@tyroneross/navgator 0.2.2 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/plugins/marketplace.json +20 -0
- package/.claude-plugin/marketplace.json +21 -7
- package/.claude-plugin/plugin.json +16 -11
- package/.codex-plugin/plugin.json +31 -0
- package/.mcp.json +8 -0
- package/CLAUDE.md +197 -23
- package/LICENSE +202 -21
- package/README.md +220 -33
- package/agents/architecture-advisor.md +6 -2
- package/agents/architecture-investigator.md +163 -0
- package/agents/architecture-planner.md +160 -0
- package/agents/external-resolver.md +97 -0
- package/dist/__tests__/agent-output.test.d.ts +5 -0
- package/dist/__tests__/agent-output.test.d.ts.map +1 -0
- package/dist/__tests__/agent-output.test.js +233 -0
- package/dist/__tests__/agent-output.test.js.map +1 -0
- package/dist/__tests__/architecture-insights-stack.test.d.ts +21 -0
- package/dist/__tests__/architecture-insights-stack.test.d.ts.map +1 -0
- package/dist/__tests__/architecture-insights-stack.test.js +86 -0
- package/dist/__tests__/architecture-insights-stack.test.js.map +1 -0
- package/dist/__tests__/architecture-insights.test.d.ts +2 -0
- package/dist/__tests__/architecture-insights.test.d.ts.map +1 -0
- package/dist/__tests__/architecture-insights.test.js +46 -0
- package/dist/__tests__/architecture-insights.test.js.map +1 -0
- package/dist/__tests__/audit-sampler.test.d.ts +10 -0
- package/dist/__tests__/audit-sampler.test.d.ts.map +1 -0
- package/dist/__tests__/audit-sampler.test.js +172 -0
- package/dist/__tests__/audit-sampler.test.js.map +1 -0
- package/dist/__tests__/audit-spc.test.d.ts +5 -0
- package/dist/__tests__/audit-spc.test.d.ts.map +1 -0
- package/dist/__tests__/audit-spc.test.js +94 -0
- package/dist/__tests__/audit-spc.test.js.map +1 -0
- package/dist/__tests__/audit-verifiers.test.d.ts +5 -0
- package/dist/__tests__/audit-verifiers.test.d.ts.map +1 -0
- package/dist/__tests__/audit-verifiers.test.js +248 -0
- package/dist/__tests__/audit-verifiers.test.js.map +1 -0
- package/dist/__tests__/auto-refresh.test.d.ts +12 -0
- package/dist/__tests__/auto-refresh.test.d.ts.map +1 -0
- package/dist/__tests__/auto-refresh.test.js +236 -0
- package/dist/__tests__/auto-refresh.test.js.map +1 -0
- package/dist/__tests__/bare-imports.test.d.ts +8 -0
- package/dist/__tests__/bare-imports.test.d.ts.map +1 -0
- package/dist/__tests__/bare-imports.test.js +176 -0
- package/dist/__tests__/bare-imports.test.js.map +1 -0
- package/dist/__tests__/classify.test.d.ts +5 -0
- package/dist/__tests__/classify.test.d.ts.map +1 -0
- package/dist/__tests__/classify.test.js +158 -0
- package/dist/__tests__/classify.test.js.map +1 -0
- package/dist/__tests__/cli-commands.test.d.ts +8 -0
- package/dist/__tests__/cli-commands.test.d.ts.map +1 -0
- package/dist/__tests__/cli-commands.test.js +207 -0
- package/dist/__tests__/cli-commands.test.js.map +1 -0
- package/dist/__tests__/consolidated-readers.test.d.ts +23 -0
- package/dist/__tests__/consolidated-readers.test.d.ts.map +1 -0
- package/dist/__tests__/consolidated-readers.test.js +200 -0
- package/dist/__tests__/consolidated-readers.test.js.map +1 -0
- package/dist/__tests__/coverage.test.d.ts +5 -0
- package/dist/__tests__/coverage.test.d.ts.map +1 -0
- package/dist/__tests__/coverage.test.js +120 -0
- package/dist/__tests__/coverage.test.js.map +1 -0
- package/dist/__tests__/deploy-scanner-runtime.test.d.ts +6 -0
- package/dist/__tests__/deploy-scanner-runtime.test.d.ts.map +1 -0
- package/dist/__tests__/deploy-scanner-runtime.test.js +168 -0
- package/dist/__tests__/deploy-scanner-runtime.test.js.map +1 -0
- package/dist/__tests__/env-scanner.test.d.ts +2 -0
- package/dist/__tests__/env-scanner.test.d.ts.map +1 -0
- package/dist/__tests__/env-scanner.test.js +191 -0
- package/dist/__tests__/env-scanner.test.js.map +1 -0
- package/dist/__tests__/freshness/cli-freshness.test.d.ts +2 -0
- package/dist/__tests__/freshness/cli-freshness.test.d.ts.map +1 -0
- package/dist/__tests__/freshness/cli-freshness.test.js +26 -0
- package/dist/__tests__/freshness/cli-freshness.test.js.map +1 -0
- package/dist/__tests__/freshness/dirty-ledger.test.d.ts +2 -0
- package/dist/__tests__/freshness/dirty-ledger.test.d.ts.map +1 -0
- package/dist/__tests__/freshness/dirty-ledger.test.js +39 -0
- package/dist/__tests__/freshness/dirty-ledger.test.js.map +1 -0
- package/dist/__tests__/freshness/drainer.test.d.ts +2 -0
- package/dist/__tests__/freshness/drainer.test.d.ts.map +1 -0
- package/dist/__tests__/freshness/drainer.test.js +103 -0
- package/dist/__tests__/freshness/drainer.test.js.map +1 -0
- package/dist/__tests__/freshness/paths.test.d.ts +2 -0
- package/dist/__tests__/freshness/paths.test.d.ts.map +1 -0
- package/dist/__tests__/freshness/paths.test.js +19 -0
- package/dist/__tests__/freshness/paths.test.js.map +1 -0
- package/dist/__tests__/freshness/scan-lock.test.d.ts +2 -0
- package/dist/__tests__/freshness/scan-lock.test.d.ts.map +1 -0
- package/dist/__tests__/freshness/scan-lock.test.js +40 -0
- package/dist/__tests__/freshness/scan-lock.test.js.map +1 -0
- package/dist/__tests__/freshness/stamp.test.d.ts +2 -0
- package/dist/__tests__/freshness/stamp.test.d.ts.map +1 -0
- package/dist/__tests__/freshness/stamp.test.js +36 -0
- package/dist/__tests__/freshness/stamp.test.js.map +1 -0
- package/dist/__tests__/gitignore-safety.test.d.ts +2 -0
- package/dist/__tests__/gitignore-safety.test.d.ts.map +1 -0
- package/dist/__tests__/gitignore-safety.test.js +110 -0
- package/dist/__tests__/gitignore-safety.test.js.map +1 -0
- package/dist/__tests__/helpers.d.ts +37 -0
- package/dist/__tests__/helpers.d.ts.map +1 -0
- package/dist/__tests__/helpers.js +134 -0
- package/dist/__tests__/helpers.js.map +1 -0
- package/dist/__tests__/impact.test.d.ts +5 -0
- package/dist/__tests__/impact.test.d.ts.map +1 -0
- package/dist/__tests__/impact.test.js +221 -0
- package/dist/__tests__/impact.test.js.map +1 -0
- package/dist/__tests__/lessons-store.test.d.ts +8 -0
- package/dist/__tests__/lessons-store.test.d.ts.map +1 -0
- package/dist/__tests__/lessons-store.test.js +232 -0
- package/dist/__tests__/lessons-store.test.js.map +1 -0
- package/dist/__tests__/llm-dedup.test.d.ts +2 -0
- package/dist/__tests__/llm-dedup.test.d.ts.map +1 -0
- package/dist/__tests__/llm-dedup.test.js +155 -0
- package/dist/__tests__/llm-dedup.test.js.map +1 -0
- package/dist/__tests__/mjs-frontend-fetch.test.d.ts +19 -0
- package/dist/__tests__/mjs-frontend-fetch.test.d.ts.map +1 -0
- package/dist/__tests__/mjs-frontend-fetch.test.js +179 -0
- package/dist/__tests__/mjs-frontend-fetch.test.js.map +1 -0
- package/dist/__tests__/multi-stack-discovery.test.d.ts +11 -0
- package/dist/__tests__/multi-stack-discovery.test.d.ts.map +1 -0
- package/dist/__tests__/multi-stack-discovery.test.js +75 -0
- package/dist/__tests__/multi-stack-discovery.test.js.map +1 -0
- package/dist/__tests__/per-entity-files-gate.test.d.ts +22 -0
- package/dist/__tests__/per-entity-files-gate.test.d.ts.map +1 -0
- package/dist/__tests__/per-entity-files-gate.test.js +160 -0
- package/dist/__tests__/per-entity-files-gate.test.js.map +1 -0
- package/dist/__tests__/prisma-calls.test.d.ts +2 -0
- package/dist/__tests__/prisma-calls.test.d.ts.map +1 -0
- package/dist/__tests__/prisma-calls.test.js +125 -0
- package/dist/__tests__/prisma-calls.test.js.map +1 -0
- package/dist/__tests__/prisma-parser.test.d.ts +2 -0
- package/dist/__tests__/prisma-parser.test.d.ts.map +1 -0
- package/dist/__tests__/prisma-parser.test.js +252 -0
- package/dist/__tests__/prisma-parser.test.js.map +1 -0
- package/dist/__tests__/prompt-detector.test.d.ts +5 -0
- package/dist/__tests__/prompt-detector.test.d.ts.map +1 -0
- package/dist/__tests__/prompt-detector.test.js +75 -0
- package/dist/__tests__/prompt-detector.test.js.map +1 -0
- package/dist/__tests__/queue-scanner.test.d.ts +5 -0
- package/dist/__tests__/queue-scanner.test.d.ts.map +1 -0
- package/dist/__tests__/queue-scanner.test.js +85 -0
- package/dist/__tests__/queue-scanner.test.js.map +1 -0
- package/dist/__tests__/resolve.test.d.ts +5 -0
- package/dist/__tests__/resolve.test.d.ts.map +1 -0
- package/dist/__tests__/resolve.test.js +196 -0
- package/dist/__tests__/resolve.test.js.map +1 -0
- package/dist/__tests__/rules.test.d.ts +2 -0
- package/dist/__tests__/rules.test.d.ts.map +1 -0
- package/dist/__tests__/rules.test.js +343 -0
- package/dist/__tests__/rules.test.js.map +1 -0
- package/dist/__tests__/sandbox.test.d.ts +5 -0
- package/dist/__tests__/sandbox.test.d.ts.map +1 -0
- package/dist/__tests__/sandbox.test.js +189 -0
- package/dist/__tests__/sandbox.test.js.map +1 -0
- package/dist/__tests__/scanner-audit.test.d.ts +9 -0
- package/dist/__tests__/scanner-audit.test.d.ts.map +1 -0
- package/dist/__tests__/scanner-audit.test.js +64 -0
- package/dist/__tests__/scanner-audit.test.js.map +1 -0
- package/dist/__tests__/scanner-characterization.test.d.ts +16 -0
- package/dist/__tests__/scanner-characterization.test.d.ts.map +1 -0
- package/dist/__tests__/scanner-characterization.test.js +167 -0
- package/dist/__tests__/scanner-characterization.test.js.map +1 -0
- package/dist/__tests__/scanner-incremental.test.d.ts +13 -0
- package/dist/__tests__/scanner-incremental.test.d.ts.map +1 -0
- package/dist/__tests__/scanner-incremental.test.js +725 -0
- package/dist/__tests__/scanner-incremental.test.js.map +1 -0
- package/dist/__tests__/scanner-integration.test.d.ts +7 -0
- package/dist/__tests__/scanner-integration.test.d.ts.map +1 -0
- package/dist/__tests__/scanner-integration.test.js +211 -0
- package/dist/__tests__/scanner-integration.test.js.map +1 -0
- package/dist/__tests__/scip-new-catches.test.d.ts +19 -0
- package/dist/__tests__/scip-new-catches.test.d.ts.map +1 -0
- package/dist/__tests__/scip-new-catches.test.js +90 -0
- package/dist/__tests__/scip-new-catches.test.js.map +1 -0
- package/dist/__tests__/subgraph.test.d.ts +5 -0
- package/dist/__tests__/subgraph.test.d.ts.map +1 -0
- package/dist/__tests__/subgraph.test.js +145 -0
- package/dist/__tests__/subgraph.test.js.map +1 -0
- package/dist/__tests__/trace.test.d.ts +5 -0
- package/dist/__tests__/trace.test.d.ts.map +1 -0
- package/dist/__tests__/trace.test.js +221 -0
- package/dist/__tests__/trace.test.js.map +1 -0
- package/dist/agent-output.d.ts +16 -0
- package/dist/agent-output.d.ts.map +1 -0
- package/dist/agent-output.js +142 -0
- package/dist/agent-output.js.map +1 -0
- package/dist/architecture-insights.d.ts +17 -0
- package/dist/architecture-insights.d.ts.map +1 -0
- package/dist/architecture-insights.js +178 -0
- package/dist/architecture-insights.js.map +1 -0
- package/dist/audit/index.d.ts +69 -0
- package/dist/audit/index.d.ts.map +1 -0
- package/dist/audit/index.js +255 -0
- package/dist/audit/index.js.map +1 -0
- package/dist/audit/sampler.d.ts +98 -0
- package/dist/audit/sampler.d.ts.map +1 -0
- package/dist/audit/sampler.js +298 -0
- package/dist/audit/sampler.js.map +1 -0
- package/dist/audit/spc.d.ts +62 -0
- package/dist/audit/spc.d.ts.map +1 -0
- package/dist/audit/spc.js +81 -0
- package/dist/audit/spc.js.map +1 -0
- package/dist/audit/verifiers.d.ts +81 -0
- package/dist/audit/verifiers.d.ts.map +1 -0
- package/dist/audit/verifiers.js +366 -0
- package/dist/audit/verifiers.js.map +1 -0
- package/dist/classify.d.ts +19 -0
- package/dist/classify.d.ts.map +1 -0
- package/dist/classify.js +124 -0
- package/dist/classify.js.map +1 -0
- package/dist/cli/commands/connections.d.ts +3 -0
- package/dist/cli/commands/connections.d.ts.map +1 -0
- package/dist/cli/commands/connections.js +125 -0
- package/dist/cli/commands/connections.js.map +1 -0
- package/dist/cli/commands/coverage.d.ts +3 -0
- package/dist/cli/commands/coverage.d.ts.map +1 -0
- package/dist/cli/commands/coverage.js +94 -0
- package/dist/cli/commands/coverage.js.map +1 -0
- package/dist/cli/commands/dead.d.ts +3 -0
- package/dist/cli/commands/dead.d.ts.map +1 -0
- package/dist/cli/commands/dead.js +80 -0
- package/dist/cli/commands/dead.js.map +1 -0
- package/dist/cli/commands/diagram.d.ts +3 -0
- package/dist/cli/commands/diagram.d.ts.map +1 -0
- package/dist/cli/commands/diagram.js +102 -0
- package/dist/cli/commands/diagram.js.map +1 -0
- package/dist/cli/commands/find.d.ts +3 -0
- package/dist/cli/commands/find.d.ts.map +1 -0
- package/dist/cli/commands/find.js +128 -0
- package/dist/cli/commands/find.js.map +1 -0
- package/dist/cli/commands/freshness.d.ts +20 -0
- package/dist/cli/commands/freshness.d.ts.map +1 -0
- package/dist/cli/commands/freshness.js +90 -0
- package/dist/cli/commands/freshness.js.map +1 -0
- package/dist/cli/commands/helpers.d.ts +7 -0
- package/dist/cli/commands/helpers.d.ts.map +1 -0
- package/dist/cli/commands/helpers.js +30 -0
- package/dist/cli/commands/helpers.js.map +1 -0
- package/dist/cli/commands/impact.d.ts +3 -0
- package/dist/cli/commands/impact.d.ts.map +1 -0
- package/dist/cli/commands/impact.js +172 -0
- package/dist/cli/commands/impact.js.map +1 -0
- package/dist/cli/commands/lessons.d.ts +6 -0
- package/dist/cli/commands/lessons.d.ts.map +1 -0
- package/dist/cli/commands/lessons.js +279 -0
- package/dist/cli/commands/lessons.js.map +1 -0
- package/dist/cli/commands/list.d.ts +3 -0
- package/dist/cli/commands/list.d.ts.map +1 -0
- package/dist/cli/commands/list.js +91 -0
- package/dist/cli/commands/list.js.map +1 -0
- package/dist/cli/commands/llm-map.d.ts +3 -0
- package/dist/cli/commands/llm-map.d.ts.map +1 -0
- package/dist/cli/commands/llm-map.js +121 -0
- package/dist/cli/commands/llm-map.js.map +1 -0
- package/dist/cli/commands/misc.d.ts +17 -0
- package/dist/cli/commands/misc.d.ts.map +1 -0
- package/dist/cli/commands/misc.js +495 -0
- package/dist/cli/commands/misc.js.map +1 -0
- package/dist/cli/commands/prompts.d.ts +3 -0
- package/dist/cli/commands/prompts.d.ts.map +1 -0
- package/dist/cli/commands/prompts.js +74 -0
- package/dist/cli/commands/prompts.js.map +1 -0
- package/dist/cli/commands/rules.d.ts +3 -0
- package/dist/cli/commands/rules.d.ts.map +1 -0
- package/dist/cli/commands/rules.js +61 -0
- package/dist/cli/commands/rules.js.map +1 -0
- package/dist/cli/commands/scan.d.ts +3 -0
- package/dist/cli/commands/scan.d.ts.map +1 -0
- package/dist/cli/commands/scan.js +177 -0
- package/dist/cli/commands/scan.js.map +1 -0
- package/dist/cli/commands/schema.d.ts +3 -0
- package/dist/cli/commands/schema.d.ts.map +1 -0
- package/dist/cli/commands/schema.js +126 -0
- package/dist/cli/commands/schema.js.map +1 -0
- package/dist/cli/commands/status.d.ts +3 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +340 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/subgraph.d.ts +3 -0
- package/dist/cli/commands/subgraph.d.ts.map +1 -0
- package/dist/cli/commands/subgraph.js +55 -0
- package/dist/cli/commands/subgraph.js.map +1 -0
- package/dist/cli/commands/temporal.d.ts +3 -0
- package/dist/cli/commands/temporal.d.ts.map +1 -0
- package/dist/cli/commands/temporal.js +112 -0
- package/dist/cli/commands/temporal.js.map +1 -0
- package/dist/cli/commands/trace.d.ts +3 -0
- package/dist/cli/commands/trace.d.ts.map +1 -0
- package/dist/cli/commands/trace.js +65 -0
- package/dist/cli/commands/trace.js.map +1 -0
- package/dist/cli/index.js +88 -825
- package/dist/cli/index.js.map +1 -1
- package/dist/config.d.ts +13 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +106 -12
- package/dist/config.js.map +1 -1
- package/dist/coverage.d.ts +37 -0
- package/dist/coverage.d.ts.map +1 -0
- package/dist/coverage.js +177 -0
- package/dist/coverage.js.map +1 -0
- package/dist/diagram.d.ts.map +1 -1
- package/dist/diagram.js +41 -0
- package/dist/diagram.js.map +1 -1
- package/dist/diff.d.ts +57 -0
- package/dist/diff.d.ts.map +1 -0
- package/dist/diff.js +527 -0
- package/dist/diff.js.map +1 -0
- package/dist/enrich/cache.d.ts +41 -0
- package/dist/enrich/cache.d.ts.map +1 -0
- package/dist/enrich/cache.js +97 -0
- package/dist/enrich/cache.js.map +1 -0
- package/dist/enrich/external-enrichment.types.d.ts +91 -0
- package/dist/enrich/external-enrichment.types.d.ts.map +1 -0
- package/dist/enrich/external-enrichment.types.js +38 -0
- package/dist/enrich/external-enrichment.types.js.map +1 -0
- package/dist/enrich/external-resolver.d.ts +95 -0
- package/dist/enrich/external-resolver.d.ts.map +1 -0
- package/dist/enrich/external-resolver.js +222 -0
- package/dist/enrich/external-resolver.js.map +1 -0
- package/dist/enrich/fetchers.d.ts +30 -0
- package/dist/enrich/fetchers.d.ts.map +1 -0
- package/dist/enrich/fetchers.js +89 -0
- package/dist/enrich/fetchers.js.map +1 -0
- package/dist/file-resolve.d.ts +35 -0
- package/dist/file-resolve.d.ts.map +1 -0
- package/dist/file-resolve.js +159 -0
- package/dist/file-resolve.js.map +1 -0
- package/dist/freshness/dirty-ledger.d.ts +7 -0
- package/dist/freshness/dirty-ledger.d.ts.map +1 -0
- package/dist/freshness/dirty-ledger.js +56 -0
- package/dist/freshness/dirty-ledger.js.map +1 -0
- package/dist/freshness/drainer.d.ts +38 -0
- package/dist/freshness/drainer.d.ts.map +1 -0
- package/dist/freshness/drainer.js +88 -0
- package/dist/freshness/drainer.js.map +1 -0
- package/dist/freshness/paths.d.ts +9 -0
- package/dist/freshness/paths.d.ts.map +1 -0
- package/dist/freshness/paths.js +24 -0
- package/dist/freshness/paths.js.map +1 -0
- package/dist/freshness/scan-lock.d.ts +8 -0
- package/dist/freshness/scan-lock.d.ts.map +1 -0
- package/dist/freshness/scan-lock.js +68 -0
- package/dist/freshness/scan-lock.js.map +1 -0
- package/dist/freshness/stamp.d.ts +25 -0
- package/dist/freshness/stamp.d.ts.map +1 -0
- package/dist/freshness/stamp.js +50 -0
- package/dist/freshness/stamp.js.map +1 -0
- package/dist/git.d.ts +12 -0
- package/dist/git.d.ts.map +1 -0
- package/dist/git.js +42 -0
- package/dist/git.js.map +1 -0
- package/dist/gitignore-safety.d.ts +41 -0
- package/dist/gitignore-safety.d.ts.map +1 -0
- package/dist/gitignore-safety.js +107 -0
- package/dist/gitignore-safety.js.map +1 -0
- package/dist/impact.d.ts +20 -0
- package/dist/impact.d.ts.map +1 -0
- package/dist/impact.js +89 -0
- package/dist/impact.js.map +1 -0
- package/dist/index.d.ts +24 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +31 -1
- package/dist/index.js.map +1 -1
- package/dist/lessons-store.d.ts +93 -0
- package/dist/lessons-store.d.ts.map +1 -0
- package/dist/lessons-store.js +265 -0
- package/dist/lessons-store.js.map +1 -0
- package/dist/llm-dedup.d.ts +40 -0
- package/dist/llm-dedup.d.ts.map +1 -0
- package/dist/llm-dedup.js +373 -0
- package/dist/llm-dedup.js.map +1 -0
- package/dist/mcp/server.d.ts +9 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +87 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools.d.ts +198 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +744 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/metrics/pagerank-louvain.d.ts +44 -0
- package/dist/metrics/pagerank-louvain.d.ts.map +1 -0
- package/dist/metrics/pagerank-louvain.js +128 -0
- package/dist/metrics/pagerank-louvain.js.map +1 -0
- package/dist/parsers/scip-runner.d.ts +63 -0
- package/dist/parsers/scip-runner.d.ts.map +1 -0
- package/dist/parsers/scip-runner.js +179 -0
- package/dist/parsers/scip-runner.js.map +1 -0
- package/dist/projects.d.ts +54 -0
- package/dist/projects.d.ts.map +1 -0
- package/dist/projects.js +153 -0
- package/dist/projects.js.map +1 -0
- package/dist/resolve.d.ts +22 -0
- package/dist/resolve.d.ts.map +1 -0
- package/dist/resolve.js +128 -0
- package/dist/resolve.js.map +1 -0
- package/dist/rules.d.ts +36 -0
- package/dist/rules.d.ts.map +1 -0
- package/dist/rules.js +484 -0
- package/dist/rules.js.map +1 -0
- package/dist/sandbox.d.ts +33 -0
- package/dist/sandbox.d.ts.map +1 -0
- package/dist/sandbox.js +91 -0
- package/dist/sandbox.js.map +1 -0
- package/dist/scan-lock.d.ts +37 -0
- package/dist/scan-lock.d.ts.map +1 -0
- package/dist/scan-lock.js +145 -0
- package/dist/scan-lock.js.map +1 -0
- package/dist/scanner.d.ts +126 -1
- package/dist/scanner.d.ts.map +1 -1
- package/dist/scanner.js +1711 -235
- package/dist/scanner.js.map +1 -1
- package/dist/scanners/connections/ast-scanner.d.ts +9 -2
- package/dist/scanners/connections/ast-scanner.d.ts.map +1 -1
- package/dist/scanners/connections/ast-scanner.js +19 -4
- package/dist/scanners/connections/ast-scanner.js.map +1 -1
- package/dist/scanners/connections/import-scanner.d.ts +27 -0
- package/dist/scanners/connections/import-scanner.d.ts.map +1 -0
- package/dist/scanners/connections/import-scanner.js +537 -0
- package/dist/scanners/connections/import-scanner.js.map +1 -0
- package/dist/scanners/connections/llm-call-tracer.d.ts +1 -1
- package/dist/scanners/connections/llm-call-tracer.d.ts.map +1 -1
- package/dist/scanners/connections/llm-call-tracer.js +6 -2
- package/dist/scanners/connections/llm-call-tracer.js.map +1 -1
- package/dist/scanners/connections/prisma-calls.d.ts +11 -0
- package/dist/scanners/connections/prisma-calls.d.ts.map +1 -0
- package/dist/scanners/connections/prisma-calls.js +237 -0
- package/dist/scanners/connections/prisma-calls.js.map +1 -0
- package/dist/scanners/connections/service-calls.d.ts +1 -1
- package/dist/scanners/connections/service-calls.d.ts.map +1 -1
- package/dist/scanners/connections/service-calls.js +35 -3
- package/dist/scanners/connections/service-calls.js.map +1 -1
- package/dist/scanners/infrastructure/cron-scanner.d.ts +14 -0
- package/dist/scanners/infrastructure/cron-scanner.d.ts.map +1 -0
- package/dist/scanners/infrastructure/cron-scanner.js +383 -0
- package/dist/scanners/infrastructure/cron-scanner.js.map +1 -0
- package/dist/scanners/infrastructure/deploy-scanner.d.ts +11 -0
- package/dist/scanners/infrastructure/deploy-scanner.d.ts.map +1 -0
- package/dist/scanners/infrastructure/deploy-scanner.js +508 -0
- package/dist/scanners/infrastructure/deploy-scanner.js.map +1 -0
- package/dist/scanners/infrastructure/env-scanner.d.ts +55 -0
- package/dist/scanners/infrastructure/env-scanner.d.ts.map +1 -0
- package/dist/scanners/infrastructure/env-scanner.js +431 -0
- package/dist/scanners/infrastructure/env-scanner.js.map +1 -0
- package/dist/scanners/infrastructure/field-usage-analyzer.d.ts +52 -0
- package/dist/scanners/infrastructure/field-usage-analyzer.d.ts.map +1 -0
- package/dist/scanners/infrastructure/field-usage-analyzer.js +480 -0
- package/dist/scanners/infrastructure/field-usage-analyzer.js.map +1 -0
- package/dist/scanners/infrastructure/prisma-parser.d.ts +21 -0
- package/dist/scanners/infrastructure/prisma-parser.d.ts.map +1 -0
- package/dist/scanners/infrastructure/prisma-parser.js +58 -0
- package/dist/scanners/infrastructure/prisma-parser.js.map +1 -0
- package/dist/scanners/infrastructure/prisma-scanner.d.ts +30 -0
- package/dist/scanners/infrastructure/prisma-scanner.d.ts.map +1 -0
- package/dist/scanners/infrastructure/prisma-scanner.js +329 -0
- package/dist/scanners/infrastructure/prisma-scanner.js.map +1 -0
- package/dist/scanners/infrastructure/queue-scanner.d.ts +14 -0
- package/dist/scanners/infrastructure/queue-scanner.d.ts.map +1 -0
- package/dist/scanners/infrastructure/queue-scanner.js +455 -0
- package/dist/scanners/infrastructure/queue-scanner.js.map +1 -0
- package/dist/scanners/infrastructure/typespec-validator.d.ts +50 -0
- package/dist/scanners/infrastructure/typespec-validator.d.ts.map +1 -0
- package/dist/scanners/infrastructure/typespec-validator.js +407 -0
- package/dist/scanners/infrastructure/typespec-validator.js.map +1 -0
- package/dist/scanners/packages/swift.d.ts +5 -0
- package/dist/scanners/packages/swift.d.ts.map +1 -1
- package/dist/scanners/packages/swift.js +23 -0
- package/dist/scanners/packages/swift.js.map +1 -1
- package/dist/scanners/prompts/detector.d.ts +13 -2
- package/dist/scanners/prompts/detector.d.ts.map +1 -1
- package/dist/scanners/prompts/detector.js +97 -46
- package/dist/scanners/prompts/detector.js.map +1 -1
- package/dist/scanners/prompts/index.d.ts +1 -1
- package/dist/scanners/prompts/index.d.ts.map +1 -1
- package/dist/scanners/prompts/index.js +2 -2
- package/dist/scanners/prompts/index.js.map +1 -1
- package/dist/scanners/swift/code-scanner.d.ts +1 -1
- package/dist/scanners/swift/code-scanner.d.ts.map +1 -1
- package/dist/scanners/swift/code-scanner.js +216 -2
- package/dist/scanners/swift/code-scanner.js.map +1 -1
- package/dist/scanners/swift/swiftui-scanner.d.ts +45 -0
- package/dist/scanners/swift/swiftui-scanner.d.ts.map +1 -0
- package/dist/scanners/swift/swiftui-scanner.js +606 -0
- package/dist/scanners/swift/swiftui-scanner.js.map +1 -0
- package/dist/scanners/xcode/pbxproj-parser.d.ts +32 -0
- package/dist/scanners/xcode/pbxproj-parser.d.ts.map +1 -0
- package/dist/scanners/xcode/pbxproj-parser.js +407 -0
- package/dist/scanners/xcode/pbxproj-parser.js.map +1 -0
- package/dist/scanners/xcode/storyboard-scanner.d.ts +13 -0
- package/dist/scanners/xcode/storyboard-scanner.d.ts.map +1 -0
- package/dist/scanners/xcode/storyboard-scanner.js +236 -0
- package/dist/scanners/xcode/storyboard-scanner.js.map +1 -0
- package/dist/storage/markdown-view.d.ts +49 -0
- package/dist/storage/markdown-view.d.ts.map +1 -0
- package/dist/storage/markdown-view.js +233 -0
- package/dist/storage/markdown-view.js.map +1 -0
- package/dist/storage.d.ts +225 -9
- package/dist/storage.d.ts.map +1 -1
- package/dist/storage.js +945 -86
- package/dist/storage.js.map +1 -1
- package/dist/subgraph.d.ts +30 -0
- package/dist/subgraph.d.ts.map +1 -0
- package/dist/subgraph.js +106 -0
- package/dist/subgraph.js.map +1 -0
- package/dist/temporal/git-store.d.ts +65 -0
- package/dist/temporal/git-store.d.ts.map +1 -0
- package/dist/temporal/git-store.js +166 -0
- package/dist/temporal/git-store.js.map +1 -0
- package/dist/trace.d.ts +38 -0
- package/dist/trace.d.ts.map +1 -0
- package/dist/trace.js +292 -0
- package/dist/trace.js.map +1 -0
- package/dist/types.d.ts +322 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +53 -0
- package/dist/types.js.map +1 -1
- package/hooks/hooks.json +1 -55
- package/hooks/mark-dirty.sh +20 -0
- package/hooks/post-bash-suggest.sh +30 -0
- package/hooks/post-edit-suggest.sh +29 -0
- package/hooks/pre-edit-warn.sh +28 -0
- package/hooks/session-start.sh +19 -0
- package/hooks/stop-suggest.sh +49 -0
- package/package.json +30 -11
- package/scripts/install-codex-plugin.sh +119 -0
- package/scripts/install-plugin.sh +29 -24
- package/skills/architecture-export/SKILL.md +79 -0
- package/skills/architecture-scan/SKILL.md +64 -0
- package/skills/code-review/SKILL.md +368 -0
- package/skills/impact-analysis/SKILL.md +80 -0
- package/skills/infrastructure-scanning.md +42 -0
- package/skills/navgator-setup/SKILL.md +108 -0
- package/web/.next/standalone/web/.next/BUILD_ID +1 -1
- package/web/.next/standalone/web/.next/app-path-routes-manifest.json +3 -0
- package/web/.next/standalone/web/.next/build-manifest.json +2 -2
- package/web/.next/standalone/web/.next/prerender-manifest.json +3 -3
- package/web/.next/standalone/web/.next/required-server-files.json +4 -4
- package/web/.next/standalone/web/.next/routes-manifest.json +18 -0
- package/web/.next/standalone/web/.next/server/app/_global-error.html +2 -2
- package/web/.next/standalone/web/.next/server/app/_global-error.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_not-found/page/next-font-manifest.json +2 -2
- package/web/.next/standalone/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/web/.next/server/app/_not-found.html +1 -1
- package/web/.next/standalone/web/.next/server/app/_not-found.rsc +3 -3
- package/web/.next/standalone/web/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
- package/web/.next/standalone/web/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
- package/web/.next/standalone/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_not-found.segments/_tree.segment.rsc +3 -3
- package/web/.next/standalone/web/.next/server/app/api/prompts/route.js.nft.json +1 -1
- package/web/.next/standalone/web/.next/server/app/api/rules/route/app-paths-manifest.json +3 -0
- package/web/.next/standalone/web/.next/server/app/api/rules/route/build-manifest.json +11 -0
- package/web/.next/standalone/web/.next/server/app/api/rules/route/server-reference-manifest.json +4 -0
- package/web/.next/standalone/web/.next/server/app/api/rules/route.js +6 -0
- package/web/.next/standalone/web/.next/server/app/api/rules/route.js.map +5 -0
- package/web/.next/standalone/web/.next/server/app/api/rules/route.js.nft.json +1 -0
- package/web/.next/standalone/web/.next/server/app/api/rules/route_client-reference-manifest.js +2 -0
- package/web/.next/standalone/web/.next/server/app/api/subgraph/route/app-paths-manifest.json +3 -0
- package/web/.next/standalone/web/.next/server/app/api/subgraph/route/build-manifest.json +11 -0
- package/web/.next/standalone/web/.next/server/app/api/subgraph/route/server-reference-manifest.json +4 -0
- package/web/.next/standalone/web/.next/server/app/api/subgraph/route.js +6 -0
- package/web/.next/standalone/web/.next/server/app/api/subgraph/route.js.map +5 -0
- package/web/.next/standalone/web/.next/server/app/api/subgraph/route.js.nft.json +1 -0
- package/web/.next/standalone/web/.next/server/app/api/subgraph/route_client-reference-manifest.js +2 -0
- package/web/.next/standalone/web/.next/server/app/api/trace/route/app-paths-manifest.json +3 -0
- package/web/.next/standalone/web/.next/server/app/api/trace/route/build-manifest.json +11 -0
- package/web/.next/standalone/web/.next/server/app/api/trace/route/server-reference-manifest.json +4 -0
- package/web/.next/standalone/web/.next/server/app/api/trace/route.js +6 -0
- package/web/.next/standalone/web/.next/server/app/api/trace/route.js.map +5 -0
- package/web/.next/standalone/web/.next/server/app/api/trace/route.js.nft.json +1 -0
- package/web/.next/standalone/web/.next/server/app/api/trace/route_client-reference-manifest.js +2 -0
- package/web/.next/standalone/web/.next/server/app/index.html +1 -1
- package/web/.next/standalone/web/.next/server/app/index.rsc +6 -6
- package/web/.next/standalone/web/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/web/.next/standalone/web/.next/server/app/index.segments/_full.segment.rsc +6 -6
- package/web/.next/standalone/web/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/index.segments/_index.segment.rsc +3 -3
- package/web/.next/standalone/web/.next/server/app/index.segments/_tree.segment.rsc +5 -5
- package/web/.next/standalone/web/.next/server/app/page/next-font-manifest.json +2 -2
- package/web/.next/standalone/web/.next/server/app/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/web/.next/server/app-paths-manifest.json +3 -0
- package/web/.next/standalone/web/.next/server/chunks/2374f_next_dist_esm_build_templates_app-route_0bb4e66a.js +1 -1
- package/web/.next/standalone/web/.next/server/chunks/[root-of-the-server]__006b837d._.js +1 -1
- package/web/.next/standalone/web/.next/server/chunks/[root-of-the-server]__0426efe8._.js +3 -0
- package/web/.next/standalone/web/.next/server/chunks/[root-of-the-server]__2e09fec9._.js +1 -1
- package/web/.next/standalone/web/.next/server/chunks/[root-of-the-server]__38d0390f._.js +1 -1
- package/web/.next/standalone/web/.next/server/chunks/[root-of-the-server]__594bcf20._.js +1 -1
- package/web/.next/standalone/web/.next/server/chunks/[root-of-the-server]__b888fadf._.js +1 -1
- package/web/.next/standalone/web/.next/server/chunks/[root-of-the-server]__cd5f36ce._.js +3 -0
- package/web/.next/standalone/web/.next/server/chunks/[root-of-the-server]__ee6fc95f._.js +3 -0
- package/web/.next/standalone/web/.next/server/chunks/[root-of-the-server]__fa2ec862._.js +1 -1
- package/web/.next/standalone/web/.next/server/chunks/ssr/web_171de0df._.js +9 -4
- package/web/.next/standalone/web/.next/server/chunks/web__next-internal_server_app_api_rules_route_actions_3de01bd5.js +3 -0
- package/web/.next/standalone/web/.next/server/chunks/web__next-internal_server_app_api_subgraph_route_actions_d8b5a63f.js +3 -0
- package/web/.next/standalone/web/.next/server/chunks/web__next-internal_server_app_api_trace_route_actions_b0703ae2.js +3 -0
- package/web/.next/standalone/web/.next/server/next-font-manifest.js +1 -1
- package/web/.next/standalone/web/.next/server/next-font-manifest.json +4 -4
- package/web/.next/standalone/web/.next/server/pages/404.html +1 -1
- package/web/.next/standalone/web/.next/server/pages/500.html +2 -2
- package/web/.next/standalone/web/.next/server/server-reference-manifest.js +1 -1
- package/web/.next/standalone/web/.next/server/server-reference-manifest.json +1 -1
- package/web/.next/standalone/web/.next/static/chunks/22a09ecf6ba35cfd.js +17 -0
- package/web/.next/standalone/web/.next/static/chunks/9857ba86ce4e82d8.css +2 -0
- package/web/.next/standalone/web/.next/static/chunks/f899547f99ef4b76.css +1 -0
- package/web/.next/standalone/web/.next/static/media/4fa387ec64143e14-s.c36e1862.woff2 +0 -0
- package/web/.next/standalone/web/.next/static/media/53b9e256198e5412-s.853d50a3.woff2 +0 -0
- package/web/.next/standalone/web/.next/static/media/5ce348bf30bf5439-s.ebceb24d.woff2 +0 -0
- package/web/.next/standalone/web/.next/static/media/6306c77e7c8268e4-s.ff4a2084.woff2 +0 -0
- package/web/.next/standalone/web/.next/static/media/7178b3e590c64307-s.55554cd0.woff2 +0 -0
- package/web/.next/standalone/web/.next/static/media/797e433ab948586e-s.p.479bea2b.woff2 +0 -0
- package/web/.next/standalone/web/.next/static/media/7d817b4c03b0c5f1-s.f377b9c4.woff2 +0 -0
- package/web/.next/standalone/web/.next/static/media/8a480f0b521d4e75-s.ea323500.woff2 +0 -0
- package/web/.next/standalone/web/.next/static/media/bbc41e54d2fcbd21-s.d1207556.woff2 +0 -0
- package/web/.next/standalone/web/.next/static/media/caa3a2e1cccd8315-s.p.3b6cae6d.woff2 +0 -0
- package/web/.next/standalone/web/.next/static/media/fef07dbb0973bf53-s.518e079e.woff2 +0 -0
- package/web/.next/standalone/web/app/api/components/route.ts +1 -1
- package/web/.next/standalone/web/app/api/connections/route.ts +3 -1
- package/web/.next/standalone/web/app/api/graph/route.ts +3 -3
- package/web/.next/standalone/web/app/api/projects/route.ts +1 -1
- package/web/.next/standalone/web/app/api/prompts/route.ts +2 -2
- package/web/.next/standalone/web/app/api/rules/route.ts +213 -0
- package/web/.next/standalone/web/app/api/settings/route.ts +2 -2
- package/web/.next/standalone/web/app/api/status/route.ts +1 -1
- package/web/.next/standalone/web/app/api/subgraph/route.ts +267 -0
- package/web/.next/standalone/web/app/api/trace/route.ts +321 -0
- package/web/.next/standalone/web/app/page.tsx +9 -1
- package/web/.next/standalone/web/components/connections-panel.tsx +23 -6
- package/web/.next/standalone/web/components/coverage-panel.tsx +309 -0
- package/web/.next/standalone/web/components/rules-panel.tsx +156 -0
- package/web/.next/standalone/web/components/sidebar.tsx +8 -0
- package/web/.next/standalone/web/components/status-overview.tsx +24 -1
- package/web/.next/standalone/web/components/subgraph-panel.tsx +382 -0
- package/web/.next/standalone/web/components/trace-panel.tsx +325 -0
- package/web/.next/standalone/web/lib/hooks/index.ts +3 -0
- package/web/.next/standalone/web/lib/hooks/use-coverage.ts +68 -0
- package/web/.next/standalone/web/lib/hooks/use-subgraph.ts +85 -0
- package/web/.next/standalone/web/lib/hooks/use-trace.ts +84 -0
- package/web/.next/standalone/web/lib/types.ts +108 -0
- package/web/.next/standalone/web/package-lock.json +218 -0
- package/web/.next/standalone/web/package.json +4 -2
- package/web/.next/standalone/web/server.js +1 -1
- package/web/.next/static/chunks/22a09ecf6ba35cfd.js +17 -0
- package/web/.next/static/chunks/9857ba86ce4e82d8.css +2 -0
- package/web/.next/static/chunks/f899547f99ef4b76.css +1 -0
- package/web/.next/static/media/4fa387ec64143e14-s.c36e1862.woff2 +0 -0
- package/web/.next/static/media/53b9e256198e5412-s.853d50a3.woff2 +0 -0
- package/web/.next/static/media/5ce348bf30bf5439-s.ebceb24d.woff2 +0 -0
- package/web/.next/static/media/6306c77e7c8268e4-s.ff4a2084.woff2 +0 -0
- package/web/.next/static/media/7178b3e590c64307-s.55554cd0.woff2 +0 -0
- package/web/.next/static/media/797e433ab948586e-s.p.479bea2b.woff2 +0 -0
- package/web/.next/static/media/7d817b4c03b0c5f1-s.f377b9c4.woff2 +0 -0
- package/web/.next/static/media/8a480f0b521d4e75-s.ea323500.woff2 +0 -0
- package/web/.next/static/media/bbc41e54d2fcbd21-s.d1207556.woff2 +0 -0
- package/web/.next/static/media/caa3a2e1cccd8315-s.p.3b6cae6d.woff2 +0 -0
- package/web/.next/static/media/fef07dbb0973bf53-s.518e079e.woff2 +0 -0
- package/skills/check/SKILL.md +0 -64
- package/skills/connections/SKILL.md +0 -54
- package/skills/diagram/SKILL.md +0 -64
- package/skills/export/SKILL.md +0 -49
- package/skills/impact/SKILL.md +0 -58
- package/skills/install/SKILL.md +0 -94
- package/skills/scan/SKILL.md +0 -75
- package/skills/status/SKILL.md +0 -37
- package/skills/ui/SKILL.md +0 -43
- package/skills/update/SKILL.md +0 -43
- package/web/.next/standalone/web/.next/static/chunks/8a80e7184ad3a13f.css +0 -2
- package/web/.next/standalone/web/.next/static/chunks/c056475f5f4424b6.css +0 -1
- package/web/.next/standalone/web/.next/static/chunks/cb3513192b63e480.js +0 -12
- package/web/.next/standalone/web/.next/static/media/4fa387ec64143e14-s.c1fdd6c2.woff2 +0 -0
- package/web/.next/standalone/web/.next/static/media/7178b3e590c64307-s.b97b3418.woff2 +0 -0
- package/web/.next/standalone/web/.next/static/media/797e433ab948586e-s.p.dbea232f.woff2 +0 -0
- package/web/.next/standalone/web/.next/static/media/8a480f0b521d4e75-s.8e0177b5.woff2 +0 -0
- package/web/.next/standalone/web/.next/static/media/bbc41e54d2fcbd21-s.799d8ef8.woff2 +0 -0
- package/web/.next/standalone/web/.next/static/media/caa3a2e1cccd8315-s.p.853070df.woff2 +0 -0
- package/web/.next/static/chunks/8a80e7184ad3a13f.css +0 -2
- package/web/.next/static/chunks/c056475f5f4424b6.css +0 -1
- package/web/.next/static/chunks/cb3513192b63e480.js +0 -12
- package/web/.next/static/media/4fa387ec64143e14-s.c1fdd6c2.woff2 +0 -0
- package/web/.next/static/media/7178b3e590c64307-s.b97b3418.woff2 +0 -0
- package/web/.next/static/media/797e433ab948586e-s.p.dbea232f.woff2 +0 -0
- package/web/.next/static/media/8a480f0b521d4e75-s.8e0177b5.woff2 +0 -0
- package/web/.next/static/media/bbc41e54d2fcbd21-s.799d8ef8.woff2 +0 -0
- package/web/.next/static/media/caa3a2e1cccd8315-s.p.853070df.woff2 +0 -0
- /package/web/.next/standalone/web/.next/static/{P-ZMQO7_Wnj487ks3guqa → qZVrJ4kmwXfw4Ikgj1oXR}/_buildManifest.js +0 -0
- /package/web/.next/standalone/web/.next/static/{P-ZMQO7_Wnj487ks3guqa → qZVrJ4kmwXfw4Ikgj1oXR}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/standalone/web/.next/static/{P-ZMQO7_Wnj487ks3guqa → qZVrJ4kmwXfw4Ikgj1oXR}/_ssgManifest.js +0 -0
- /package/web/.next/static/{P-ZMQO7_Wnj487ks3guqa → qZVrJ4kmwXfw4Ikgj1oXR}/_buildManifest.js +0 -0
- /package/web/.next/static/{P-ZMQO7_Wnj487ks3guqa → qZVrJ4kmwXfw4Ikgj1oXR}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{P-ZMQO7_Wnj487ks3guqa → qZVrJ4kmwXfw4Ikgj1oXR}/_ssgManifest.js +0 -0
package/dist/cli/index.js
CHANGED
|
@@ -4,17 +4,25 @@
|
|
|
4
4
|
* Architecture connection tracker for Claude Code
|
|
5
5
|
*/
|
|
6
6
|
import { Command } from 'commander';
|
|
7
|
-
import
|
|
8
|
-
import
|
|
9
|
-
import
|
|
10
|
-
import
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
7
|
+
import { registerScanCommand } from './commands/scan.js';
|
|
8
|
+
import { registerStatusCommand } from './commands/status.js';
|
|
9
|
+
import { registerImpactCommand } from './commands/impact.js';
|
|
10
|
+
import { registerConnectionsCommand } from './commands/connections.js';
|
|
11
|
+
import { registerListCommand } from './commands/list.js';
|
|
12
|
+
import { registerFindCommand } from './commands/find.js';
|
|
13
|
+
import { registerTemporalCommands } from './commands/temporal.js';
|
|
14
|
+
import { registerDiagramCommand } from './commands/diagram.js';
|
|
15
|
+
import { registerPromptsCommand } from './commands/prompts.js';
|
|
16
|
+
import { registerTraceCommand } from './commands/trace.js';
|
|
17
|
+
import { registerRulesCommand } from './commands/rules.js';
|
|
18
|
+
import { registerCoverageCommand } from './commands/coverage.js';
|
|
19
|
+
import { registerSubgraphCommand } from './commands/subgraph.js';
|
|
20
|
+
import { registerLLMMapCommand } from './commands/llm-map.js';
|
|
21
|
+
import { registerSchemaCommand } from './commands/schema.js';
|
|
22
|
+
import { registerDeadCommand } from './commands/dead.js';
|
|
23
|
+
import { registerLessonsCommand } from './commands/lessons.js';
|
|
24
|
+
import { registerFreshnessCommands } from './commands/freshness.js';
|
|
25
|
+
import { registerSetupCommand, registerUICommand, registerHistoryCommand, registerDiffCommand, registerProjectsCommand, registerSummaryCommand, showWelcomeMenu, } from './commands/misc.js';
|
|
18
26
|
const NAVGATOR_LOGO = `
|
|
19
27
|
_ _ ____ _
|
|
20
28
|
| \\ | | __ ___ _/ ___| __ _| |_ ___ _ __
|
|
@@ -29,822 +37,40 @@ const program = new Command();
|
|
|
29
37
|
program
|
|
30
38
|
.name('navgator')
|
|
31
39
|
.description('Architecture connection tracker - know your stack before you change it')
|
|
32
|
-
.version('0.
|
|
40
|
+
.version('0.9.0')
|
|
41
|
+
.option('--sandbox', 'Run in sandbox mode (restricts network, interactive, child processes)')
|
|
33
42
|
.addHelpText('beforeAll', NAVGATOR_LOGO);
|
|
34
|
-
//
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
const port = options.port || 3000;
|
|
39
|
-
const projectPath = options.projectPath || process.cwd();
|
|
40
|
-
// Resolve standalone server.js relative to package root
|
|
41
|
-
const cliDir = path.dirname(fileURLToPath(import.meta.url));
|
|
42
|
-
const packageRoot = path.resolve(cliDir, '..', '..');
|
|
43
|
-
const serverJs = path.join(packageRoot, 'web', '.next', 'standalone', 'web', 'server.js');
|
|
44
|
-
if (!fs.existsSync(serverJs)) {
|
|
45
|
-
throw new Error(`Next.js standalone server not found at:\n ${serverJs}\n\n` +
|
|
46
|
-
'Run `npm run build` from the NavGator root to build the web UI.');
|
|
47
|
-
}
|
|
48
|
-
const child = spawn('node', [serverJs], {
|
|
49
|
-
env: {
|
|
50
|
-
...process.env,
|
|
51
|
-
PORT: String(port),
|
|
52
|
-
HOSTNAME: '0.0.0.0',
|
|
53
|
-
NAVGATOR_PROJECT_PATH: projectPath,
|
|
54
|
-
},
|
|
55
|
-
cwd: path.dirname(serverJs),
|
|
56
|
-
stdio: ['ignore', 'pipe', 'pipe'],
|
|
57
|
-
});
|
|
58
|
-
// Wait for "Ready" or listening message
|
|
59
|
-
await new Promise((resolve, reject) => {
|
|
60
|
-
const timeout = setTimeout(() => {
|
|
61
|
-
resolve(); // proceed even if no explicit "Ready" message after 5s
|
|
62
|
-
}, 5000);
|
|
63
|
-
const onData = (data) => {
|
|
64
|
-
const msg = data.toString();
|
|
65
|
-
if (msg.includes('Ready') || msg.includes('ready') || msg.includes('started') || msg.includes('listening')) {
|
|
66
|
-
clearTimeout(timeout);
|
|
67
|
-
resolve();
|
|
68
|
-
}
|
|
69
|
-
};
|
|
70
|
-
child.stdout?.on('data', onData);
|
|
71
|
-
child.stderr?.on('data', onData);
|
|
72
|
-
child.on('error', (err) => {
|
|
73
|
-
clearTimeout(timeout);
|
|
74
|
-
reject(err);
|
|
75
|
-
});
|
|
76
|
-
child.on('exit', (code) => {
|
|
77
|
-
if (code !== null && code !== 0) {
|
|
78
|
-
clearTimeout(timeout);
|
|
79
|
-
reject(new Error(`Server exited with code ${code}`));
|
|
80
|
-
}
|
|
81
|
-
});
|
|
82
|
-
});
|
|
83
|
-
return { port, process: child };
|
|
84
|
-
}
|
|
85
|
-
async function launchUI(projectPath) {
|
|
86
|
-
const resolvedPath = projectPath || process.cwd();
|
|
87
|
-
const port = 3000;
|
|
88
|
-
console.log('');
|
|
89
|
-
console.log('🐊 NavGator Dashboard');
|
|
90
|
-
console.log(` Project: ${resolvedPath}`);
|
|
91
|
-
console.log('');
|
|
92
|
-
const { process: serverProcess } = await launchWebUI({
|
|
93
|
-
port,
|
|
94
|
-
projectPath: resolvedPath,
|
|
95
|
-
});
|
|
96
|
-
const url = `http://localhost:${port}`;
|
|
97
|
-
console.log(`Dashboard running at: ${url}`);
|
|
98
|
-
console.log('');
|
|
99
|
-
console.log('Press Ctrl+C to stop');
|
|
100
|
-
console.log('');
|
|
101
|
-
// Try to open browser
|
|
102
|
-
const { exec } = await import('child_process');
|
|
103
|
-
const openCmd = process.platform === 'darwin' ? 'open' :
|
|
104
|
-
process.platform === 'win32' ? 'start' : 'xdg-open';
|
|
105
|
-
exec(`${openCmd} ${url}`);
|
|
106
|
-
// Keep process running, clean up child on exit
|
|
107
|
-
const cleanup = () => {
|
|
108
|
-
console.log('\nShutting down...');
|
|
109
|
-
serverProcess.kill();
|
|
110
|
-
process.exit(0);
|
|
111
|
-
};
|
|
112
|
-
process.on('SIGINT', cleanup);
|
|
113
|
-
process.on('SIGTERM', cleanup);
|
|
114
|
-
}
|
|
115
|
-
async function runScan() {
|
|
116
|
-
console.log('NavGator - Scanning architecture...\n');
|
|
117
|
-
const result = await scan(process.cwd(), {
|
|
118
|
-
prompts: true,
|
|
119
|
-
verbose: false,
|
|
120
|
-
});
|
|
121
|
-
console.log('\n========================================');
|
|
122
|
-
console.log('SCAN COMPLETE');
|
|
123
|
-
console.log('========================================\n');
|
|
124
|
-
const byType = {};
|
|
125
|
-
for (const c of result.components) {
|
|
126
|
-
byType[c.type] = (byType[c.type] || 0) + 1;
|
|
127
|
-
}
|
|
128
|
-
console.log('COMPONENTS:');
|
|
129
|
-
for (const [type, count] of Object.entries(byType)) {
|
|
130
|
-
console.log(` ${type}: ${count}`);
|
|
131
|
-
}
|
|
132
|
-
console.log(`\nFiles scanned: ${result.stats.files_scanned}`);
|
|
133
|
-
console.log(`Scan completed in ${result.stats.scan_duration_ms}ms`);
|
|
134
|
-
}
|
|
135
|
-
async function showStatus() {
|
|
136
|
-
const config = getConfig();
|
|
137
|
-
const index = await loadIndex(config);
|
|
138
|
-
if (!index) {
|
|
139
|
-
console.log('No architecture data found. Run `navgator setup` first.');
|
|
140
|
-
return;
|
|
141
|
-
}
|
|
142
|
-
console.log('NavGator - Architecture Status\n');
|
|
143
|
-
console.log('========================================');
|
|
144
|
-
const lastScan = new Date(index.last_scan);
|
|
145
|
-
const hoursSince = Math.round((Date.now() - index.last_scan) / (1000 * 60 * 60));
|
|
146
|
-
console.log(`Last scan: ${lastScan.toLocaleString()} (${hoursSince}h ago)`);
|
|
147
|
-
console.log(`Total components: ${index.stats.total_components}`);
|
|
148
|
-
console.log(`Total connections: ${index.stats.total_connections}`);
|
|
149
|
-
if (index.stats.outdated_count > 0) {
|
|
150
|
-
console.log(`Outdated packages: ${index.stats.outdated_count}`);
|
|
151
|
-
}
|
|
152
|
-
console.log('\nCOMPONENTS BY TYPE:');
|
|
153
|
-
for (const [type, count] of Object.entries(index.stats.components_by_type)) {
|
|
154
|
-
console.log(` ${type}: ${count}`);
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
function showPostSetupGuidance() {
|
|
158
|
-
console.log('');
|
|
159
|
-
console.log(' Your architecture dashboard is ready!');
|
|
160
|
-
console.log('');
|
|
161
|
-
console.log(' What NavGator gives you:');
|
|
162
|
-
console.log(' - Interactive SVG diagrams (zoom, pan, click) + Mermaid export');
|
|
163
|
-
console.log(' - LLM call site tracking with provider/model analysis');
|
|
164
|
-
console.log(' - Component & connection maps with code-level evidence');
|
|
165
|
-
console.log('');
|
|
166
|
-
console.log(' Quick reference:');
|
|
167
|
-
console.log(' navgator Open the welcome menu');
|
|
168
|
-
console.log(' navgator ui Launch the full dashboard');
|
|
169
|
-
console.log(' navgator scan Re-scan the project');
|
|
170
|
-
console.log(' navgator diagram Generate a Mermaid diagram');
|
|
171
|
-
console.log('');
|
|
172
|
-
}
|
|
173
|
-
async function showWelcomeMenu(context) {
|
|
174
|
-
if (context === 'no-command') {
|
|
175
|
-
console.log(NAVGATOR_LOGO);
|
|
176
|
-
console.log(' Tip: Run `navgator ui` to launch the full dashboard.\n');
|
|
177
|
-
}
|
|
178
|
-
console.log(' What would you like to do?\n');
|
|
179
|
-
console.log(' 1) Launch the dashboard UI');
|
|
180
|
-
console.log(' 2) Run a scan');
|
|
181
|
-
console.log(' 3) View project status');
|
|
182
|
-
console.log(' 4) Exit');
|
|
183
|
-
console.log('');
|
|
184
|
-
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
185
|
-
const answer = await new Promise((resolve) => {
|
|
186
|
-
rl.question(' Choose (1-4): ', resolve);
|
|
187
|
-
});
|
|
188
|
-
rl.close();
|
|
189
|
-
switch (answer.trim()) {
|
|
190
|
-
case '1':
|
|
191
|
-
await launchUI();
|
|
192
|
-
break;
|
|
193
|
-
case '2':
|
|
194
|
-
await runScan();
|
|
195
|
-
break;
|
|
196
|
-
case '3':
|
|
197
|
-
await showStatus();
|
|
198
|
-
break;
|
|
199
|
-
default:
|
|
200
|
-
console.log('');
|
|
201
|
-
break;
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
// =============================================================================
|
|
205
|
-
// SETUP COMMAND (New - Initial Installation)
|
|
206
|
-
// =============================================================================
|
|
207
|
-
program
|
|
208
|
-
.command('setup')
|
|
209
|
-
.description('Initialize NavGator with a two-phase scan (fast initial + deep follow-up)')
|
|
210
|
-
.option('-f, --fast', 'Run fast scan only (skip deep analysis)')
|
|
211
|
-
.option('-v, --verbose', 'Show detailed progress')
|
|
212
|
-
.option('--no-diagram', 'Skip diagram generation')
|
|
213
|
-
.action(async (options) => {
|
|
214
|
-
try {
|
|
215
|
-
console.log('');
|
|
216
|
-
console.log('🐊 NavGator - Architecture Connection Tracker');
|
|
217
|
-
console.log(' Know your stack before you change it');
|
|
218
|
-
console.log('');
|
|
219
|
-
// Offer to link as Claude Code plugin
|
|
220
|
-
const claudeDir = path.join(os.homedir(), '.claude');
|
|
221
|
-
if (fs.existsSync(claudeDir)) {
|
|
222
|
-
const pluginDir = path.join(claudeDir, 'plugins');
|
|
223
|
-
const linkPath = path.join(pluginDir, 'navgator');
|
|
224
|
-
const packageRoot = path.resolve(import.meta.dirname, '..', '..');
|
|
225
|
-
let alreadyLinked = false;
|
|
226
|
-
try {
|
|
227
|
-
const existing = fs.readlinkSync(linkPath);
|
|
228
|
-
if (existing === packageRoot)
|
|
229
|
-
alreadyLinked = true;
|
|
230
|
-
}
|
|
231
|
-
catch { }
|
|
232
|
-
if (!alreadyLinked) {
|
|
233
|
-
console.log('Claude Code detected.');
|
|
234
|
-
console.log('NavGator can register as a Claude Code plugin by creating a symlink:');
|
|
235
|
-
console.log(` ${linkPath} -> ${packageRoot}`);
|
|
236
|
-
console.log('This enables hooks, skills, and slash commands inside Claude Code.\n');
|
|
237
|
-
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
238
|
-
const answer = await new Promise((resolve) => {
|
|
239
|
-
rl.question('Link NavGator as a Claude Code plugin? (y/N) ', resolve);
|
|
240
|
-
});
|
|
241
|
-
rl.close();
|
|
242
|
-
if (answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes') {
|
|
243
|
-
try {
|
|
244
|
-
fs.mkdirSync(pluginDir, { recursive: true });
|
|
245
|
-
// Remove stale link if it points elsewhere
|
|
246
|
-
try {
|
|
247
|
-
fs.unlinkSync(linkPath);
|
|
248
|
-
}
|
|
249
|
-
catch { }
|
|
250
|
-
fs.symlinkSync(packageRoot, linkPath, 'dir');
|
|
251
|
-
console.log('Plugin linked successfully.\n');
|
|
252
|
-
}
|
|
253
|
-
catch (err) {
|
|
254
|
-
console.log('Could not auto-link. Link manually:');
|
|
255
|
-
console.log(` ln -s ${packageRoot} ${linkPath}\n`);
|
|
256
|
-
}
|
|
257
|
-
}
|
|
258
|
-
else {
|
|
259
|
-
console.log('Skipped plugin linking. You can link manually later:');
|
|
260
|
-
console.log(` ln -s ${packageRoot} ${linkPath}\n`);
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
// Check if already set up
|
|
265
|
-
const status = await isSetupComplete();
|
|
266
|
-
if (status.hasScanned && !status.stale) {
|
|
267
|
-
console.log('NavGator is already set up for this project.');
|
|
268
|
-
console.log(`Last scan: ${status.lastScan?.toLocaleString()}`);
|
|
269
|
-
console.log(`Scan depth: ${status.phase}`);
|
|
270
|
-
console.log('');
|
|
271
|
-
await showWelcomeMenu('post-setup');
|
|
272
|
-
return;
|
|
273
|
-
}
|
|
274
|
-
// Progress callback
|
|
275
|
-
const onProgress = (phase, message) => {
|
|
276
|
-
const icon = phase === 'FAST' ? '⚡' : '🔍';
|
|
277
|
-
console.log(`${icon} [${phase}] ${message}`);
|
|
278
|
-
};
|
|
279
|
-
// Run setup
|
|
280
|
-
const result = await setup({
|
|
281
|
-
fastOnly: options.fast,
|
|
282
|
-
generateDiagram: options.diagram !== false,
|
|
283
|
-
verbose: options.verbose,
|
|
284
|
-
onProgress,
|
|
285
|
-
});
|
|
286
|
-
// Display results
|
|
287
|
-
console.log(formatSetupStatus(result));
|
|
288
|
-
// Show diagram preview if generated
|
|
289
|
-
if (result.diagram) {
|
|
290
|
-
console.log('Architecture Diagram Preview:');
|
|
291
|
-
console.log('─'.repeat(60));
|
|
292
|
-
// Show first 30 lines
|
|
293
|
-
const lines = result.diagram.split('\n').slice(0, 30);
|
|
294
|
-
console.log(lines.join('\n'));
|
|
295
|
-
if (result.diagram.split('\n').length > 30) {
|
|
296
|
-
console.log('... (run `navgator diagram` to see full diagram)');
|
|
297
|
-
}
|
|
298
|
-
console.log('');
|
|
299
|
-
}
|
|
300
|
-
// Show post-setup guidance + welcome menu
|
|
301
|
-
showPostSetupGuidance();
|
|
302
|
-
await showWelcomeMenu('post-setup');
|
|
303
|
-
}
|
|
304
|
-
catch (error) {
|
|
305
|
-
console.error('Setup failed:', error);
|
|
306
|
-
process.exit(1);
|
|
307
|
-
}
|
|
308
|
-
});
|
|
309
|
-
// =============================================================================
|
|
310
|
-
// SCAN COMMAND
|
|
311
|
-
// =============================================================================
|
|
312
|
-
program
|
|
313
|
-
.command('scan')
|
|
314
|
-
.description('Scan project architecture and update connection tracking')
|
|
315
|
-
.option('-q, --quick', 'Quick scan (packages only, no code analysis)')
|
|
316
|
-
.option('-c, --connections', 'Focus on connection detection')
|
|
317
|
-
.option('-p, --prompts', 'Enhanced AI prompt scanning with full content')
|
|
318
|
-
.option('-v, --verbose', 'Show detailed output')
|
|
319
|
-
.option('--clear', 'Clear existing data before scanning')
|
|
320
|
-
.option('--ast', 'Use AST-based scanning (more accurate, slightly slower)')
|
|
321
|
-
.action(async (options) => {
|
|
322
|
-
try {
|
|
323
|
-
console.log('NavGator - Scanning architecture...\n');
|
|
324
|
-
const result = await scan(process.cwd(), {
|
|
325
|
-
quick: options.quick,
|
|
326
|
-
connections: options.connections,
|
|
327
|
-
prompts: options.prompts,
|
|
328
|
-
verbose: options.verbose,
|
|
329
|
-
clearFirst: options.clear,
|
|
330
|
-
useAST: options.ast,
|
|
331
|
-
});
|
|
332
|
-
console.log('\n========================================');
|
|
333
|
-
console.log('SCAN COMPLETE');
|
|
334
|
-
console.log('========================================\n');
|
|
335
|
-
// Group components by type
|
|
336
|
-
const byType = {};
|
|
337
|
-
for (const c of result.components) {
|
|
338
|
-
byType[c.type] = (byType[c.type] || 0) + 1;
|
|
339
|
-
}
|
|
340
|
-
console.log('COMPONENTS:');
|
|
341
|
-
for (const [type, count] of Object.entries(byType)) {
|
|
342
|
-
console.log(` ${type}: ${count}`);
|
|
343
|
-
}
|
|
344
|
-
// Group connections by type
|
|
345
|
-
const connByType = {};
|
|
346
|
-
for (const c of result.connections) {
|
|
347
|
-
connByType[c.connection_type] = (connByType[c.connection_type] || 0) + 1;
|
|
348
|
-
}
|
|
349
|
-
if (Object.keys(connByType).length > 0) {
|
|
350
|
-
console.log('\nCONNECTIONS:');
|
|
351
|
-
for (const [type, count] of Object.entries(connByType)) {
|
|
352
|
-
console.log(` ${type}: ${count}`);
|
|
353
|
-
}
|
|
354
|
-
}
|
|
355
|
-
if (result.warnings.length > 0) {
|
|
356
|
-
console.log(`\nWARNINGS: ${result.warnings.length}`);
|
|
357
|
-
for (const w of result.warnings.slice(0, 5)) {
|
|
358
|
-
console.log(` - ${w.message}`);
|
|
359
|
-
}
|
|
360
|
-
if (result.warnings.length > 5) {
|
|
361
|
-
console.log(` ... and ${result.warnings.length - 5} more`);
|
|
362
|
-
}
|
|
363
|
-
}
|
|
364
|
-
// Show file change summary
|
|
365
|
-
if (result.fileChanges) {
|
|
366
|
-
const { added, modified, removed } = result.fileChanges;
|
|
367
|
-
if (added.length > 0 || modified.length > 0 || removed.length > 0) {
|
|
368
|
-
console.log('\nFILE CHANGES:');
|
|
369
|
-
if (added.length > 0)
|
|
370
|
-
console.log(` Added: ${added.length}`);
|
|
371
|
-
if (modified.length > 0)
|
|
372
|
-
console.log(` Modified: ${modified.length}`);
|
|
373
|
-
if (removed.length > 0)
|
|
374
|
-
console.log(` Removed: ${removed.length}`);
|
|
375
|
-
}
|
|
376
|
-
}
|
|
377
|
-
// Show prompt scan results if enhanced scanning was used
|
|
378
|
-
if (result.promptScan && result.promptScan.prompts.length > 0) {
|
|
379
|
-
console.log('\nAI PROMPTS:');
|
|
380
|
-
console.log(` Total: ${result.promptScan.summary.totalPrompts}`);
|
|
381
|
-
console.log(` Templates: ${result.promptScan.summary.templatesCount}`);
|
|
382
|
-
if (Object.keys(result.promptScan.summary.byProvider).length > 0) {
|
|
383
|
-
console.log(' By provider:');
|
|
384
|
-
for (const [provider, count] of Object.entries(result.promptScan.summary.byProvider)) {
|
|
385
|
-
console.log(` ${provider}: ${count}`);
|
|
386
|
-
}
|
|
387
|
-
}
|
|
388
|
-
}
|
|
389
|
-
console.log(`\nFiles scanned: ${result.stats.files_scanned}`);
|
|
390
|
-
console.log(`Scan completed in ${result.stats.scan_duration_ms}ms`);
|
|
391
|
-
// Auto-register project in ~/.navgator/projects.json
|
|
392
|
-
try {
|
|
393
|
-
const os = await import('os');
|
|
394
|
-
const path = await import('path');
|
|
395
|
-
const registryDir = path.join(os.homedir(), '.navgator');
|
|
396
|
-
const registryPath = path.join(registryDir, 'projects.json');
|
|
397
|
-
await fs.promises.mkdir(registryDir, { recursive: true });
|
|
398
|
-
let registry;
|
|
399
|
-
try {
|
|
400
|
-
registry = JSON.parse(await fs.promises.readFile(registryPath, 'utf-8'));
|
|
401
|
-
}
|
|
402
|
-
catch {
|
|
403
|
-
registry = { version: 1, projects: [] };
|
|
404
|
-
}
|
|
405
|
-
const projectRoot = process.cwd();
|
|
406
|
-
const existing = registry.projects.find(p => p.path === projectRoot);
|
|
407
|
-
if (existing) {
|
|
408
|
-
existing.lastScan = Date.now();
|
|
409
|
-
}
|
|
410
|
-
else {
|
|
411
|
-
const dirName = projectRoot.split(path.sep).pop() || 'project';
|
|
412
|
-
const name = dirName.replace(/[-_]/g, ' ').replace(/\b\w/g, c => c.toUpperCase()).trim();
|
|
413
|
-
registry.projects.push({ path: projectRoot, name, addedAt: Date.now(), lastScan: Date.now() });
|
|
414
|
-
}
|
|
415
|
-
await fs.promises.writeFile(registryPath, JSON.stringify(registry, null, 2), 'utf-8');
|
|
416
|
-
}
|
|
417
|
-
catch {
|
|
418
|
-
// Non-critical — don't fail the scan
|
|
419
|
-
}
|
|
420
|
-
}
|
|
421
|
-
catch (error) {
|
|
422
|
-
console.error('Scan failed:', error);
|
|
423
|
-
process.exit(1);
|
|
424
|
-
}
|
|
425
|
-
});
|
|
426
|
-
// =============================================================================
|
|
427
|
-
// STATUS COMMAND
|
|
428
|
-
// =============================================================================
|
|
429
|
-
program
|
|
430
|
-
.command('status')
|
|
431
|
-
.description('Show architecture summary and health status')
|
|
432
|
-
.option('--json', 'Output as JSON')
|
|
433
|
-
.action(async (options) => {
|
|
434
|
-
try {
|
|
435
|
-
const config = getConfig();
|
|
436
|
-
const index = await loadIndex(config);
|
|
437
|
-
if (!index) {
|
|
438
|
-
console.log('No architecture data found. Run `navgator scan` first.');
|
|
439
|
-
return;
|
|
440
|
-
}
|
|
441
|
-
if (options.json) {
|
|
442
|
-
console.log(JSON.stringify(index, null, 2));
|
|
443
|
-
return;
|
|
444
|
-
}
|
|
445
|
-
console.log('NavGator - Architecture Status\n');
|
|
446
|
-
console.log('========================================');
|
|
447
|
-
const lastScan = new Date(index.last_scan);
|
|
448
|
-
const hoursSince = Math.round((Date.now() - index.last_scan) / (1000 * 60 * 60));
|
|
449
|
-
console.log(`Last scan: ${lastScan.toLocaleString()} (${hoursSince}h ago)`);
|
|
450
|
-
console.log(`Total components: ${index.stats.total_components}`);
|
|
451
|
-
console.log(`Total connections: ${index.stats.total_connections}`);
|
|
452
|
-
if (index.stats.outdated_count > 0) {
|
|
453
|
-
console.log(`Outdated packages: ${index.stats.outdated_count}`);
|
|
454
|
-
}
|
|
455
|
-
if (index.stats.vulnerable_count > 0) {
|
|
456
|
-
console.log(`Vulnerable packages: ${index.stats.vulnerable_count}`);
|
|
457
|
-
}
|
|
458
|
-
console.log('\nCOMPONENTS BY TYPE:');
|
|
459
|
-
for (const [type, count] of Object.entries(index.stats.components_by_type)) {
|
|
460
|
-
console.log(` ${type}: ${count}`);
|
|
461
|
-
}
|
|
462
|
-
if (Object.keys(index.stats.connections_by_type).length > 0) {
|
|
463
|
-
console.log('\nCONNECTIONS BY TYPE:');
|
|
464
|
-
for (const [type, count] of Object.entries(index.stats.connections_by_type)) {
|
|
465
|
-
console.log(` ${type}: ${count}`);
|
|
466
|
-
}
|
|
467
|
-
}
|
|
468
|
-
if (hoursSince > 24) {
|
|
469
|
-
console.log('\n⚠️ Architecture data is stale. Consider running `navgator scan`');
|
|
470
|
-
}
|
|
471
|
-
}
|
|
472
|
-
catch (error) {
|
|
473
|
-
console.error('Status check failed:', error);
|
|
474
|
-
process.exit(1);
|
|
475
|
-
}
|
|
476
|
-
});
|
|
477
|
-
// =============================================================================
|
|
478
|
-
// IMPACT COMMAND
|
|
479
|
-
// =============================================================================
|
|
480
|
-
program
|
|
481
|
-
.command('impact <component>')
|
|
482
|
-
.description('Show what\'s affected if you change a component')
|
|
483
|
-
.option('--json', 'Output as JSON')
|
|
484
|
-
.action(async (componentName, options) => {
|
|
485
|
-
try {
|
|
486
|
-
const config = getConfig();
|
|
487
|
-
const components = await loadAllComponents(config);
|
|
488
|
-
const connections = await loadAllConnections(config);
|
|
489
|
-
// Find the component
|
|
490
|
-
const component = components.find((c) => c.name.toLowerCase() === componentName.toLowerCase());
|
|
491
|
-
if (!component) {
|
|
492
|
-
console.log(`Component "${componentName}" not found.`);
|
|
493
|
-
console.log('\nAvailable components:');
|
|
494
|
-
for (const c of components.slice(0, 10)) {
|
|
495
|
-
console.log(` - ${c.name} (${c.type})`);
|
|
496
|
-
}
|
|
497
|
-
if (components.length > 10) {
|
|
498
|
-
console.log(` ... and ${components.length - 10} more`);
|
|
499
|
-
}
|
|
500
|
-
return;
|
|
501
|
-
}
|
|
502
|
-
// Find connections TO this component
|
|
503
|
-
const incoming = connections.filter((c) => c.to.component_id === component.component_id);
|
|
504
|
-
// Find connections FROM this component
|
|
505
|
-
const outgoing = connections.filter((c) => c.from.component_id === component.component_id);
|
|
506
|
-
if (options.json) {
|
|
507
|
-
console.log(JSON.stringify({ component, incoming, outgoing }, null, 2));
|
|
508
|
-
return;
|
|
509
|
-
}
|
|
510
|
-
console.log(`NavGator - Impact Analysis: ${component.name}\n`);
|
|
511
|
-
console.log('========================================');
|
|
512
|
-
console.log(`Component: ${component.name}`);
|
|
513
|
-
console.log(`Type: ${component.type}`);
|
|
514
|
-
console.log(`Layer: ${component.role.layer}`);
|
|
515
|
-
console.log(`Purpose: ${component.role.purpose}`);
|
|
516
|
-
if (incoming.length > 0) {
|
|
517
|
-
console.log(`\nINCOMING CONNECTIONS (${incoming.length}):`);
|
|
518
|
-
console.log('These files/components USE this component:\n');
|
|
519
|
-
for (const conn of incoming) {
|
|
520
|
-
const lineInfo = conn.code_reference.line_start ? `:${conn.code_reference.line_start}` : '';
|
|
521
|
-
console.log(` ${conn.code_reference.file}${lineInfo}`);
|
|
522
|
-
// Use symbol as primary identifier
|
|
523
|
-
if (conn.code_reference.symbol) {
|
|
524
|
-
const symbolType = conn.code_reference.symbol_type ? ` (${conn.code_reference.symbol_type})` : '';
|
|
525
|
-
console.log(` Symbol: ${conn.code_reference.symbol}${symbolType}`);
|
|
526
|
-
}
|
|
527
|
-
if (conn.code_reference.code_snippet) {
|
|
528
|
-
console.log(` Code: ${conn.code_reference.code_snippet}`);
|
|
529
|
-
}
|
|
530
|
-
console.log('');
|
|
531
|
-
}
|
|
532
|
-
}
|
|
533
|
-
if (outgoing.length > 0) {
|
|
534
|
-
console.log(`\nOUTGOING CONNECTIONS (${outgoing.length}):`);
|
|
535
|
-
console.log('This component USES these:\n');
|
|
536
|
-
for (const conn of outgoing) {
|
|
537
|
-
const target = components.find((c) => c.component_id === conn.to.component_id);
|
|
538
|
-
console.log(` → ${target?.name || conn.to.component_id}`);
|
|
539
|
-
console.log(` Type: ${conn.connection_type}`);
|
|
540
|
-
console.log('');
|
|
541
|
-
}
|
|
542
|
-
}
|
|
543
|
-
if (incoming.length === 0 && outgoing.length === 0) {
|
|
544
|
-
console.log('\nNo connections found for this component.');
|
|
545
|
-
}
|
|
546
|
-
console.log('\n========================================');
|
|
547
|
-
console.log(`Files that may need changes if you modify ${component.name}:`);
|
|
548
|
-
const affectedFiles = new Set(incoming.map((c) => c.code_reference.file));
|
|
549
|
-
for (const file of affectedFiles) {
|
|
550
|
-
console.log(` - ${file}`);
|
|
551
|
-
}
|
|
552
|
-
}
|
|
553
|
-
catch (error) {
|
|
554
|
-
console.error('Impact analysis failed:', error);
|
|
555
|
-
process.exit(1);
|
|
556
|
-
}
|
|
557
|
-
});
|
|
558
|
-
// =============================================================================
|
|
559
|
-
// CONNECTIONS COMMAND
|
|
560
|
-
// =============================================================================
|
|
561
|
-
program
|
|
562
|
-
.command('connections <component>')
|
|
563
|
-
.description('Show all connections for a specific component')
|
|
564
|
-
.option('--json', 'Output as JSON')
|
|
565
|
-
.option('--incoming', 'Show only incoming connections')
|
|
566
|
-
.option('--outgoing', 'Show only outgoing connections')
|
|
567
|
-
.action(async (componentName, options) => {
|
|
568
|
-
try {
|
|
569
|
-
const config = getConfig();
|
|
570
|
-
const components = await loadAllComponents(config);
|
|
571
|
-
const connections = await loadAllConnections(config);
|
|
572
|
-
const component = components.find((c) => c.name.toLowerCase() === componentName.toLowerCase());
|
|
573
|
-
if (!component) {
|
|
574
|
-
console.log(`Component "${componentName}" not found.`);
|
|
575
|
-
return;
|
|
576
|
-
}
|
|
577
|
-
const incoming = options.outgoing
|
|
578
|
-
? []
|
|
579
|
-
: connections.filter((c) => c.to.component_id === component.component_id);
|
|
580
|
-
const outgoing = options.incoming
|
|
581
|
-
? []
|
|
582
|
-
: connections.filter((c) => c.from.component_id === component.component_id);
|
|
583
|
-
if (options.json) {
|
|
584
|
-
console.log(JSON.stringify({ component, incoming, outgoing }, null, 2));
|
|
585
|
-
return;
|
|
586
|
-
}
|
|
587
|
-
console.log(`NavGator - Connections: ${component.name}\n`);
|
|
588
|
-
console.log('========================================');
|
|
589
|
-
console.log(`Component: ${component.name} (${component.type})`);
|
|
590
|
-
console.log(`Layer: ${component.role.layer}`);
|
|
591
|
-
if (!options.outgoing && incoming.length > 0) {
|
|
592
|
-
console.log(`\nINCOMING (${incoming.length}):`);
|
|
593
|
-
for (const conn of incoming) {
|
|
594
|
-
const lineInfo = conn.code_reference.line_start ? `:${conn.code_reference.line_start}` : '';
|
|
595
|
-
const symbolInfo = conn.code_reference.symbol ? ` (${conn.code_reference.symbol})` : '';
|
|
596
|
-
console.log(`├── ${conn.connection_type}`);
|
|
597
|
-
console.log(`│ └── ${conn.code_reference.file}${lineInfo}${symbolInfo}`);
|
|
598
|
-
}
|
|
599
|
-
}
|
|
600
|
-
if (!options.incoming && outgoing.length > 0) {
|
|
601
|
-
console.log(`\nOUTGOING (${outgoing.length}):`);
|
|
602
|
-
for (const conn of outgoing) {
|
|
603
|
-
const target = components.find((c) => c.component_id === conn.to.component_id);
|
|
604
|
-
console.log(`├── ${conn.connection_type} → ${target?.name || 'unknown'}`);
|
|
605
|
-
}
|
|
606
|
-
}
|
|
607
|
-
}
|
|
608
|
-
catch (error) {
|
|
609
|
-
console.error('Connections query failed:', error);
|
|
610
|
-
process.exit(1);
|
|
611
|
-
}
|
|
612
|
-
});
|
|
613
|
-
// =============================================================================
|
|
614
|
-
// LIST COMMAND
|
|
615
|
-
// =============================================================================
|
|
616
|
-
program
|
|
617
|
-
.command('list')
|
|
618
|
-
.description('List all tracked components')
|
|
619
|
-
.option('-t, --type <type>', 'Filter by type')
|
|
620
|
-
.option('-l, --layer <layer>', 'Filter by layer')
|
|
621
|
-
.option('--json', 'Output as JSON')
|
|
622
|
-
.action(async (options) => {
|
|
623
|
-
try {
|
|
624
|
-
const config = getConfig();
|
|
625
|
-
let components = await loadAllComponents(config);
|
|
626
|
-
if (options.type) {
|
|
627
|
-
components = components.filter((c) => c.type === options.type);
|
|
628
|
-
}
|
|
629
|
-
if (options.layer) {
|
|
630
|
-
components = components.filter((c) => c.role.layer === options.layer);
|
|
631
|
-
}
|
|
632
|
-
if (options.json) {
|
|
633
|
-
console.log(JSON.stringify(components, null, 2));
|
|
634
|
-
return;
|
|
635
|
-
}
|
|
636
|
-
console.log(`NavGator - Components (${components.length})\n`);
|
|
637
|
-
// Group by layer
|
|
638
|
-
const byLayer = {};
|
|
639
|
-
for (const c of components) {
|
|
640
|
-
if (!byLayer[c.role.layer])
|
|
641
|
-
byLayer[c.role.layer] = [];
|
|
642
|
-
byLayer[c.role.layer].push(c);
|
|
643
|
-
}
|
|
644
|
-
for (const [layer, comps] of Object.entries(byLayer)) {
|
|
645
|
-
console.log(`\n${layer.toUpperCase()}:`);
|
|
646
|
-
for (const c of comps) {
|
|
647
|
-
const version = c.version ? `@${c.version}` : '';
|
|
648
|
-
console.log(` ${c.name}${version} (${c.type})`);
|
|
649
|
-
}
|
|
650
|
-
}
|
|
651
|
-
}
|
|
652
|
-
catch (error) {
|
|
653
|
-
console.error('List failed:', error);
|
|
654
|
-
process.exit(1);
|
|
655
|
-
}
|
|
656
|
-
});
|
|
657
|
-
// =============================================================================
|
|
658
|
-
// DIAGRAM COMMAND
|
|
659
|
-
// =============================================================================
|
|
660
|
-
program
|
|
661
|
-
.command('diagram')
|
|
662
|
-
.description('Generate a Mermaid diagram of the architecture')
|
|
663
|
-
.option('-f, --focus <component>', 'Center diagram on a specific component')
|
|
664
|
-
.option('-l, --layer <layer>', 'Show only a specific layer')
|
|
665
|
-
.option('-s, --summary', 'Show only top connected components')
|
|
666
|
-
.option('-d, --direction <dir>', 'Diagram direction: TB, BT, LR, RL', 'TB')
|
|
667
|
-
.option('--no-styles', 'Disable color styling')
|
|
668
|
-
.option('--no-labels', 'Hide connection labels')
|
|
669
|
-
.option('-o, --output <file>', 'Save to file instead of stdout')
|
|
670
|
-
.option('-m, --max-nodes <n>', 'Maximum nodes to show', '50')
|
|
671
|
-
.option('--markdown', 'Wrap diagram in markdown code block')
|
|
672
|
-
.action(async (options) => {
|
|
673
|
-
try {
|
|
674
|
-
const config = getConfig();
|
|
675
|
-
const graph = await loadGraph(config);
|
|
676
|
-
if (!graph) {
|
|
677
|
-
console.error('No architecture data found. Run `navgator scan` first.');
|
|
678
|
-
process.exit(1);
|
|
679
|
-
}
|
|
680
|
-
const diagramOpts = {
|
|
681
|
-
direction: options.direction,
|
|
682
|
-
includeStyles: options.styles !== false,
|
|
683
|
-
showLabels: options.labels !== false,
|
|
684
|
-
maxNodes: parseInt(options.maxNodes, 10),
|
|
685
|
-
};
|
|
686
|
-
let diagram;
|
|
687
|
-
if (options.focus) {
|
|
688
|
-
// Find component by name
|
|
689
|
-
const components = await loadAllComponents(config);
|
|
690
|
-
const component = components.find((c) => c.name.toLowerCase() === options.focus.toLowerCase());
|
|
691
|
-
if (!component) {
|
|
692
|
-
console.error(`Component "${options.focus}" not found.`);
|
|
693
|
-
console.log('Available components:');
|
|
694
|
-
for (const c of components.slice(0, 10)) {
|
|
695
|
-
console.log(` - ${c.name}`);
|
|
696
|
-
}
|
|
697
|
-
process.exit(1);
|
|
698
|
-
}
|
|
699
|
-
diagram = generateComponentDiagram(graph, component.component_id, 2, diagramOpts);
|
|
700
|
-
}
|
|
701
|
-
else if (options.layer) {
|
|
702
|
-
const validLayers = ['frontend', 'backend', 'database', 'queue', 'infra', 'external'];
|
|
703
|
-
if (!validLayers.includes(options.layer)) {
|
|
704
|
-
console.error(`Invalid layer "${options.layer}". Valid layers: ${validLayers.join(', ')}`);
|
|
705
|
-
process.exit(1);
|
|
706
|
-
}
|
|
707
|
-
diagram = generateLayerDiagram(graph, options.layer, diagramOpts);
|
|
708
|
-
}
|
|
709
|
-
else if (options.summary) {
|
|
710
|
-
diagram = generateSummaryDiagram(graph, { ...diagramOpts, maxNodes: 20 });
|
|
711
|
-
}
|
|
712
|
-
else {
|
|
713
|
-
diagram = generateMermaidDiagram(graph, diagramOpts);
|
|
714
|
-
}
|
|
715
|
-
// Optionally wrap in markdown
|
|
716
|
-
if (options.markdown) {
|
|
717
|
-
const title = options.focus
|
|
718
|
-
? `Architecture: ${options.focus}`
|
|
719
|
-
: options.layer
|
|
720
|
-
? `${options.layer} Layer`
|
|
721
|
-
: 'Architecture Diagram';
|
|
722
|
-
diagram = wrapInMarkdown(diagram, title);
|
|
723
|
-
}
|
|
724
|
-
// Output
|
|
725
|
-
if (options.output) {
|
|
726
|
-
await fs.promises.writeFile(options.output, diagram, 'utf-8');
|
|
727
|
-
console.log(`Diagram saved to ${options.output}`);
|
|
728
|
-
}
|
|
729
|
-
else {
|
|
730
|
-
console.log(diagram);
|
|
731
|
-
}
|
|
732
|
-
}
|
|
733
|
-
catch (error) {
|
|
734
|
-
console.error('Diagram generation failed:', error);
|
|
735
|
-
process.exit(1);
|
|
736
|
-
}
|
|
737
|
-
});
|
|
738
|
-
// =============================================================================
|
|
739
|
-
// UI COMMAND
|
|
740
|
-
// =============================================================================
|
|
741
|
-
program
|
|
742
|
-
.command('ui')
|
|
743
|
-
.description('Launch the NavGator dashboard in your browser')
|
|
744
|
-
.option('-p, --port <port>', 'Port to serve on', '3000')
|
|
745
|
-
.option('--path <path>', 'Project path to analyze (defaults to current directory)')
|
|
746
|
-
.option('--no-open', 'Don\'t open browser automatically')
|
|
747
|
-
.action(async (options) => {
|
|
748
|
-
try {
|
|
749
|
-
const port = parseInt(options.port, 10);
|
|
750
|
-
const projectPath = options.path
|
|
751
|
-
? (await import('path')).resolve(options.path)
|
|
752
|
-
: process.cwd();
|
|
753
|
-
console.log('');
|
|
754
|
-
console.log('🐊 NavGator Dashboard');
|
|
755
|
-
console.log(` Project: ${projectPath}`);
|
|
756
|
-
console.log('');
|
|
757
|
-
const { process: serverProcess } = await launchWebUI({
|
|
758
|
-
port,
|
|
759
|
-
projectPath,
|
|
760
|
-
});
|
|
761
|
-
const url = `http://localhost:${port}`;
|
|
762
|
-
console.log(`Dashboard running at: ${url}`);
|
|
763
|
-
console.log('');
|
|
764
|
-
console.log('Press Ctrl+C to stop');
|
|
765
|
-
console.log('');
|
|
766
|
-
// Try to open browser
|
|
767
|
-
if (options.open !== false) {
|
|
768
|
-
const { exec } = await import('child_process');
|
|
769
|
-
const openCmd = process.platform === 'darwin' ? 'open' :
|
|
770
|
-
process.platform === 'win32' ? 'start' : 'xdg-open';
|
|
771
|
-
exec(`${openCmd} ${url}`);
|
|
772
|
-
}
|
|
773
|
-
// Keep process running, clean up child on exit
|
|
774
|
-
const cleanup = () => {
|
|
775
|
-
console.log('\nShutting down...');
|
|
776
|
-
serverProcess.kill();
|
|
777
|
-
process.exit(0);
|
|
778
|
-
};
|
|
779
|
-
process.on('SIGINT', cleanup);
|
|
780
|
-
process.on('SIGTERM', cleanup);
|
|
781
|
-
}
|
|
782
|
-
catch (error) {
|
|
783
|
-
console.error('Failed to start UI:', error);
|
|
784
|
-
process.exit(1);
|
|
785
|
-
}
|
|
786
|
-
});
|
|
787
|
-
// =============================================================================
|
|
788
|
-
// PROMPTS COMMAND
|
|
789
|
-
// =============================================================================
|
|
790
|
-
program
|
|
791
|
-
.command('prompts')
|
|
792
|
-
.description('Scan and display AI prompts in the codebase')
|
|
793
|
-
.option('-v, --verbose', 'Show full prompt content')
|
|
794
|
-
.option('--json', 'Output as JSON')
|
|
795
|
-
.option('--detail <name>', 'Show detailed view of a specific prompt')
|
|
796
|
-
.action(async (options) => {
|
|
797
|
-
try {
|
|
798
|
-
const result = await scanPromptsOnly(process.cwd());
|
|
799
|
-
if (options.json) {
|
|
800
|
-
console.log(JSON.stringify(result, null, 2));
|
|
801
|
-
return;
|
|
802
|
-
}
|
|
803
|
-
if (options.detail) {
|
|
804
|
-
// Find specific prompt
|
|
805
|
-
const prompt = result.prompts.find((p) => p.name.toLowerCase() === options.detail.toLowerCase() ||
|
|
806
|
-
p.id.toLowerCase() === options.detail.toLowerCase());
|
|
807
|
-
if (!prompt) {
|
|
808
|
-
console.log(`Prompt "${options.detail}" not found.`);
|
|
809
|
-
console.log('\nAvailable prompts:');
|
|
810
|
-
for (const p of result.prompts.slice(0, 10)) {
|
|
811
|
-
console.log(` - ${p.name} (${p.location.file}:${p.location.lineStart})`);
|
|
812
|
-
}
|
|
813
|
-
return;
|
|
814
|
-
}
|
|
815
|
-
console.log(formatPromptDetail(prompt));
|
|
816
|
-
return;
|
|
817
|
-
}
|
|
818
|
-
// Standard output
|
|
819
|
-
console.log(formatPromptsOutput(result));
|
|
820
|
-
// Show prompt details if verbose
|
|
821
|
-
if (options.verbose && result.prompts.length > 0) {
|
|
822
|
-
console.log('\n' + '='.repeat(60));
|
|
823
|
-
console.log('PROMPT DETAILS');
|
|
824
|
-
console.log('='.repeat(60));
|
|
825
|
-
for (const prompt of result.prompts) {
|
|
826
|
-
console.log(`\n--- ${prompt.name} ---`);
|
|
827
|
-
console.log(`File: ${prompt.location.file}:${prompt.location.lineStart}`);
|
|
828
|
-
if (prompt.purpose) {
|
|
829
|
-
console.log(`Purpose: ${prompt.purpose}`);
|
|
830
|
-
}
|
|
831
|
-
for (const msg of prompt.messages) {
|
|
832
|
-
console.log(`\n[${msg.role.toUpperCase()}]:`);
|
|
833
|
-
// Show up to 300 chars of content
|
|
834
|
-
const preview = msg.content.slice(0, 300);
|
|
835
|
-
console.log(preview);
|
|
836
|
-
if (msg.content.length > 300) {
|
|
837
|
-
console.log(`... (${msg.content.length - 300} more chars)`);
|
|
838
|
-
}
|
|
839
|
-
}
|
|
840
|
-
}
|
|
841
|
-
}
|
|
842
|
-
}
|
|
843
|
-
catch (error) {
|
|
844
|
-
console.error('Prompt scan failed:', error);
|
|
845
|
-
process.exit(1);
|
|
43
|
+
// Apply sandbox flag globally before any command runs
|
|
44
|
+
program.hook('preAction', () => {
|
|
45
|
+
if (program.opts().sandbox) {
|
|
46
|
+
process.env.NAVGATOR_SANDBOX = '1';
|
|
846
47
|
}
|
|
847
48
|
});
|
|
49
|
+
// Register all commands
|
|
50
|
+
registerSetupCommand(program);
|
|
51
|
+
registerScanCommand(program);
|
|
52
|
+
registerStatusCommand(program);
|
|
53
|
+
registerFreshnessCommands(program);
|
|
54
|
+
registerImpactCommand(program);
|
|
55
|
+
registerConnectionsCommand(program);
|
|
56
|
+
registerListCommand(program);
|
|
57
|
+
registerFindCommand(program);
|
|
58
|
+
registerTemporalCommands(program);
|
|
59
|
+
registerDiagramCommand(program);
|
|
60
|
+
registerUICommand(program);
|
|
61
|
+
registerPromptsCommand(program);
|
|
62
|
+
registerHistoryCommand(program);
|
|
63
|
+
registerDiffCommand(program);
|
|
64
|
+
registerProjectsCommand(program);
|
|
65
|
+
registerSummaryCommand(program);
|
|
66
|
+
registerTraceCommand(program);
|
|
67
|
+
registerRulesCommand(program);
|
|
68
|
+
registerCoverageCommand(program);
|
|
69
|
+
registerSubgraphCommand(program);
|
|
70
|
+
registerLLMMapCommand(program);
|
|
71
|
+
registerSchemaCommand(program);
|
|
72
|
+
registerDeadCommand(program);
|
|
73
|
+
registerLessonsCommand(program);
|
|
848
74
|
// =============================================================================
|
|
849
75
|
// PARSE AND RUN
|
|
850
76
|
// =============================================================================
|
|
@@ -852,6 +78,29 @@ program
|
|
|
852
78
|
const arg = process.argv[2];
|
|
853
79
|
const isFlag = arg?.startsWith('-');
|
|
854
80
|
const hasCommandOrFlag = process.argv.length > 2;
|
|
81
|
+
/**
|
|
82
|
+
* Detect a natural-language intent argument: a non-flag, non-subcommand
|
|
83
|
+
* first arg that contains spaces or quotes (e.g. `navgator "review my auth"`).
|
|
84
|
+
*
|
|
85
|
+
* Run 1 — D3: redirect such input to /navgator:plan. The planner agent runs
|
|
86
|
+
* inside Claude Code; the bare CLI cannot reach it. Print a redirect message
|
|
87
|
+
* and exit 0 so wrappers don't treat this as a failure.
|
|
88
|
+
*/
|
|
89
|
+
function looksLikeNaturalLanguage(rawArg, knownCommands) {
|
|
90
|
+
if (!rawArg)
|
|
91
|
+
return false;
|
|
92
|
+
if (rawArg.startsWith('-'))
|
|
93
|
+
return false;
|
|
94
|
+
// Subcommand match → not natural language.
|
|
95
|
+
if (knownCommands.has(rawArg))
|
|
96
|
+
return false;
|
|
97
|
+
// Quotes, spaces, or known NL-shaped punctuation → treat as intent.
|
|
98
|
+
if (rawArg.includes(' ') || rawArg.includes('"') || rawArg.includes("'"))
|
|
99
|
+
return true;
|
|
100
|
+
// Single token that's NOT a registered command and NOT in knownCommands:
|
|
101
|
+
// let commander handle it (will produce its own unknown-command error).
|
|
102
|
+
return false;
|
|
103
|
+
}
|
|
855
104
|
if (!hasCommandOrFlag) {
|
|
856
105
|
// No arguments at all → show welcome menu
|
|
857
106
|
showWelcomeMenu('no-command').catch((err) => {
|
|
@@ -859,8 +108,22 @@ if (!hasCommandOrFlag) {
|
|
|
859
108
|
process.exit(1);
|
|
860
109
|
});
|
|
861
110
|
}
|
|
111
|
+
else if (!isFlag && arg !== undefined) {
|
|
112
|
+
// Build the set of registered subcommand names from commander's metadata.
|
|
113
|
+
const knownCommands = new Set(program.commands.map((c) => c.name()));
|
|
114
|
+
if (looksLikeNaturalLanguage(arg, knownCommands)) {
|
|
115
|
+
// Natural-language intent — redirect to /navgator:plan.
|
|
116
|
+
const intent = arg;
|
|
117
|
+
process.stdout.write(`navgator "${intent}" needs Claude Code. From a terminal use a subcommand directly ` +
|
|
118
|
+
`(e.g. \`navgator scan\`, \`navgator impact <component>\`), or run /navgator:plan "${intent}" ` +
|
|
119
|
+
`from inside Claude Code.\n`);
|
|
120
|
+
process.exit(0);
|
|
121
|
+
}
|
|
122
|
+
// Non-NL token → fall through to commander (it will print its own error).
|
|
123
|
+
program.parse();
|
|
124
|
+
}
|
|
862
125
|
else {
|
|
863
|
-
// Has a
|
|
126
|
+
// Has a flag (--help, --version, etc.) → let Commander handle it
|
|
864
127
|
program.parse();
|
|
865
128
|
}
|
|
866
129
|
//# sourceMappingURL=index.js.map
|