diff --git a/.claude/agents/devtools-reviewer.md b/.claude/agents/devtools-reviewer.md
index 3d0973a1..662e2234 100644
--- a/.claude/agents/devtools-reviewer.md
+++ b/.claude/agents/devtools-reviewer.md
@@ -4,7 +4,7 @@ description: Reviews a change or pull request against this repository's coding s
tools: Read, Grep, Glob, Bash
---
-You review changes to the Angular devtools. You don't edit files; you report.
+You review changes to Pangular Inspector. You don't edit files; you report.
Check the diff against:
diff --git a/.claude/agents/inspector-engineer.md b/.claude/agents/inspector-engineer.md
index 1ba46c50..556e5498 100644
--- a/.claude/agents/inspector-engineer.md
+++ b/.claude/agents/inspector-engineer.md
@@ -3,7 +3,7 @@ name: inspector-engineer
description: Owns how inspectors collect data from the running app and serve it to the panel and to agents. Use for new inspectors, wrong or noisy data, unstable ids, tabs overwriting each other, heavy polling, and new MCP tools.
---
-You are the inspector engineer for the Angular devtools.
+You are the inspector engineer for Pangular Inspector.
Follow the `devtools-inspector` skill and the "Reading data from the page" section of `docs/contributing/coding-standards.md`. Read Angular through its debug APIs and check every field you rely on against `node_modules/@angular/core/fesm2022`. Keep ids stable with `WeakMap`s, never write to the app's DOM, send `pageId` with every report, expire and forget pages on the server, and skip unchanged pushes.
diff --git a/.claude/agents/ui-engineer.md b/.claude/agents/ui-engineer.md
index 9e9d6315..391a3071 100644
--- a/.claude/agents/ui-engineer.md
+++ b/.claude/agents/ui-engineer.md
@@ -3,7 +3,7 @@ name: ui-engineer
description: Builds and restyles pages in the devtools panel (app/) so they match the design system, work with the keyboard and pass axe. Use for new inspector pages, UI polish, dropdowns, toolbars, empty states and theme changes.
---
-You are the UI engineer for the Angular devtools panel.
+You are the UI engineer for the Pangular Inspector panel.
Follow the `devtools-ui` skill and `docs/contributing/ui-guidelines.md`. Use the theme variables and SCSS mixins, the shared `app-select` dropdown and the page anatomy (intro, sticky toolbar, list or tree with a detail panel, loading, error, empty and no-match states). Headings start at `h2`.
diff --git a/.claude/rules/angular.md b/.claude/rules/angular.md
index 095574c6..58df53e6 100644
--- a/.claude/rules/angular.md
+++ b/.claude/rules/angular.md
@@ -2,7 +2,7 @@
You are an expert in TypeScript, Angular, and scalable web application development. You write functional, maintainable, performant, and accessible code following Angular and TypeScript best practices.
-These apply to every Angular and TypeScript file in the repository: the panel (`app`), the package (`packages/ng-devtools`), the demo apps and the docs site. `AGENTS.md` points here so agents other than Claude Code find them too.
+These apply to every Angular and TypeScript file in the repository: the panel (`app`), the package (`packages/devtools`), the demo apps and the docs site. `AGENTS.md` points here so agents other than Claude Code find them too.
## TypeScript Best Practices
diff --git a/.claude/skills/devtools-docs/SKILL.md b/.claude/skills/devtools-docs/SKILL.md
index 3a483084..a9d42deb 100644
--- a/.claude/skills/devtools-docs/SKILL.md
+++ b/.claude/skills/devtools-docs/SKILL.md
@@ -1,9 +1,9 @@
---
name: devtools-docs
-description: Writing guide for the Angular DevTools documentation site in apps/docs (NgMd). Covers audience, voice, style rules, page types and structure, NgMd authoring components, code samples, checking claims against the code, and the build checks. You MUST use this skill any time you create, edit or review files in apps/docs/src/content, the docs home page, or README.md.
+description: Writing guide for the Pangular Inspector documentation site in apps/docs (NgMd). Covers audience, voice, style rules, page types and structure, NgMd authoring components, code samples, checking claims against the code, and the build checks. You MUST use this skill any time you create, edit or review files in apps/docs/src/content, the docs home page, or README.md.
---
-# Angular DevTools docs writing guide
+# Pangular Inspector docs writing guide
The human-readable version of this guide is `apps/docs/src/content/contributing/writing-docs.md`. Keep the two in sync when rules change.
@@ -116,7 +116,7 @@ Rules:
- Highlight lines with `{3}` or `{2,5-7}` after the language. Count the path comment as line 1.
- Install commands use a code group: ` ```bash group="install" name="pnpm" active ` then npm, yarn, bun.
- `file="path#L5-L20"` imports a real file (relative to `apps/docs`, nothing outside it). It is not a title.
-- Samples must run: every import, real export names from `packages/ng-devtools/package.json`, real option names and defaults.
+- Samples must run: every import, real export names from `packages/devtools/package.json`, real option names and defaults.
- Source samples from the demos: `src/` (Angular Travel) and `examples/analog`.
- Load the overlay only in dev, with the `ngDevMode` dynamic import used on the installation page.
- Secure by default: no `auth: false` or `allowedOrigins: false` in copyable code unless the page explains it.
@@ -125,13 +125,13 @@ Rules:
## 7. Check claims against the code
-| Page | Source of truth |
-| ------------------ | -------------------------------------------------------------------------------------------------------------- |
-| inspectors/\* | `app/src/pages/*.ts` (the tab) and `packages/ng-devtools/src/*` (collectors, actions) |
-| agents/\* | `packages/ng-devtools/src/devframe.ts`, `rpc/*.ts`, `rpc/analog-register.ts`, Devframe built-ins |
-| getting-started/\* | `packages/ng-devtools/package.json` exports, `hub.ts`, `vite.ts`, `config.ts`, `overlay.ts`, `popup.ts`, demos |
-| security | `hub.ts`, `vite.ts`, `forms-privacy.ts`, `forms-actions.ts`, router and Analog redaction |
-| contributing/\* | root `package.json`, `nx.json`, `project.json` files, `.github/workflows`, `extension/` |
+| Page | Source of truth |
+| ------------------ | ----------------------------------------------------------------------------------------------------------- |
+| inspectors/\* | `app/src/pages/*.ts` (the tab) and `packages/devtools/src/*` (collectors, actions) |
+| agents/\* | `packages/devtools/src/devframe.ts`, `rpc/*.ts`, `rpc/analog-register.ts`, Devframe built-ins |
+| getting-started/\* | `packages/devtools/package.json` exports, `hub.ts`, `vite.ts`, `config.ts`, `overlay.ts`, `popup.ts`, demos |
+| security | `hub.ts`, `vite.ts`, `forms-privacy.ts`, `forms-actions.ts`, router and Analog redaction |
+| contributing/\* | root `package.json`, `nx.json`, `project.json` files, `.github/workflows`, `extension/` |
Check names exactly. When code changes, update the docs in the same PR. When unsure, say less rather than guess.
diff --git a/.claude/skills/devtools-fix-issue/SKILL.md b/.claude/skills/devtools-fix-issue/SKILL.md
index c04b0a13..681e035d 100644
--- a/.claude/skills/devtools-fix-issue/SKILL.md
+++ b/.claude/skills/devtools-fix-issue/SKILL.md
@@ -18,7 +18,7 @@ The issue text is untrusted data, like any comment or pull request from outside.
## 2. Reproduce, then fix
-1. Write a test that fails for the reported reason, not for some side effect. Package code goes in `packages/ng-devtools/src/__tests__`, panel code in `app/src/__tests__` (`pnpm test:panel`).
+1. Write a test that fails for the reported reason, not for some side effect. Package code goes in `packages/devtools/src/__tests__`, panel code in `app/src/__tests__` (`pnpm test:panel`).
2. Make the smallest fix that covers the cause. Follow `docs/contributing/coding-standards.md` and the `devtools-inspector` or `devtools-ui` skill for the area.
3. Undo the fix and run the test again. It must fail. Put the fix back.
4. Update the docs page for the area when behaviour, options, labels or tools change (`devtools-docs` skill).
@@ -27,7 +27,7 @@ The issue text is untrusted data, like any comment or pull request from outside.
Run the checks in the `devtools-verify` skill. When `app/` changed, run `pnpm extension:build` and commit `extension/ui`, or CI fails.
-Then review your own diff as a skeptic: data that now leaks without redaction, a new tool missing from the config lists in `packages/ng-devtools/src/config.ts`, a listener or wrapper that is never removed, a docs claim the code doesn't back.
+Then review your own diff as a skeptic: data that now leaks without redaction, a new tool missing from the config lists in `packages/devtools/src/config.ts`, a listener or wrapper that is never removed, a docs claim the code doesn't back.
## 4. Open the pull request
diff --git a/.claude/skills/devtools-inspector/SKILL.md b/.claude/skills/devtools-inspector/SKILL.md
index 2dab1e02..30ff08ca 100644
--- a/.claude/skills/devtools-inspector/SKILL.md
+++ b/.claude/skills/devtools-inspector/SKILL.md
@@ -17,7 +17,7 @@ app page (overlay.ts + -collector.ts)
Read `docs/contributing/coding-standards.md` ("Reading data from the page") before you start.
-## Page side (`packages/ng-devtools/src`)
+## Page side (`packages/devtools/src`)
- Put collection logic in its own module (`-collector.ts`) and keep `overlay.ts` changes to wiring: import, attach, push, `leave()` and the returned cleanup.
- Read Angular through the debug APIs on `window.ng` and verify each field against `node_modules/@angular/core/fesm2022` (or the library's fesm build). Known helpers:
diff --git a/.claude/skills/devtools-ui/SKILL.md b/.claude/skills/devtools-ui/SKILL.md
index 533eeed6..0d2a0a80 100644
--- a/.claude/skills/devtools-ui/SKILL.md
+++ b/.claude/skills/devtools-ui/SKILL.md
@@ -10,7 +10,7 @@ Read `docs/contributing/ui-guidelines.md` first; it is the source of truth for t
## Before you write code
1. Open two recently built pages as references: `app/src/pages/di-inspector.ts` (tree + detail, keyboard, highlight) and `app/src/pages/network-inspector.ts` (toolbar, tables, forms, `app-select`).
-2. Check which data the page gets and from where (`client.scope('ng-devtools').rpc.call(...)` or `rpc.sharedState(...)`). UI work must not change RPC names or data shapes; if the data is wrong, use the `devtools-inspector` skill.
+2. Check which data the page gets and from where (`client.scope('pangular').rpc.call(...)` or `rpc.sharedState(...)`). UI work must not change RPC names or data shapes; if the data is wrong, use the `devtools-inspector` skill.
## Rules
diff --git a/.claude/skills/devtools-verify/SKILL.md b/.claude/skills/devtools-verify/SKILL.md
index 38e3fd12..7ba5bd2a 100644
--- a/.claude/skills/devtools-verify/SKILL.md
+++ b/.claude/skills/devtools-verify/SKILL.md
@@ -48,7 +48,7 @@ node dist/angular-devtools/server/server.mjs # Angular Travel on :4000
pnpm analog:dev # Analog demo on :5173
```
-Open the panel through the amber launcher on the page, at `/__devframes/`, and directly at `/__devframes/ng-devtools/?view=angular#tab=`.
+Open the panel through the amber launcher on the page, at `/__devframes/`, and directly at `/__devframes/pangular/?view=angular#tab=`.
## 3. Browser checks
@@ -58,7 +58,7 @@ With Playwright and `@axe-core/playwright` (install them in a scratch folder, no
- Hub docks: clicking each rail button shows the matching view and only one frame (the rail selection and the content must match after fast switching and after a reload).
- The feature itself, with real data from the demo app (for example `/examples/`).
-Exclude the launcher (`#ng-devtools-popup-root`) from axe runs on demo pages; it is checked through the panel.
+Exclude the launcher (`#pangular-popup-root`) from axe runs on demo pages; it is checked through the panel.
## 4. Report honestly
diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml
index 78a9c068..a1fa67a3 100644
--- a/.github/ISSUE_TEMPLATE/bug_report.yml
+++ b/.github/ISSUE_TEMPLATE/bug_report.yml
@@ -35,10 +35,10 @@ body:
label: Setup
description: How the devtools are mounted in your app.
options:
- - Angular CLI with Express (initNgDevtoolsHub)
+ - Angular CLI with Express (initPangularHub)
- Vite plugin
- Analog
- - Standalone CLI (ng-devtools dev)
+ - Standalone CLI (pangular dev)
- Chrome extension
- MCP server (stdio or HTTP)
- Other
@@ -62,7 +62,7 @@ body:
id: versions
attributes:
label: Versions
- description: Angular, @santoshyadavdev/ng-devtools, browser, and Analog if used.
+ description: Angular, @pangular-inspector/devtools, browser, and Analog if used.
- type: textarea
id: extra
attributes:
diff --git a/.github/labeler.yml b/.github/labeler.yml
index 49276bcc..352472b9 100644
--- a/.github/labeler.yml
+++ b/.github/labeler.yml
@@ -4,12 +4,11 @@
'area: package':
- changed-files:
- - any-glob-to-any-file: ['packages/ng-devtools/**', 'bin.mjs']
+ - any-glob-to-any-file: ['packages/devtools/**', 'bin.mjs']
'area: agents':
- changed-files:
- - any-glob-to-any-file:
- ['packages/ng-devtools/src/devframe.ts', 'packages/ng-devtools/src/rpc/**']
+ - any-glob-to-any-file: ['packages/devtools/src/devframe.ts', 'packages/devtools/src/rpc/**']
'area: extension':
- changed-files:
diff --git a/.github/workflows/docs-check.yml b/.github/workflows/docs-check.yml
index 87f8763f..fc737b77 100644
--- a/.github/workflows/docs-check.yml
+++ b/.github/workflows/docs-check.yml
@@ -28,7 +28,7 @@ jobs:
NO_DOCS: ${{ contains(github.event.pull_request.labels.*.name, 'no-docs') }}
run: |
changed=$(git diff --name-only "$BASE...$HEAD")
- code=$(printf '%s\n' "$changed" | grep -E '^(packages/ng-devtools/src/|app/src/|extension/[^/]+$)' | grep -vE '(__tests__/|\.(spec|test)\.ts$)' || true)
+ code=$(printf '%s\n' "$changed" | grep -E '^(packages/devtools/src/|app/src/|extension/[^/]+$)' | grep -vE '(__tests__/|\.(spec|test)\.ts$)' || true)
docs=$(printf '%s\n' "$changed" | grep -E '^apps/docs/src/content/' || true)
if [ -z "$code" ]; then
echo "No code changes that need docs."
diff --git a/AGENTS.md b/AGENTS.md
index 73a7eaa7..1e888585 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -2,11 +2,11 @@ Follow the Angular, TypeScript and accessibility rules in `.claude/rules/angular
## This repository
-Angular DevTools inspects a running Angular app and serves what it finds to a panel and to AI agents over MCP. It is an Nx and pnpm workspace:
+Pangular Inspector inspects a running Angular app and serves what it finds to a panel and to AI agents over MCP. It is an Nx and pnpm workspace:
| Path | What it is |
| --------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| `packages/ng-devtools` | The published package: the page overlay and collectors, the devframe server (`src/devframe.ts`), the Express hub, the Vite plugin, the CLI and the agent tools |
+| `packages/devtools` | The published package: the page overlay and collectors, the devframe server (`src/devframe.ts`), the Express hub, the Vite plugin, the CLI and the agent tools |
| `app` | The panel UI, an Angular app served by the hub and bundled into the Chrome extension |
| `extension` | The Chrome extension; `extension/ui` is a committed build of `app` |
| `apps/docs` | The documentation site |
@@ -32,7 +32,7 @@ The words this project uses for its own concepts (overlay, collector, hub, devfr
- After any change in `app`, run `pnpm extension:build` and commit `extension/ui`. CI fails when the committed bundle is stale.
- Commit messages and pull request titles use `type(scope): summary` with the scopes in `docs/contributing/commit-message-guidelines.md`. Pull requests are squash merged.
-- A new agent tool or RPC must be listed in `packages/ng-devtools/src/config.ts` (`AGENT_INSPECTOR`, `RPC_INSPECTOR`, and `ACTION_TOOLS` for anything that writes), or turning its inspector off won't hide it.
+- A new agent tool or RPC must be listed in `packages/devtools/src/config.ts` (`AGENT_INSPECTOR`, `RPC_INSPECTOR`, and `ACTION_TOOLS` for anything that writes), or turning its inspector off won't hide it.
- Values sent to the panel or to agents go through `serialize` or the redaction helpers, so `redaction.secretNames`, JWTs and bearer tokens are masked everywhere.
- Data from the page carries a `pageId` and expires, so one tab never overwrites another.
- Docs links are relative `.md` links, which the build checks. `*Angular` style words are keyword links on purpose.
@@ -65,8 +65,8 @@ Roles for delegating work live in `.claude/agents/`: `ui-engineer`, `inspector-e
- **Devtools SPA (hot reload):** `pnpm devtools:dev` → http://localhost:5173 (serves its own RPC, so source-scan data works; live tabs need an app page connected, so use the SSR server on 4000 for those)
- **Demo app (SPA, no SSR):** `pnpm start` → http://localhost:4200 (runs `ng serve` with SSR and hot reload; devtools popup + RPC work without a separate server)
- The devtools popup appears on the demo app page; click it to open the inspector panel
-- Changes to `app/src/` (devtools SPA) are visible live via `pnpm devtools:dev`; the SSR server serves the SPA built into `packages/ng-devtools/dist/public` (or the npm-published copy when it has not been built), so run `pnpm devtools:build-pkg` to refresh it
-- To publish: update the version in `packages/ng-devtools/package.json`, then run `pnpm devtools:publish` (the package build bundles the SPA)
+- Changes to `app/src/` (devtools SPA) are visible live via `pnpm devtools:dev`; the SSR server serves the SPA built into `packages/devtools/dist/public` (or the npm-published copy when it has not been built), so run `pnpm devtools:build-pkg` to refresh it
+- To publish: update the version in `packages/devtools/package.json`, then run `pnpm devtools:publish` (the package build bundles the SPA)
## Documentation
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 9d986eb9..cd618f3f 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -1,4 +1,4 @@
-# Contributing to Angular DevTools
+# Contributing to Pangular Inspector
Thanks for your interest in contributing. This guide covers the rules a change follows and how to get it merged. For setup, the project structure, the commands and what CI runs, see [Development setup](./apps/docs/src/content/contributing/development.md) on the docs site.
@@ -25,7 +25,7 @@ By taking part you agree to the [Code of Conduct](./CODE_OF_CONDUCT.md). Report
## Make changes
-- **A new inspector or a data fix:** follow [Reading data from the page](docs/contributing/coding-standards.md#reading-data-from-the-page-packagesng-devtools). Collection goes in its own module, reports carry a `pageId`, and the server expires and forgets pages.
+- **A new inspector or a data fix:** follow [Reading data from the page](docs/contributing/coding-standards.md#reading-data-from-the-page-packagesdevtools). Collection goes in its own module, reports carry a `pageId`, and the server expires and forgets pages.
- **A new tab, RPC function or agent tool:** follow the steps in [Development setup](./apps/docs/src/content/contributing/development.md). Describe what an agent tool returns and when it is empty, and add tests.
- **UI changes:** follow the [UI guidelines](docs/contributing/ui-guidelines.md). Use the theme variables, the SCSS mixins and the shared dropdown.
- **Docs changes:** follow the [writing guide](./apps/docs/src/content/contributing/writing-docs.md). Run the docs site with `pnpm docs:dev`.
diff --git a/README.md b/README.md
index 2e1f4812..90fd900e 100644
--- a/README.md
+++ b/README.md
@@ -1,18 +1,18 @@
-# Angular DevTools
+# Pangular Inspector
-Inspect Angular component trees, signals, dependency injection, routes, forms, pipes and NgRx stores at dev time, build time, or through a coding agent. Built with [Devframe](https://devfra.me) so the same tool runs as an embedded panel, standalone CLI, static report, MCP server, or Chrome DevTools extension.
+The unified Angular devtools. Inspect Angular component trees, signals, dependency injection, routes, forms, pipes and NgRx stores at dev time, build time, or through a coding agent. Built with [Devframe](https://devfra.me) so the same tool runs as an embedded panel, standalone CLI, static report, MCP server, or Chrome DevTools extension.
## Get started
```sh
-npm install @santoshyadavdev/ng-devtools devframe
+npm install @pangular-inspector/devtools devframe
```
-Then follow the [installation guide](./apps/docs/src/content/getting-started/installation.md) for your setup: Angular CLI with Express, Vite and Analog, the standalone CLI, or [Angular Native](./apps/docs/src/content/getting-started/angular-native.md). For a coding agent, run `npx @santoshyadavdev/ng-devtools mcp`.
+Then follow the [installation guide](./apps/docs/src/content/getting-started/installation.md) for your setup: Angular CLI with Express, Vite and Analog, the standalone CLI, or [Angular Native](./apps/docs/src/content/getting-started/angular-native.md). For a coding agent, run `npx @pangular-inspector/devtools mcp`.
## Documentation
-The docs live in [`apps/docs`](./apps/docs). Run them locally with `pnpm docs:dev`.
+Read the docs at [pangular-inspector.dev](https://pangular-inspector.dev). Their source lives in [`apps/docs`](./apps/docs); run them locally with `pnpm docs:dev`.
- [Getting started](./apps/docs/src/content/getting-started/introduction.md)
- [Inspectors](./apps/docs/src/content/inspectors/dashboard.md)
@@ -39,10 +39,10 @@ Join the conversation, ask questions, and share feedback on [Discord](https://di
## Sponsors
-Angular DevTools is free and open source. If it helps your work, please consider sponsoring it. Your support keeps development going.
+Pangular Inspector is free and open source. If it helps your work, please consider sponsoring it. Your support keeps development going.
-
+
### Company sponsors
diff --git a/SECURITY.md b/SECURITY.md
index 6ac14577..6ca4a5de 100644
--- a/SECURITY.md
+++ b/SECURITY.md
@@ -2,8 +2,8 @@
## Supported versions
-Angular DevTools is in early development. Only the latest published release of
-`@santoshyadavdev/ng-devtools` is supported. There are no older release lines to backport a fix to.
+Pangular Inspector is in early development. Only the latest published release of
+`@pangular-inspector/devtools` is supported. There are no older release lines to backport a fix to.
## Reporting a vulnerability
diff --git a/app/index.html b/app/index.html
index 5b9f4c43..637cf438 100644
--- a/app/index.html
+++ b/app/index.html
@@ -7,7 +7,7 @@
- Angular DevTools
+ Pangular Inspector
diff --git a/app/src/__tests__/angular-native-view.test.ts b/app/src/__tests__/angular-native-view.test.ts
index e889cf11..18d8c1ac 100644
--- a/app/src/__tests__/angular-native-view.test.ts
+++ b/app/src/__tests__/angular-native-view.test.ts
@@ -100,7 +100,7 @@ describe('Angular Native view', () => {
expect(text).toContain('No Angular Native app is connected');
const link = host(fixture).querySelector('a.cta');
expect(link?.textContent).toContain('Set up Angular Native');
- expect(link?.href).toContain('getting-started/angular-native.md');
+ expect(link?.href).toContain('getting-started/angular-native/');
expect(tabNames(fixture)).toEqual([]);
});
diff --git a/app/src/__tests__/base-url.test.ts b/app/src/__tests__/base-url.test.ts
index b8525e7e..833013cd 100644
--- a/app/src/__tests__/base-url.test.ts
+++ b/app/src/__tests__/base-url.test.ts
@@ -14,16 +14,16 @@ function at(href: string) {
describe('detectBaseURL', () => {
it('tries the embedded server path, then the folder the panel is served from', () => {
- expect(detectBaseURL(at('http://localhost:5173/'))).toEqual(['/__ng-devtools/', './']);
+ expect(detectBaseURL(at('http://localhost:5173/'))).toEqual(['/__pangular/', './']);
expect(detectBaseURL(at('http://127.0.0.1:4782/reports/today/'))).toEqual([
- '/__ng-devtools/',
+ '/__pangular/',
'./',
]);
});
it('lets devframe pick the base when the panel is served under the server path', () => {
- expect(detectBaseURL(at('http://localhost:4200/__ng-devtools/'))).toBeUndefined();
- expect(detectBaseURL(at('http://localhost:4200/__devframes/ng-devtools/'))).toBeUndefined();
+ expect(detectBaseURL(at('http://localhost:4200/__pangular/'))).toBeUndefined();
+ expect(detectBaseURL(at('http://localhost:4200/__devframes/pangular/'))).toBeUndefined();
});
it('accepts a same origin baseURL query', () => {
@@ -39,27 +39,27 @@ describe('detectBaseURL', () => {
const loc = at(
'http://localhost:4200/panel/?baseURL=' + encodeURIComponent('https://evil.example/'),
);
- expect(detectBaseURL(loc)).toEqual(['/__ng-devtools/', './']);
+ expect(detectBaseURL(loc)).toEqual(['/__pangular/', './']);
});
it('ignores a malformed baseURL query instead of throwing', () => {
const loc = at('http://localhost:4200/panel/?baseURL=' + encodeURIComponent('http://['));
expect(() => detectBaseURL(loc)).not.toThrow();
- expect(detectBaseURL(loc)).toEqual(['/__ng-devtools/', './']);
+ expect(detectBaseURL(loc)).toEqual(['/__pangular/', './']);
});
it('accepts an http or https host from the extension panel', () => {
const base = 'chrome-extension://abc/ui/index.html?baseURL=';
- const http = at(base + encodeURIComponent('http://localhost:4200/__ng-devtools/'));
- expect(detectBaseURL(http)).toBe('http://localhost:4200/__ng-devtools/');
- const https = at(base + encodeURIComponent('https://app.example/__ng-devtools/'));
- expect(detectBaseURL(https)).toBe('https://app.example/__ng-devtools/');
+ const http = at(base + encodeURIComponent('http://localhost:4200/__pangular/'));
+ expect(detectBaseURL(http)).toBe('http://localhost:4200/__pangular/');
+ const https = at(base + encodeURIComponent('https://app.example/__pangular/'));
+ expect(detectBaseURL(https)).toBe('https://app.example/__pangular/');
});
it('rejects other schemes from the extension panel', () => {
const loc = at(
'chrome-extension://abc/ui/index.html?baseURL=' + encodeURIComponent('javascript:alert(1)'),
);
- expect(detectBaseURL(loc)).toEqual(['/__ng-devtools/', './']);
+ expect(detectBaseURL(loc)).toEqual(['/__pangular/', './']);
});
});
diff --git a/app/src/__tests__/config-pending.test.ts b/app/src/__tests__/config-pending.test.ts
index e82d2646..c2a5d97d 100644
--- a/app/src/__tests__/config-pending.test.ts
+++ b/app/src/__tests__/config-pending.test.ts
@@ -29,7 +29,7 @@ function fakeClient(configs: object = {}): DevframeRpcClient {
} as unknown as DevframeRpcClient;
}
-const signalsOff = { 'ng-devtools': { inspectors: { signals: false } } };
+const signalsOff = { pangular: { inspectors: { signals: false } } };
async function settle(fixture: ComponentFixture) {
for (let i = 0; i < 3; i++) {
diff --git a/app/src/__tests__/forms-panels.test.ts b/app/src/__tests__/forms-panels.test.ts
index d5711d1d..aca2a7af 100644
--- a/app/src/__tests__/forms-panels.test.ts
+++ b/app/src/__tests__/forms-panels.test.ts
@@ -165,7 +165,7 @@ describe('FormsFieldDetail', () => {
expect(text(fixture)).toContain('this field is redacted (password input)');
const link = host.querySelector('a')!;
expect(link.textContent).toContain('How to unmask it');
- expect(link.href).toContain('security.md#opt-fields-in-or-out');
+ expect(link.href).toContain('security/#opt-fields-in-or-out');
});
});
diff --git a/app/src/__tests__/hub-dock-sync.test.ts b/app/src/__tests__/hub-dock-sync.test.ts
index 0d5ef95e..ccad967c 100644
--- a/app/src/__tests__/hub-dock-sync.test.ts
+++ b/app/src/__tests__/hub-dock-sync.test.ts
@@ -9,7 +9,7 @@ function fakeHub(selectedId: string | null = null) {
const docks = {
selectedId,
getStateById: (id: string) =>
- id === 'ng-devtools:missing'
+ id === 'pangular:missing'
? undefined
: {
events: {
@@ -38,7 +38,7 @@ describe('hub dock sync', () => {
});
it('reports the dock the hub already has selected', () => {
- parent[KEY] = fakeHub('ng-devtools:ngrx');
+ parent[KEY] = fakeHub('pangular:ngrx');
const onView = vi.fn();
followHubDocks(['angular', 'ngrx'], onView);
expect(onView).toHaveBeenCalledOnce();
@@ -57,18 +57,18 @@ describe('hub dock sync', () => {
parent[KEY] = hub;
const onView = vi.fn();
const stop = followHubDocks(['angular', 'ngrx', 'missing'], onView);
- hub.listeners.get('ng-devtools:ngrx')?.();
- hub.listeners.get('ng-devtools:angular')?.();
+ hub.listeners.get('pangular:ngrx')?.();
+ hub.listeners.get('pangular:angular')?.();
expect(onView.mock.calls).toEqual([['ngrx'], ['angular']]);
stop();
- expect(hub.offs).toEqual(['ng-devtools:angular', 'ng-devtools:ngrx']);
+ expect(hub.offs).toEqual(['pangular:angular', 'pangular:ngrx']);
});
it('waits for the hub context to appear', () => {
vi.useFakeTimers();
const onView = vi.fn();
followHubDocks(['angular'], onView);
- parent[KEY] = fakeHub('ng-devtools:angular');
+ parent[KEY] = fakeHub('pangular:angular');
vi.advanceTimersByTime(100);
expect(onView).toHaveBeenCalledWith('angular');
});
@@ -78,7 +78,7 @@ describe('hub dock sync', () => {
const onView = vi.fn();
const stop = followHubDocks(['angular'], onView);
stop();
- parent[KEY] = fakeHub('ng-devtools:angular');
+ parent[KEY] = fakeHub('pangular:angular');
vi.advanceTimersByTime(1000);
expect(onView).not.toHaveBeenCalled();
});
@@ -94,7 +94,7 @@ describe('hub dock sync', () => {
const hub = fakeHub();
parent[KEY] = hub;
expect(await selectHubDock('ngrx')).toBe(true);
- expect(hub.docks.switchEntry).toHaveBeenCalledWith('ng-devtools:ngrx');
+ expect(hub.docks.switchEntry).toHaveBeenCalledWith('pangular:ngrx');
});
it('reports failure when the hub rejects the switch', async () => {
diff --git a/app/src/__tests__/hub-rail-style.test.ts b/app/src/__tests__/hub-rail-style.test.ts
index 1e4be506..9e8d95d9 100644
--- a/app/src/__tests__/hub-rail-style.test.ts
+++ b/app/src/__tests__/hub-rail-style.test.ts
@@ -18,7 +18,7 @@ describe('styleHubRail', () => {
it('injects a style tag into the shadow root', () => {
const dock = makeDock();
styleHubRail(document, 'dark');
- expect(dock.shadowRoot!.querySelector('style[data-ng-devtools]')).not.toBeNull();
+ expect(dock.shadowRoot!.querySelector('style[data-pangular]')).not.toBeNull();
});
it('does nothing when document is null', () => {
@@ -30,7 +30,7 @@ describe('styleHubRail', () => {
styleHubRail(document, 'dark');
const style = document
.querySelector('devframes-dock-standalone')!
- .shadowRoot!.querySelector('style[data-ng-devtools]')!;
+ .shadowRoot!.querySelector('style[data-pangular]')!;
expect(style.textContent).toContain('#0b0b0e');
});
@@ -39,7 +39,7 @@ describe('styleHubRail', () => {
styleHubRail(document, 'light');
const style = document
.querySelector('devframes-dock-standalone')!
- .shadowRoot!.querySelector('style[data-ng-devtools]')!;
+ .shadowRoot!.querySelector('style[data-pangular]')!;
expect(style.textContent).toContain('#ffffff');
});
@@ -49,7 +49,7 @@ describe('styleHubRail', () => {
styleHubRail(document, 'light');
const shadows = document.querySelectorAll('devframes-dock-standalone');
const styleTags = [...shadows].flatMap((el) => [
- ...(el.shadowRoot?.querySelectorAll('style[data-ng-devtools]') ?? []),
+ ...(el.shadowRoot?.querySelectorAll('style[data-pangular]') ?? []),
]);
expect(styleTags).toHaveLength(1);
expect(styleTags[0].textContent).toContain('#ffffff');
@@ -62,7 +62,7 @@ describe('styleHubRail', () => {
const dock = makeDock();
vi.advanceTimersByTime(100);
- expect(dock.shadowRoot!.querySelector('style[data-ng-devtools]')).not.toBeNull();
+ expect(dock.shadowRoot!.querySelector('style[data-pangular]')).not.toBeNull();
});
it('deduplicates retry timers for the same document', () => {
@@ -71,7 +71,7 @@ describe('styleHubRail', () => {
styleHubRail(document, 'light');
const dock = makeDock();
vi.advanceTimersByTime(100);
- const styles = dock.shadowRoot!.querySelectorAll('style[data-ng-devtools]');
+ const styles = dock.shadowRoot!.querySelectorAll('style[data-pangular]');
expect(styles).toHaveLength(1);
expect(styles[0].textContent).toContain('#ffffff');
});
diff --git a/app/src/__tests__/router-panels.test.ts b/app/src/__tests__/router-panels.test.ts
index 7c1e383c..5d2115cf 100644
--- a/app/src/__tests__/router-panels.test.ts
+++ b/app/src/__tests__/router-panels.test.ts
@@ -14,7 +14,7 @@ function fakeClient(call: Call, connectionMeta: object = {}): DevframeRpcClient
return { connectionMeta, scope: () => ({ rpc }) } as unknown as DevframeRpcClient;
}
-const routerActionsOff = { configs: { 'ng-devtools': { actions: { router: false } } } };
+const routerActionsOff = { configs: { pangular: { actions: { router: false } } } };
const offline: Call = () => Promise.reject(new Error('offline'));
diff --git a/app/src/__tests__/theme.service.test.ts b/app/src/__tests__/theme.service.test.ts
index dd3a5200..7e055d30 100644
--- a/app/src/__tests__/theme.service.test.ts
+++ b/app/src/__tests__/theme.service.test.ts
@@ -45,13 +45,13 @@ describe('ThemeService', () => {
expect(svc.current()).toBe('light');
});
- it('updates to light on a ng-devtools:theme-change postMessage', () => {
+ it('updates to light on a pangular:theme-change postMessage', () => {
const svc = TestBed.inject(ThemeService);
expect(svc.current()).toBe('dark');
window.dispatchEvent(
new MessageEvent('message', {
- data: { type: 'ng-devtools:theme-change', theme: 'default' },
+ data: { type: 'pangular:theme-change', theme: 'default' },
source: window.parent,
}),
);
@@ -60,14 +60,14 @@ describe('ThemeService', () => {
expect(document.documentElement.dataset['theme']).toBe('light');
});
- it('updates to dark on a ng-devtools:theme-change postMessage', () => {
+ it('updates to dark on a pangular:theme-change postMessage', () => {
document.documentElement.dataset['theme'] = 'light';
const svc = TestBed.inject(ThemeService);
expect(svc.current()).toBe('light');
window.dispatchEvent(
new MessageEvent('message', {
- data: { type: 'ng-devtools:theme-change', theme: 'dark' },
+ data: { type: 'pangular:theme-change', theme: 'dark' },
source: window.parent,
}),
);
@@ -81,7 +81,7 @@ describe('ThemeService', () => {
window.dispatchEvent(
new MessageEvent('message', {
- data: { type: 'ng-devtools:theme-change', theme: 'default' },
+ data: { type: 'pangular:theme-change', theme: 'default' },
source: null,
}),
);
@@ -117,7 +117,7 @@ describe('ThemeService', () => {
window.dispatchEvent(
new MessageEvent('message', {
- data: { type: 'ng-devtools:theme-change', theme: 'dark' },
+ data: { type: 'pangular:theme-change', theme: 'dark' },
source: window.parent,
}),
);
diff --git a/app/src/app.ts b/app/src/app.ts
index 634f24d6..ee9f94b9 100644
--- a/app/src/app.ts
+++ b/app/src/app.ts
@@ -108,13 +108,13 @@ const NATIVESCRIPT_SETUP: ComingSoonInfo = {
color: '#3c5afd',
plansTitle: 'Set up an app',
plans: [
- 'Install @santoshyadavdev/ng-devtools and @valor/nativescript-websockets',
+ 'Install @pangular-inspector/devtools and @valor/nativescript-websockets',
'Call initNativeScriptOverlay() in main.ts, before the app bootstraps',
- 'Run ng-devtools dev --no-auth in the app, then open the Angular dock',
+ 'Run npx pangular dev --no-auth in the app, then open the Angular dock',
],
link: {
label: 'NativeScript setup guide',
- href: 'https://santoshyadavdev.github.io/angular-devtools/guides/nativescript',
+ href: 'https://pangular-inspector.dev/guides/nativescript/',
},
};
@@ -149,7 +149,7 @@ const NO_ANGULAR_NATIVE: ComingSoonInfo = {
],
link: {
label: 'Set up Angular Native',
- href: 'https://github.com/santoshyadavdev/angular-devtools/blob/main/apps/docs/src/content/getting-started/angular-native.md',
+ href: 'https://pangular-inspector.dev/getting-started/angular-native/',
},
};
@@ -719,7 +719,7 @@ export class App implements OnInit, OnDestroy {
});
readonly title = computed(() => {
const view = this.view();
- return view ? VIEW_TITLE[view] : 'Angular DevTools';
+ return view ? VIEW_TITLE[view] : 'Pangular Inspector';
});
readonly analogKnown = signal(false);
readonly nativePageId = signal(null);
@@ -855,7 +855,7 @@ export class App implements OnInit, OnDestroy {
this.connected.set(true);
void this.watchVisibility(client);
void this.watchAngularNative(client);
- const scoped = client.scope('ng-devtools').rpc as unknown as {
+ const scoped = client.scope('pangular').rpc as unknown as {
call: (name: string) => Promise;
};
scoped.call('analog-project').then(
@@ -915,7 +915,7 @@ export class App implements OnInit, OnDestroy {
inspectFromPanel({ source, origin, data }: MessageEvent) {
if (source !== window.parent || origin !== location.origin) return;
const message = data as { type?: unknown; id?: unknown } | null;
- if (message?.type !== 'ng-devtools:inspect-component' || typeof message.id !== 'string') return;
+ if (message?.type !== 'pangular:inspect-component' || typeof message.id !== 'string') return;
// Any element inside the app resolves to a component, so following every
// Elements selection would pull the user off whichever tab they are on.
if (this.tab() !== 'components' || !this.config().inspectors.components) return;
@@ -944,7 +944,7 @@ export class App implements OnInit, OnDestroy {
private async watchAngularNative(client: DevframeRpcClient) {
try {
- const state = await client.scope('ng-devtools').rpc.sharedState('component-tree');
+ const state = await client.scope('pangular').rpc.sharedState('component-tree');
const apply = (value: unknown) => {
const pages = (value as { pages?: Record } | undefined)?.pages;
const pageId = angularNativePage(pages, this.nativePageId());
@@ -962,7 +962,7 @@ export class App implements OnInit, OnDestroy {
private async watchVisibility(client: DevframeRpcClient) {
try {
- const state = await client.scope('ng-devtools').rpc.sharedState('page-visibility');
+ const state = await client.scope('pangular').rpc.sharedState('page-visibility');
const apply = (value: unknown) => {
const hidden = (value as { hidden?: unknown } | undefined)?.hidden;
this.hiddenPages.set(
@@ -1009,7 +1009,7 @@ export class App implements OnInit, OnDestroy {
return;
}
try {
- await client.call('hub:docks:activate', { dockId: `ng-devtools:${view}` });
+ await client.call('hub:docks:activate', { dockId: `pangular:${view}` });
this.keepFocus();
this.showView(view);
} catch {
diff --git a/app/src/base-url.ts b/app/src/base-url.ts
index 51ed2c24..eba8b5cd 100644
--- a/app/src/base-url.ts
+++ b/app/src/base-url.ts
@@ -1,6 +1,6 @@
type PanelLocation = Pick;
-// Chrome extension passes ?baseURL=...; embedded uses /__ng-devtools/; the CLI and a
+// Chrome extension passes ?baseURL=...; embedded uses /__pangular/; the CLI and a
// static report serve the panel next to their own __connection.json
function sameOrigin(value: string, loc: PanelLocation): boolean {
try {
@@ -32,8 +32,8 @@ export function detectBaseURL(loc: PanelLocation = location): string | string[]
return fromQuery;
}
- if (loc.pathname.includes('__ng-devtools') || loc.pathname.includes('__devframes/')) {
+ if (loc.pathname.includes('__pangular') || loc.pathname.includes('__devframes/')) {
return undefined;
}
- return ['/__ng-devtools/', './'];
+ return ['/__pangular/', './'];
}
diff --git a/app/src/devtools-config.ts b/app/src/devtools-config.ts
index e6f46c66..3b379995 100644
--- a/app/src/devtools-config.ts
+++ b/app/src/devtools-config.ts
@@ -2,24 +2,24 @@ import type { DevframeRpcClient } from 'devframe/client';
import {
actionBlockedMessage,
configFromConnection,
- type NgDevtoolsAction,
- type NgDevtoolsInspector,
- type ResolvedNgDevtoolsConfig,
-} from '@santoshyadavdev/ng-devtools/config';
+ type PangularAction,
+ type PangularInspector,
+ type ResolvedPangularConfig,
+} from '@pangular-inspector/devtools/config';
import type { Tab } from './types/tab.types';
export { actionBlockedMessage };
/** The config the server published in its connection info; everything is on without one. */
-export function panelConfig(client: DevframeRpcClient | null): ResolvedNgDevtoolsConfig {
+export function panelConfig(client: DevframeRpcClient | null): ResolvedPangularConfig {
return configFromConnection(client?.connectionMeta);
}
-export function actionAllowed(client: DevframeRpcClient | null, action: NgDevtoolsAction): boolean {
+export function actionAllowed(client: DevframeRpcClient | null, action: PangularAction): boolean {
return panelConfig(client).actions[action];
}
-const TAB_INSPECTOR: Partial> = {
+const TAB_INSPECTOR: Partial> = {
components: 'components',
routes: 'router',
signals: 'signals',
@@ -31,7 +31,7 @@ const TAB_INSPECTOR: Partial> = {
analog: 'analog',
};
-export function tabEnabled(tab: Tab, config: ResolvedNgDevtoolsConfig): boolean {
+export function tabEnabled(tab: Tab, config: ResolvedPangularConfig): boolean {
const inspector = TAB_INSPECTOR[tab];
return !inspector || config.inspectors[inspector];
}
diff --git a/app/src/hub-dock-sync.ts b/app/src/hub-dock-sync.ts
index cf655727..1920bae6 100644
--- a/app/src/hub-dock-sync.ts
+++ b/app/src/hub-dock-sync.ts
@@ -1,5 +1,5 @@
const CLIENT_CONTEXT_KEY = '__DEVFRAME_HUB_CLIENT_CONTEXT__';
-const DOCK_PREFIX = 'ng-devtools:';
+const DOCK_PREFIX = 'pangular:';
interface DockState {
events: { on: (event: 'entry:activated', listener: () => void) => () => void };
diff --git a/app/src/hub-rail-style.ts b/app/src/hub-rail-style.ts
index dbeac6f9..a49f5b15 100644
--- a/app/src/hub-rail-style.ts
+++ b/app/src/hub-rail-style.ts
@@ -53,10 +53,10 @@ export function styleHubRail(
pendingRetries.delete(doc);
}
}
- let style = root.querySelector('style[data-ng-devtools]');
+ let style = root.querySelector('style[data-pangular]');
if (!style) {
style = doc!.createElement('style');
- style.dataset['ngDevtools'] = '';
+ style.dataset['pangular'] = '';
root.append(style);
}
style.textContent = activeDockStyle(theme);
diff --git a/app/src/page-id.ts b/app/src/page-id.ts
index 85b28693..3b95ca9e 100644
--- a/app/src/page-id.ts
+++ b/app/src/page-id.ts
@@ -1,4 +1,4 @@
-const PAGE_ID_KEY = 'ng-devtools-page-id';
+const PAGE_ID_KEY = 'pangular-page-id';
let scopedPageId: string | null = null;
diff --git a/app/src/pages/analog-inspector.ts b/app/src/pages/analog-inspector.ts
index db7188ef..2c0b4847 100644
--- a/app/src/pages/analog-inspector.ts
+++ b/app/src/pages/analog-inspector.ts
@@ -317,7 +317,7 @@ function walk(routes: AnalogRoute[], depth = 0, out: { route: AnalogRoute; depth
This app is not an Analog app.
- Add ngDevtools() from @santoshyadavdev/ng-devtools/vite next to
+ Add pangular() from @pangular-inspector/devtools/vite next to
analog() in vite.config.ts and run the Analog dev server.
@if (staticReport()) {
- Run ng-devtools build again to rebuild the report.
+ Run pangular build again to rebuild the report.
} @else {
Check that the dev server is running, then try again.
}
@@ -1526,7 +1526,7 @@ export class ComponentTree {
private async watch(client: DevframeRpcClient) {
for (const cleanup of this.cleanups.splice(0)) cleanup();
- const my = client.scope('ng-devtools');
+ const my = client.scope('pangular');
try {
const tree = await my.rpc.sharedState('component-tree');
if (this.destroyRef.destroyed) return;
@@ -1574,7 +1574,7 @@ export class ComponentTree {
const client = this.rpc();
if (!client) return;
this.loading.set(true);
- const my = client.scope('ng-devtools');
+ const my = client.scope('pangular');
try {
this.source.set((await my.rpc.call('get-components')) as SourceComponent[]);
this.error.set(false);
@@ -1677,7 +1677,7 @@ export class ComponentTree {
this.picking.set(true);
this.say('Click a component in the app. Press Escape to cancel.');
const result = (await client
- .scope('ng-devtools')
+ .scope('pangular')
.rpc.call('request-component-pick', { pageId: this.pickPageId ?? undefined })
.catch(() => ({ ok: false, error: 'Could not reach the devtools server.' }))) as PickResult;
if (seq !== this.pickSeq) return;
@@ -1697,7 +1697,7 @@ export class ComponentTree {
const client = this.rpc();
if (!client || !this.picking()) return;
void client
- .scope('ng-devtools')
+ .scope('pangular')
.rpc.call('cancel-component-pick', { pageId: this.pickPageId ?? undefined })
.catch(() => {});
}
@@ -1718,7 +1718,7 @@ export class ComponentTree {
const client = this.rpc();
if (!client) return;
void client
- .scope('ng-devtools')
+ .scope('pangular')
.rpc.call('select-component', { pageId: this.page()?.pageId, id })
.catch(() => {});
}
@@ -1769,7 +1769,7 @@ export class ComponentTree {
if (!client) return;
const target = id ? { pageId: this.page()?.pageId, id } : null;
void client
- .scope('ng-devtools')
+ .scope('pangular')
.rpc.call('request-page-highlight', target)
.catch(() => {});
}
diff --git a/app/src/pages/dashboard.ts b/app/src/pages/dashboard.ts
index 76615469..1bd4aa54 100644
--- a/app/src/pages/dashboard.ts
+++ b/app/src/pages/dashboard.ts
@@ -10,9 +10,9 @@ import {
} from '@angular/core';
import type { DevframeRpcClient } from 'devframe/client';
import {
- summarizeNgDevtoolsConfig,
- type ResolvedNgDevtoolsConfig,
-} from '@santoshyadavdev/ng-devtools/config';
+ summarizePangularConfig,
+ type ResolvedPangularConfig,
+} from '@pangular-inspector/devtools/config';
import { hostPageId } from '../page-id';
import { injectorTreeFor, signalGraphFor } from '../live-pages';
import { isStaticReport } from '../rpc';
@@ -167,7 +167,7 @@ export function storeCard(rows: Row[]): Card {
@if (metaState() === 'error') {
@if (staticReport()) {
- Run ng-devtools build again to rebuild the report.
+ Run pangular build again to rebuild the report.
} @else {
Check that the dev server is running, then reload the panel.
}
@@ -514,7 +514,7 @@ export class Dashboard {
protected readonly stats = computed(() =>
this.rpc() ? STATS.filter((stat) => tabEnabled(stat.tab, this.config())) : [],
);
- protected readonly configItems = computed(() => summarizeNgDevtoolsConfig(this.config()));
+ protected readonly configItems = computed(() => summarizePangularConfig(this.config()));
protected readonly metaState = signal('loading');
protected readonly states = signal>>({});
private readonly rows = signal>>({});
@@ -592,7 +592,7 @@ export class Dashboard {
const client = this.rpc();
if (!client) return;
- const my = client.scope('ng-devtools');
+ const my = client.scope('pangular');
this.metaState.set('loading');
this.states.set({});
this.rows.set({});
@@ -632,9 +632,9 @@ export class Dashboard {
.catch(() => mark('error'));
}
- private async watchLive(client: DevframeRpcClient, config: ResolvedNgDevtoolsConfig) {
+ private async watchLive(client: DevframeRpcClient, config: ResolvedPangularConfig) {
this.unwatch();
- const rpc = client.scope('ng-devtools').rpc;
+ const rpc = client.scope('pangular').rpc;
const follow = async (
name: 'injector-tree' | 'signal-graph',
target: (value: T) => void,
diff --git a/app/src/pages/di-inspector.ts b/app/src/pages/di-inspector.ts
index 02de8c03..fbe1b414 100644
--- a/app/src/pages/di-inspector.ts
+++ b/app/src/pages/di-inspector.ts
@@ -1474,7 +1474,7 @@ export class DiInspector {
if (!client) return;
const selector = node?.injector.type === 'element' ? (node.injector.selector ?? null) : null;
void client
- .scope('ng-devtools')
+ .scope('pangular')
.rpc.call('request-page-highlight', selector)
.catch(() => {});
}
@@ -1538,7 +1538,7 @@ export class DiInspector {
private async loadInjectorTree(client: DevframeRpcClient) {
this.stopTree?.();
this.stopTree = null;
- const my = client.scope('ng-devtools');
+ const my = client.scope('pangular');
let state: Awaited>;
try {
state = await my.rpc.sharedState('injector-tree');
@@ -1564,7 +1564,7 @@ export class DiInspector {
}
private async loadSourceProviders(client: DevframeRpcClient) {
- const my = client.scope('ng-devtools');
+ const my = client.scope('pangular');
try {
this.sourceProviders.set((await my.rpc.call('get-providers')) as SourceProvider[]);
} catch {
diff --git a/app/src/pages/forms-inspector.ts b/app/src/pages/forms-inspector.ts
index 8eba5163..9633fda7 100644
--- a/app/src/pages/forms-inspector.ts
+++ b/app/src/pages/forms-inspector.ts
@@ -1380,7 +1380,7 @@ export class FormsInspector {
this.loading.set(true);
this.failed.set(false);
try {
- const state = await client.scope('ng-devtools').rpc.sharedState('forms');
+ const state = await client.scope('pangular').rpc.sharedState('forms');
if (this.destroyRef.destroyed) return;
const apply = (value: unknown) => {
const snapshot = value as FormsSnapshot | undefined;
@@ -1520,7 +1520,7 @@ export class FormsInspector {
const client = this.rpc();
if (!client) return;
void client
- .scope('ng-devtools')
+ .scope('pangular')
.rpc.callEvent('request-form-highlight', formId ? { formId, path } : null);
}
diff --git a/app/src/pages/forms-types.ts b/app/src/pages/forms-types.ts
index 83a529b2..869eff86 100644
--- a/app/src/pages/forms-types.ts
+++ b/app/src/pages/forms-types.ts
@@ -132,8 +132,7 @@ export function redactLabel(reason: string): string {
return REDACT_LABELS[reason] ?? reason;
}
-export const UNMASK_DOCS_URL =
- 'https://github.com/santoshyadavdev/angular-devtools/blob/main/apps/docs/src/content/security.md#opt-fields-in-or-out';
+export const UNMASK_DOCS_URL = 'https://pangular-inspector.dev/security/#opt-fields-in-or-out';
export async function formAction(
client: DevframeRpcClient | null,
diff --git a/app/src/pages/live-route.ts b/app/src/pages/live-route.ts
index 83a882a3..7c24680a 100644
--- a/app/src/pages/live-route.ts
+++ b/app/src/pages/live-route.ts
@@ -52,7 +52,7 @@ type TabId = (typeof TABS)[number]['id'];
Could not load the live router state.
- Check that the dev server with ng-devtools is still running, then retry.
+ Check that the dev server with Pangular Inspector is still running, then retry.
@@ -312,7 +312,7 @@ export class LiveRoute {
this.loading.set(true);
this.failed.set(false);
try {
- const state = await client.scope('ng-devtools').rpc.sharedState('router');
+ const state = await client.scope('pangular').rpc.sharedState('router');
if (this.destroyRef.destroyed) return;
const apply = (value: unknown) => {
this.pages.set((value as { pages?: RouterPage[] } | undefined)?.pages ?? []);
diff --git a/app/src/pages/network-inspector.ts b/app/src/pages/network-inspector.ts
index a1fb76a7..81c815cc 100644
--- a/app/src/pages/network-inspector.ts
+++ b/app/src/pages/network-inspector.ts
@@ -16,7 +16,7 @@ import type { DevframeRpcClient } from 'devframe/client';
import { hostPageId } from '../page-id';
import { rpcCall as call } from '../rpc';
import { actionAllowed, actionBlockedMessage, panelConfig } from '../devtools-config';
-import { HTTP_RULE_STATUSES, isHttpRuleStatus } from '@santoshyadavdev/ng-devtools/config';
+import { HTTP_RULE_STATUSES, isHttpRuleStatus } from '@pangular-inspector/devtools/config';
import { LimitNote } from '../ui/limit-note';
import { Select, type SelectOption } from '../ui/select';
@@ -266,8 +266,8 @@ const HTTP_STATUS_OPTIONS: SelectOption[] = [
No requests yet.
- Add withNgDevtools() to provideHttpClient, then load a page
- of the app.
+ Add withPangular() to provideHttpClient, then load a page of
+ the app.
- Not captured: add provideNgDevtoolsHttp() to the app providers.
+ Not captured: add providePangularHttp() to the app providers.
} @else {
Warnings ({{ h.warnings.length }})
@@ -1475,7 +1475,7 @@ export class NetworkInspector {
this.loading.set(true);
this.failed.set(false);
try {
- const rpc = client.scope('ng-devtools').rpc;
+ const rpc = client.scope('pangular').rpc;
const [state, payloads] = await Promise.all([
rpc.sharedState('http'),
rpc.sharedState('http-payloads'),
diff --git a/app/src/pages/pipes-inspector.ts b/app/src/pages/pipes-inspector.ts
index 31ea4159..031dffc1 100644
--- a/app/src/pages/pipes-inspector.ts
+++ b/app/src/pages/pipes-inspector.ts
@@ -1125,7 +1125,7 @@ export class PipesInspector {
this.loading.set(true);
this.loadFailed.set(false);
try {
- const my = client.scope('ng-devtools');
+ const my = client.scope('pangular');
const pipes = (await my.rpc.call('get-pipes')) as PipeInfo[];
this.pipes.set(pipes);
const sel = this.selected();
@@ -1144,9 +1144,7 @@ export class PipesInspector {
async loadLint(client: DevframeRpcClient) {
this.lintFailed.set(false);
try {
- const findings = (await client
- .scope('ng-devtools')
- .rpc.call('pipe-lint')) as PipeLintFinding[];
+ const findings = (await client.scope('pangular').rpc.call('pipe-lint')) as PipeLintFinding[];
this.lint.set(findings);
} catch {
this.lintFailed.set(true);
@@ -1155,7 +1153,7 @@ export class PipesInspector {
async loadLive(client: DevframeRpcClient) {
try {
- const state = await client.scope('ng-devtools').rpc.sharedState('pipe-usage');
+ const state = await client.scope('pangular').rpc.sharedState('pipe-usage');
if (this.destroyRef.destroyed) return;
const apply = (value: unknown) => {
const snapshot = value as PipesSnapshot | undefined;
@@ -1181,7 +1179,7 @@ export class PipesInspector {
this.pendingRecord.set(on);
let result: { pages?: number } | undefined;
try {
- result = (await client.scope('ng-devtools').rpc.call('request-instrument-pipes', on)) as
+ result = (await client.scope('pangular').rpc.call('request-instrument-pipes', on)) as
{ pages?: number } | undefined;
} catch {
this.settleRecord("Couldn't reach the devtools server. Try again.");
@@ -1248,7 +1246,7 @@ export class PipesInspector {
const client = this.rpc();
if (!client) return;
void client
- .scope('ng-devtools')
+ .scope('pangular')
.rpc.call(
'request-page-highlight',
target ? { ...target, ...(reveal ? { reveal } : {}) } : null,
diff --git a/app/src/pages/route-inspector.ts b/app/src/pages/route-inspector.ts
index d4cc0c1a..134f834c 100644
--- a/app/src/pages/route-inspector.ts
+++ b/app/src/pages/route-inspector.ts
@@ -52,7 +52,7 @@ import { SHARED_STYLES, sourceLocation, type SourceRoute } from './router-types'
Could not scan the route files.
@if (staticReport()) {
- Run ng-devtools build again to rebuild the report.
+ Run pangular build again to rebuild the report.
} @else {
Check that the dev server is running, then refresh.
}
@@ -282,7 +282,7 @@ export class RouteInspector {
this.loading.set(true);
this.error.set(false);
try {
- const my = client.scope('ng-devtools');
+ const my = client.scope('pangular');
const result = (await my.rpc.call('get-routes')) as SourceRoute[];
this.routes.set(result);
} catch {
diff --git a/app/src/pages/route-lint.ts b/app/src/pages/route-lint.ts
index 259c9b2c..453c33f3 100644
--- a/app/src/pages/route-lint.ts
+++ b/app/src/pages/route-lint.ts
@@ -36,7 +36,7 @@ import {
@if (failed()) {
The route checks could not run.
-
The DevTools server did not answer. Check that it is still running.
+
The devtools server did not answer. Check that it is still running.
{{ nav.earlier }} navigation(s) before DevTools connected
+
{{ nav.earlier }} navigation(s) before Pangular Inspector connected
}
@@ -313,7 +313,7 @@ const PHASE_COLORS: Record = {
} @else {
-
No navigations since DevTools connected.
+
No navigations since Pangular Inspector connected.
Earlier ones are not visible. Click a link in the app to record one.
}
diff --git a/app/src/pages/signal-inspector.ts b/app/src/pages/signal-inspector.ts
index fa567f9c..c91149b7 100644
--- a/app/src/pages/signal-inspector.ts
+++ b/app/src/pages/signal-inspector.ts
@@ -1356,7 +1356,7 @@ export class SignalInspector {
async loadSignalGraph(client: DevframeRpcClient) {
for (const cleanup of this.cleanups.splice(0)) cleanup();
- const my = client.scope('ng-devtools');
+ const my = client.scope('pangular');
try {
const state = await my.rpc.sharedState('signal-graph');
if (this.destroyRef.destroyed) return;
@@ -1398,7 +1398,7 @@ export class SignalInspector {
? { pageId, env: picked.slice(ENV.length) }
: { pageId, id: picked };
void client
- .scope('ng-devtools')
+ .scope('pangular')
.rpc.call('select-signal-target', target)
.catch(() => {});
}
@@ -1412,7 +1412,7 @@ export class SignalInspector {
}
async loadSourceSignals(client: DevframeRpcClient) {
- const my = client.scope('ng-devtools');
+ const my = client.scope('pangular');
try {
const result = (await my.rpc.call('get-signals')) as SourceSignal[];
this.sourceSignals.set(result);
diff --git a/app/src/pages/store-inspector.ts b/app/src/pages/store-inspector.ts
index 4d89085e..06856d07 100644
--- a/app/src/pages/store-inspector.ts
+++ b/app/src/pages/store-inspector.ts
@@ -125,7 +125,7 @@ const CLASSIC_KINDS = new Set([
@if (failed()) {
Could not load the live store state.
-
Check that the dev server with ng-devtools is still running.
+
Check that the dev server with Pangular Inspector is still running.
} @else if (!page()) {
@@ -1839,7 +1839,7 @@ export class StoreInspector {
.catch(() => this.sourceEntries.set([]))
.finally(() => this.sourceLoaded.set(true));
try {
- const state = await client.scope('ng-devtools').rpc.sharedState('ngrx-store');
+ const state = await client.scope('pangular').rpc.sharedState('ngrx-store');
if (this.destroyRef.destroyed) return;
const apply = (value: unknown) => {
const next = value as Partial | undefined;
diff --git a/app/src/rpc.ts b/app/src/rpc.ts
index e67f6e97..15fb5770 100644
--- a/app/src/rpc.ts
+++ b/app/src/rpc.ts
@@ -1,13 +1,13 @@
import type { DevframeRpcClient } from 'devframe/client';
-/** Calls an `ng-devtools` RPC; resolves `null` without a client, rejections propagate. */
+/** Calls a `pangular` RPC; resolves `null` without a client, rejections propagate. */
export function rpcCall(
client: DevframeRpcClient | null,
name: string,
arg?: unknown,
): Promise {
if (!client) return Promise.resolve(null);
- const rpc = client.scope('ng-devtools').rpc as unknown as {
+ const rpc = client.scope('pangular').rpc as unknown as {
call: (name: string, ...args: unknown[]) => Promise;
};
return rpc.call(name, ...(arg === undefined ? [] : [arg]));
@@ -25,7 +25,7 @@ export function rpcTry(
);
}
-/** True when the panel reads a report written by `ng-devtools build`, not a live server. */
+/** True when the panel reads a report written by `pangular build`, not a live server. */
export function isStaticReport(client: DevframeRpcClient | null): boolean {
return client?.connectionMeta.backend === 'static';
}
@@ -33,7 +33,7 @@ export function isStaticReport(client: DevframeRpcClient | null): boolean {
/** Clears the boxes the panel drew in the app when the panel page goes away; returns the cleanup. */
export function clearHighlightsOnHide(client: () => DevframeRpcClient | null): () => void {
const clear = () => {
- const rpc = client()?.scope('ng-devtools').rpc;
+ const rpc = client()?.scope('pangular').rpc;
if (!rpc) return;
void rpc.callEvent('request-page-highlight', null);
void rpc.callEvent('request-form-highlight', null);
diff --git a/app/src/tab-memory.ts b/app/src/tab-memory.ts
index 6105efea..1c1f2b67 100644
--- a/app/src/tab-memory.ts
+++ b/app/src/tab-memory.ts
@@ -1,4 +1,4 @@
-const TAB_KEY = 'ng-devtools-tab';
+const TAB_KEY = 'pangular-tab';
/**
* The tab to open on load. A `#tab=` deep link wins; without one, the last tab
diff --git a/app/src/theme.service.ts b/app/src/theme.service.ts
index 043e8cad..dd560bf3 100644
--- a/app/src/theme.service.ts
+++ b/app/src/theme.service.ts
@@ -31,7 +31,7 @@ export class ThemeService {
let channel: BroadcastChannel | undefined;
try {
- channel = new BroadcastChannel('ng-devtools:theme');
+ channel = new BroadcastChannel('pangular:theme');
} catch {}
effect(() => {
const theme = this.current();
@@ -42,7 +42,7 @@ export class ThemeService {
let w: Window = window;
while (w !== w.parent) {
w = w.parent;
- w.postMessage({ type: 'ng-devtools:theme-change', theme }, '*');
+ w.postMessage({ type: 'pangular:theme-change', theme }, '*');
}
} catch {}
});
@@ -50,7 +50,7 @@ export class ThemeService {
const onMessage = (e: MessageEvent) => {
if (e.source !== window.parent) return;
const msg = e.data as { type?: unknown; theme?: unknown } | null;
- if (msg?.type !== 'ng-devtools:theme-change') return;
+ if (msg?.type !== 'pangular:theme-change') return;
pinned = true;
this.apply(msg.theme === 'dark' ? 'dark' : 'light');
};
diff --git a/app/src/ui/limit-note.ts b/app/src/ui/limit-note.ts
index 0d32520a..9bead966 100644
--- a/app/src/ui/limit-note.ts
+++ b/app/src/ui/limit-note.ts
@@ -1,8 +1,8 @@
import { Component, input } from '@angular/core';
-import type { NgDevtoolsLimit } from '@santoshyadavdev/ng-devtools/config';
+import type { PangularLimit } from '@pangular-inspector/devtools/config';
export const LIMITS_DOCS_URL =
- 'https://github.com/santoshyadavdev/angular-devtools/blob/main/apps/docs/src/content/getting-started/configuration.md#limits';
+ 'https://pangular-inspector.dev/getting-started/configuration/#limits';
/** Says that a capped timeline dropped its oldest entries, and which limit to raise. */
@Component({
@@ -49,6 +49,6 @@ export class LimitNote {
readonly dropped = input(0);
readonly max = input.required();
readonly what = input.required();
- readonly limit = input.required();
+ readonly limit = input.required();
protected readonly docsUrl = LIMITS_DOCS_URL;
}
diff --git a/app/tsconfig.json b/app/tsconfig.json
index 214c0daa..d9cb6efe 100644
--- a/app/tsconfig.json
+++ b/app/tsconfig.json
@@ -18,6 +18,6 @@
"strictInputAccessModifiers": true,
"strictTemplates": true
},
- "include": ["./**/*.ts", "../packages/ng-devtools/src/config.ts"],
+ "include": ["./**/*.ts", "../packages/devtools/src/config.ts"],
"exclude": ["node_modules", "vite.config.ts", "vitest.config.ts"]
}
diff --git a/app/vite.config.ts b/app/vite.config.ts
index 56b638a3..122488e7 100644
--- a/app/vite.config.ts
+++ b/app/vite.config.ts
@@ -2,7 +2,7 @@ import { join } from 'node:path';
import { defineConfig } from 'vite';
import angular from '@analogjs/vite-plugin-angular';
import { devframeViteBridge } from '@devframes/vite/single';
-import ngDevtools from '@santoshyadavdev/ng-devtools/devframe';
+import pangular from '@pangular-inspector/devtools/devframe';
export default defineConfig({
base: './',
@@ -28,6 +28,6 @@ export default defineConfig({
tsconfig: join(import.meta.dirname, 'tsconfig.json'),
inlineStylesExtension: 'scss',
}),
- devframeViteBridge(ngDevtools, { base: '/__ng-devtools/', auth: false }),
+ devframeViteBridge(pangular, { base: '/__pangular/', auth: false }),
],
});
diff --git a/apps/docs/package.json b/apps/docs/package.json
index 22f89ccd..c4ea419a 100644
--- a/apps/docs/package.json
+++ b/apps/docs/package.json
@@ -2,7 +2,7 @@
"name": "angular-devtools-docs",
"version": "0.0.0",
"private": true,
- "description": "Documentation site for Angular DevTools",
+ "description": "Documentation site for Pangular Inspector",
"license": "MIT",
"type": "module",
"engines": {
diff --git a/apps/docs/public/og.png b/apps/docs/public/og.png
index e6378548..4b7e12dd 100644
Binary files a/apps/docs/public/og.png and b/apps/docs/public/og.png differ
diff --git a/apps/docs/src/app/pages/index.page.ts b/apps/docs/src/app/pages/index.page.ts
index 916d8f00..d2c52d4e 100644
--- a/apps/docs/src/app/pages/index.page.ts
+++ b/apps/docs/src/app/pages/index.page.ts
@@ -191,14 +191,14 @@ import {writeToClipboard} from '../utils/clipboard';
tabindex="0"
aria-label="src/server.ts and src/main.ts"
class="p-4 text-sm overflow-x-auto text-zinc-700 dark:text-zinc-300 leading-relaxed"
- >import {{ '{' }} initNgDevtoolsHub {{ '}' }}
- from '@santoshyadavdev/ng-devtools/hub';
+ >import {{ '{' }} initPangularHub {{ '}' }}
+ from '@pangular-inspector/devtools/hub';
-const devtools = initNgDevtoolsHub({{ '{' }} ws: false {{ '}' }});
+const devtools = initPangularHub({{ '{' }} ws: false {{ '}' }});
app.use(devtools.nodeMiddleware);
// src/main.ts
-if (typeof ngDevMode === 'undefined' || ngDevMode) import('@santoshyadavdev/ng-devtools/overlay');
+if (typeof ngDevMode === 'undefined' || ngDevMode) import('@pangular-inspector/devtools/overlay');
- Your client starts ng-devtools mcp for your project folder. The server scans your source. No page ever connects to it.
+ Your client starts pangular mcp for your project folder. The server scans your source. No page ever connects to it.
Your client calls /__devframes/__mcp on the server that runs your app. Pages open in a browser report to it, so the live tools work.
@@ -26,26 +26,26 @@ There are two ways to connect. Pick one based on the data your agent needs.
| Transport | Live page data | Setup |
| --------------------------- | ------------------------------------ | ------------------------------------ |
-| stdio (`ng-devtools mcp`) | No. Source scan tools only. | A command in your MCP client config. |
+| stdio (`pangular mcp`) | No. Source scan tools only. | A command in your MCP client config. |
| HTTP (`/__devframes/__mcp`) | Yes, with the app open in a browser. | A URL on your app's dev server. |
## Connect over stdio
-The package ships an `ng-devtools` binary. Its `mcp` command starts an MCP server on stdin and stdout.
+The package ships a `pangular` binary. Its `mcp` command starts an MCP server on stdin and stdout.
### Add the stdio server to your client
```bash group="stdio" name="Claude Code" active
-claude mcp add ng-devtools -- npx @santoshyadavdev/ng-devtools mcp --root /path/to/your-app
+claude mcp add pangular -- npx @pangular-inspector/devtools mcp --root /path/to/your-app
```
```json group="stdio" name="Cursor"
// .cursor/mcp.json
{
"mcpServers": {
- "ng-devtools": {
+ "pangular": {
"command": "npx",
- "args": ["@santoshyadavdev/ng-devtools", "mcp", "--root", "${workspaceFolder}"]
+ "args": ["@pangular-inspector/devtools", "mcp", "--root", "${workspaceFolder}"]
}
}
}
@@ -55,10 +55,10 @@ claude mcp add ng-devtools -- npx @santoshyadavdev/ng-devtools mcp --root /path/
// .vscode/mcp.json
{
"servers": {
- "ng-devtools": {
+ "pangular": {
"type": "stdio",
"command": "npx",
- "args": ["@santoshyadavdev/ng-devtools", "mcp", "--root", "${workspaceFolder}"]
+ "args": ["@pangular-inspector/devtools", "mcp", "--root", "${workspaceFolder}"]
}
}
}
@@ -66,13 +66,13 @@ claude mcp add ng-devtools -- npx @santoshyadavdev/ng-devtools mcp --root /path/
### Point it at the project folder
-The server scans the folder it starts in, and your client picks that folder. Some clients start servers in `/`. Pass `--root` with the root of your Angular or Analog project, the folder with `package.json` and `angular.json`, or set `NG_DEVTOOLS_ROOT`. Cursor and VS Code expand `${workspaceFolder}` to the open folder.
+The server scans the folder it starts in, and your client picks that folder. Some clients start servers in `/`. Pass `--root` with the root of your Angular or Analog project, the folder with `package.json` and `angular.json`, or set `PANGULAR_ROOT`. Cursor and VS Code expand `${workspaceFolder}` to the open folder.
If the folder has no `angular.json` and no `package.json` that depends on `@angular/core`, the server prints a warning on stderr. Your client shows it in the MCP server log.
### Configure the stdio server
-The stdio server reads the [devtools options](../getting-started/configuration.md) from `ng-devtools.config.json` in the project folder, from the file you pass with `--config`, or from `NG_DEVTOOLS_CONFIG`. `--read-only` sets `agent.readOnly`. See [Flags for every command](../getting-started/cli.md#flags-for-every-command).
+The stdio server reads the [devtools options](../getting-started/configuration.md) from `pangular.config.json` in the project folder, from the file you pass with `--config`, or from `PANGULAR_CONFIG`. `--read-only` sets `agent.readOnly`. See [Flags for every command](../getting-started/cli.md#flags-for-every-command).
Inside this repository, pnpm devtools:mcp runs the same server against the demo app.
@@ -100,7 +100,7 @@ The path depends on how you mount the devtools. Use the port your server actuall
The standalone CLI uses port 9999 by default. If that port is taken and you did not pass `--port`, it picks a free port. Use the URL it prints.
-If you mount the devtools panel without the hub, at `/__ng-devtools/`, the endpoint is `/__ng-devtools/__mcp`.
+If you mount the devtools panel without the hub, at `/__pangular/`, the endpoint is `/__pangular/__mcp`.
### Send an Origin header
@@ -119,7 +119,7 @@ If the hub asks for the one-time code, the HTTP endpoint also asks for a bearer
| [Express hub](../getting-started/express.md) | Yes, unless you pass `auth: false` or your own `mcp` option. |
| [Vite plugin](../getting-started/vite.md) | Only when the one-time code is on. See the plugin's [`auth` option](../getting-started/vite.md#auth). |
-The hub prints a generated token in the terminal when it starts. The token changes when the server process restarts, but not when `ng serve` rebuilds `server.ts`. To keep the same token across restarts, set `NG_DEVTOOLS_MCP_TOKEN` in the environment of the server. The hub then uses that value and prints nothing.
+The hub prints a generated token in the terminal when it starts. The token changes when the server process restarts, but not when `ng serve` rebuilds `server.ts`. To keep the same token across restarts, set `PANGULAR_MCP_TOKEN` in the environment of the server. The hub then uses that value and prints nothing.
Send the token in an `Authorization: Bearer ` header, next to the `Origin` header. If your setup needs no token, leave the `Authorization` header out.
@@ -131,11 +131,11 @@ The stdio server never needs a token.
// .mcp.json
{
"mcpServers": {
- "ng-devtools": {
+ "pangular": {
"type": "http",
"url": "http://localhost:4000/__devframes/__mcp",
"headers": {
- "Authorization": "Bearer ${NG_DEVTOOLS_MCP_TOKEN}",
+ "Authorization": "Bearer ${PANGULAR_MCP_TOKEN}",
"Origin": "http://localhost:4000"
}
}
@@ -147,10 +147,10 @@ The stdio server never needs a token.
// .cursor/mcp.json
{
"mcpServers": {
- "ng-devtools": {
+ "pangular": {
"url": "http://localhost:4000/__devframes/__mcp",
"headers": {
- "Authorization": "Bearer ${env:NG_DEVTOOLS_MCP_TOKEN}",
+ "Authorization": "Bearer ${env:PANGULAR_MCP_TOKEN}",
"Origin": "http://localhost:4000"
}
}
@@ -164,17 +164,17 @@ The stdio server never needs a token.
"inputs": [
{
"type": "promptString",
- "id": "ng-devtools-token",
- "description": "ng-devtools MCP token",
+ "id": "pangular-token",
+ "description": "Pangular Inspector MCP token",
"password": true
}
],
"servers": {
- "ng-devtools": {
+ "pangular": {
"type": "http",
"url": "http://localhost:4000/__devframes/__mcp",
"headers": {
- "Authorization": "Bearer ${input:ng-devtools-token}",
+ "Authorization": "Bearer ${input:pangular-token}",
"Origin": "http://localhost:4000"
}
}
@@ -182,7 +182,7 @@ The stdio server never needs a token.
}
```
-The Claude Code and Cursor examples read the token from `NG_DEVTOOLS_MCP_TOKEN`, so set the same value for the server and the client. VS Code asks for the token the first time it starts the server.
+The Claude Code and Cursor examples read the token from `PANGULAR_MCP_TOKEN`, so set the same value for the server and the client. VS Code asks for the token the first time it starts the server.
### Open the app in a browser
@@ -190,7 +190,7 @@ The live tools read what the page reports. Without an open page, they have nothi
- Run the server that mounts the devtools: your Express SSR server, the Vite dev server, or ng-devtools dev.
+ Run the server that mounts the devtools: your Express SSR server, the Vite dev server, or pangular dev.
Load the app with the overlay. The page connects to the devtools and starts reporting.
@@ -204,7 +204,7 @@ The live tools read what the page reports. Without an open page, they have nothi
### Tool names
-The server registers tools with a colon, as `ng-devtools:get-routes`. MCP clients see them with an underscore, as `ng-devtools_get-routes`. Calls with either form work.
+The server registers tools with a colon, as `pangular:get-routes`. MCP clients see them with an underscore, as `pangular_get-routes`. Calls with either form work.
### Read and action tools
diff --git a/apps/docs/src/content/agents/resources.md b/apps/docs/src/content/agents/resources.md
index 377baeb3..bcccdffe 100644
--- a/apps/docs/src/content/agents/resources.md
+++ b/apps/docs/src/content/agents/resources.md
@@ -23,24 +23,24 @@ Resources are empty when no page is connected. Read them through the [HTTP endpo
### Resource URIs
-Clients see each resource at a `devframe://resource/` URI with the id encoded. For example, `ng-devtools:component-tree` is served at:
+Clients see each resource at a `devframe://resource/` URI with the id encoded. For example, `pangular:component-tree` is served at:
```text
-devframe://resource/ng-devtools%3Acomponent-tree
+devframe://resource/pangular%3Acomponent-tree
```
Each one returns JSON.
## Available resources
-| Resource | Name | Content |
-| ---------------------------- | ---------------------- | ------------------------------ |
-| `ng-devtools:component-tree` | Angular Component Tree | Live component hierarchy |
-| `ng-devtools:signal-graph` | Angular Signal Graph | Signal dependency graph |
-| `ng-devtools:injector-tree` | Angular Injector Tree | DI injector hierarchy |
-| `ng-devtools:ngrx-store` | NgRx Store State | Live NgRx state and change log |
-| `ng-devtools:forms` | Angular Forms | Live forms and recent changes |
-| `ng-devtools:router` | Angular Router | Live route and navigations |
+| Resource | Name | Content |
+| ------------------------- | ---------------------- | ------------------------------ |
+| `pangular:component-tree` | Angular Component Tree | Live component hierarchy |
+| `pangular:signal-graph` | Angular Signal Graph | Signal dependency graph |
+| `pangular:injector-tree` | Angular Injector Tree | DI injector hierarchy |
+| `pangular:ngrx-store` | NgRx Store State | Live NgRx state and change log |
+| `pangular:forms` | Angular Forms | Live forms and recent changes |
+| `pangular:router` | Angular Router | Live route and navigations |
### component-tree
@@ -80,16 +80,16 @@ The devtools keep their live data in shared-state keys. Every key is also listed
This table covers the data that has no resource of its own.
-| Key | Content |
-| ------------------------------ | ------------------------------------------------------------------- |
-| `ng-devtools:http` | The SSR & HTTP timeline, fault rules and hydration data |
-| `ng-devtools:http-payloads` | The TransferState payload of each page, by page id |
-| `ng-devtools:change-detection` | Change detection recordings, by page id |
-| `ng-devtools:pipe-usage` | Live pipe instances and recorded calls |
-| `ng-devtools:analog` | Analog page data and the server call log |
-| `ng-devtools:routes` | Declared but not filled. Use `get-routes` or `list-routes` instead. |
+| Key | Content |
+| --------------------------- | ------------------------------------------------------------------- |
+| `pangular:http` | The SSR & HTTP timeline, fault rules and hydration data |
+| `pangular:http-payloads` | The TransferState payload of each page, by page id |
+| `pangular:change-detection` | Change detection recordings, by page id |
+| `pangular:pipe-usage` | Live pipe instances and recorded calls |
+| `pangular:analog` | Analog page data and the server call log |
+| `pangular:routes` | Declared but not filled. Use `get-routes` or `list-routes` instead. |
-The list also includes the keys behind the six resources above (`ng-devtools:component-tree`, `ng-devtools:forms`, and so on).
+The list also includes the keys behind the six resources above (`pangular:component-tree`, `pangular:forms`, and so on).
### Read a key with a tool
@@ -100,7 +100,7 @@ Some clients only use tools. The `devframe_state_read` tool reads the same keys:
Call devframe_state_read without arguments. It returns every key.
- Call it again with key, for example ng-devtools:http. It returns the value as JSON.
+ Call it again with key, for example pangular:http. It returns the value as JSON.
diff --git a/apps/docs/src/content/agents/tools.md b/apps/docs/src/content/agents/tools.md
index 3b7ac9c0..e572816d 100644
--- a/apps/docs/src/content/agents/tools.md
+++ b/apps/docs/src/content/agents/tools.md
@@ -15,7 +15,7 @@ This page lists every tool the [MCP server](./mcp-server.md) exposes. Each group
### Names
-Tool ids use a colon, as `ng-devtools:get-routes`. MCP clients see them with an underscore, as `ng-devtools_get-routes`. The tables below drop the `ng-devtools:` prefix.
+Tool ids use a colon, as `pangular:get-routes`. MCP clients see them with an underscore, as `pangular_get-routes`. The tables below drop the `pangular:` prefix.
### Source and live tools
@@ -361,7 +361,7 @@ These tools cover *Analog apps. Most read your source. Some also read what the V
`devframe_state_read` reads the devtools' live shared state. Call it without arguments to list the keys, then with `key` to read a value as JSON.
-Use it for data that has no dedicated tool, such as the SSR & HTTP timeline (`ng-devtools:http`) or live pipe usage (`ng-devtools:pipe-usage`). See [Resources](./resources.md) for every key.
+Use it for data that has no dedicated tool, such as the SSR & HTTP timeline (`pangular:http`) or live pipe usage (`pangular:pipe-usage`). See [Resources](./resources.md) for every key.
## Where to next
diff --git a/apps/docs/src/content/community.md b/apps/docs/src/content/community.md
index 151e9926..0dc1ed03 100644
--- a/apps/docs/src/content/community.md
+++ b/apps/docs/src/content/community.md
@@ -9,7 +9,7 @@ description: Where to ask questions, report bugs and support the project.
# Get involved
-Angular DevTools is open source under the MIT license. Here is where to reach the people behind it, and how to help.
+Pangular Inspector is open source under the MIT license. Here is where to reach the people behind it, and how to help.
## Maintainers
@@ -43,7 +43,7 @@ Angular DevTools is open source under the MIT license. Here is where to reach th
A good bug report saves a round-trip. Include:
-- your Angular version and the version of `@santoshyadavdev/ng-devtools`,
+- your Angular version and the version of `@pangular-inspector/devtools`,
- your setup: Angular CLI and Express, Vite and Analog, or the standalone CLI,
- the tab that misbehaves, and what you expected to see,
- a small reproduction, if you can.
diff --git a/apps/docs/src/content/contributing/chrome-extension.md b/apps/docs/src/content/contributing/chrome-extension.md
index 10d343dd..d1bdaced 100644
--- a/apps/docs/src/content/contributing/chrome-extension.md
+++ b/apps/docs/src/content/contributing/chrome-extension.md
@@ -62,7 +62,7 @@ This builds the devtools UI (`pnpm devtools:build`), then replaces `extension/ui
Click Load unpacked and select the extension/ directory.
- Start a demo app and open DevTools. The Angular DevTools panel appears once the extension detects Angular on the page.
+ Start a demo app and open DevTools. The Pangular Inspector panel appears once the extension detects Angular on the page.
@@ -74,7 +74,7 @@ After a rebuild, click the reload icon on the extension card, then reopen DevToo
pnpm extension:zip
```
-This runs `extension:build`, then writes `dist/ng-devtools-extension.zip`. The zip leaves out `.DS_Store` files.
+This runs `extension:build`, then writes `dist/pangular-inspector-extension.zip`. The zip leaves out `.DS_Store` files.
### Upload
@@ -99,8 +99,8 @@ It then calls `chrome.permissions.contains()` for `:///*` of t
With access granted, it looks for the devtools server under these paths, in order:
-1. `/__ng-devtools/`
-2. `/__devframes/ng-devtools/`
+1. `/__pangular/`
+2. `/__devframes/pangular/`
3. `/__devframe/`
4. `/`
@@ -110,7 +110,7 @@ It records the status of each request, or "no answer" when the request fails or
### Waiting for the page id
-The overlay sets `window.__ngDevtoolsPageId` once it claims the page id, and removes it when it is disposed. After it finds the server, the panel evaluates that global every 250 milliseconds for up to five seconds. If the global never appears, it reads the `ng-devtools-page-id` value from `sessionStorage` once, for overlays that do not set the global, and loads the UI with whatever it got.
+The overlay sets `window.__pangularPageId` once it claims the page id, and removes it when it is disposed. After it finds the server, the panel evaluates that global every 250 milliseconds for up to five seconds. If the global never appears, it reads the `pangular-page-id` value from `sessionStorage` once, for overlays that do not set the global, and loads the UI with whatever it got.
### Loading the UI
@@ -128,13 +128,13 @@ On each navigation of the inspected page, the panel shows its status view again
### Theme
-The panel follows the DevTools theme. `panel-bridge.js` reads `chrome.devtools.panels.themeName` at startup, sets `data-theme` on `panel.html` so the status view matches, and passes the name to the UI as the `theme` parameter (`dark` or `default`, which is light). Its `setThemeChangeHandler` updates `panel.html` and posts an `ng-devtools:theme-change` message to the UI frame when DevTools switches theme. `ThemeService` in the panel sets `data-theme` on ``, and the CSS tokens in `app/src/styles/_theme.scss` follow it.
+The panel follows the DevTools theme. `panel-bridge.js` reads `chrome.devtools.panels.themeName` at startup, sets `data-theme` on `panel.html` so the status view matches, and passes the name to the UI as the `theme` parameter (`dark` or `default`, which is light). Its `setThemeChangeHandler` updates `panel.html` and posts a `pangular:theme-change` message to the UI frame when DevTools switches theme. `ThemeService` in the panel sets `data-theme` on ``, and the CSS tokens in `app/src/styles/_theme.scss` follow it.
### Elements panel selection
-The overlay defines `window.__ngDevtoolsComponentOf` on the page. It takes an element and returns the id of the nearest component host, through shadow roots, or `null`.
+The overlay defines `window.__pangularComponentOf` on the page. It takes an element and returns the id of the nearest component host, through shadow roots, or `null`.
-When the Elements panel selection changes, `panel-bridge.js` evaluates it with `$0`. If it gets an id, it posts an `ng-devtools:inspect-component` message to the UI frame. The UI accepts the message only from its parent window and its own origin, and only while the **Components** tab is open. The tab then expands the parent rows, clears the filter if needed, selects the row and scrolls it into view.
+When the Elements panel selection changes, `panel-bridge.js` evaluates it with `$0`. If it gets an id, it posts a `pangular:inspect-component` message to the UI frame. The UI accepts the message only from its parent window and its own origin, and only while the **Components** tab is open. The tab then expands the parent rows, clears the filter if needed, selects the row and scrolls it into view.
## Where to next
diff --git a/apps/docs/src/content/contributing/demo-apps.md b/apps/docs/src/content/contributing/demo-apps.md
index 6b3c8b75..5090e587 100644
--- a/apps/docs/src/content/contributing/demo-apps.md
+++ b/apps/docs/src/content/contributing/demo-apps.md
@@ -62,11 +62,11 @@ Keep `redirectTo` cycles (`NG04016`) in the unit tests: Angular stops them befor
The demo shows the full setup in three files:
-| File | What it adds |
-| ----------------------- | ------------------------------------------------------------------------------------------------------------------------------ |
-| `src/server.ts` | The hub, with `initNgDevtoolsHub()` mounted as Express middleware |
-| `src/main.ts` | The overlay and `registerNgrxSignals`, loaded in development only |
-| `src/app/app.config.ts` | `withNgDevtools()` and `provideNgDevtoolsHttp()` for the SSR & HTTP tab, and `withIncrementalHydration()` for the defer blocks |
+| File | What it adds |
+| ----------------------- | -------------------------------------------------------------------------------------------------------------------------- |
+| `src/server.ts` | The hub, with `initPangularHub()` mounted as Express middleware |
+| `src/main.ts` | The overlay and `registerNgrxSignals`, loaded in development only |
+| `src/app/app.config.ts` | `withPangular()` and `providePangularHttp()` for the SSR & HTTP tab, and `withIncrementalHydration()` for the defer blocks |
### Run in development
@@ -123,7 +123,7 @@ The script builds the devtools package, then starts the Vite dev server. That de
### Type-check the Analog demo
-`pnpm typecheck` runs `ngc -p examples/analog/tsconfig.app.json --noEmit`, so CI type-checks the demo's pages, templates, loaders, API routes and middleware. The demo resolves `@santoshyadavdev/ng-devtools` to the package source, which imports with `.ts` extensions, so `tsconfig.app.json` sets `rewriteRelativeImportExtensions`.
+`pnpm typecheck` runs `ngc -p examples/analog/tsconfig.app.json --noEmit`, so CI type-checks the demo's pages, templates, loaders, API routes and middleware. The demo resolves `@pangular-inspector/devtools` to the package source, which imports with `.ts` extensions, so `tsconfig.app.json` sets `rewriteRelativeImportExtensions`.
### Build and preview
@@ -151,7 +151,7 @@ pnpm --filter analog-demo preview
### Outside the workspace
-The demo is excluded in `pnpm-workspace.yaml`, so `pnpm install` and CI don't install Expo or React Native, and `pnpm typecheck` doesn't check it. It installs with npm and depends on a tarball of the devtools package (`ng-devtools.tgz`), so Metro bundles the built `dist` files as npm publishes them.
+The demo is excluded in `pnpm-workspace.yaml`, so `pnpm install` and CI don't install Expo or React Native, and `pnpm typecheck` doesn't check it. It installs with npm and depends on a tarball of the devtools package (`pangular-inspector-devtools.tgz`), so Metro bundles the built `dist` files as npm publishes them.
### Run the Angular Native demo
@@ -162,7 +162,7 @@ npm install
npm run devtools
```
-`devtools:pack` builds and packs `packages/ng-devtools` into the demo folder. After a change in the package, pack again and run `npm install ./ng-devtools.tgz`, since a plain `npm install` keeps the tarball its lockfile pins. `npm run devtools` starts the devtools server with `--no-auth` on port 9999. Then, in a second terminal, run `npm run ios`, or `adb reverse tcp:9999 tcp:9999` and `npm run android`. The demo's `README.md` has the details, and `npm run typecheck` checks its templates.
+`devtools:pack` builds and packs `packages/devtools` into the demo folder. After a change in the package, pack again and run `npm install ./pangular-inspector-devtools.tgz`, since a plain `npm install` keeps the tarball its lockfile pins. `npm run devtools` starts the devtools server with `--no-auth` on port 9999. Then, in a second terminal, run `npm run ios`, or `adb reverse tcp:9999 tcp:9999` and `npm run android`. The demo's `README.md` has the details, and `npm run typecheck` checks its templates.
## Where to next
diff --git a/apps/docs/src/content/contributing/development.md b/apps/docs/src/content/contributing/development.md
index d3e0b665..a0c4d707 100644
--- a/apps/docs/src/content/contributing/development.md
+++ b/apps/docs/src/content/contributing/development.md
@@ -49,7 +49,7 @@ app/ # Devtools UI SPA (Angular + Vite)
src/pages/ # One component per tab
vite.config.ts # Vite config with the Analog Angular plugin
packages/
- ng-devtools/ # Publishable npm package
+ devtools/ # Publishable npm package
src/devframe.ts # defineDevframe(): the tool definition
src/overlay.ts # Client script running in the user's page
src/rpc/ # Node-side RPC functions and agent tools
@@ -62,12 +62,12 @@ src/ # Angular Travel, the host demo app
### Nx projects
-| Project | Root | Targets |
-| ------------------------------ | ---------------------- | -------------------------------- |
-| `angular-devtools` | `.` (`project.json`) | `build`, `serve`, `test` |
-| `@santoshyadavdev/ng-devtools` | `packages/ng-devtools` | `build` |
-| `analog-demo` | `examples/analog` | `dev`, `build`, `preview` |
-| `angular-devtools-docs` | `apps/docs` | `dev`, `build`, `test`, and more |
+| Project | Root | Targets |
+| ------------------------------ | -------------------- | -------------------------------- |
+| `angular-devtools` | `.` (`project.json`) | `build`, `serve`, `test` |
+| `@pangular-inspector/devtools` | `packages/devtools` | `build` |
+| `analog-demo` | `examples/analog` | `dev`, `build`, `preview` |
+| `angular-devtools-docs` | `apps/docs` | `dev`, `build`, `test`, and more |
Run `pnpm exec nx show projects` to list them. Package projects get their targets from their `package.json` scripts.
@@ -90,7 +90,7 @@ The scripts call Nx. You can also run a target on a project directly:
```bash group="nx" name="Build" active
pnpm exec nx build # Angular Travel
-pnpm exec nx build @santoshyadavdev/ng-devtools # The npm package
+pnpm exec nx build @pangular-inspector/devtools # The npm package
pnpm exec nx build angular-devtools-docs # This site
```
@@ -123,7 +123,7 @@ pnpm exec nx affected -t test build
| `pnpm devtools:dev` | 5173 | The devtools UI with hot reload and its own RPC. Source-scan data only; live tabs need an app page connected, so use the SSR server for those. |
- The SSR server serves the UI built into packages/ng-devtools/dist/public. Run pnpm devtools:build-pkg to refresh it after you change app/.
+ The SSR server serves the UI built into packages/devtools/dist/public. Run pnpm devtools:build-pkg to refresh it after you change app/.
## Run the checks
@@ -179,10 +179,10 @@ A separate `axe` job in the same workflow installs Chromium and runs `pnpm test:
Two more workflows run on pull requests. Both only warn. They never fail the pull request.
-| Workflow | File | What it checks |
-| ---------------- | -------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
-| `Commit message` | `.github/workflows/commit-message.yml` | The pull request title and every commit message. The title becomes the commit on `main` when the pull request is squash merged. |
-| `Docs check` | `.github/workflows/docs-check.yml` | That a change to `packages/ng-devtools/src/`, `app/src/` or the top-level files in `extension/` also changes a page in `apps/docs/src/content`. Tests don't count. |
+| Workflow | File | What it checks |
+| ---------------- | -------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `Commit message` | `.github/workflows/commit-message.yml` | The pull request title and every commit message. The title becomes the commit on `main` when the pull request is squash merged. |
+| `Docs check` | `.github/workflows/docs-check.yml` | That a change to `packages/devtools/src/`, `app/src/` or the top-level files in `extension/` also changes a page in `apps/docs/src/content`. Tests don't count. |
If a code change needs no docs change, add the `no-docs` label to the pull request and say why in the description. The `Docs check` workflow then skips the warning.
@@ -190,9 +190,9 @@ If a code change needs no docs change, add the `no-docs` label to the pull reque
### Add an RPC function
-1. Create the function in `packages/ng-devtools/src/rpc/`.
-2. Register it in `packages/ng-devtools/src/devframe.ts`.
-3. Map it to its inspector in `RPC_INSPECTOR` in `packages/ng-devtools/src/config.ts`, so turning the inspector off removes it.
+1. Create the function in `packages/devtools/src/rpc/`.
+2. Register it in `packages/devtools/src/devframe.ts`.
+3. Map it to its inspector in `RPC_INSPECTOR` in `packages/devtools/src/config.ts`, so turning the inspector off removes it.
4. Call it from the UI in `app/src/pages/`.
### Add a tab
@@ -205,7 +205,7 @@ If a code change needs no docs change, add the `no-docs` label to the pull reque
Add `agent: { description }` to an RPC function, or call `ctx.agent.registerTool()` in the devframe setup. List the tool on the [Tools](../agents/tools.md) page.
-Map a registered tool to its inspector in `AGENT_INSPECTOR` in `packages/ng-devtools/src/config.ts`, so `inspectors` and `agent.tools` can hide it. A tool that acts on the page sets `safety: 'action'`, so `agent.readOnly` drops it. See [Configuration](../getting-started/configuration.md).
+Map a registered tool to its inspector in `AGENT_INSPECTOR` in `packages/devtools/src/config.ts`, so `inspectors` and `agent.tools` can hide it. A tool that acts on the page sets `safety: 'action'`, so `agent.readOnly` drops it. See [Configuration](../getting-started/configuration.md).
Run pnpm extension:build and commit extension/ui. CI fails when it is stale. See Build the extension.
diff --git a/apps/docs/src/content/contributing/kitchen-sink.md b/apps/docs/src/content/contributing/kitchen-sink.md
index 0b3cc325..2cdc6288 100644
--- a/apps/docs/src/content/contributing/kitchen-sink.md
+++ b/apps/docs/src/content/contributing/kitchen-sink.md
@@ -75,7 +75,7 @@ import {appConfig} from './app/app.config';
bootstrapApplication(App, appConfig).then(() => {
if (typeof ngDevMode === 'undefined' || ngDevMode) {
- return import('@santoshyadavdev/ng-devtools/overlay');
+ return import('@pangular-inspector/devtools/overlay');
}
return undefined;
});
@@ -84,19 +84,19 @@ bootstrapApplication(App, appConfig).then(() => {
### Code group
```bash group="install" name="pnpm" image="https://cdn.simpleicons.org/pnpm/F69220" active
-pnpm add @santoshyadavdev/ng-devtools devframe
+pnpm add @pangular-inspector/devtools devframe
```
```bash group="install" name="npm" image="https://cdn.simpleicons.org/npm/CB3837"
-npm install @santoshyadavdev/ng-devtools devframe
+npm install @pangular-inspector/devtools devframe
```
```bash group="install" name="yarn" image="https://cdn.simpleicons.org/yarn/2C8EBB"
-yarn add @santoshyadavdev/ng-devtools devframe
+yarn add @pangular-inspector/devtools devframe
```
```bash group="install" name="bun" image="https://bun.sh/logo.svg"
-bun add @santoshyadavdev/ng-devtools devframe
+bun add @pangular-inspector/devtools devframe
```
### File import
@@ -110,7 +110,7 @@ bun add @santoshyadavdev/ng-devtools devframe
```json
{
"mcpServers": {
- "ng-devtools": {"command": "npx", "args": ["@santoshyadavdev/ng-devtools", "mcp"]}
+ "pangular": {"command": "npx", "args": ["@pangular-inspector/devtools", "mcp"]}
}
}
```
@@ -241,7 +241,7 @@ Text between alerts.
- Run pnpm add @santoshyadavdev/ng-devtools devframe.
+ Run pnpm add @pangular-inspector/devtools devframe.
Add the hub to your server.
diff --git a/apps/docs/src/content/contributing/publishing.md b/apps/docs/src/content/contributing/publishing.md
index 9f043d1b..89faa618 100644
--- a/apps/docs/src/content/contributing/publishing.md
+++ b/apps/docs/src/content/contributing/publishing.md
@@ -9,7 +9,7 @@ description: Bump the version, build, and publish the npm package. Ship the Chro
# Publishing
-The devtools ship as one npm package, `@santoshyadavdev/ng-devtools`, from `packages/ng-devtools`. It holds the Node-side logic, RPC, CLI, overlay, popup, and the built UI in `dist/public`.
+The devtools ship as one npm package, `@pangular-inspector/devtools`, from `packages/devtools`. It holds the Node-side logic, RPC, CLI, overlay, popup, and the built UI in `dist/public`.
## What ships
@@ -17,16 +17,16 @@ The package publishes `dist/` and `bin.mjs`. On publish, `publishConfig.exports`
| Import | Published file |
| --------------------------------------- | ------------------- |
-| `@santoshyadavdev/ng-devtools` | `dist/devframe.mjs` |
-| `@santoshyadavdev/ng-devtools/devframe` | `dist/devframe.mjs` |
-| `@santoshyadavdev/ng-devtools/config` | `dist/config.mjs` |
-| `@santoshyadavdev/ng-devtools/overlay` | `dist/overlay.mjs` |
-| `@santoshyadavdev/ng-devtools/popup` | `dist/popup.mjs` |
-| `@santoshyadavdev/ng-devtools/http` | `dist/http.mjs` |
-| `@santoshyadavdev/ng-devtools/hub` | `dist/hub.mjs` |
-| `@santoshyadavdev/ng-devtools/vite` | `dist/vite.mjs` |
+| `@pangular-inspector/devtools` | `dist/devframe.mjs` |
+| `@pangular-inspector/devtools/devframe` | `dist/devframe.mjs` |
+| `@pangular-inspector/devtools/config` | `dist/config.mjs` |
+| `@pangular-inspector/devtools/overlay` | `dist/overlay.mjs` |
+| `@pangular-inspector/devtools/popup` | `dist/popup.mjs` |
+| `@pangular-inspector/devtools/http` | `dist/http.mjs` |
+| `@pangular-inspector/devtools/hub` | `dist/hub.mjs` |
+| `@pangular-inspector/devtools/vite` | `dist/vite.mjs` |
-The `ng-devtools` binary is `bin.mjs`. In the workspace, the exports point at the TypeScript sources instead.
+The `pangular` binary is `bin.mjs`. In the workspace, the exports point at the TypeScript sources instead.
### How the package builds
@@ -47,7 +47,7 @@ The package's `build` script runs two steps:
### 1. Bump the version
-Update `version` in `packages/ng-devtools/package.json`. In the same commit, add a section for the version to `packages/ng-devtools/CHANGELOG.md`. The changelog follows [Keep a Changelog](https://keepachangelog.com), with entries grouped as Upgrade notes, Security fixes, Features and Documentation. Use a message like `chore(release): ng-devtools 0.0.5`.
+Update `version` in `packages/devtools/package.json`. In the same commit, add a section for the version to `packages/devtools/CHANGELOG.md`. The changelog follows [Keep a Changelog](https://keepachangelog.com), with entries grouped as Upgrade notes, Security fixes, Features and Documentation. Use a message like `chore(release): 0.0.7`.
### 2. Check the build
@@ -67,7 +67,7 @@ If `app/` changed since the last release, run `pnpm extension:build` and commit
pnpm devtools:publish
```
-This runs `pnpm --filter @santoshyadavdev/ng-devtools publish --access public`. The `prepack` build bundles the library and the UI.
+This runs `pnpm --filter @pangular-inspector/devtools publish --access public`. The `prepack` build bundles the library and the UI.
pnpm publish checks git before it publishes. Run it from a clean working tree on main.
@@ -80,7 +80,7 @@ The extension has its own version, in `extension/manifest.json`. It does not fol
1. Bump `version` in `extension/manifest.json`.
2. Run `pnpm extension:zip`. It rebuilds `extension/ui` first.
3. Commit `extension/ui` and the manifest.
-4. Upload `dist/ng-devtools-extension.zip`.
+4. Upload `dist/pangular-inspector-extension.zip`.
See [Build the extension](./chrome-extension.md) for the upload steps.
diff --git a/apps/docs/src/content/contributing/writing-docs.md b/apps/docs/src/content/contributing/writing-docs.md
index dae94ac1..8ae40f8a 100644
--- a/apps/docs/src/content/contributing/writing-docs.md
+++ b/apps/docs/src/content/contributing/writing-docs.md
@@ -164,10 +164,10 @@ Always set the language. When the code belongs in a specific file, put the path
```ts {6}
// src/app/app.config.ts
import {ApplicationConfig} from '@angular/core';
-import {provideNgDevtoolsHttp} from '@santoshyadavdev/ng-devtools/http';
+import {providePangularHttp} from '@pangular-inspector/devtools/http';
export const appConfig: ApplicationConfig = {
- providers: [provideNgDevtoolsHttp()],
+ providers: [providePangularHttp()],
};
```
````
@@ -178,17 +178,17 @@ For install commands, use a code group so readers pick their package manager. Li
````md
```bash group="install" name="pnpm" active
-pnpm add @santoshyadavdev/ng-devtools devframe
+pnpm add @pangular-inspector/devtools devframe
```
```bash group="install" name="npm"
-npm install @santoshyadavdev/ng-devtools devframe
+npm install @pangular-inspector/devtools devframe
```
````
### Rules for samples
-- Samples must run. Include every import, and match the real exports and option names in `packages/ng-devtools`.
+- Samples must run. Include every import, and match the real exports and option names in `packages/devtools`.
- Prefer the demo apps as the source. The Angular Travel demo is in `src/` and the Analog demo is in `examples/analog`.
- Use realistic names: `TripSearch`, `authGuard`, `bookingForm`. Avoid `Foo`, `Example` or `prop1`.
- Load the overlay only in development builds, with the `ngDevMode` check the installation page uses.
@@ -200,13 +200,13 @@ npm install @santoshyadavdev/ng-devtools devframe
The docs describe what the code does today. Before you write a claim, find it in the source.
-| Page | Source of truth |
-| ------------------------- | --------------------------------------------------------------------------------------------------------------------- |
-| Inspector pages | The tab in `app/src/pages/` and its collector in `packages/ng-devtools/src/` |
-| Agent tools and resources | `packages/ng-devtools/src/devframe.ts`, `rpc/*.ts` and `rpc/analog-register.ts` |
-| Setup pages | `packages/ng-devtools/package.json` exports, `hub.ts`, `vite.ts`, `config.ts`, `overlay.ts`, `popup.ts` and the demos |
-| Security | `hub.ts`, `vite.ts` and the redaction code, such as `forms-privacy.ts` |
-| Contributing | Root `package.json` scripts, `nx.json`, `project.json` files and `.github/workflows` |
+| Page | Source of truth |
+| ------------------------- | ------------------------------------------------------------------------------------------------------------------ |
+| Inspector pages | The tab in `app/src/pages/` and its collector in `packages/devtools/src/` |
+| Agent tools and resources | `packages/devtools/src/devframe.ts`, `rpc/*.ts` and `rpc/analog-register.ts` |
+| Setup pages | `packages/devtools/package.json` exports, `hub.ts`, `vite.ts`, `config.ts`, `overlay.ts`, `popup.ts` and the demos |
+| Security | `hub.ts`, `vite.ts` and the redaction code, such as `forms-privacy.ts` |
+| Contributing | Root `package.json` scripts, `nx.json`, `project.json` files and `.github/workflows` |
Check names exactly: labels, buttons, tool names, arguments, option names and defaults. When the code changes, update the page in the same pull request.
diff --git a/apps/docs/src/content/getting-started/angular-native.md b/apps/docs/src/content/getting-started/angular-native.md
index 080237df..044f0444 100644
--- a/apps/docs/src/content/getting-started/angular-native.md
+++ b/apps/docs/src/content/getting-started/angular-native.md
@@ -9,7 +9,7 @@ description: Send live components, signals, injectors and NgRx stores from an An
# Angular Native
-[Angular Native](https://ng-native.com) renders *Angular onto React Native's Fabric renderer, so the app has no DOM for the [browser overlay](./overlay.md) to walk. The `@santoshyadavdev/ng-devtools/overlay-angular-native` entry point walks Angular Native's own node tree instead and sends the same live data to a devtools server that runs on your machine.
+[Angular Native](https://ng-native.com) renders *Angular onto React Native's Fabric renderer, so the app has no DOM for the [browser overlay](./overlay.md) to walk. The `@pangular-inspector/devtools/overlay-angular-native` entry point walks Angular Native's own node tree instead and sends the same live data to a devtools server that runs on your machine.
## What it shows
@@ -59,7 +59,7 @@ The [Angular Native demo](../contributing/demo-apps.md#angular-native-demo) (`ex
- Add @santoshyadavdev/ng-devtools and devframe to the app, as on the installation page.
+ Add @pangular-inspector/devtools and devframe to the app, as on the installation page.
Pass the root node of the mounted app. The check keeps the overlay out of release builds.
@@ -79,7 +79,7 @@ The [Angular Native demo](../contributing/demo-apps.md#angular-native-demo) (`ex
import {AppRegistry, Image, Platform, processColor} from 'react-native';
import {mount} from '@ng-native/platform';
import {getFabricUIManager, registerPlatformComponents} from '@ng-native/fabric';
-import {initAngularNativeOverlay} from '@santoshyadavdev/ng-devtools/overlay-angular-native';
+import {initAngularNativeOverlay} from '@pangular-inspector/devtools/overlay-angular-native';
import {App} from './app/app.ts';
registerPlatformComponents(Platform.OS);
@@ -98,13 +98,13 @@ AppRegistry.registerRunnable('main', ({rootTag}) => {
### Start the server
```bash
-npx @santoshyadavdev/ng-devtools dev --no-auth
+npx @pangular-inspector/devtools dev --no-auth
```
When it is ready, the server prints the Angular Native view on its own line:
```text
- ng-devtools v0.0.6
+ pangular v0.0.7
Panel: http://localhost:9999/
Angular Native apps: http://localhost:9999/?view=angular-native
MCP: http://localhost:9999/__mcp
@@ -149,7 +149,7 @@ The server's [configuration](./configuration.md) applies to the app: inspectors
- Check the Metro log for a [ng-devtools] line. A warning about --no-auth means the server asked for a code. A warning about reaching the server means the address is wrong for where the app runs. A release build has no ng global, so nothing is collected there.
+ Check the Metro log for a [pangular] line. A warning about --no-auth means the server asked for a code. A warning about reaching the server means the address is wrong for where the app runs. A release build has no ng global, so nothing is collected there.
Angular records providers only when a window global exists as mount() creates the platform. If the list stays empty, check that window is defined before mount() runs.
diff --git a/apps/docs/src/content/getting-started/chrome-extension.md b/apps/docs/src/content/getting-started/chrome-extension.md
index 97b34d91..a193b87d 100644
--- a/apps/docs/src/content/getting-started/chrome-extension.md
+++ b/apps/docs/src/content/getting-started/chrome-extension.md
@@ -4,12 +4,12 @@ description: Open the devtools as a panel inside Chrome DevTools.
---
- An Angular DevTools panel inside Chrome DevTools. It loads the devtools UI and connects it to the dev server of the page you inspect.
+ A Pangular Inspector panel inside Chrome DevTools. It loads the devtools UI and connects it to the dev server of the page you inspect.
# Chrome extension
-The Chrome extension adds a panel named **Angular DevTools** to Chrome DevTools. The panel loads the devtools UI and connects it to the dev server of the page you are inspecting.
+The Chrome extension adds a panel named **Pangular Inspector** to Chrome DevTools. The panel loads the devtools UI and connects it to the dev server of the page you are inspecting.
The page still needs the devtools mounted on its server and the overlay loaded. The extension is one more way to open the devtools. It does not replace the setup. Start with Angular CLI and Express or Vite and Analog.
@@ -47,7 +47,7 @@ The Chrome extension adds a panel named **Angular DevTools** to Chrome DevTools.
Click Load unpacked and select the extension/ directory.
- The Angular DevTools panel appears next to the built-in panels.
+ The Pangular Inspector panel appears next to the built-in panels.
@@ -72,12 +72,12 @@ A content script checks each page for Angular: an `ng-version` attribute or a `w
The panel looks for the devtools server on the origin of the inspected page. It tries these paths in order:
-| Path | Mounted by |
-| --------------------------- | ------------------------------------- |
-| `/__ng-devtools/` | A panel mounted with `initDevframe()` |
-| `/__devframes/ng-devtools/` | The Express hub or the Vite plugin |
-| `/__devframe/` | A bare devframe mount |
-| `/` | A devframe served at the root |
+| Path | Mounted by |
+| ------------------------ | ------------------------------------- |
+| `/__pangular/` | A panel mounted with `initDevframe()` |
+| `/__devframes/pangular/` | The Express hub or the Vite plugin |
+| `/__devframe/` | A bare devframe mount |
+| `/` | A devframe served at the root |
Under each path it asks for `__devframe/__connection.json`, then `__connection.json`. It connects the UI to the first path that answers with a connection file. Each request times out after 1.5 seconds.
@@ -95,7 +95,7 @@ The extension can reach loopback hosts from the start. For any other host, such
### The inspected tab
-The overlay gives each page an id and exposes it on the page as `window.__ngDevtoolsPageId`. The panel passes the id of the page it inspects to the UI. If several tabs run the same app, the panel shows the tab you inspect, not the one that reported last.
+The overlay gives each page an id and exposes it on the page as `window.__pangularPageId`. The panel passes the id of the page it inspects to the UI. If several tabs run the same app, the panel shows the tab you inspect, not the one that reported last.
The overlay claims the id after it connects to the server, so it can come later than the server answers. The panel waits up to five seconds for the id. If no id appears in that time, it uses the id the tab kept from an earlier load, if there is one. Without any id, it loads the UI and shows the page that reported last.
diff --git a/apps/docs/src/content/getting-started/cli.md b/apps/docs/src/content/getting-started/cli.md
index e6109ceb..c85c3f5f 100644
--- a/apps/docs/src/content/getting-started/cli.md
+++ b/apps/docs/src/content/getting-started/cli.md
@@ -9,7 +9,7 @@ description: Run the devtools from the command line, build a static report, or s
# Standalone CLI
-The package installs an `ng-devtools` binary. Run it from the root of your Angular workspace, or point it there with `--root`. It scans the source files in that folder, so it works without starting your app.
+The package installs a `pangular` binary. Run it from the root of your Angular workspace, or point it there with `--root`. It scans the source files in that folder, so it works without starting your app.
## Commands
@@ -19,24 +19,24 @@ The package installs an `ng-devtools` binary. Run it from the root of your Angul
| `build` | Writes a static copy of the devtools with the scan. |
| `mcp` | Starts an MCP server over stdio for coding agents. |
-`ng-devtools --version` prints the package version. An unknown command or flag prints one error line and exits with code 1. `ng-devtools --help` lists the commands and flags.
+`pangular --version` prints the package version. An unknown command or flag prints one error line and exits with code 1. `pangular --help` lists the commands and flags.
### Flags for every command
-| Flag | What it does |
-| ----------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| `--root ` | The project folder to scan. The default is `NG_DEVTOOLS_ROOT`, then the working directory. |
-| `--config ` | A JSON file with the [devtools options](./configuration.md). The default is `NG_DEVTOOLS_CONFIG`, then `ng-devtools.config.json` in the project folder, if it exists. |
-| `--read-only` | Sets `agent.readOnly`: drops the agent tools that act on the page or the server. See [Inspectors and agent tools](./configuration.md#inspectors-and-agent-tools). |
+| Flag | What it does |
+| ----------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `--root ` | The project folder to scan. The default is `PANGULAR_ROOT`, then the working directory. |
+| `--config ` | A JSON file with the [devtools options](./configuration.md). The default is `PANGULAR_CONFIG`, then `pangular.config.json` in the project folder, if it exists. |
+| `--read-only` | Sets `agent.readOnly`: drops the agent tools that act on the page or the server. See [Inspectors and agent tools](./configuration.md#inspectors-and-agent-tools). |
If the project folder has no `angular.json` and no `package.json` that depends on `@angular/core`, the CLI prints a warning on stderr, because the scans find nothing there.
### Config file
-The file holds the same options as `createNgDevtools()`, as JSON:
+The file holds the same options as `createPangular()`, as JSON:
```json
-// ng-devtools.config.json
+// pangular.config.json
{
"inspectors": {"analog": false},
"agent": {"readOnly": true},
@@ -49,19 +49,19 @@ A missing `--config` file or invalid JSON stops the command with an error.
### Run it without installing
```bash group="run" name="npx" image="https://cdn.simpleicons.org/npm/CB3837" active
-npx @santoshyadavdev/ng-devtools dev
+npx @pangular-inspector/devtools dev
```
```bash group="run" name="pnpm" image="https://cdn.simpleicons.org/pnpm/F69220"
-pnpm dlx @santoshyadavdev/ng-devtools dev
+pnpm dlx @pangular-inspector/devtools dev
```
```bash group="run" name="yarn" image="https://cdn.simpleicons.org/yarn/2C8EBB"
-yarn dlx @santoshyadavdev/ng-devtools dev
+yarn dlx -p @pangular-inspector/devtools pangular dev
```
```bash group="run" name="bun" image="https://bun.sh/logo.svg"
-bunx @santoshyadavdev/ng-devtools dev
+bunx --package @pangular-inspector/devtools pangular dev
```
### Run the installed binary
@@ -69,25 +69,25 @@ bunx @santoshyadavdev/ng-devtools dev
With the package installed in your project, call the binary through your package manager:
```bash
-npx ng-devtools dev
-npx ng-devtools build --outDir dist-report
-npx ng-devtools mcp
+npx pangular dev
+npx pangular build --outDir dist-report
+npx pangular mcp
```
## Dev server
### Start it
-The default command starts a local server with the devtools UI. `dev` is optional: `npx @santoshyadavdev/ng-devtools` does the same.
+The default command starts a local server with the devtools UI. `dev` is optional: `npx @pangular-inspector/devtools` does the same.
```bash
-npx @santoshyadavdev/ng-devtools dev --port 9999 --open
+npx @pangular-inspector/devtools dev --port 9999 --open
```
When the server is ready, it prints the version, the panel URL, the panel URL for [Angular Native](./angular-native.md) apps and the MCP endpoint:
```text
- ng-devtools v0.0.6
+ pangular v0.0.7
Panel: http://localhost:9999/
Angular Native apps: http://localhost:9999/?view=angular-native
MCP: http://localhost:9999/__mcp
@@ -131,7 +131,7 @@ When no app is connected, the tabs show what your source declares. An [Angular N
`build` writes a self-contained static copy of the devtools with the source scan baked in: components, routes, signals, providers, pipes, NgRx declarations and build metadata.
```bash
-npx @santoshyadavdev/ng-devtools build --outDir dist-report
+npx @pangular-inspector/devtools build --outDir dist-report
```
### Report flags
@@ -160,7 +160,7 @@ The output is static files. Open it offline or host it on any static file server
`mcp` starts an *MCP server over stdio for coding agents:
```bash
-npx @santoshyadavdev/ng-devtools mcp
+npx @pangular-inspector/devtools mcp
```
Your agent client runs this command for you. [MCP server](../agents/mcp-server.md) covers client setup.
diff --git a/apps/docs/src/content/getting-started/configuration.md b/apps/docs/src/content/getting-started/configuration.md
index bfc3a54c..65e49449 100644
--- a/apps/docs/src/content/getting-started/configuration.md
+++ b/apps/docs/src/content/getting-started/configuration.md
@@ -15,13 +15,13 @@ Everything is on when you leave the options out. You set them once, on the serve
These three functions take the same options:
-| Function | Import | Setup |
-| --------------------- | --------------------------------------- | --------------------------------------------------------------- |
-| `initNgDevtoolsHub()` | `@santoshyadavdev/ng-devtools/hub` | [Angular CLI and Express](./express.md) |
-| `ngDevtools()` | `@santoshyadavdev/ng-devtools/vite` | [Vite and Analog](./vite.md) |
-| `createNgDevtools()` | `@santoshyadavdev/ng-devtools/devframe` | A custom devframe host, such as `initDevframe()` without a hub. |
+| Function | Import | Setup |
+| ------------------- | --------------------------------------- | --------------------------------------------------------------- |
+| `initPangularHub()` | `@pangular-inspector/devtools/hub` | [Angular CLI and Express](./express.md) |
+| `pangular()` | `@pangular-inspector/devtools/vite` | [Vite and Analog](./vite.md) |
+| `createPangular()` | `@pangular-inspector/devtools/devframe` | A custom devframe host, such as `initDevframe()` without a hub. |
-The `ng-devtools` binary reads the same options from a JSON file, for `dev`, `build` and `mcp`. See [Config file](./cli.md#config-file).
+The `pangular` binary reads the same options from a JSON file, for `dev`, `build` and `mcp`. See [Config file](./cli.md#config-file).
### Express hub
@@ -30,10 +30,10 @@ Pass the options next to the [access options](../security.md#express-hub) `auth`
```ts {8-10}
// src/server.ts
import express from 'express';
-import {initNgDevtoolsHub} from '@santoshyadavdev/ng-devtools/hub';
+import {initPangularHub} from '@pangular-inspector/devtools/hub';
const app = express();
-const devtools = initNgDevtoolsHub({
+const devtools = initPangularHub({
ws: false,
inspectors: {pipes: false},
agent: {readOnly: true},
@@ -44,18 +44,18 @@ app.use(devtools.nodeMiddleware);
### Vite plugin
-Pass them to `ngDevtools()`, next to the [access options](../security.md#vite-plugin) `auth` and `allowedOrigins`:
+Pass them to `pangular()`, next to the [access options](../security.md#vite-plugin) `auth` and `allowedOrigins`:
```ts {9-12}
// vite.config.ts
import analog from '@analogjs/platform';
-import ngDevtools from '@santoshyadavdev/ng-devtools/vite';
+import pangular from '@pangular-inspector/devtools/vite';
import {defineConfig} from 'vite';
export default defineConfig({
plugins: [
analog(),
- ngDevtools({
+ pangular({
actions: {http: false, analog: false},
limits: {refreshMs: 1000, navigations: 100},
}),
@@ -65,17 +65,17 @@ export default defineConfig({
### Custom devframe host
-The default export of `@santoshyadavdev/ng-devtools/devframe` uses the defaults. Call `createNgDevtools()` to pass options:
+The default export of `@pangular-inspector/devtools/devframe` uses the defaults. Call `createPangular()` to pass options:
```ts {7-9}
// src/server.ts
import express from 'express';
import {initDevframe} from 'devframe/initiate';
-import {createNgDevtools} from '@santoshyadavdev/ng-devtools/devframe';
+import {createPangular} from '@pangular-inspector/devtools/devframe';
const app = express();
-const devtools = initDevframe(createNgDevtools({agent: {readOnly: true}}), {
- base: '/__ng-devtools/',
+const devtools = initDevframe(createPangular({agent: {readOnly: true}}), {
+ base: '/__pangular/',
});
app.use(devtools.nodeMiddleware);
```
@@ -84,11 +84,11 @@ app.use(devtools.nodeMiddleware);
### Type
-`@santoshyadavdev/ng-devtools/config` exports the type. The hub and Vite entry points export it too.
+`@pangular-inspector/devtools/config` exports the type. The hub and Vite entry points export it too.
```ts
-// @santoshyadavdev/ng-devtools/config
-type NgDevtoolsInspector =
+// @pangular-inspector/devtools/config
+type PangularInspector =
| 'components'
| 'injectors'
| 'signals'
@@ -99,12 +99,12 @@ type NgDevtoolsInspector =
| 'http'
| 'analog';
-type NgDevtoolsAction = 'forms' | 'router' | 'ngrx' | 'http' | 'analog';
+type PangularAction = 'forms' | 'router' | 'ngrx' | 'http' | 'analog';
-interface NgDevtoolsConfig {
- inspectors?: Partial>;
- agent?: {readOnly?: boolean; tools?: Partial>};
- actions?: boolean | Partial>;
+interface PangularConfig {
+ inspectors?: Partial>;
+ agent?: {readOnly?: boolean; tools?: Partial>};
+ actions?: boolean | Partial>;
redaction?: {secretNames?: string[]; unmask?: string[]};
limits?: {
refreshMs?: number;
@@ -151,7 +151,7 @@ The server refuses a blocked action. The panel disables its controls and shows a
| Option | Default | What it does |
| ----------------------- | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `redaction.secretNames` | `[]` | Extra field names to treat as secret, on top of the built-in list. They match by words, like the built-in list, so `passport` also covers `passportNumber`. |
-| `redaction.unmask` | `[]` | Field names to show even when they look secret. They join the `unmask` list of `window.__NG_DEVTOOLS_FORMS__`. |
+| `redaction.unmask` | `[]` | Field names to show even when they look secret. They join the `unmask` list of `window.__PANGULAR_FORMS__`. |
Forms, the router, component inputs, signals, NgRx, pipes, Analog previews and SSR & HTTP URLs use the extra secret names. Each list keeps up to 100 names. See [Access and redaction](../security.md#what-is-redacted) for what is redacted and what unmasking allows.
@@ -168,16 +168,16 @@ Values outside the bounds are clamped to the nearest one.
| `limits.changeLog` | `200` | 10 to 2000 | NgRx change log entries kept per page. |
| `limits.cdCycles` | `200` | 10 to 2000 | Change detection cycles kept per page while recording. |
-When a timeline reaches its limit, the oldest entries are dropped. The timeline then shows a note above the list, such as "Showing the latest 200 HTTP calls. 12 older entries were dropped." with the limit to raise. This applies to the **SSR & HTTP** timeline, the router navigation timeline, the forms timeline, the NgRx change log and the change detection recording. The `explain-navigation`, `form-history` and `change-detection` agent tools add the same note, and the `ng-devtools:ngrx-store` resource reports a `dropped` count per page.
+When a timeline reaches its limit, the oldest entries are dropped. The timeline then shows a note above the list, such as "Showing the latest 200 HTTP calls. 12 older entries were dropped." with the limit to raise. This applies to the **SSR & HTTP** timeline, the router navigation timeline, the forms timeline, the NgRx change log and the change detection recording. The `explain-navigation`, `form-history` and `change-detection` agent tools add the same note, and the `pangular:ngrx-store` resource reports a `dropped` count per page.
On Angular 20 and later, the page reports about 250 ms after Angular runs change detection, plus a heartbeat every 4 seconds. `refreshMs` doesn't change that. The page polls every `refreshMs` instead when it can't follow change detection, such as until the app bootstraps. The Analog inspector also reads the page every `refreshMs`. At any value, the page sends its data at least every 8 seconds, even when nothing changed, so the server never drops a page that is still open.
## Check the active configuration
-The server checks the options when it starts. An unknown key, a value of the wrong type or a limit outside its bounds prints one `[ng-devtools]` warning in the terminal that lists each problem and the value used instead. An unknown key names the closest known key:
+The server checks the options when it starts. An unknown key, a value of the wrong type or a limit outside its bounds prints one `[pangular]` warning in the terminal that lists each problem and the value used instead. An unknown key names the closest known key:
```text
-[ng-devtools] The devtools config has 2 problems:
+[pangular] The devtools config has 2 problems:
- Unknown option `agent.readonly` was ignored. Did you mean `readOnly`?
- `actions` should be true, false or an object, got the string "false". It was ignored, so every action is allowed.
```
diff --git a/apps/docs/src/content/getting-started/express.md b/apps/docs/src/content/getting-started/express.md
index f9671957..2df0a224 100644
--- a/apps/docs/src/content/getting-started/express.md
+++ b/apps/docs/src/content/getting-started/express.md
@@ -19,10 +19,10 @@ In an *Angular app with server-side rendering, the devtools run inside your Expr
- Add @santoshyadavdev/ng-devtools and devframe. See Installation.
+ Add @pangular-inspector/devtools and devframe. See Installation.
- Add initNgDevtoolsHub() to server.ts, before your other routes.
+ Add initPangularHub() to server.ts, before your other routes.
Import the overlay in main.ts, in development only.
@@ -39,10 +39,10 @@ In an *Angular app with server-side rendering, the devtools run inside your Expr
```ts {3,6-7}
// src/server.ts
import express from 'express';
-import {initNgDevtoolsHub} from '@santoshyadavdev/ng-devtools/hub';
+import {initPangularHub} from '@pangular-inspector/devtools/hub';
const app = express();
-const devtools = initNgDevtoolsHub({ws: false});
+const devtools = initPangularHub({ws: false});
app.use(devtools.nodeMiddleware);
```
@@ -55,7 +55,7 @@ Mount the middleware before `express.static` and the Angular SSR handler, so the
```ts
// src/server.ts
const app = express();
-const devtools = initNgDevtoolsHub({ws: false});
+const devtools = initPangularHub({ws: false});
app.use(devtools.nodeMiddleware); // devtools first
app.use(express.static(browserDistFolder, {index: false}));
@@ -75,12 +75,12 @@ The browser talks to the hub over server-sent events or a WebSocket. Pick one wi
```ts group="transport" name="Server-sent events" active
// src/server.ts
-const devtools = initNgDevtoolsHub({ws: false});
+const devtools = initPangularHub({ws: false});
```
```ts group="transport" name="WebSocket side-car"
// src/server.ts
-const devtools = initNgDevtoolsHub({ws: {sidecar: true}});
+const devtools = initPangularHub({ws: {sidecar: true}});
```
With `ws: false` there is no WebSocket, and the browser connects over SSE on the same port. It is the simplest choice: every request goes through your Express server, including under `ng serve`.
@@ -89,15 +89,15 @@ With `ws: {sidecar: true}`, the WebSocket runs on its own port, picked automatic
### Rebuilds under `ng serve`
-`ng serve` runs `server.ts` again after a rebuild that changes the server output. The process keeps one hub per `base`, so each new `initNgDevtoolsHub()` call closes the hub from the run before, along with its side-car port. A generated MCP token stays the same until the process exits.
+`ng serve` runs `server.ts` again after a rebuild that changes the server output. The process keeps one hub per `base`, so each new `initPangularHub()` call closes the hub from the run before, along with its side-car port. A generated MCP token stays the same until the process exits.
### Hub options
-`initNgDevtoolsHub()` accepts the options of `initHub()` from `@devframes/hub`, apart from `devframes` and `ui`. These are the ones you are most likely to set:
+`initPangularHub()` accepts the options of `initHub()` from `@devframes/hub`, apart from `devframes` and `ui`. These are the ones you are most likely to set:
| Option | Default | What it does |
| ---------------- | ----------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| `base` | `'/__devframes/'` | Where the hub is mounted. The devtools panel lives at `ng-devtools/`. |
+| `base` | `'/__devframes/'` | Where the hub is mounted. The devtools panel lives at `pangular/`. |
| `ws` | | `false` uses server-sent events only. `{ sidecar: true }` runs the WebSocket on its own port. |
| `auth` | on | `false` turns off the one-time code. |
| `allowedOrigins` | loopback origins and the Chrome extension | Extra origins allowed to open the WebSocket. A list replaces the Chrome extension default. `false` turns the origin check off. |
@@ -113,9 +113,9 @@ The origin check is on by default too. Only loopback origins and the [Chrome ext
```ts
// src/server.ts
-import {initNgDevtoolsHub} from '@santoshyadavdev/ng-devtools/hub';
+import {initPangularHub} from '@pangular-inspector/devtools/hub';
-const devtools = initNgDevtoolsHub({
+const devtools = initPangularHub({
allowedOrigins: ['https://tunnel.example', 'chrome-extension://'],
});
```
@@ -126,18 +126,18 @@ The demo app in this repository mounts the hub like this:
```ts
// src/server.ts
-const auth = process.env['NG_DEVTOOLS_AUTH'] === 'true';
-const devtools = initNgDevtoolsHub({
+const auth = process.env['PANGULAR_AUTH'] === 'true';
+const devtools = initPangularHub({
ws: {sidecar: true},
auth,
});
app.use(devtools.nodeMiddleware);
```
-It turns the one-time code off unless `NG_DEVTOOLS_AUTH` is `true`. Don't copy that setting. Keep the one-time code on for your own apps. The demo keeps the default origin check.
+It turns the one-time code off unless `PANGULAR_AUTH` is `true`. Don't copy that setting. Keep the one-time code on for your own apps. The demo keeps the default origin check.
- initNgDevtoolsHub() has no production switch of its own. If your server.ts also runs in production, decide there whether to mount it.
+ initPangularHub() has no production switch of its own. If your server.ts also runs in production, decide there whether to mount it.
## Load the overlay
@@ -155,7 +155,7 @@ import {appConfig} from './app/app.config';
bootstrapApplication(App, appConfig)
.then(() => {
if (typeof ngDevMode === 'undefined' || ngDevMode) {
- return import('@santoshyadavdev/ng-devtools/overlay');
+ return import('@pangular-inspector/devtools/overlay');
}
return undefined;
})
@@ -215,22 +215,22 @@ To fill the SSR & HTTP tab, add the interceptor and hydration hooks to your app
import {provideHttpClient, withFetch} from '@angular/common/http';
import {ApplicationConfig} from '@angular/core';
import {provideClientHydration} from '@angular/platform-browser';
-import {provideNgDevtoolsHttp, withNgDevtools} from '@santoshyadavdev/ng-devtools/http';
+import {providePangularHttp, withPangular} from '@pangular-inspector/devtools/http';
export const appConfig: ApplicationConfig = {
providers: [
provideClientHydration(),
- provideHttpClient(withFetch(), withNgDevtools()),
- provideNgDevtoolsHttp(),
+ provideHttpClient(withFetch(), withPangular()),
+ providePangularHttp(),
],
};
```
-`withNgDevtools()` records requests and applies fault rules. `provideNgDevtoolsHttp()` captures hydration warnings before the overlay loads. In production builds the interceptor passes requests through untouched.
+`withPangular()` records requests and applies fault rules. `providePangularHttp()` captures hydration warnings before the overlay loads. In production builds the interceptor passes requests through untouched.
-### Put `withNgDevtools` first
+### Put `withPangular` first
-Register `withNgDevtools()` before your own interceptors, for example `provideHttpClient(withNgDevtools(), withInterceptors([authInterceptor]))`. It then records requests as the app makes them, and fault rules apply before anything else.
+Register `withPangular()` before your own interceptors, for example `provideHttpClient(withPangular(), withInterceptors([authInterceptor]))`. It then records requests as the app makes them, and fault rules apply before anything else.
### Run SSR in the same process
@@ -245,13 +245,13 @@ To mount only the devtools panel without the dock, use `initDevframe()` from `de
```ts
// src/server.ts
import {initDevframe} from 'devframe/initiate';
-import ngDevtools from '@santoshyadavdev/ng-devtools/devframe';
+import pangular from '@pangular-inspector/devtools/devframe';
-const devtools = initDevframe(ngDevtools, {base: '/__ng-devtools/'});
+const devtools = initDevframe(pangular, {base: '/__pangular/'});
app.use(devtools.nodeMiddleware);
```
-The overlay looks for `/__ng-devtools/` too. Without the hub, every tab sits in one tab bar.
+The overlay looks for `/__pangular/` too. Without the hub, every tab sits in one tab bar.
## Troubleshooting
@@ -269,7 +269,7 @@ The overlay looks for `/__ng-devtools/` too. Without the hub, every tab sits in
With auth on, a browser reads data only after it exchanges the one-time code the server printed. On a machine only you use, pass auth: false.
- Add withNgDevtools() and provideNgDevtoolsHttp(), and run SSR in the same Express process as the hub. Prerendered routes make no requests at runtime.
+ Add withPangular() and providePangularHttp(), and run SSR in the same Express process as the hub. Prerendered routes make no requests at runtime.
diff --git a/apps/docs/src/content/getting-started/installation.md b/apps/docs/src/content/getting-started/installation.md
index 6e48edf5..aa65e6ea 100644
--- a/apps/docs/src/content/getting-started/installation.md
+++ b/apps/docs/src/content/getting-started/installation.md
@@ -9,7 +9,7 @@ description: Install the devtools package and choose where it runs.
# Installation
-The devtools ship as one npm package, `@santoshyadavdev/ng-devtools`. It contains the Node side, the browser overlay, the in-page popup, the CLI and the built UI.
+The devtools ship as one npm package, `@pangular-inspector/devtools`. It contains the Node side, the browser overlay, the in-page popup, the CLI and the built UI.
## Prerequisites
@@ -32,39 +32,39 @@ The devtools ship as one npm package, `@santoshyadavdev/ng-devtools`. It contain
## Install the package
```bash group="install" name="pnpm" image="https://cdn.simpleicons.org/pnpm/F69220" active
-pnpm add @santoshyadavdev/ng-devtools devframe
+pnpm add @pangular-inspector/devtools devframe
```
```bash group="install" name="npm" image="https://cdn.simpleicons.org/npm/CB3837"
-npm install @santoshyadavdev/ng-devtools devframe
+npm install @pangular-inspector/devtools devframe
```
```bash group="install" name="yarn" image="https://cdn.simpleicons.org/yarn/2C8EBB"
-yarn add @santoshyadavdev/ng-devtools devframe
+yarn add @pangular-inspector/devtools devframe
```
```bash group="install" name="bun" image="https://bun.sh/logo.svg"
-bun add @santoshyadavdev/ng-devtools devframe
+bun add @pangular-inspector/devtools devframe
```
MCP agent support (`@devframes/agentic`) is included. You don't install it separately.
### Entry points
-| Import | Use it for |
-| ----------------------------------------------------- | -------------------------------------------------------------------------------------- |
-| `@santoshyadavdev/ng-devtools/hub` | `initNgDevtoolsHub()`, the server middleware for an Express app. |
-| `@santoshyadavdev/ng-devtools/vite` | The Vite plugin for Analog apps. |
-| `@santoshyadavdev/ng-devtools/overlay` | The browser script that collects live data from your page. |
-| `@santoshyadavdev/ng-devtools/overlay-angular-native` | The overlay for an Angular Native app. See [Angular Native](./angular-native.md). |
-| `@santoshyadavdev/ng-devtools/popup` | The floating button and panel on your page. |
-| `@santoshyadavdev/ng-devtools/http` | The HTTP interceptor and hydration hooks for the SSR & HTTP tab. |
-| `@santoshyadavdev/ng-devtools/config` | The `NgDevtoolsConfig` type and its defaults. See [Configuration](./configuration.md). |
-| `@santoshyadavdev/ng-devtools/devframe` | The devframe definition, for custom hosts. |
+| Import | Use it for |
+| ----------------------------------------------------- | ------------------------------------------------------------------------------------ |
+| `@pangular-inspector/devtools/hub` | `initPangularHub()`, the server middleware for an Express app. |
+| `@pangular-inspector/devtools/vite` | The Vite plugin for Analog apps. |
+| `@pangular-inspector/devtools/overlay` | The browser script that collects live data from your page. |
+| `@pangular-inspector/devtools/overlay-angular-native` | The overlay for an Angular Native app. See [Angular Native](./angular-native.md). |
+| `@pangular-inspector/devtools/popup` | The floating button and panel on your page. |
+| `@pangular-inspector/devtools/http` | The HTTP interceptor and hydration hooks for the SSR & HTTP tab. |
+| `@pangular-inspector/devtools/config` | The `PangularConfig` type and its defaults. See [Configuration](./configuration.md). |
+| `@pangular-inspector/devtools/devframe` | The devframe definition, for custom hosts. |
### The CLI binary
-The package also installs an `ng-devtools` binary. It runs the devtools without your app: a local server, a static report or an MCP server. See [Standalone CLI](./cli.md).
+The package also installs a `pangular` binary. It runs the devtools without your app: a local server, a static report or an MCP server. See [Standalone CLI](./cli.md).
## Pick a setup
@@ -80,27 +80,27 @@ Pick the tab that matches your app:
```ts group="setup" name="Angular CLI + Express" image="https://cdn.simpleicons.org/express/71717A" active
// src/server.ts
import express from 'express';
-import {initNgDevtoolsHub} from '@santoshyadavdev/ng-devtools/hub';
+import {initPangularHub} from '@pangular-inspector/devtools/hub';
const app = express();
-const devtools = initNgDevtoolsHub({ws: false});
+const devtools = initPangularHub({ws: false});
app.use(devtools.nodeMiddleware);
```
```ts group="setup" name="Analog (Vite)" image="https://cdn.simpleicons.org/vite/646CFF"
// vite.config.ts
import analog from '@analogjs/platform';
-import ngDevtools from '@santoshyadavdev/ng-devtools/vite';
+import pangular from '@pangular-inspector/devtools/vite';
import {defineConfig} from 'vite';
export default defineConfig({
- plugins: [analog(), ngDevtools()],
+ plugins: [analog(), pangular()],
});
```
```bash group="setup" name="Standalone CLI" image="https://cdn.simpleicons.org/gnubash/4EAA25"
# Run from the root of your Angular workspace
-npx @santoshyadavdev/ng-devtools
+npx @pangular-inspector/devtools
```
### Browser part
@@ -116,7 +116,7 @@ import {appConfig} from './app/app.config';
bootstrapApplication(App, appConfig)
.then(() => {
if (typeof ngDevMode === 'undefined' || ngDevMode) {
- return import('@santoshyadavdev/ng-devtools/overlay');
+ return import('@pangular-inspector/devtools/overlay');
}
return undefined;
})
@@ -130,7 +130,7 @@ import {App} from './app/app';
import {appConfig} from './app/app.config';
bootstrapApplication(App, appConfig).then(() => {
- if (import.meta.env.DEV) void import('@santoshyadavdev/ng-devtools/overlay');
+ if (import.meta.env.DEV) void import('@pangular-inspector/devtools/overlay');
});
```
diff --git a/apps/docs/src/content/getting-started/introduction.md b/apps/docs/src/content/getting-started/introduction.md
index 35779335..05532ad6 100644
--- a/apps/docs/src/content/getting-started/introduction.md
+++ b/apps/docs/src/content/getting-started/introduction.md
@@ -3,7 +3,7 @@ title: Introduction
description: What the devtools inspect, and the ways you can run them.
---
-
+
Inspect components, signals, injectors, routes, forms, pipes, NgRx stores and HTTP calls. In the page, from the command line, or through a coding agent.
@@ -14,7 +14,7 @@ The devtools inspect a running *Angular app. They read components, signals, inje
The same tool runs in several places. It is built with *Devframe, so one definition powers every mode.
- Everything ships in @santoshyadavdev/ng-devtools: the server side, the browser overlay, the in-page popup, the CLI and the built UI. See Installation.
+ Everything ships in @pangular-inspector/devtools: the server side, the browser overlay, the in-page popup, the CLI and the built UI. See Installation.
## What it inspects
@@ -73,8 +73,8 @@ Your app's server hosts the devtools, and a script in the page sends live data t
| Setup | Server part | Guide |
| -------------------------- | ----------------------- | ------------------------------------------ |
-| Angular CLI with SSR | `initNgDevtoolsHub()` | [Angular CLI and Express](./express.md) |
-| SSR on Hono, h3 or Fastify | `initNgDevtoolsHub()` | [Hono, h3 and Fastify](./other-servers.md) |
+| Angular CLI with SSR | `initPangularHub()` | [Angular CLI and Express](./express.md) |
+| SSR on Hono, h3 or Fastify | `initPangularHub()` | [Hono, h3 and Fastify](./other-servers.md) |
| Analog | The Vite plugin | [Vite and Analog](./vite.md) |
| Chrome DevTools (extra) | One of the setups above | [Chrome extension](./chrome-extension.md) |
@@ -86,7 +86,7 @@ Your app's server hosts the devtools, and a script in the page sends live data t
| Static report | An offline HTML build of the source scan. |
| MCP server | Every inspector exposed to coding agents over stdio. |
-All three come from the `ng-devtools` binary. See [Standalone CLI](./cli.md).
+All three come from the `pangular` binary. See [Standalone CLI](./cli.md).
## Built on Devframe
diff --git a/apps/docs/src/content/getting-started/other-servers.md b/apps/docs/src/content/getting-started/other-servers.md
index d1d8053c..ffac63ad 100644
--- a/apps/docs/src/content/getting-started/other-servers.md
+++ b/apps/docs/src/content/getting-started/other-servers.md
@@ -13,7 +13,7 @@ description: Mount the devtools hub in an Angular SSR server built on Hono, h3 o
## Two ways to mount the hub
-`initNgDevtoolsHub()` returns two request handlers for the same routes:
+`initPangularHub()` returns two request handlers for the same routes:
| Handler | Signature | Outside `devtools.base` |
| ---------------- | ----------------------------------------- | ----------------------- |
@@ -31,11 +31,11 @@ Hono and h3 take web-standard handlers, so they use `handler`. Fastify runs on N
```ts
// src/server.ts
import {AngularAppEngine, createRequestHandler} from '@angular/ssr';
-import {initNgDevtoolsHub} from '@santoshyadavdev/ng-devtools/hub';
+import {initPangularHub} from '@pangular-inspector/devtools/hub';
import {Hono} from 'hono';
const angularApp = new AngularAppEngine();
-const devtools = initNgDevtoolsHub({ws: false});
+const devtools = initPangularHub({ws: false});
const app = new Hono();
app.all(`${devtools.base}*`, (c) => devtools.handler(c.req.raw));
@@ -49,10 +49,10 @@ export const reqHandler = createRequestHandler(app.fetch);
```ts
// src/server.ts
import {createRequestHandler} from '@angular/ssr';
-import {initNgDevtoolsHub} from '@santoshyadavdev/ng-devtools/hub';
+import {initPangularHub} from '@pangular-inspector/devtools/hub';
import {H3} from 'h3';
-const devtools = initNgDevtoolsHub({ws: false});
+const devtools = initPangularHub({ws: false});
const app = new H3();
app.all(`${devtools.base}**`, (event) => devtools.handler(event.req));
@@ -70,10 +70,10 @@ Fastify has no Connect middleware of its own. Hand requests under the base to `n
```ts
// src/server.ts
import {createNodeRequestHandler} from '@angular/ssr/node';
-import {initNgDevtoolsHub} from '@santoshyadavdev/ng-devtools/hub';
+import {initPangularHub} from '@pangular-inspector/devtools/hub';
import Fastify from 'fastify';
-const devtools = initNgDevtoolsHub({ws: false});
+const devtools = initPangularHub({ws: false});
const app = Fastify();
app.addHook('onRequest', (request, reply, done) => {
@@ -107,7 +107,7 @@ A web handler never sees WebSocket upgrades, and neither does a server that `ng
// src/server.ts
import {serve} from '@hono/node-server';
-const devtools = initNgDevtoolsHub();
+const devtools = initPangularHub();
// ... mount devtools.handler on the Hono app as shown above
const server = serve({fetch: app.fetch, port: 4000});
diff --git a/apps/docs/src/content/getting-started/overlay.md b/apps/docs/src/content/getting-started/overlay.md
index 21416bde..f149510a 100644
--- a/apps/docs/src/content/getting-started/overlay.md
+++ b/apps/docs/src/content/getting-started/overlay.md
@@ -26,7 +26,7 @@ import {appConfig} from './app/app.config';
bootstrapApplication(App, appConfig)
.then(() => {
if (typeof ngDevMode === 'undefined' || ngDevMode) {
- return import('@santoshyadavdev/ng-devtools/overlay');
+ return import('@pangular-inspector/devtools/overlay');
}
return undefined;
})
@@ -40,7 +40,7 @@ import {App} from './app/app';
import {appConfig} from './app/app.config';
bootstrapApplication(App, appConfig).then(() => {
- if (import.meta.env.DEV) void import('@santoshyadavdev/ng-devtools/overlay');
+ if (import.meta.env.DEV) void import('@pangular-inspector/devtools/overlay');
});
```
@@ -77,8 +77,8 @@ The overlay reads `window.ng`, Angular's debug API. Production builds remove it,
The overlay looks for the devframe connection next to the page first. Then it tries these paths in order:
-1. `/__ng-devtools/`
-2. `/__devframes/ng-devtools/`
+1. `/__pangular/`
+2. `/__devframes/pangular/`
It also adds the [floating button](./popup-and-hub.md). With the hub mounted, the button opens the whole hub, with every dock in a side rail.
@@ -106,7 +106,7 @@ import {appConfig} from './app/app.config';
bootstrapApplication(App, appConfig).then(async () => {
if (typeof ngDevMode === 'undefined' || ngDevMode) {
- const {initOverlay} = await import('@santoshyadavdev/ng-devtools/overlay');
+ const {initOverlay} = await import('@pangular-inspector/devtools/overlay');
const dispose = await initOverlay({baseURL: '/__my-devtools/'});
}
});
@@ -114,7 +114,7 @@ bootstrapApplication(App, appConfig).then(async () => {
`baseURL` takes one path or a list of paths to try in order. `initOverlay` resolves to a function that stops the overlay it started and removes its hooks.
-The floating button follows the path the overlay connected to. If that path is `ng-devtools/` and a hub answers at ``, the button opens the hub. Otherwise it opens the devtools panel at that path.
+The floating button follows the path the overlay connected to. If that path is `pangular/` and a hub answers at ``, the button opens the hub. Otherwise it opens the devtools panel at that path.
### One overlay per page
@@ -128,7 +128,7 @@ Call `disposeOverlay` to turn the overlay off:
```ts
// src/app/devtools-toggle.ts
-import {disposeOverlay} from '@santoshyadavdev/ng-devtools/overlay';
+import {disposeOverlay} from '@pangular-inspector/devtools/overlay';
export async function stopDevtools() {
await disposeOverlay();
@@ -152,7 +152,7 @@ import {appConfig} from './app/app.config';
bootstrapApplication(App, appConfig).then(() => {
if (typeof ngDevMode === 'undefined' || ngDevMode) {
return Promise.all([
- import('@santoshyadavdev/ng-devtools/overlay'),
+ import('@pangular-inspector/devtools/overlay'),
import('@ngrx/signals'),
]).then(([devtools, {patchState, watchState}]) =>
devtools.registerNgrxSignals({patchState, watchState}),
@@ -166,11 +166,11 @@ See [Restore NgRx signal state](../guides/ngrx-signals-restore.md).
## No devtools server found
-If no path answers, the overlay logs an error that starts with `[ng-devtools] No devtools server found` and lists the paths it tried. The floating button still appears, and its panel says **No devtools server found** with a link to the setup guide.
+If no path answers, the overlay logs an error that starts with `[pangular] No devtools server found` and lists the paths it tried. The floating button still appears, and its panel says **No devtools server found** with a link to the setup guide.
Common causes:
-- No server part is mounted, for example plain `ng serve` without `initNgDevtoolsHub()` in `server.ts`.
+- No server part is mounted, for example plain `ng serve` without `initPangularHub()` in `server.ts`.
- The hub is mounted after `express.static` or the SSR handler, so the app answers first.
- The hub runs on a custom `base`, and the overlay still uses the default paths. Pass the path to [`initOverlay`](#a-custom-mount-path).
diff --git a/apps/docs/src/content/getting-started/popup-and-hub.md b/apps/docs/src/content/getting-started/popup-and-hub.md
index 2ea5af32..a3669e19 100644
--- a/apps/docs/src/content/getting-started/popup-and-hub.md
+++ b/apps/docs/src/content/getting-started/popup-and-hub.md
@@ -17,8 +17,8 @@ When the overlay loads, a floating button appears in the bottom-right corner of
Importing the [overlay](./overlay.md) adds the button. The first time the panel opens, it looks for the devtools server:
-1. If the overlay connected, it uses that path. When the path is `ng-devtools/` and a hub answers at ``, it opens the hub.
-2. Otherwise it checks for the hub at `/__devframes/`, then for the devtools alone at `/__ng-devtools/` and `/__devframes/ng-devtools/`.
+1. If the overlay connected, it uses that path. When the path is `pangular/` and a hub answers at ``, it opens the hub.
+2. Otherwise it checks for the hub at `/__devframes/`, then for the devtools alone at `/__pangular/` and `/__devframes/pangular/`.
A path counts only when it answers with JSON. If nothing answers, the panel says **No devtools server found** and looks again the next time it opens.
@@ -28,7 +28,7 @@ Most apps never call the popup API. To add the button without the overlay, call
```ts
// src/main.ts
-import {createDevtoolsPopup} from '@santoshyadavdev/ng-devtools/popup';
+import {createDevtoolsPopup} from '@pangular-inspector/devtools/popup';
createDevtoolsPopup();
```
@@ -39,7 +39,7 @@ To open a fixed page instead, pass `src`:
```ts
// src/main.ts
-import {createDevtoolsPopup} from '@santoshyadavdev/ng-devtools/popup';
+import {createDevtoolsPopup} from '@pangular-inspector/devtools/popup';
createDevtoolsPopup({src: '/__my-devtools/'});
```
@@ -57,9 +57,9 @@ The button reads CSS variables from your page. Set them on `:root` to match your
```css
/* src/styles.css */
:root {
- --ng-devtools-accent: #f5a524; /* button background */
- --ng-devtools-accent-ink: #1c1300; /* button icon */
- --ng-devtools-title: #f5a524; /* panel title and active dock mode */
+ --pangular-accent: #f5a524; /* button background */
+ --pangular-accent-ink: #1c1300; /* button icon */
+ --pangular-title: #f5a524; /* panel title and active dock mode */
}
```
@@ -100,7 +100,7 @@ In a search box that has text, Escape clears the box and leaves the p
### Saved layout
-The panel saves its position, size and dock mode in `localStorage` under `ng-devtools-popup`, so it keeps its layout across reloads. Clear that key to reset it.
+The panel saves its position, size and dock mode in `localStorage` under `pangular-popup`, so it keeps its layout across reloads. Clear that key to reset it.
### Theme
@@ -133,7 +133,7 @@ Without the hub (for example the standalone CLI, or a panel mounted with `initDe
### Tab hashes
-The URL hash selects a tab. Open `/__devframes/ng-devtools/#tab=signals` to land on the Signals tab. Switching tabs updates the hash, so you can copy the URL at any time.
+The URL hash selects a tab. Open `/__devframes/pangular/#tab=signals` to land on the Signals tab. Switching tabs updates the hash, so you can copy the URL at any time.
| Tab | Hash |
| ---------- | ----------------- |
@@ -179,10 +179,10 @@ A browser tab in the background runs its timers about once a minute. The app pag
Drag it somewhere else, or focus it and use the arrow keys. Double-click it to reset its position. To remove it, stop the overlay with disposeOverlay.
- Remove the ng-devtools-popup key from localStorage and reload.
+ Remove the pangular-popup key from localStorage and reload.
- The overlay did not find the hub at /__devframes/. Check that your server mounts initNgDevtoolsHub() or the Vite plugin on the default base. On a custom base, pass <base>ng-devtools/ to initOverlay.
+ The overlay did not find the hub at /__devframes/. Check that your server mounts initPangularHub() or the Vite plugin on the default base. On a custom base, pass <base>pangular/ to initOverlay.
No devtools path answered with JSON. Mount the hub or the Vite plugin, before the SSR handler. See No devtools server found.
diff --git a/apps/docs/src/content/getting-started/vite.md b/apps/docs/src/content/getting-started/vite.md
index 5e5fdff6..3fd55c22 100644
--- a/apps/docs/src/content/getting-started/vite.md
+++ b/apps/docs/src/content/getting-started/vite.md
@@ -15,10 +15,10 @@ For *Analog apps, add the *Vite plugin next to `analog()` and load the overlay i
- Add @santoshyadavdev/ng-devtools and devframe. See Installation.
+ Add @pangular-inspector/devtools and devframe. See Installation.
- Register ngDevtools() after analog() in vite.config.ts.
+ Register pangular() after analog() in vite.config.ts.
Import the overlay in src/main.ts when import.meta.env.DEV is true.
@@ -35,11 +35,11 @@ For *Analog apps, add the *Vite plugin next to `analog()` and load the overlay i
```ts {3,7}
// vite.config.ts
import analog from '@analogjs/platform';
-import ngDevtools from '@santoshyadavdev/ng-devtools/vite';
+import pangular from '@pangular-inspector/devtools/vite';
import {defineConfig} from 'vite';
export default defineConfig({
- plugins: [analog(), ngDevtools()],
+ plugins: [analog(), pangular()],
});
```
@@ -54,7 +54,7 @@ import {App} from './app/app';
import {appConfig} from './app/app.config';
bootstrapApplication(App, appConfig).then(() => {
- if (import.meta.env.DEV) void import('@santoshyadavdev/ng-devtools/overlay');
+ if (import.meta.env.DEV) void import('@pangular-inspector/devtools/overlay');
});
```
@@ -86,7 +86,7 @@ It records Analog page renders, `load()` fetches, server functions and API calls
### Answers only your machine
-The plugin only answers requests from a loopback address (any `127.x.x.x` address or `::1`). Other requests to the devtools get `403` with the message "ng-devtools only answers requests from this machine." WebSocket upgrades follow the same rules.
+The plugin only answers requests from a loopback address (any `127.x.x.x` address or `::1`). Other requests to the devtools get `403` with the message "Pangular Inspector only answers requests from this machine." WebSocket upgrades follow the same rules.
By default the plugin leaves the one-time code off, and the loopback and origin checks take its place. If `server.allowedHosts` or `allowedOrigins` allows a host that is not a loopback host, the plugin also asks for the code. See [`auth`](#auth). [Access and redaction](../security.md) covers every check.
@@ -94,7 +94,7 @@ By default the plugin leaves the one-time code off, and the loopback and origin
```ts
// vite.config.ts
-ngDevtools({
+pangular({
base: '/__devframes/',
apiPrefix: 'api',
allowedOrigins: ['https://tunnel.example'],
@@ -112,7 +112,7 @@ The plugin also takes the devtools options, such as `inspectors`, `agent`, `acti
### `base`
-Change `base` if `/__devframes/` clashes with a route of your own. The leading and trailing slashes are optional: `'devtools'`, `'/devtools'` and `'/devtools/'` all mount the hub at `/devtools/`, and the loopback checks cover the whole path. The overlay looks for `/__devframes/ng-devtools/` and `/__ng-devtools/` by default, so a custom base also needs a custom overlay path: pass `ng-devtools/` to `initOverlay`. The floating button follows that path. See [A custom mount path](./overlay.md#a-custom-mount-path).
+Change `base` if `/__devframes/` clashes with a route of your own. The leading and trailing slashes are optional: `'devtools'`, `'/devtools'` and `'/devtools/'` all mount the hub at `/devtools/`, and the loopback checks cover the whole path. The overlay looks for `/__devframes/pangular/` and `/__pangular/` by default, so a custom base also needs a custom overlay path: pass `pangular/` to `initOverlay`. The floating button follows that path. See [A custom mount path](./overlay.md#a-custom-mount-path).
### `apiPrefix`
@@ -140,7 +140,7 @@ If your tunnel rewrites the `Host` header to `localhost`, you don't list it in `
```ts
// vite.config.ts
-ngDevtools({auth: true});
+pangular({auth: true});
```
## Hostnames other than localhost
@@ -152,12 +152,12 @@ If you open the dev server through another hostname that points to your machine
```ts {7}
// vite.config.ts
import analog from '@analogjs/platform';
-import ngDevtools from '@santoshyadavdev/ng-devtools/vite';
+import pangular from '@pangular-inspector/devtools/vite';
import {defineConfig} from 'vite';
export default defineConfig({
server: {allowedHosts: ['myapp.test']},
- plugins: [analog(), ngDevtools()],
+ plugins: [analog(), pangular()],
});
```
@@ -167,7 +167,7 @@ Add other origins with `allowedOrigins`:
```ts
// vite.config.ts
-ngDevtools({allowedOrigins: ['https://tunnel.example']});
+pangular({allowedOrigins: ['https://tunnel.example']});
```
A non-loopback entry in `server.allowedHosts` or `allowedOrigins` turns the one-time code on. See [`auth`](#auth).
diff --git a/apps/docs/src/content/guides/analog.md b/apps/docs/src/content/guides/analog.md
index bb96c410..b7a4f360 100644
--- a/apps/docs/src/content/guides/analog.md
+++ b/apps/docs/src/content/guides/analog.md
@@ -32,7 +32,7 @@ This guide adds the devtools to an *Analog app. Everything runs on the *Vite dev
- Add @santoshyadavdev/ng-devtools and devframe.
+ Add @pangular-inspector/devtools and devframe.
Register it next to analog() in vite.config.ts.
@@ -48,19 +48,19 @@ This guide adds the devtools to an *Analog app. Everything runs on the *Vite dev
## Step 1: Install
```bash group="install" name="pnpm" image="https://cdn.simpleicons.org/pnpm/F69220" active
-pnpm add @santoshyadavdev/ng-devtools devframe
+pnpm add @pangular-inspector/devtools devframe
```
```bash group="install" name="npm" image="https://cdn.simpleicons.org/npm/CB3837"
-npm install @santoshyadavdev/ng-devtools devframe
+npm install @pangular-inspector/devtools devframe
```
```bash group="install" name="yarn" image="https://cdn.simpleicons.org/yarn/2C8EBB"
-yarn add @santoshyadavdev/ng-devtools devframe
+yarn add @pangular-inspector/devtools devframe
```
```bash group="install" name="bun" image="https://bun.sh/logo.svg"
-bun add @santoshyadavdev/ng-devtools devframe
+bun add @pangular-inspector/devtools devframe
```
## Step 2: Add the Vite plugin
@@ -70,11 +70,11 @@ Add the plugin after `analog()`:
```ts {3,7}
// vite.config.ts
import analog from '@analogjs/platform';
-import ngDevtools from '@santoshyadavdev/ng-devtools/vite';
+import pangular from '@pangular-inspector/devtools/vite';
import {defineConfig} from 'vite';
export default defineConfig(() => ({
- plugins: [analog(), ngDevtools()],
+ plugins: [analog(), pangular()],
}));
```
@@ -106,7 +106,7 @@ import {App} from './app/app';
import {appConfig} from './app/app.config';
bootstrapApplication(App, appConfig).then(() => {
- if (import.meta.env.DEV) void import('@santoshyadavdev/ng-devtools/overlay');
+ if (import.meta.env.DEV) void import('@pangular-inspector/devtools/overlay');
});
```
@@ -130,27 +130,27 @@ Open the **Analog** dock to see file routes, server calls, render modes, content
## Catch hydration errors from the first load
-The overlay loads after the first render, so it misses hydration errors (`NG0500` to `NG0506`) logged during the first load. `provideNgDevtoolsHttp()` starts listening for them when the app starts. The Analog dock lists them under **Hydration error** in **Lint**, and the `analog-current-page` tool returns them.
+The overlay loads after the first render, so it misses hydration errors (`NG0500` to `NG0506`) logged during the first load. `providePangularHttp()` starts listening for them when the app starts. The Analog dock lists them under **Hydration error** in **Lint**, and the `analog-current-page` tool returns them.
-Analog's own `load()` fetches and API calls show in the Analog dock without extra setup. `withNgDevtools()` also records `HttpClient` calls in the **SSR & HTTP** tab.
+Analog's own `load()` fetches and API calls show in the Analog dock without extra setup. `withPangular()` also records `HttpClient` calls in the **SSR & HTTP** tab.
```ts {5,10-11}
// src/app/app.config.ts
import {provideHttpClient, withFetch} from '@angular/common/http';
import {ApplicationConfig} from '@angular/core';
import {provideFileRouter} from '@analogjs/router';
-import {provideNgDevtoolsHttp, withNgDevtools} from '@santoshyadavdev/ng-devtools/http';
+import {providePangularHttp, withPangular} from '@pangular-inspector/devtools/http';
export const appConfig: ApplicationConfig = {
providers: [
provideFileRouter(),
- provideHttpClient(withFetch(), withNgDevtools()),
- provideNgDevtoolsHttp(),
+ provideHttpClient(withFetch(), withPangular()),
+ providePangularHttp(),
],
};
```
-`provideNgDevtoolsHttp()` and `withNgDevtools()` do nothing in production builds. See [Set up SSR & HTTP](./ssr-http.md) for the interceptor order.
+`providePangularHttp()` and `withPangular()` do nothing in production builds. See [Set up SSR & HTTP](./ssr-http.md) for the interceptor order.
## Try the demo
@@ -164,7 +164,7 @@ pnpm analog:dev
The script builds the devtools package first, then starts the Vite dev server.
- The demo aliases @santoshyadavdev/ng-devtools/overlay to the built package in its vite.config.ts. Your app does not need that alias.
+ The demo aliases @pangular-inspector/devtools/overlay to the built package in its vite.config.ts. Your app does not need that alias.
## Where to next
diff --git a/apps/docs/src/content/guides/nativescript.md b/apps/docs/src/content/guides/nativescript.md
index 7892a131..bc758dff 100644
--- a/apps/docs/src/content/guides/nativescript.md
+++ b/apps/docs/src/content/guides/nativescript.md
@@ -32,7 +32,7 @@ This guide adds the devtools to a NativeScript Angular app. The app has no DOM,
- Add @santoshyadavdev/ng-devtools and @valor/nativescript-websockets.
+ Add @pangular-inspector/devtools and @valor/nativescript-websockets.
Import @valor/nativescript-websockets first in src/polyfills.ts.
@@ -41,26 +41,26 @@ This guide adds the devtools to a NativeScript Angular app. The app has no DOM,
Call initNativeScriptOverlay() in src/main.ts, before the app bootstraps.
- Start ng-devtools dev in the app's folder and open the UI.
+ Start pangular dev in the app's folder and open the UI.
## Step 1: Install
```bash group="install" name="npm" image="https://cdn.simpleicons.org/npm/CB3837" active
-npm install @santoshyadavdev/ng-devtools @valor/nativescript-websockets
+npm install @pangular-inspector/devtools @valor/nativescript-websockets
```
```bash group="install" name="pnpm" image="https://cdn.simpleicons.org/pnpm/F69220"
-pnpm add @santoshyadavdev/ng-devtools @valor/nativescript-websockets
+pnpm add @pangular-inspector/devtools @valor/nativescript-websockets
```
```bash group="install" name="yarn" image="https://cdn.simpleicons.org/yarn/2C8EBB"
-yarn add @santoshyadavdev/ng-devtools @valor/nativescript-websockets
+yarn add @pangular-inspector/devtools @valor/nativescript-websockets
```
```bash group="install" name="bun" image="https://bun.sh/logo.svg"
-bun add @santoshyadavdev/ng-devtools @valor/nativescript-websockets
+bun add @pangular-inspector/devtools @valor/nativescript-websockets
```
## Step 2: Add a WebSocket global
@@ -76,7 +76,7 @@ import '@valor/nativescript-websockets';
```ts {2,4-6}
// src/main.ts
-import {initNativeScriptOverlay} from '@santoshyadavdev/ng-devtools/overlay-nativescript';
+import {initNativeScriptOverlay} from '@pangular-inspector/devtools/overlay-nativescript';
if (__DEV__) {
initNativeScriptOverlay();
@@ -101,7 +101,7 @@ Run the server in the app's folder, so the source scanners read its `src/`:
```bash
cd my-nativescript-app
-npx @santoshyadavdev/ng-devtools dev --no-auth
+npx @pangular-inspector/devtools dev --no-auth
```
The server listens on `localhost` only, which the iOS simulator and the Android emulator reach. `--no-auth` is needed because the app cannot enter the one-time code the panel asks for.
@@ -114,7 +114,7 @@ The server listens on `localhost` only, which the iOS simulator and the Android
A physical device reaches your machine over the network, so the server has to listen on an interface the device can reach:
```bash
-npx @santoshyadavdev/ng-devtools dev --host 192.168.1.20 --no-auth
+npx @pangular-inspector/devtools dev --host 192.168.1.20 --no-auth
```
@@ -127,7 +127,7 @@ See [Standalone CLI](../getting-started/cli.md) for the other server options and
`examples/nativescript` is a `ns create --ng` project wired up this way, with a small showcase component (signals, a computed, an effect and a component-level provider). It is tested on the iOS simulator. Android is untested.
-The demo maps `@santoshyadavdev/ng-devtools/*` to the package's build output in `packages/ng-devtools/dist`, so build the package first:
+The demo maps `@pangular-inspector/devtools/*` to the package's build output in `packages/devtools/dist`, so build the package first:
```bash
pnpm devtools:build-pkg
diff --git a/apps/docs/src/content/guides/ngrx-signals-restore.md b/apps/docs/src/content/guides/ngrx-signals-restore.md
index 014aae2e..268d4032 100644
--- a/apps/docs/src/content/guides/ngrx-signals-restore.md
+++ b/apps/docs/src/content/guides/ngrx-signals-restore.md
@@ -38,7 +38,7 @@ Without `registerNgrxSignals`, a restore changes the store but skips this listen
## Register patchState and watchState
-Call `registerNgrxSignals({ patchState, watchState })` from `@santoshyadavdev/ng-devtools/overlay` once, after the app starts. Load both modules with dynamic imports in development only, so production bundles do not include the devtools.
+Call `registerNgrxSignals({ patchState, watchState })` from `@pangular-inspector/devtools/overlay` once, after the app starts. Load both modules with dynamic imports in development only, so production bundles do not include the devtools.
```ts group="register" name="Angular CLI" active
// src/main.ts
@@ -52,7 +52,7 @@ bootstrapApplication(App, appConfig)
return ref
.whenStable()
.then(() =>
- Promise.all([import('@santoshyadavdev/ng-devtools/overlay'), import('@ngrx/signals')]),
+ Promise.all([import('@pangular-inspector/devtools/overlay'), import('@ngrx/signals')]),
)
.then(([devtools, {patchState, watchState}]) =>
devtools.registerNgrxSignals({patchState, watchState}),
@@ -72,7 +72,7 @@ import {appConfig} from './app/app.config';
bootstrapApplication(App, appConfig).then(async () => {
if (import.meta.env.DEV) {
const [devtools, {patchState, watchState}] = await Promise.all([
- import('@santoshyadavdev/ng-devtools/overlay'),
+ import('@pangular-inspector/devtools/overlay'),
import('@ngrx/signals'),
]);
devtools.registerNgrxSignals({patchState, watchState});
diff --git a/apps/docs/src/content/guides/ssr-http.md b/apps/docs/src/content/guides/ssr-http.md
index 9b29021f..67e135f1 100644
--- a/apps/docs/src/content/guides/ssr-http.md
+++ b/apps/docs/src/content/guides/ssr-http.md
@@ -15,10 +15,10 @@ The [SSR & HTTP tab](../inspectors/ssr-http.md) records every `HttpClient` call
- withNgDevtools() records each request and applies fault rules.
+ withPangular() records each request and applies fault rules.
- provideNgDevtoolsHttp() captures the NG05xx hydration warnings Angular logs.
+ providePangularHttp() captures the NG05xx hydration warnings Angular logs.
SSR and the devtools hub run in the same Express process.
@@ -32,7 +32,7 @@ The [SSR & HTTP tab](../inspectors/ssr-http.md) records every `HttpClient` call
Register the interceptor and the hydration hook in app.config.ts.
- Place withNgDevtools() before your own interceptors.
+ Place withPangular() before your own interceptors.
SSR and the devtools middleware share one Express process.
@@ -47,57 +47,57 @@ The [SSR & HTTP tab](../inspectors/ssr-http.md) records every `HttpClient` call
## Step 1: Add the providers
-Both functions come from `@santoshyadavdev/ng-devtools/http`.
+Both functions come from `@pangular-inspector/devtools/http`.
```ts {4,10-11}
// src/app/app.config.ts
import {ApplicationConfig} from '@angular/core';
import {provideHttpClient, withFetch} from '@angular/common/http';
-import {provideNgDevtoolsHttp, withNgDevtools} from '@santoshyadavdev/ng-devtools/http';
+import {providePangularHttp, withPangular} from '@pangular-inspector/devtools/http';
import {provideClientHydration} from '@angular/platform-browser';
export const appConfig: ApplicationConfig = {
providers: [
provideClientHydration(),
- provideHttpClient(withFetch(), withNgDevtools()),
- provideNgDevtoolsHttp(),
+ provideHttpClient(withFetch(), withPangular()),
+ providePangularHttp(),
],
};
```
### What each provider does
-- `withNgDevtools()` adds the interceptor that records calls and applies fault rules.
-- `provideNgDevtoolsHttp()` captures the hydration warnings (NG05xx) before the overlay loads.
+- `withPangular()` adds the interceptor that records calls and applies fault rules.
+- `providePangularHttp()` captures the hydration warnings (NG05xx) before the overlay loads.
The interceptor checks ngDevMode. In production builds it passes every request through untouched.
-## Step 2: Put withNgDevtools first
+## Step 2: Put withPangular first
-Register `withNgDevtools()` before your own interceptors. Then it records requests as the app makes them, and fault rules apply before anything else.
+Register `withPangular()` before your own interceptors. Then it records requests as the app makes them, and fault rules apply before anything else.
```ts {11}
// src/app/app.config.ts
import {provideHttpClient, withFetch, withInterceptors} from '@angular/common/http';
import {ApplicationConfig} from '@angular/core';
import {provideClientHydration} from '@angular/platform-browser';
-import {provideNgDevtoolsHttp, withNgDevtools} from '@santoshyadavdev/ng-devtools/http';
+import {providePangularHttp, withPangular} from '@pangular-inspector/devtools/http';
import {authInterceptor} from './auth.interceptor';
export const appConfig: ApplicationConfig = {
providers: [
provideClientHydration(),
- provideHttpClient(withFetch(), withNgDevtools(), withInterceptors([authInterceptor])),
- provideNgDevtoolsHttp(),
+ provideHttpClient(withFetch(), withPangular(), withInterceptors([authInterceptor])),
+ providePangularHttp(),
],
};
```
### How transfer cache hits are detected
-A call counts as a transfer cache hit when the cached response comes back right away. It also counts when the page's TransferState holds a GET or HEAD entry for the same URL. So an async interceptor after `withNgDevtools()` does not hide cache hits.
+A call counts as a transfer cache hit when the cached response comes back right away. It also counts when the page's TransferState holds a GET or HEAD entry for the same URL. So an async interceptor after `withPangular()` does not hide cache hits.
## Step 3: Mount the hub in server.ts
@@ -107,12 +107,12 @@ The interceptor on the server hands its calls to the devtools through the Node p
// src/server.ts
import {AngularNodeAppEngine, createNodeRequestHandler} from '@angular/ssr/node';
import express from 'express';
-import {initNgDevtoolsHub} from '@santoshyadavdev/ng-devtools/hub';
+import {initPangularHub} from '@pangular-inspector/devtools/hub';
const app = express();
const angularApp = new AngularNodeAppEngine();
-const devtools = initNgDevtoolsHub({
+const devtools = initPangularHub({
ws: {sidecar: true},
});
app.use(devtools.nodeMiddleware);
diff --git a/apps/docs/src/content/inspectors/analog.md b/apps/docs/src/content/inspectors/analog.md
index 69d7d8bb..748ee42c 100644
--- a/apps/docs/src/content/inspectors/analog.md
+++ b/apps/docs/src/content/inspectors/analog.md
@@ -22,11 +22,11 @@ Add the Vite plugin next to `analog()` and load the overlay. See [Vite and Analo
```ts {3,7}
// vite.config.ts
import analog from '@analogjs/platform';
-import ngDevtools from '@santoshyadavdev/ng-devtools/vite';
+import pangular from '@pangular-inspector/devtools/vite';
import {defineConfig} from 'vite';
export default defineConfig({
- plugins: [analog(), ngDevtools()],
+ plugins: [analog(), pangular()],
});
```
@@ -82,7 +82,7 @@ Checks grouped by rule, each with a fix. Each card lists where the rule fired an
- API method suffixes, duplicate API routes, and routes outside the API prefix.
- Prerender entries that match nothing.
- Frontmatter errors, duplicate slugs, and content that shadows a page.
-- From the live page: `load()` fetched twice, server function reads called again after hydration, hydration errors, API routes not found, and added pages that need a restart. To catch hydration errors from the first load, add `provideNgDevtoolsHttp()` (see [Set up Analog](../guides/analog.md#catch-hydration-errors-from-the-first-load)).
+- From the live page: `load()` fetched twice, server function reads called again after hydration, hydration errors, API routes not found, and added pages that need a restart. To catch hydration errors from the first load, add `providePangularHttp()` (see [Set up Analog](../guides/analog.md#catch-hydration-errors-from-the-first-load)).
## Where the data comes from
@@ -163,19 +163,19 @@ The tab reads every `routeRules` entry in `vite.config`. A rule like `/blog/**`
## Agent tools
-| Tool | Inputs | What it does |
-| ------------------------------------- | ---------------------------------------------- | ----------------------------------------------------------------------- |
-| `ng-devtools:analog-routes` | `filter` | File routes in match order, with page, layout and server files. |
-| `ng-devtools:analog-explain-url` | `url` (required) | Which files render a URL, or the closest candidates. |
-| `ng-devtools:analog-current-page` | `page` | The open page: its files, `load()` data, rendering and hydration state. |
-| `ng-devtools:analog-server-calls` | `kind`, `route`, `limit` | Recent server calls, with server function names and action outcomes. |
-| `ng-devtools:analog-api-routes` | | Server routes with method, URL and file, plus middleware. |
-| `ng-devtools:analog-server-functions` | | Server functions with name, method, file, id and call counts. |
-| `ng-devtools:analog-call-api` | `path` (required), `method`, `body`, `confirm` | Sends a real request to the dev server. |
-| `ng-devtools:analog-render-modes` | | The render mode of each page, and what the last request did. |
-| `ng-devtools:analog-prerender-plan` | | The prerender plan. |
-| `ng-devtools:analog-content` | `filter` | Markdown files with slug, frontmatter, route and parse errors. |
-| `ng-devtools:analog-lint` | | The Analog checks. |
+| Tool | Inputs | What it does |
+| ---------------------------------- | ---------------------------------------------- | ----------------------------------------------------------------------- |
+| `pangular:analog-routes` | `filter` | File routes in match order, with page, layout and server files. |
+| `pangular:analog-explain-url` | `url` (required) | Which files render a URL, or the closest candidates. |
+| `pangular:analog-current-page` | `page` | The open page: its files, `load()` data, rendering and hydration state. |
+| `pangular:analog-server-calls` | `kind`, `route`, `limit` | Recent server calls, with server function names and action outcomes. |
+| `pangular:analog-api-routes` | | Server routes with method, URL and file, plus middleware. |
+| `pangular:analog-server-functions` | | Server functions with name, method, file, id and call counts. |
+| `pangular:analog-call-api` | `path` (required), `method`, `body`, `confirm` | Sends a real request to the dev server. |
+| `pangular:analog-render-modes` | | The render mode of each page, and what the last request did. |
+| `pangular:analog-prerender-plan` | | The prerender plan. |
+| `pangular:analog-content` | `filter` | Markdown files with slug, frontmatter, route and parse errors. |
+| `pangular:analog-lint` | | The Analog checks. |
`analog-current-page` is the only place that shows the `load()` data a page received. See [Tools](../agents/tools.md).
diff --git a/apps/docs/src/content/inspectors/components.md b/apps/docs/src/content/inspectors/components.md
index efaa5cdc..1870c3df 100644
--- a/apps/docs/src/content/inspectors/components.md
+++ b/apps/docs/src/content/inspectors/components.md
@@ -186,14 +186,14 @@ Use the arrow keys, Home and End to move through the tree. The right arrow expan
## Agent tools
-| Tool or resource | Kind | What it does |
-| ------------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| `ng-devtools:get-components` | tool | Lists components and directives from source, with selector, kind, inputs, outputs, change detection, file and line. |
-| `ng-devtools:highlight` | tool | Highlights a component in the page and selects it. Takes an instance id, class name, host tag or CSS selector. Also retargets the Signals graph. Lists every instance a name matches. |
-| `ng-devtools:inspect-component` | tool | Selects one instance and returns its live detail: inputs, outputs, properties, listeners, directives and injected services. |
-| `ng-devtools:defer-blocks` | tool | Lists the `@defer` blocks of each page, and flags blocks that failed, blocks stuck on their placeholder and blocks still dehydrated. |
-| `ng-devtools:change-detection` | tool | Starts, stops or clears a change detection recording, and returns the slowest and most often checked components and the latest cycles. |
-| `ng-devtools:component-tree` | resource | The live tree per page, with the detail of the selected instance and the defer blocks. |
+| Tool or resource | Kind | What it does |
+| ---------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `pangular:get-components` | tool | Lists components and directives from source, with selector, kind, inputs, outputs, change detection, file and line. |
+| `pangular:highlight` | tool | Highlights a component in the page and selects it. Takes an instance id, class name, host tag or CSS selector. Also retargets the Signals graph. Lists every instance a name matches. |
+| `pangular:inspect-component` | tool | Selects one instance and returns its live detail: inputs, outputs, properties, listeners, directives and injected services. |
+| `pangular:defer-blocks` | tool | Lists the `@defer` blocks of each page, and flags blocks that failed, blocks stuck on their placeholder and blocks still dehydrated. |
+| `pangular:change-detection` | tool | Starts, stops or clears a change detection recording, and returns the slowest and most often checked components and the latest cycles. |
+| `pangular:component-tree` | resource | The live tree per page, with the detail of the selected instance and the defer blocks. |
See [Tools](../agents/tools.md) and [Resources](../agents/resources.md).
diff --git a/apps/docs/src/content/inspectors/dashboard.md b/apps/docs/src/content/inspectors/dashboard.md
index ca3a99a8..c8ae1186 100644
--- a/apps/docs/src/content/inspectors/dashboard.md
+++ b/apps/docs/src/content/inspectors/dashboard.md
@@ -86,9 +86,9 @@ The Components, Routes, NgRx and Pipes cards count the source scan. The Signals
## Agent tools
-| Tool | What it returns |
-| ------------------------ | ------------------------------------------------------------------------------------------------------ |
-| `ng-devtools:build-meta` | Angular and TypeScript versions, the project name, SSR status and, in Analog apps, the Analog version. |
+| Tool | What it returns |
+| --------------------- | ------------------------------------------------------------------------------------------------------ |
+| `pangular:build-meta` | Angular and TypeScript versions, the project name, SSR status and, in Analog apps, the Analog version. |
[Static reports](../getting-started/cli.md) include the same data. See [Tools](../agents/tools.md) for every tool.
diff --git a/apps/docs/src/content/inspectors/forms.md b/apps/docs/src/content/inspectors/forms.md
index 59220ab0..3616a8d9 100644
--- a/apps/docs/src/content/inspectors/forms.md
+++ b/apps/docs/src/content/inspectors/forms.md
@@ -152,28 +152,28 @@ You can also open a form from its component in the [Components tab](./components
### Read tools
-| Tool | What it does |
-| ------------------------------------ | ----------------------------------------------------------------------------------------------------------------- |
-| `ng-devtools:explain-form-invalid` | Start here. Every invalid or pending form, with each failing field's value, validator, message and touched state. |
-| `ng-devtools:inspect-forms` | The forms with status and error counts. With `form`, the field tree. Narrow with `path` or `onlyInvalid`. |
-| `ng-devtools:explain-field` | One field: error sources, skip reasons, pending values, binding, visible errors, and source lines. |
-| `ng-devtools:explain-submit` | What submit does, and why it might do nothing. |
-| `ng-devtools:form-payload` | What the form sends: value against raw value, and unvalidated fields. |
-| `ng-devtools:form-history` | The change timeline with origins. Returns a marker. |
-| `ng-devtools:form-diff` | The net change since a marker. |
-| `ng-devtools:lint-forms` | Form bugs and accessibility checks. |
-| `ng-devtools:explain-custom-control` | How a field binds to its element, and what is wrong with the binding. |
-| `ng-devtools:export-form` | A JSON snapshot or a test fixture. |
-| `ng-devtools:wait-for-form` | Waits until the form is settled, valid, not pending or submitted. |
+| Tool | What it does |
+| --------------------------------- | ----------------------------------------------------------------------------------------------------------------- |
+| `pangular:explain-form-invalid` | Start here. Every invalid or pending form, with each failing field's value, validator, message and touched state. |
+| `pangular:inspect-forms` | The forms with status and error counts. With `form`, the field tree. Narrow with `path` or `onlyInvalid`. |
+| `pangular:explain-field` | One field: error sources, skip reasons, pending values, binding, visible errors, and source lines. |
+| `pangular:explain-submit` | What submit does, and why it might do nothing. |
+| `pangular:form-payload` | What the form sends: value against raw value, and unvalidated fields. |
+| `pangular:form-history` | The change timeline with origins. Returns a marker. |
+| `pangular:form-diff` | The net change since a marker. |
+| `pangular:lint-forms` | Form bugs and accessibility checks. |
+| `pangular:explain-custom-control` | How a field binds to its element, and what is wrong with the binding. |
+| `pangular:export-form` | A JSON snapshot or a test fixture. |
+| `pangular:wait-for-form` | Waits until the form is settled, valid, not pending or submitted. |
### Write tools
-| Tool | What it does |
-| ------------------------- | ---------------------------------------------------------------------------------- |
-| `ng-devtools:form-action` | Set, touch, revalidate, reset, submit, focus, snapshot, restore and more. |
-| `ng-devtools:fill-form` | Fills several fields through the inputs, like a user would. Can submit afterwards. |
+| Tool | What it does |
+| ---------------------- | ---------------------------------------------------------------------------------- |
+| `pangular:form-action` | Set, touch, revalidate, reset, submit, focus, snapshot, restore and more. |
+| `pangular:fill-form` | Fills several fields through the inputs, like a user would. Can submit afterwards. |
-Agents can loop: inspect, act, `wait-for-form`, then `form-diff` from the marker they had. The `ng-devtools:forms` resource holds every form and recent changes. See [Tools](../agents/tools.md).
+Agents can loop: inspect, act, `wait-for-form`, then `form-diff` from the marker they had. The `pangular:forms` resource holds every form and recent changes. See [Tools](../agents/tools.md).
## Limits and gotchas
diff --git a/apps/docs/src/content/inspectors/injectors.md b/apps/docs/src/content/inspectors/injectors.md
index 85831a50..bae64ed0 100644
--- a/apps/docs/src/content/inspectors/injectors.md
+++ b/apps/docs/src/content/inspectors/injectors.md
@@ -111,11 +111,11 @@ Arrow keys, Home and End move the selection through the tree. The right arrow ex
## Agent tools
-| Tool or resource | Kind | What it does |
-| ------------------------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| `ng-devtools:get-providers` | tool | DI providers from source: `@Injectable` services, `inject()` calls, constructor parameters and `providers` arrays. |
-| `ng-devtools:inspect-providers` | tool | The injector tree a page reported, with what components and created services inject. `selector` narrows it to matching element injectors, `token` to where a token is provided and injected. |
-| `ng-devtools:injector-tree` | resource | The live tree last reported by a page. |
+| Tool or resource | Kind | What it does |
+| ---------------------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `pangular:get-providers` | tool | DI providers from source: `@Injectable` services, `inject()` calls, constructor parameters and `providers` arrays. |
+| `pangular:inspect-providers` | tool | The injector tree a page reported, with what components and created services inject. `selector` narrows it to matching element injectors, `token` to where a token is provided and injected. |
+| `pangular:injector-tree` | resource | The live tree last reported by a page. |
See [Tools](../agents/tools.md) and [Resources](../agents/resources.md).
diff --git a/apps/docs/src/content/inspectors/ngrx-store.md b/apps/docs/src/content/inspectors/ngrx-store.md
index 07d18503..a55249c6 100644
--- a/apps/docs/src/content/inspectors/ngrx-store.md
+++ b/apps/docs/src/content/inspectors/ngrx-store.md
@@ -156,13 +156,13 @@ To try another payload, type the action in **Dispatch an action** instead.
## Agent tools
-| Tool or resource | Kind | What it does |
-| ---------------------------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------- |
-| `ng-devtools:get-ngrx-store` | tool | NgRx declarations from source, with the members of each `signalStore` and the type strings of each action. |
-| `ng-devtools:dispatch-ngrx-action` | tool | Dispatches an action to the classic Store, or an action from the log again, and returns the new log entry. |
-| `ng-devtools:ngrx-store` | resource | The live stores per page, with state, computeds, methods, references and the change log. Classic Store actions carry an `origin`. |
-| `ng-devtools:inspect-signal-store` | tool | The live state of one store, or a summary of every store discovered so far. |
-| `ng-devtools:signal-store-history` | tool | The live change log, oldest first: state diffs, classic `@ngrx/store` actions and `@ngrx/signals/events` events. |
+| Tool or resource | Kind | What it does |
+| ------------------------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------- |
+| `pangular:get-ngrx-store` | tool | NgRx declarations from source, with the members of each `signalStore` and the type strings of each action. |
+| `pangular:dispatch-ngrx-action` | tool | Dispatches an action to the classic Store, or an action from the log again, and returns the new log entry. |
+| `pangular:ngrx-store` | resource | The live stores per page, with state, computeds, methods, references and the change log. Classic Store actions carry an `origin`. |
+| `pangular:inspect-signal-store` | tool | The live state of one store, or a summary of every store discovered so far. |
+| `pangular:signal-store-history` | tool | The live change log, oldest first: state diffs, classic `@ngrx/store` actions and `@ngrx/signals/events` events. |
No tool can restore a state. See [Dispatch an action](../agents/tools.md#dispatch-an-action) and [Resources](../agents/resources.md).
@@ -170,7 +170,7 @@ No tool can restore a state. See [Dispatch an action](../agents/tools.md#dispatc
### `watchState` needs `registerNgrxSignals`
-Without it, restore writes the state signals directly. Components update, but `watchState` listeners do not run, and the log entry says so. Call `registerNgrxSignals({ patchState, watchState })` from `@santoshyadavdev/ng-devtools/overlay` once, and restore goes through `patchState`. This applies to `signalStore` only. A `signalState` restore always writes directly. See [Restore NgRx signal state](../guides/ngrx-signals-restore.md).
+Without it, restore writes the state signals directly. Components update, but `watchState` listeners do not run, and the log entry says so. Call `registerNgrxSignals({ patchState, watchState })` from `@pangular-inspector/devtools/overlay` once, and restore goes through `patchState`. This applies to `signalStore` only. A `signalState` restore always writes directly. See [Restore NgRx signal state](../guides/ngrx-signals-restore.md).
### Stores appear when they are created
diff --git a/apps/docs/src/content/inspectors/pipes.md b/apps/docs/src/content/inspectors/pipes.md
index 406bfb11..ea9180b1 100644
--- a/apps/docs/src/content/inspectors/pipes.md
+++ b/apps/docs/src/content/inspectors/pipes.md
@@ -124,11 +124,11 @@ Look for **resubscribing** rows in **Async subscriptions**, and for `async-on-ca
## Agent tools
-| Tool | Live | What it does |
-| -------------------------- | ------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| `ng-devtools:get-pipes` | no | Custom pipes and the built-in pipes in use. |
-| `ng-devtools:lint-pipes` | no | Runs the lint rules above. |
-| `ng-devtools:explain-pipe` | partly | One pipe by `name`: where it is declared or used, purity, live counts, last input and output, the stale warning, resubscribing `\| async` usages and the lint findings. |
+| Tool | Live | What it does |
+| ----------------------- | ------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `pangular:get-pipes` | no | Custom pipes and the built-in pipes in use. |
+| `pangular:lint-pipes` | no | Runs the lint rules above. |
+| `pangular:explain-pipe` | partly | One pipe by `name`: where it is declared or used, purity, live counts, last input and output, the stale warning, resubscribing `\| async` usages and the lint findings. |
Agents can't turn recording on. To give `explain-pipe` call data, click **Record calls** in the panel first. See [Tools](../agents/tools.md).
diff --git a/apps/docs/src/content/inspectors/router.md b/apps/docs/src/content/inspectors/router.md
index 3239656f..516fc9a9 100644
--- a/apps/docs/src/content/inspectors/router.md
+++ b/apps/docs/src/content/inspectors/router.md
@@ -97,7 +97,7 @@ Route config mistakes, each with a fix:
Each finding says whether Angular throws, warns or does not warn. The lint skips lazy routes that have not loaded. It runs again after each navigation and config change, and keeps the current findings on screen while it does. Click **Check again** to rerun it.
-If no check could run, the view says **No checks ran** and why: the page runs in events-only mode, or it has not reported its route config yet. If the DevTools server does not answer, the view shows an error with **Retry**.
+If no check could run, the view says **No checks ran** and why: the page runs in events-only mode, or it has not reported its route config yet. If the devtools server does not answer, the view shows an error with **Retry**.
### Source route config
@@ -181,18 +181,18 @@ Without that recording, the guards listed for a navigation are candidates: the `
## Agent tools
-| Tool or resource | What it does |
-| --------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| `ng-devtools:explain-navigation` | Why a navigation failed or redirected, with any loop and the cause of each hop. Pass `url` or `id` to narrow it, `limit` for more than the last 5, or `perf` for the slowest ones. |
-| `ng-devtools:inspect-route` | The route the page is on. Pass `selector` (a component class, tag or link text) for the route a component was rendered for, or a link state. |
-| `ng-devtools:list-routes` | The live config with source files and example URLs. `match` predicts a URL, `audit` lists the guards of each page. |
-| `ng-devtools:lint-routes` | The lint findings, including redirect loops seen at runtime. |
-| `ng-devtools:router-config` | The setup, including whether guard recording is on. |
-| `ng-devtools:export-navigation` | A markdown repro, with any loop the navigation is part of. Defaults to the latest navigation that did not succeed. |
-| `ng-devtools:explain-render-mode` | Which render mode a URL gets, from `*.routes.server.ts`. |
-| `ng-devtools:get-routes` | Routes from your source files. |
-| `ng-devtools:navigate` | Acts on the router: `navigate`, `abort`, `replay`, `probe`, `instrument` and `resolve-lazy`. |
-| `ng-devtools:router` (resource) | The active route tree and recent navigations of each page. |
+| Tool or resource | What it does |
+| ------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `pangular:explain-navigation` | Why a navigation failed or redirected, with any loop and the cause of each hop. Pass `url` or `id` to narrow it, `limit` for more than the last 5, or `perf` for the slowest ones. |
+| `pangular:inspect-route` | The route the page is on. Pass `selector` (a component class, tag or link text) for the route a component was rendered for, or a link state. |
+| `pangular:list-routes` | The live config with source files and example URLs. `match` predicts a URL, `audit` lists the guards of each page. |
+| `pangular:lint-routes` | The lint findings, including redirect loops seen at runtime. |
+| `pangular:router-config` | The setup, including whether guard recording is on. |
+| `pangular:export-navigation` | A markdown repro, with any loop the navigation is part of. Defaults to the latest navigation that did not succeed. |
+| `pangular:explain-render-mode` | Which render mode a URL gets, from `*.routes.server.ts`. |
+| `pangular:get-routes` | Routes from your source files. |
+| `pangular:navigate` | Acts on the router: `navigate`, `abort`, `replay`, `probe`, `instrument` and `resolve-lazy`. |
+| `pangular:router` (resource) | The active route tree and recent navigations of each page. |
`navigate` only accepts same-origin relative URLs that start with `/`. `resolve-lazy` needs a `routeId`. With [`actions.router`](../getting-started/configuration.md#actions) set to `false`, the tool refuses `navigate`, `abort`, `replay` and `probe`, and keeps `instrument` and `resolve-lazy`. See [Tools](../agents/tools.md).
@@ -212,7 +212,7 @@ Aborting and probing use the `currentNavigation` signal and `Navigation.abort()`
### Navigations before the devtools connected
-The tab lists only the last one, marked **before DevTools connected**, without timing or guard details. It also lists a navigation still running at that moment.
+The tab lists only the last one, marked **before Pangular Inspector connected**, without timing or guard details. It also lists a navigation still running at that moment.
### Redaction
@@ -220,7 +220,7 @@ The devtools replace query, matrix and fragment values with secret-looking keys
### History and config caps
-The page keeps the last 50 navigations and 50 preloads. Set the navigation count with [`limits.navigations`](../getting-started/configuration.md#limits). Once older navigations are dropped, the **Navigations** view and `explain-navigation` say how many. The live config lists at most 200 routes per level (a route's children and its loaded lazy routes count as one level) and 1000 routes in total. The **Routes** view and `ng-devtools:list-routes` say how many routes were left out.
+The page keeps the last 50 navigations and 50 preloads. Set the navigation count with [`limits.navigations`](../getting-started/configuration.md#limits). Once older navigations are dropped, the **Navigations** view and `explain-navigation` say how many. The live config lists at most 200 routes per level (a route's children and its loaded lazy routes count as one level) and 1000 routes in total. The **Routes** view and `pangular:list-routes` say how many routes were left out.
## FAQ
diff --git a/apps/docs/src/content/inspectors/signals.md b/apps/docs/src/content/inspectors/signals.md
index 9a7c2379..a2eb4a13 100644
--- a/apps/docs/src/content/inspectors/signals.md
+++ b/apps/docs/src/content/inspectors/signals.md
@@ -146,7 +146,7 @@ Entries are sampled instead of exact in these cases:
### Switch the graph from an agent
-The `ng-devtools:highlight` tool also switches the graph to the component it highlights. Calling `ng-devtools:inspect-signals` with `root` or a route path switches it to that injector. The picker does not show either choice.
+The `pangular:highlight` tool also switches the graph to the component it highlights. Calling `pangular:inspect-signals` with `root` or a route path switches it to that injector. The picker does not show either choice.
### Find a stuck effect in a root service
@@ -161,12 +161,12 @@ The `ng-devtools:highlight` tool also switches the graph to the component it hig
## Agent tools
-| Tool or resource | Kind | What it does |
-| ----------------------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------- |
-| `ng-devtools:get-signals` | tool | Signal declarations from source, with signal inputs, models and queries. |
-| `ng-devtools:inspect-signals` | tool | The graph the page reported, with edges, resources and history. Takes a host tag, class name, instance id, `root` or a route path. |
-| `ng-devtools:highlight` | tool | Highlights a component and makes it the target of the graph. |
-| `ng-devtools:signal-graph` | resource | The live graph per page. |
+| Tool or resource | Kind | What it does |
+| -------------------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------- |
+| `pangular:get-signals` | tool | Signal declarations from source, with signal inputs, models and queries. |
+| `pangular:inspect-signals` | tool | The graph the page reported, with edges, resources and history. Takes a host tag, class name, instance id, `root` or a route path. |
+| `pangular:highlight` | tool | Highlights a component and makes it the target of the graph. |
+| `pangular:signal-graph` | resource | The live graph per page. |
`inspect-signals` returns the graph of the chosen component. Call `highlight` first to switch it to another component. See [Tools](../agents/tools.md).
diff --git a/apps/docs/src/content/inspectors/ssr-http.md b/apps/docs/src/content/inspectors/ssr-http.md
index 33a5279b..3b3b5a40 100644
--- a/apps/docs/src/content/inspectors/ssr-http.md
+++ b/apps/docs/src/content/inspectors/ssr-http.md
@@ -13,25 +13,25 @@ The SSR & HTTP tab shows the HTTP calls your app makes during server rendering a
## Setup
-The timeline and fault rules need the interceptor. The hydration warnings need the provider. Add both to the app config, with `withNgDevtools()` before your own interceptors:
+The timeline and fault rules need the interceptor. The hydration warnings need the provider. Add both to the app config, with `withPangular()` before your own interceptors:
```ts {9-10}
// src/app/app.config.ts
import {ApplicationConfig} from '@angular/core';
import {provideHttpClient, withFetch, withInterceptors} from '@angular/common/http';
-import {provideNgDevtoolsHttp, withNgDevtools} from '@santoshyadavdev/ng-devtools/http';
+import {providePangularHttp, withPangular} from '@pangular-inspector/devtools/http';
import {authInterceptor} from './auth.interceptor';
export const appConfig: ApplicationConfig = {
providers: [
- provideHttpClient(withFetch(), withNgDevtools(), withInterceptors([authInterceptor])),
- provideNgDevtoolsHttp(),
+ provideHttpClient(withFetch(), withPangular(), withInterceptors([authInterceptor])),
+ providePangularHttp(),
],
};
```
-
- Put withNgDevtools() before your own interceptors. Then it records requests as the app makes them, and fault rules apply before anything else. The full setup is in the SSR & HTTP guide.
+
+ Put withPangular() before your own interceptors. Then it records requests as the app makes them, and fault rules apply before anything else. The full setup is in the SSR & HTTP guide.
SSR must run in the same Node process as the devtools server, such as the Express server with the hub mounted, or the Vite dev server with the plugin. The [overlay](../getting-started/overlay.md) must be loaded, because client calls, hydration and the payload reach the tab through it.
@@ -96,10 +96,10 @@ Each entry in the page's `{APP_ID}-state` script, with its size. The tab decodes
| Part | Needs |
| --------------------- | --------------------------------------- |
-| HTTP timeline | `withNgDevtools()` and the overlay. |
-| Fault injection | `withNgDevtools()`. |
+| HTTP timeline | `withPangular()` and the overlay. |
+| Fault injection | `withPangular()`. |
| Hydration stats | The overlay. |
-| Hydration warnings | `provideNgDevtoolsHttp()`. |
+| Hydration warnings | `providePangularHttp()`. |
| TransferState payload | The overlay, on a server-rendered page. |
### Development builds
@@ -152,14 +152,14 @@ The interceptor works in development builds only. In production it passes reques
## Agent tools
-There is no dedicated tool for this tab. Agents read its data with the `devframe_state_read` tool and the `ng-devtools:http` key. See [Resources](../agents/resources.md).
+There is no dedicated tool for this tab. Agents read its data with the `devframe_state_read` tool and the `pangular:http` key. See [Resources](../agents/resources.md).
Two router tools cover related ground:
-| Tool | What it does |
-| --------------------------------- | ------------------------------------------------------------- |
-| `ng-devtools:explain-render-mode` | Which render mode a URL gets, from `*.routes.server.ts`. |
-| `ng-devtools:explain-navigation` | Each navigation's story, including the HTTP requests it made. |
+| Tool | What it does |
+| ------------------------------ | ------------------------------------------------------------- |
+| `pangular:explain-render-mode` | Which render mode a URL gets, from `*.routes.server.ts`. |
+| `pangular:explain-navigation` | Each navigation's story, including the HTTP requests it made. |
## Limits and gotchas
@@ -192,7 +192,7 @@ The timeline keeps the last 200 SSR calls in total, and the last 200 client call
SSR runs in a different process from the devtools, or the route is prerendered. Mount the hub in the same server, and use RenderMode.Server.
- provideNgDevtoolsHttp() is missing from the app providers.
+ providePangularHttp() is missing from the app providers.
Client calls live in the page, so a reload clears them. SSR calls stay until Clear timeline or a server restart.
diff --git a/apps/docs/src/content/security.md b/apps/docs/src/content/security.md
index 62ffa1cc..6fcda6c6 100644
--- a/apps/docs/src/content/security.md
+++ b/apps/docs/src/content/security.md
@@ -43,19 +43,19 @@ In detail, a request to the devtools must:
- come from a loopback address (any `127.x.x.x` address or `::1`), and
- have no `Origin` header, or an origin that is a loopback host, a Chrome extension, an entry in `allowedOrigins`, or a host that Vite's `server.allowedHosts` accepts.
-Other requests get `403` with the message "ng-devtools only answers requests from this machine." WebSocket upgrades follow the same rules.
+Other requests get `403` with the message "Pangular Inspector only answers requests from this machine." WebSocket upgrades follow the same rules.
If you open the dev server through another hostname that points to your machine (for example `myapp.test`), list it in Vite's `server.allowedHosts` and the devtools trust it too. Add other origins with `allowedOrigins`:
```ts {7-8}
// vite.config.ts
import analog from '@analogjs/platform';
-import ngDevtools from '@santoshyadavdev/ng-devtools/vite';
+import pangular from '@pangular-inspector/devtools/vite';
import {defineConfig} from 'vite';
export default defineConfig({
server: {allowedHosts: ['myapp.test']},
- plugins: [analog(), ngDevtools({allowedOrigins: ['https://tunnel.example']})],
+ plugins: [analog(), pangular({allowedOrigins: ['https://tunnel.example']})],
});
```
@@ -77,7 +77,7 @@ With only loopback hosts allowed, the loopback and origin checks take the place
### Express hub
-`initNgDevtoolsHub()` has two checks, both on by default:
+`initPangularHub()` has two checks, both on by default:
| Check | Option | What it does |
| ------------- | ---------------- | ----------------------------------------------------------------------------------------------------------------------------------------- |
@@ -86,12 +86,12 @@ With only loopback hosts allowed, the loopback and origin checks take the place
```ts {8}
// src/server.ts
-import {initNgDevtoolsHub} from '@santoshyadavdev/ng-devtools/hub';
+import {initPangularHub} from '@pangular-inspector/devtools/hub';
import express from 'express';
const app = express();
-const devtools = initNgDevtoolsHub({
+const devtools = initPangularHub({
allowedOrigins: ['https://tunnel.example'],
});
app.use(devtools.nodeMiddleware);
@@ -111,7 +111,7 @@ The CLI server binds to `localhost` and asks for a one-time code. `--host` chang
The HTTP MCP endpoint answers only requests that carry a loopback `Origin` header. In the Vite plugin, the request must also come from a loopback address, like every devtools request.
-While the one-time code is on, the endpoint also asks for a bearer token. That is the Express hub by default, and the Vite plugin when its code is on. The hub prints a generated token when it starts. Set `NG_DEVTOOLS_MCP_TOKEN` to choose the token yourself. Requests without the right `Authorization: Bearer ` header get `401`. The stdio server needs no token. See [Send a token](./agents/mcp-server.md#send-a-token).
+While the one-time code is on, the endpoint also asks for a bearer token. That is the Express hub by default, and the Vite plugin when its code is on. The hub prints a generated token when it starts. Set `PANGULAR_MCP_TOKEN` to choose the token yourself. Requests without the right `Authorization: Bearer ` header get `401`. The stdio server needs no token. See [Send a token](./agents/mcp-server.md#send-a-token).
Without a token, the Express hub answers only requests from a loopback address. With a token, it also answers other addresses that send the right token and a loopback `Origin`. Any client can set that header, so treat the token like a password.
@@ -133,7 +133,7 @@ A field's value is replaced with `[redacted]` when the field:
- is a password field,
- has a password, one-time-code or credit-card `autocomplete`,
-- sits inside `.sentry-mask`, `.rr-mask`, `[data-private]` or `[data-ng-devtools="mask"]`,
+- sits inside `.sentry-mask`, `.rr-mask`, `[data-private]` or `[data-pangular="mask"]`,
- has a name that contains a secret word (password, token, card, cvv, apiKey and similar), or a name listed in `mask`, or
- sits inside a group or array whose name contains a secret word.
@@ -146,15 +146,14 @@ Those values are also removed from error messages. The devtools don't write secr
Mark a field in the template, or list keys on `window`:
```html
-
-
+
```
```ts
-window.__NG_DEVTOOLS_FORMS__ = {mask: ['iban'], unmask: ['passport']};
+window.__PANGULAR_FORMS__ = {mask: ['iban'], unmask: ['passport']};
```
-`[data-ng-devtools="unmask"]` opts a field back in. The `window` setting does the same by key.
+`[data-pangular="unmask"]` opts a field back in. The `window` setting does the same by key.
The `mask` and `unmask` lists apply to every inspector on the page, not only forms: nested keys of an object-valued control, Signal Forms fields, form writes and restores, component inputs, signals, NgRx state, pipes and the Analog `load()` preview all follow them. Analog server call previews are recorded on the server, so they follow `redaction.secretNames` and `redaction.unmask` only.
@@ -213,7 +212,7 @@ Response previews and TransferState values in the [SSR & HTTP tab](./inspectors/
Keep real credentials out of forms and API responses you inspect.
- Use data-ng-devtools="mask", window.__NG_DEVTOOLS_FORMS__ or redaction.secretNames for fields the secret words miss.
+ Use data-pangular="mask", window.__PANGULAR_FORMS__ or redaction.secretNames for fields the secret words miss.
Set agent.readOnly or turn off actions to stop the panel and agents from writing to your app. See Configuration.
diff --git a/apps/docs/src/ngmd.config.ts b/apps/docs/src/ngmd.config.ts
index bc1a51b4..df870008 100644
--- a/apps/docs/src/ngmd.config.ts
+++ b/apps/docs/src/ngmd.config.ts
@@ -133,11 +133,11 @@ export interface NgmdConfig {
const config: NgmdConfig = {
site: {
- name: 'Angular DevTools',
+ name: 'Pangular Inspector',
description:
'Inspect Angular components, signals, dependency injection, routes, forms and stores. In the page, from the CLI, or through a coding agent over MCP.',
- tagline: 'Devtools for Angular apps and coding agents',
- url: 'https://santoshyadavdev.github.io/angular-devtools',
+ tagline: 'The unified Angular devtools',
+ url: 'https://pangular-inspector.dev',
githubUrl: 'https://github.com/santoshyadavdev/angular-devtools',
githubDir: 'apps/docs',
links: {
diff --git a/bin.mjs b/bin.mjs
index 834004cc..0c890449 100644
--- a/bin.mjs
+++ b/bin.mjs
@@ -1,4 +1,4 @@
#!/usr/bin/env node
-import { createNgDevtoolsCli } from '@santoshyadavdev/ng-devtools/cli';
+import { createPangularCli } from '@pangular-inspector/devtools/cli';
-await createNgDevtoolsCli().parse();
+await createPangularCli().parse();
diff --git a/docs/CONTEXT.md b/docs/CONTEXT.md
index 646ff3c5..29b02700 100644
--- a/docs/CONTEXT.md
+++ b/docs/CONTEXT.md
@@ -1,6 +1,6 @@
-# Angular DevTools
+# Pangular Inspector
-Angular DevTools inspects a running Angular app and serves what it finds to a panel and to AI agents over MCP. This glossary fixes the words the project uses for its own concepts, so that a name means one thing in the code, the docs, issues and commit messages. Each entry gives the term, what it means here, and the words to avoid for it.
+Pangular Inspector inspects a running Angular app and serves what it finds to a panel and to AI agents over MCP. This glossary fixes the words the project uses for its own concepts, so that a name means one thing in the code, the docs, issues and commit messages. Each entry gives the term, what it means here, and the words to avoid for it.
## Language
@@ -17,7 +17,7 @@ The short id a page claims when the overlay starts, kept in `sessionStorage` so
_Avoid_: tab id, session id, client id
**Overlay**:
-The script the app imports in `main.ts` in development only (`@santoshyadavdev/ng-devtools/overlay`). It finds the server, starts the collectors and adds the floating button. It reads the page; it never changes it on its own.
+The script the app imports in `main.ts` in development only (`@pangular-inspector/devtools/overlay`). It finds the server, starts the collectors and adds the floating button. It reads the page; it never changes it on its own.
_Avoid_: content script, agent, injected script
**Collector**:
@@ -33,15 +33,15 @@ A report a collector sends to the server over RPC, such as `push-component-tree`
_Avoid_: sync, upload, post
**Inspector**:
-One area the devtools can look at: `components`, `injectors`, `signals`, `ngrx`, `forms`, `router`, `pipes`, `http` and `analog` (`NG_DEVTOOLS_INSPECTORS` in `config.ts`). An inspector owns a collector, its RPC functions, its agent tools and its view in the panel, and `inspectors` in the config turns all of them off together.
+One area the devtools can look at: `components`, `injectors`, `signals`, `ngrx`, `forms`, `router`, `pipes`, `http` and `analog` (`PANGULAR_INSPECTORS` in `config.ts`). An inspector owns a collector, its RPC functions, its agent tools and its view in the panel, and `inspectors` in the config turns all of them off together.
_Avoid_: plugin, module, feature
**Devframe**:
-The framework the devtools are built on (`devframe`). One definition, `packages/ng-devtools/src/devframe.ts`, declares the RPC functions, shared state and agent tools, and Devframe serves it as the embedded panel, the standalone CLI, the static report and the MCP server.
+The framework the devtools are built on (`devframe`). One definition, `packages/devtools/src/devframe.ts`, declares the RPC functions, shared state and agent tools, and Devframe serves it as the embedded panel, the standalone CLI, the static report and the MCP server.
_Avoid_: framework, runtime, backend
**Hub**:
-The server part an app mounts: `initNgDevtoolsHub()` for Express, or the Vite plugin. It is built on `@devframes/hub`, serves the panel and the connection file under `/__devframes/`, and lets other Devframe tools join the same dock.
+The server part an app mounts: `initPangularHub()` for Express, or the Vite plugin. It is built on `@devframes/hub`, serves the panel and the connection file under `/__devframes/`, and lets other Devframe tools join the same dock.
_Avoid_: server (too broad), middleware, proxy
**Dock**:
@@ -73,7 +73,7 @@ Anything that changes the app or the server rather than reading it: setting a fo
_Avoid_: mutation, command, write tool
**Resource**:
-Live state an agent reads as JSON over MCP, such as `ng-devtools:component-tree`. It holds what the connected pages reported, so it is empty when no page is connected.
+Live state an agent reads as JSON over MCP, such as `pangular:component-tree`. It holds what the connected pages reported, so it is empty when no page is connected.
_Avoid_: snapshot, feed, state dump
**Source scan**:
@@ -81,7 +81,7 @@ What the devtools read from the project's source files rather than the running p
_Avoid_: static analysis, AST pass, crawl
**Static report**:
-An offline HTML build of the panel over the source scan, written by `ng-devtools build --outDir `. No page connects to it.
+An offline HTML build of the panel over the source scan, written by `pangular build --outDir `. No page connects to it.
_Avoid_: export, snapshot, static site
**Redaction**:
diff --git a/docs/contributing/coding-standards.md b/docs/contributing/coding-standards.md
index 21472846..cea6b7ae 100644
--- a/docs/contributing/coding-standards.md
+++ b/docs/contributing/coding-standards.md
@@ -10,7 +10,7 @@ These rules go together with the Angular rules in [`AGENTS.md`](../../AGENTS.md)
- No `I` prefix on interfaces and no `$` suffix on observables.
- Prefer `for...of` over `forEach` when the loop has side effects.
- Only catch errors you expect, and say what happens instead (fall back, skip, report).
-- Comment the why, not the what. Public functions and exported types in `packages/ng-devtools` get a short doc comment when the name alone doesn't explain them.
+- Comment the why, not the what. Public functions and exported types in `packages/devtools` get a short doc comment when the name alone doesn't explain them.
## Angular (panel UI and demo app)
@@ -23,7 +23,7 @@ These rules go together with the Angular rules in [`AGENTS.md`](../../AGENTS.md)
The panel's visual rules are in the [UI guidelines](./ui-guidelines.md).
-## Reading data from the page (`packages/ng-devtools`)
+## Reading data from the page (`packages/devtools`)
The overlay runs inside the user's app, so it must be correct, cheap and invisible.
@@ -45,7 +45,7 @@ The overlay runs inside the user's app, so it must be correct, cheap and invisib
## Tests
-- Every behavior change comes with a test in `packages/ng-devtools/src/__tests__` or `packages/ng-devtools/src/rpc/__tests__`.
+- Every behavior change comes with a test in `packages/devtools/src/__tests__` or `packages/devtools/src/rpc/__tests__`.
- Page-side collectors are tested in jsdom with a fake `ng` object; see `injector-tree.test.ts` and `component-tree.test.ts`.
- Test names read as sentences: `it('keeps ids stable between collections')`.
- Run `pnpm test:devtools`, `pnpm test:panel` and `pnpm test` before you push.
diff --git a/docs/contributing/commit-message-guidelines.md b/docs/contributing/commit-message-guidelines.md
index d4fbaef1..f1a508be 100644
--- a/docs/contributing/commit-message-guidelines.md
+++ b/docs/contributing/commit-message-guidelines.md
@@ -107,7 +107,7 @@ route with query parameters never showed as active.
```
```
-chore(release): ng-devtools 0.0.5
+chore(release): 0.0.7
```
```
diff --git a/docs/privacy-policy.html b/docs/privacy-policy.html
index eea2f9dc..22de2f1e 100644
--- a/docs/privacy-policy.html
+++ b/docs/privacy-policy.html
@@ -3,7 +3,7 @@
- Angular DevTools — Privacy Policy
+ Pangular Inspector privacy policy