@documentation-robotics/cli 0.1.0 → 0.1.5
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/LICENSE +21 -0
- package/README.md +466 -693
- package/dist/analysis/data-model-analyzer.js +189 -0
- package/dist/analysis/data-model-analyzer.js.map +7 -0
- package/dist/analysis/index.js +3 -0
- package/dist/analysis/index.js.map +7 -0
- package/dist/analysis/relationship-classifier.js +181 -0
- package/dist/analysis/relationship-classifier.js.map +7 -0
- package/dist/analyzers/base-analyzer.js +1 -0
- package/dist/analyzers/base-analyzer.js.map +7 -0
- package/dist/analyzers/call-graph-utils.js +39 -0
- package/dist/analyzers/call-graph-utils.js.map +7 -0
- package/dist/analyzers/cbm-analyzer.js +1205 -0
- package/dist/analyzers/cbm-analyzer.js.map +7 -0
- package/dist/analyzers/heuristic-utils.js +55 -0
- package/dist/analyzers/heuristic-utils.js.map +7 -0
- package/dist/analyzers/mapping-loader.js +146 -0
- package/dist/analyzers/mapping-loader.js.map +7 -0
- package/dist/analyzers/registry.js +124 -0
- package/dist/analyzers/registry.js.map +7 -0
- package/dist/analyzers/session-state.js +176 -0
- package/dist/analyzers/session-state.js.map +7 -0
- package/dist/analyzers/stdio-client.js +206 -0
- package/dist/analyzers/stdio-client.js.map +7 -0
- package/dist/analyzers/types.js +15 -0
- package/dist/analyzers/types.js.map +7 -0
- package/dist/analyzers/verify-engine.js +209 -0
- package/dist/analyzers/verify-engine.js.map +7 -0
- package/dist/analyzers/verify-ignore.js +130 -0
- package/dist/analyzers/verify-ignore.js.map +7 -0
- package/dist/analyzers/version.js +8 -0
- package/dist/analyzers/version.js.map +7 -0
- package/dist/audit/ai/runner.js +41 -0
- package/dist/audit/ai/runner.js.map +7 -0
- package/dist/audit/differential-analyzer.js +183 -0
- package/dist/audit/differential-analyzer.js.map +7 -0
- package/dist/audit/index.js +32 -0
- package/dist/audit/index.js.map +7 -0
- package/dist/audit/nodes/ai/evaluator.js +49 -0
- package/dist/audit/nodes/ai/evaluator.js.map +7 -0
- package/dist/audit/nodes/ai/parser.js +55 -0
- package/dist/audit/nodes/ai/parser.js.map +7 -0
- package/dist/audit/nodes/ai/prompts.js +103 -0
- package/dist/audit/nodes/ai/prompts.js.map +7 -0
- package/dist/audit/nodes/analysis/node-completeness-checker.js +32 -0
- package/dist/audit/nodes/analysis/node-completeness-checker.js.map +7 -0
- package/dist/audit/nodes/analysis/node-definition-analyzer.js +47 -0
- package/dist/audit/nodes/analysis/node-definition-analyzer.js.map +7 -0
- package/dist/audit/nodes/analysis/node-overlap-detector.js +79 -0
- package/dist/audit/nodes/analysis/node-overlap-detector.js.map +7 -0
- package/dist/audit/nodes/model/orchestrator.js +82 -0
- package/dist/audit/nodes/model/orchestrator.js.map +7 -0
- package/dist/audit/nodes/spec/loader.js +116 -0
- package/dist/audit/nodes/spec/loader.js.map +7 -0
- package/dist/audit/nodes/spec/orchestrator.js +68 -0
- package/dist/audit/nodes/spec/orchestrator.js.map +7 -0
- package/dist/audit/nodes/types.js +1 -0
- package/dist/audit/nodes/types.js.map +7 -0
- package/dist/audit/pipeline/index.js +5 -0
- package/dist/audit/pipeline/index.js.map +7 -0
- package/dist/audit/pipeline/pipeline-orchestrator.js +218 -0
- package/dist/audit/pipeline/pipeline-orchestrator.js.map +7 -0
- package/dist/audit/relationships/ai/evaluator.js +235 -0
- package/dist/audit/relationships/ai/evaluator.js.map +7 -0
- package/dist/audit/relationships/ai/parser.js +197 -0
- package/dist/audit/relationships/ai/parser.js.map +7 -0
- package/dist/audit/relationships/ai/prompts.js +274 -0
- package/dist/audit/relationships/ai/prompts.js.map +7 -0
- package/dist/audit/relationships/analysis/balance-assessor.js +115 -0
- package/dist/audit/relationships/analysis/balance-assessor.js.map +7 -0
- package/dist/audit/relationships/analysis/coverage-analyzer.js +99 -0
- package/dist/audit/relationships/analysis/coverage-analyzer.js.map +7 -0
- package/dist/audit/relationships/analysis/duplicate-detector.js +95 -0
- package/dist/audit/relationships/analysis/duplicate-detector.js.map +7 -0
- package/dist/audit/relationships/analysis/gap-analyzer.js +99 -0
- package/dist/audit/relationships/analysis/gap-analyzer.js.map +7 -0
- package/dist/audit/relationships/analysis/layer-templates.js +294 -0
- package/dist/audit/relationships/analysis/layer-templates.js.map +7 -0
- package/dist/audit/relationships/graph/connectivity.js +129 -0
- package/dist/audit/relationships/graph/connectivity.js.map +7 -0
- package/dist/audit/relationships/graph/relationship-graph.js +179 -0
- package/dist/audit/relationships/graph/relationship-graph.js.map +7 -0
- package/dist/audit/relationships/model/balance-assessor.js +49 -0
- package/dist/audit/relationships/model/balance-assessor.js.map +7 -0
- package/dist/audit/relationships/model/coverage-analyzer.js +34 -0
- package/dist/audit/relationships/model/coverage-analyzer.js.map +7 -0
- package/dist/audit/relationships/model/duplicate-detector.js +68 -0
- package/dist/audit/relationships/model/duplicate-detector.js.map +7 -0
- package/dist/audit/relationships/model/gap-analyzer.js +41 -0
- package/dist/audit/relationships/model/gap-analyzer.js.map +7 -0
- package/dist/audit/relationships/model/orchestrator.js +126 -0
- package/dist/audit/relationships/model/orchestrator.js.map +7 -0
- package/dist/audit/relationships/spec/orchestrator.js +157 -0
- package/dist/audit/relationships/spec/orchestrator.js.map +7 -0
- package/dist/audit/reports/index.js +5 -0
- package/dist/audit/reports/index.js.map +7 -0
- package/dist/audit/reports/report-generator.js +118 -0
- package/dist/audit/reports/report-generator.js.map +7 -0
- package/dist/audit/snapshot-storage.js +163 -0
- package/dist/audit/snapshot-storage.js.map +7 -0
- package/dist/audit/types.js +21 -0
- package/dist/audit/types.js.map +7 -0
- package/dist/cli.js +223 -92
- package/dist/cli.js.map +3 -3
- package/dist/coding-agents/agents/claude-code.js +147 -0
- package/dist/coding-agents/agents/claude-code.js.map +7 -0
- package/dist/coding-agents/agents/index.js +5 -0
- package/dist/coding-agents/agents/index.js.map +7 -0
- package/dist/coding-agents/agents/types.js +1 -0
- package/dist/coding-agents/agents/types.js.map +7 -0
- package/dist/coding-agents/base-chat-client.js +45 -0
- package/dist/coding-agents/base-chat-client.js.map +7 -0
- package/dist/coding-agents/chat-utils.js +23 -0
- package/dist/coding-agents/chat-utils.js.map +7 -0
- package/dist/coding-agents/claude-code-client.js +246 -0
- package/dist/coding-agents/claude-code-client.js.map +7 -0
- package/dist/coding-agents/copilot-client.js +209 -0
- package/dist/coding-agents/copilot-client.js.map +7 -0
- package/dist/commands/add.js +95 -33
- package/dist/commands/add.js.map +2 -2
- package/dist/commands/analyzer.js +511 -0
- package/dist/commands/analyzer.js.map +7 -0
- package/dist/commands/audit-diff.js +49 -0
- package/dist/commands/audit-diff.js.map +7 -0
- package/dist/commands/audit-snapshots.js +62 -0
- package/dist/commands/audit-snapshots.js.map +7 -0
- package/dist/commands/audit.js +81 -0
- package/dist/commands/audit.js.map +7 -0
- package/dist/commands/catalog.js +248 -0
- package/dist/commands/catalog.js.map +7 -0
- package/dist/commands/changeset.js +577 -66
- package/dist/commands/changeset.js.map +2 -2
- package/dist/commands/chat.js +106 -83
- package/dist/commands/chat.js.map +2 -2
- package/dist/commands/claude.js +74 -0
- package/dist/commands/claude.js.map +7 -0
- package/dist/commands/conformance.js +71 -68
- package/dist/commands/conformance.js.map +2 -2
- package/dist/commands/copilot.js +75 -0
- package/dist/commands/copilot.js.map +7 -0
- package/dist/commands/delete.js +125 -11
- package/dist/commands/delete.js.map +3 -3
- package/dist/commands/discover-logic.js +44 -0
- package/dist/commands/discover-logic.js.map +7 -0
- package/dist/commands/docs.js +87 -0
- package/dist/commands/docs.js.map +7 -0
- package/dist/commands/element.js +14 -20
- package/dist/commands/element.js.map +2 -2
- package/dist/commands/export.js +13 -3
- package/dist/commands/export.js.map +2 -2
- package/dist/commands/import.js +51 -0
- package/dist/commands/import.js.map +7 -0
- package/dist/commands/info.js +30 -24
- package/dist/commands/info.js.map +2 -2
- package/dist/commands/init.js +27 -11
- package/dist/commands/init.js.map +2 -2
- package/dist/commands/list.js +63 -13
- package/dist/commands/list.js.map +3 -3
- package/dist/commands/relationship.js +225 -37
- package/dist/commands/relationship.js.map +2 -2
- package/dist/commands/report.js +54 -0
- package/dist/commands/report.js.map +7 -0
- package/dist/commands/reports.js +45 -0
- package/dist/commands/reports.js.map +7 -0
- package/dist/commands/schema.js +135 -0
- package/dist/commands/schema.js.map +7 -0
- package/dist/commands/search.js +40 -12
- package/dist/commands/search.js.map +2 -2
- package/dist/commands/show.js +58 -27
- package/dist/commands/show.js.map +2 -2
- package/dist/commands/stats.js +35 -0
- package/dist/commands/stats.js.map +7 -0
- package/dist/commands/trace.js +39 -16
- package/dist/commands/trace.js.map +2 -2
- package/dist/commands/update.js +141 -14
- package/dist/commands/update.js.map +2 -2
- package/dist/commands/upgrade.js +210 -46
- package/dist/commands/upgrade.js.map +3 -3
- package/dist/commands/validate.js +142 -23
- package/dist/commands/validate.js.map +3 -3
- package/dist/commands/version.js +8 -12
- package/dist/commands/version.js.map +2 -2
- package/dist/commands/visualize.js +155 -25
- package/dist/commands/visualize.js.map +2 -2
- package/dist/core/base-snapshot-manager.js +84 -0
- package/dist/core/base-snapshot-manager.js.map +7 -0
- package/dist/core/changeset-exporter.js +305 -0
- package/dist/core/changeset-exporter.js.map +7 -0
- package/dist/core/changeset-validator.js +41 -0
- package/dist/core/changeset-validator.js.map +7 -0
- package/dist/core/changeset.js +88 -173
- package/dist/core/changeset.js.map +2 -2
- package/dist/core/dependency-tracker.js +4 -2
- package/dist/core/dependency-tracker.js.map +2 -2
- package/dist/core/element.js +98 -27
- package/dist/core/element.js.map +2 -2
- package/dist/core/golden-copy-cache.js +290 -0
- package/dist/core/golden-copy-cache.js.map +7 -0
- package/dist/core/graph-model.js +266 -0
- package/dist/core/graph-model.js.map +7 -0
- package/dist/core/layer.js +159 -16
- package/dist/core/layer.js.map +2 -2
- package/dist/core/layers.js +32 -0
- package/dist/core/layers.js.map +7 -0
- package/dist/core/manifest.js +32 -11
- package/dist/core/manifest.js.map +2 -2
- package/dist/core/migration-registry.js +56 -1
- package/dist/core/migration-registry.js.map +2 -2
- package/dist/core/model.js +424 -217
- package/dist/core/model.js.map +3 -3
- package/dist/core/mutation-handler.js +179 -0
- package/dist/core/mutation-handler.js.map +7 -0
- package/dist/core/reference-registry.js +29 -21
- package/dist/core/reference-registry.js.map +2 -2
- package/dist/core/relationship-catalog.js +189 -0
- package/dist/core/relationship-catalog.js.map +7 -0
- package/dist/core/relationship-registry.js.map +2 -2
- package/dist/core/relationships.js.map +1 -1
- package/dist/core/report-data-model.js +285 -0
- package/dist/core/report-data-model.js.map +7 -0
- package/dist/core/spec-data-service.js +185 -0
- package/dist/core/spec-data-service.js.map +7 -0
- package/dist/core/spec-loader-types.js +1 -0
- package/dist/core/spec-loader-types.js.map +7 -0
- package/dist/core/spec-loader.js +234 -0
- package/dist/core/spec-loader.js.map +7 -0
- package/dist/core/staged-changeset-storage.js +282 -0
- package/dist/core/staged-changeset-storage.js.map +7 -0
- package/dist/core/staging-area.js +1002 -0
- package/dist/core/staging-area.js.map +7 -0
- package/dist/core/stats-collector.js +169 -0
- package/dist/core/stats-collector.js.map +7 -0
- package/dist/core/virtual-projection.js +443 -0
- package/dist/core/virtual-projection.js.map +7 -0
- package/dist/export/archimate-exporter.js +99 -60
- package/dist/export/archimate-exporter.js.map +2 -2
- package/dist/export/audit-formatters.js +479 -0
- package/dist/export/audit-formatters.js.map +7 -0
- package/dist/export/diff-formatters.js +99 -0
- package/dist/export/diff-formatters.js.map +7 -0
- package/dist/export/export-manager.js.map +2 -2
- package/dist/export/graphml-exporter.js +44 -27
- package/dist/export/graphml-exporter.js.map +2 -2
- package/dist/export/index.js +4 -0
- package/dist/export/index.js.map +2 -2
- package/dist/export/json-schema-exporter.js +55 -42
- package/dist/export/json-schema-exporter.js.map +2 -2
- package/dist/export/markdown-exporter.js +92 -70
- package/dist/export/markdown-exporter.js.map +2 -2
- package/dist/export/markdown-generator.js +248 -0
- package/dist/export/markdown-generator.js.map +7 -0
- package/dist/export/markdown-utils.js +30 -0
- package/dist/export/markdown-utils.js.map +7 -0
- package/dist/export/mermaid-markdown-exporter.js +37 -0
- package/dist/export/mermaid-markdown-exporter.js.map +7 -0
- package/dist/export/openapi-exporter.js +119 -71
- package/dist/export/openapi-exporter.js.map +2 -2
- package/dist/export/plantuml-exporter.js +104 -39
- package/dist/export/plantuml-exporter.js.map +2 -2
- package/dist/export/report-formatters.js +111 -0
- package/dist/export/report-formatters.js.map +7 -0
- package/dist/export/stats-formatters.js +98 -0
- package/dist/export/stats-formatters.js.map +7 -0
- package/dist/export/types.js +2 -14
- package/dist/export/types.js.map +2 -2
- package/dist/export/verify-formatters.js +153 -0
- package/dist/export/verify-formatters.js.map +7 -0
- package/dist/generated/compiled-validators.js +17 -0
- package/dist/generated/compiled-validators.js.map +7 -0
- package/dist/generated/index.js +31 -0
- package/dist/generated/index.js.map +7 -0
- package/dist/generated/layer-registry.js +190 -0
- package/dist/generated/layer-registry.js.map +7 -0
- package/dist/generated/layer-types.js +7 -0
- package/dist/generated/layer-types.js.map +7 -0
- package/dist/generated/node-types.js +1719 -0
- package/dist/generated/node-types.js.map +7 -0
- package/dist/generated/relationship-index.js +14552 -0
- package/dist/generated/relationship-index.js.map +7 -0
- package/dist/import/archimate-importer.js +166 -0
- package/dist/import/archimate-importer.js.map +7 -0
- package/dist/import/index.js +47 -0
- package/dist/import/index.js.map +7 -0
- package/dist/import/openapi-importer.js +143 -0
- package/dist/import/openapi-importer.js.map +7 -0
- package/dist/import/types.js +1 -0
- package/dist/import/types.js.map +7 -0
- package/dist/integrations/base-manager.js +311 -0
- package/dist/integrations/base-manager.js.map +7 -0
- package/dist/integrations/claude-manager.js +360 -0
- package/dist/integrations/claude-manager.js.map +7 -0
- package/dist/integrations/claude_code/agents/dr-advisor.md +253 -0
- package/dist/integrations/claude_code/agents/dr-architect.md +278 -0
- package/dist/integrations/claude_code/agents/dr-extractor.md +286 -0
- package/dist/integrations/claude_code/commands/dr-changeset.md +657 -0
- package/dist/integrations/claude_code/commands/dr-design.md +373 -0
- package/dist/integrations/claude_code/commands/dr-info.md +132 -0
- package/dist/integrations/claude_code/commands/dr-init.md +251 -0
- package/dist/integrations/claude_code/commands/dr-map.md +936 -0
- package/dist/integrations/claude_code/commands/dr-model.md +493 -0
- package/dist/integrations/claude_code/commands/dr-relate.md +814 -0
- package/dist/integrations/claude_code/commands/dr-sync.md +279 -0
- package/dist/integrations/claude_code/commands/dr-validate.md +654 -0
- package/dist/integrations/claude_code/commands/dr-verify.md +559 -0
- package/dist/integrations/claude_code/docs/END_TO_END_WALKTHROUGH.md +903 -0
- package/dist/integrations/claude_code/docs/QUICK_START.md +271 -0
- package/dist/integrations/claude_code/docs/README.md +347 -0
- package/dist/integrations/claude_code/skills/dr_01_motivation_layer/SKILL.md +550 -0
- package/dist/integrations/claude_code/skills/dr_02_business_layer/SKILL.md +620 -0
- package/dist/integrations/claude_code/skills/dr_03_security_layer/SKILL.md +642 -0
- package/dist/integrations/claude_code/skills/dr_04_application_layer/SKILL.md +911 -0
- package/dist/integrations/claude_code/skills/dr_05_technology_layer/SKILL.md +836 -0
- package/dist/integrations/claude_code/skills/dr_06_api_layer/SKILL.md +933 -0
- package/dist/integrations/claude_code/skills/dr_07_data_model_layer/SKILL.md +210 -0
- package/dist/integrations/claude_code/skills/dr_08_dataset_layer/SKILL.md +319 -0
- package/dist/integrations/claude_code/skills/dr_09_ux_layer/SKILL.md +319 -0
- package/dist/integrations/claude_code/skills/dr_10_navigation_layer/SKILL.md +318 -0
- package/dist/integrations/claude_code/skills/dr_11_apm_layer/SKILL.md +273 -0
- package/dist/integrations/claude_code/skills/dr_12_testing_layer/SKILL.md +273 -0
- package/dist/integrations/claude_code/skills/dr_changeset_reviewer/SKILL.md +187 -0
- package/dist/integrations/claude_code/skills/dr_codebase_memory/SKILL.md +590 -0
- package/dist/integrations/claude_code/skills/dr_engineering_guide/SKILL.md +295 -0
- package/dist/integrations/copilot-manager.js +328 -0
- package/dist/integrations/copilot-manager.js.map +7 -0
- package/dist/integrations/github_copilot/agents/dr-advisor.md +243 -0
- package/dist/integrations/github_copilot/agents/dr-architect.md +1567 -0
- package/dist/integrations/github_copilot/skills/dr_01_motivation_layer/SKILL.md +491 -0
- package/dist/integrations/github_copilot/skills/dr_02_business_layer/SKILL.md +539 -0
- package/dist/integrations/github_copilot/skills/dr_03_security_layer/SKILL.md +667 -0
- package/dist/integrations/github_copilot/skills/dr_04_application_layer/SKILL.md +670 -0
- package/dist/integrations/github_copilot/skills/dr_05_technology_layer/SKILL.md +660 -0
- package/dist/integrations/github_copilot/skills/dr_06_api_layer/SKILL.md +855 -0
- package/dist/integrations/github_copilot/skills/dr_07_data_model_layer/SKILL.md +171 -0
- package/dist/integrations/github_copilot/skills/dr_08_dataset_layer/SKILL.md +216 -0
- package/dist/integrations/github_copilot/skills/dr_09_ux_layer/SKILL.md +230 -0
- package/dist/integrations/github_copilot/skills/dr_10_navigation_layer/SKILL.md +228 -0
- package/dist/integrations/github_copilot/skills/dr_11_apm_layer/SKILL.md +234 -0
- package/dist/integrations/github_copilot/skills/dr_12_testing_layer/SKILL.md +230 -0
- package/dist/integrations/github_copilot/skills/dr_changeset_reviewer/SKILL.md +187 -0
- package/dist/integrations/hash-utils.js +51 -0
- package/dist/integrations/hash-utils.js.map +7 -0
- package/dist/integrations/types.js +16 -0
- package/dist/integrations/types.js.map +7 -0
- package/dist/reports/model-layer-report-generator.js +278 -0
- package/dist/reports/model-layer-report-generator.js.map +7 -0
- package/dist/reports/model-report-data.js +57 -0
- package/dist/reports/model-report-data.js.map +7 -0
- package/dist/reports/model-report-orchestrator.js +103 -0
- package/dist/reports/model-report-orchestrator.js.map +7 -0
- package/dist/schemas/bundled/analyzers/cbm.json +595 -0
- package/dist/schemas/bundled/analyzers/manifest.json +9 -0
- package/dist/schemas/bundled/api.json +3411 -0
- package/dist/schemas/bundled/apm.json +2371 -0
- package/dist/schemas/bundled/application.json +1253 -0
- package/dist/schemas/bundled/base.json +1622 -0
- package/dist/schemas/bundled/business.json +1279 -0
- package/dist/schemas/bundled/data-model.json +1298 -0
- package/dist/schemas/bundled/data-store.json +2025 -0
- package/dist/schemas/bundled/manifest.json +93 -0
- package/dist/schemas/bundled/motivation.json +1360 -0
- package/dist/schemas/bundled/navigation.json +1874 -0
- package/dist/schemas/bundled/security.json +3488 -0
- package/dist/schemas/bundled/technology.json +2067 -0
- package/dist/schemas/bundled/testing.json +3120 -0
- package/dist/schemas/bundled/ux.json +3592 -0
- package/dist/server/schemas.js +202 -0
- package/dist/server/schemas.js.map +7 -0
- package/dist/server/server.js +1336 -252
- package/dist/server/server.js.map +3 -3
- package/dist/server/telemetry-middleware.js +22 -15
- package/dist/server/telemetry-middleware.js.map +2 -2
- package/dist/server-entry.js +65 -0
- package/dist/server-entry.js.map +7 -0
- package/dist/telemetry/config.js +89 -0
- package/dist/telemetry/config.js.map +7 -0
- package/dist/telemetry/console-interceptor.js.map +1 -1
- package/dist/telemetry/detect.js +24 -0
- package/dist/telemetry/detect.js.map +7 -0
- package/dist/telemetry/fetch-otlp-exporter.js +112 -0
- package/dist/telemetry/fetch-otlp-exporter.js.map +7 -0
- package/dist/telemetry/index.js +153 -3
- package/dist/telemetry/index.js.map +2 -2
- package/dist/telemetry/resilient-exporter.js +22 -8
- package/dist/telemetry/resilient-exporter.js.map +2 -2
- package/dist/telemetry/resilient-log-exporter.js +17 -8
- package/dist/telemetry/resilient-log-exporter.js.map +2 -2
- package/dist/telemetry/test-instrumentation.js.map +2 -2
- package/dist/types/index.js +84 -0
- package/dist/types/index.js.map +3 -3
- package/dist/types/source-reference.js +1 -0
- package/dist/types/source-reference.js.map +7 -0
- package/dist/utils/chat-logger.js +292 -0
- package/dist/utils/chat-logger.js.map +7 -0
- package/dist/utils/claude-stream.js +8 -0
- package/dist/utils/claude-stream.js.map +7 -0
- package/dist/utils/date-utils.js +7 -0
- package/dist/utils/date-utils.js.map +7 -0
- package/dist/utils/element-utils.js.map +1 -1
- package/dist/utils/errors.js +88 -15
- package/dist/utils/errors.js.map +3 -3
- package/dist/utils/export-python-annotations.js +82 -0
- package/dist/utils/export-python-annotations.js.map +7 -0
- package/dist/utils/file-io.js +7 -2
- package/dist/utils/file-io.js.map +2 -2
- package/dist/utils/file-lock.js +156 -0
- package/dist/utils/file-lock.js.map +7 -0
- package/dist/utils/id-generator.js +18 -0
- package/dist/utils/id-generator.js.map +7 -0
- package/dist/utils/layer-name-formatter.js +16 -0
- package/dist/utils/layer-name-formatter.js.map +7 -0
- package/dist/utils/markdown-anchor.js +7 -0
- package/dist/utils/markdown-anchor.js.map +7 -0
- package/dist/utils/markdown-link.js +12 -0
- package/dist/utils/markdown-link.js.map +7 -0
- package/dist/utils/markdown-table.js +17 -0
- package/dist/utils/markdown-table.js.map +7 -0
- package/dist/utils/mermaid-utils.js +11 -0
- package/dist/utils/mermaid-utils.js.map +7 -0
- package/dist/utils/project-paths.js.map +2 -2
- package/dist/utils/source-reference.js +52 -0
- package/dist/utils/source-reference.js.map +7 -0
- package/dist/utils/spec-installer.js +40 -53
- package/dist/utils/spec-installer.js.map +2 -2
- package/dist/utils/spec-version.js +5 -1
- package/dist/utils/spec-version.js.map +2 -2
- package/dist/utils/string-utils.js +12 -0
- package/dist/utils/string-utils.js.map +7 -0
- package/dist/utils/table-formatting.js +19 -0
- package/dist/utils/table-formatting.js.map +7 -0
- package/dist/validators/index.js +4 -0
- package/dist/validators/index.js.map +2 -2
- package/dist/validators/naming-validator.js +20 -23
- package/dist/validators/naming-validator.js.map +2 -2
- package/dist/validators/reference-validator.js +23 -38
- package/dist/validators/reference-validator.js.map +2 -2
- package/dist/validators/relationship-schema-validator.js +243 -0
- package/dist/validators/relationship-schema-validator.js.map +7 -0
- package/dist/validators/schema-validator.js +168 -68
- package/dist/validators/schema-validator.js.map +2 -2
- package/dist/validators/semantic-validator.js +36 -60
- package/dist/validators/semantic-validator.js.map +2 -2
- package/dist/validators/types.js.map +2 -2
- package/dist/validators/validation-formatter.js +159 -0
- package/dist/validators/validation-formatter.js.map +7 -0
- package/dist/validators/validator.js +24 -38
- package/dist/validators/validator.js.map +2 -2
- package/dist/viewer/README.md +139 -0
- package/dist/viewer/assets/main-CY0Xufuj.css +1 -0
- package/dist/viewer/assets/main-DtgErnwF.js +81 -0
- package/dist/viewer/assets/vendor-CxKvDp2x.js +17 -0
- package/dist/viewer/favicon.svg +11 -0
- package/dist/viewer/fonts/inter/Inter-Black.woff2 +0 -0
- package/dist/viewer/fonts/inter/Inter-Bold.woff2 +0 -0
- package/dist/viewer/fonts/inter/Inter-ExtraBold.woff2 +0 -0
- package/dist/viewer/fonts/inter/Inter-Light.woff2 +0 -0
- package/dist/viewer/fonts/inter/Inter-Medium.woff2 +0 -0
- package/dist/viewer/fonts/inter/Inter-Regular.woff2 +0 -0
- package/dist/viewer/fonts/inter/Inter-SemiBold.woff2 +0 -0
- package/dist/viewer/fonts/jetbrains-mono/JetBrainsMono-Medium.woff2 +0 -0
- package/dist/viewer/fonts/jetbrains-mono/JetBrainsMono-Regular.woff2 +0 -0
- package/dist/viewer/fonts/jetbrains-mono/JetBrainsMono-SemiBold.woff2 +0 -0
- package/dist/viewer/index.html +15 -0
- package/dist/viewer/manifest.json +99 -0
- package/dist/viewer/version.json +1 -0
- package/package.json +37 -13
- package/PYTHON_CLI_PARITY.md +0 -265
- package/PYTHON_CLI_STRUCTURE_UPDATE.md +0 -246
- package/biome.json +0 -42
- package/bunfig.toml +0 -3
- package/dist/ai/claude-client.js +0 -71
- package/dist/ai/claude-client.js.map +0 -7
- package/dist/ai/context-provider.js +0 -129
- package/dist/ai/context-provider.js.map +0 -7
- package/dist/ai/tools.js +0 -231
- package/dist/ai/tools.js.map +0 -7
- package/dist/commands/migrate.js +0 -36
- package/dist/commands/migrate.js.map +0 -7
- package/dist/commands/project.js +0 -74
- package/dist/commands/project.js.map +0 -7
- package/dist/core/active-changeset.js +0 -52
- package/dist/core/active-changeset.js.map +0 -7
- package/dist/core/projection-engine.js +0 -288
- package/dist/core/projection-engine.js.map +0 -7
- package/dist/schemas/bundled/01-motivation-layer.schema.json +0 -942
- package/dist/schemas/bundled/02-business-layer.schema.json +0 -1293
- package/dist/schemas/bundled/03-security-layer.schema.json +0 -2177
- package/dist/schemas/bundled/04-application-layer.schema.json +0 -1328
- package/dist/schemas/bundled/05-technology-layer.schema.json +0 -1465
- package/dist/schemas/bundled/06-api-layer.schema.json +0 -1743
- package/dist/schemas/bundled/07-data-model-layer.schema.json +0 -1253
- package/dist/schemas/bundled/08-datastore-layer.schema.json +0 -892
- package/dist/schemas/bundled/09-ux-layer.schema.json +0 -1506
- package/dist/schemas/bundled/10-navigation-layer.schema.json +0 -843
- package/dist/schemas/bundled/11-apm-observability-layer.schema.json +0 -1430
- package/dist/schemas/bundled/12-testing-layer.schema.json +0 -1091
- package/dist/schemas/bundled/common/layer-extensions.schema.json +0 -266
- package/dist/schemas/bundled/common/predicates.schema.json +0 -493
- package/dist/schemas/bundled/common/relationships.schema.json +0 -791
- package/dist/schemas/bundled/common/source-references.schema.json +0 -71
- package/dist/schemas/bundled/link-registry.json +0 -1839
- package/dist/schemas/bundled/link-registry.schema.json +0 -339
- package/dist/schemas/bundled/relationship-catalog.json +0 -1302
- package/dist/schemas/bundled/relationship-type.schema.json +0 -221
- package/dist/utils/model-path.js +0 -22
- package/dist/utils/model-path.js.map +0 -7
- package/docs/TEST-INSTRUMENTATION.md +0 -405
- package/docs/telemetry.md +0 -427
- package/test-debug.js +0 -33
- package/test-special.mjs +0 -46
- package/test_runner.ts +0 -7
|
@@ -0,0 +1,511 @@
|
|
|
1
|
+
import { intro, outro, select, isCancel } from "@clack/prompts";
|
|
2
|
+
import ansis from "ansis";
|
|
3
|
+
import { promises as fs } from "fs";
|
|
4
|
+
import * as path from "path";
|
|
5
|
+
import { AnalyzerRegistry } from "../analyzers/registry.js";
|
|
6
|
+
import { MappingLoader } from "../analyzers/mapping-loader.js";
|
|
7
|
+
import { readSession, writeSession, writeStatus, readIndexMeta } from "../analyzers/session-state.js";
|
|
8
|
+
import { CLIError, ModelNotFoundError, ErrorCategory, categorizeError } from "../utils/errors.js";
|
|
9
|
+
import { findProjectRoot } from "../utils/project-paths.js";
|
|
10
|
+
import { performDiscover } from "./discover-logic.js";
|
|
11
|
+
import { formatVerifyReport } from "../export/verify-formatters.js";
|
|
12
|
+
function analyzerCommands(program) {
|
|
13
|
+
const analyzer = program.command("analyzer").description("Manage analyzer discovery and indexing");
|
|
14
|
+
analyzer.command("discover").description("Discover and select an analyzer").option("--json", "Output as JSON").option("--reselect", "Force re-selection even if analyzer already selected").addHelpText("after", `
|
|
15
|
+
Examples:
|
|
16
|
+
$ dr analyzer discover # Scan and select analyzer
|
|
17
|
+
$ dr analyzer discover --reselect # Force re-selection
|
|
18
|
+
$ dr analyzer discover --json # Output discovery results as JSON`).action(async (options) => {
|
|
19
|
+
try {
|
|
20
|
+
const projectRoot = await findProjectRoot() || process.cwd(), registry = AnalyzerRegistry.getInstance();
|
|
21
|
+
if (await registry.initialize(), !options.reselect) {
|
|
22
|
+
const session = await readSession(projectRoot);
|
|
23
|
+
if (session)
|
|
24
|
+
if (options.json) {
|
|
25
|
+
const analyzerNames = await registry.getAnalyzerNames(), analyzerOptions2 = [];
|
|
26
|
+
for (const name of analyzerNames)
|
|
27
|
+
try {
|
|
28
|
+
const backend = await registry.getAnalyzer(name);
|
|
29
|
+
if (!backend)
|
|
30
|
+
continue;
|
|
31
|
+
const detection = await backend.detect(), metadata = (await MappingLoader.load(name)).getAnalyzerMetadata();
|
|
32
|
+
analyzerOptions2.push({ backend, detection, metadata });
|
|
33
|
+
} catch (error) {
|
|
34
|
+
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
35
|
+
console.error(`Failed to discover analyzer "${name}": ${errorMsg}`);
|
|
36
|
+
}
|
|
37
|
+
const installed2 = analyzerOptions2.filter((a) => a.detection.installed), discoveryResult2 = {
|
|
38
|
+
found: analyzerOptions2.map((a) => ({
|
|
39
|
+
name: a.backend.name,
|
|
40
|
+
display_name: a.backend.displayName,
|
|
41
|
+
description: a.metadata?.description || "",
|
|
42
|
+
homepage: a.metadata?.homepage || "",
|
|
43
|
+
installed: a.detection.installed
|
|
44
|
+
})),
|
|
45
|
+
installed_count: installed2.length,
|
|
46
|
+
selected: session.active_analyzer
|
|
47
|
+
};
|
|
48
|
+
console.log(JSON.stringify(discoveryResult2, null, 2));
|
|
49
|
+
return;
|
|
50
|
+
} else {
|
|
51
|
+
console.log(ansis.green(`\u2713 Using analyzer: ${session.active_analyzer} (use --reselect to change)`));
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
const discoverResult = await performDiscover(registry, {
|
|
56
|
+
json: options.json,
|
|
57
|
+
reselect: options.reselect,
|
|
58
|
+
isTTY: process.stdin.isTTY
|
|
59
|
+
}), { discoveryResult, installed, analyzerOptions, selectedAnalyzer, shouldWriteSession } = discoverResult;
|
|
60
|
+
if (options.json) {
|
|
61
|
+
if (selectedAnalyzer && shouldWriteSession) {
|
|
62
|
+
const state = {
|
|
63
|
+
active_analyzer: selectedAnalyzer,
|
|
64
|
+
selected_at: (/* @__PURE__ */ new Date()).toISOString()
|
|
65
|
+
};
|
|
66
|
+
await writeSession(state, projectRoot), discoveryResult.selected = selectedAnalyzer;
|
|
67
|
+
}
|
|
68
|
+
console.log(JSON.stringify(discoveryResult, null, 2));
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
if (installed.length === 0) {
|
|
72
|
+
intro(ansis.blue("\u{1F4CA} Analyzer Discovery")), console.log(""), console.log(ansis.yellow("No analyzers installed. Install one of the following:")), console.log("");
|
|
73
|
+
for (const opt of analyzerOptions) {
|
|
74
|
+
const name = ansis.bold(opt.backend.displayName), homepage = opt.metadata?.homepage || "(homepage not available)";
|
|
75
|
+
console.log(` ${name} ${ansis.dim(`(${homepage})`)}`);
|
|
76
|
+
}
|
|
77
|
+
console.log(""), outro(ansis.dim("To install: follow the links above or use your package manager"));
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
if (intro(ansis.blue("\u{1F4CA} Analyzer Selection")), process.stdin.isTTY) {
|
|
81
|
+
const selectedName = await select({
|
|
82
|
+
message: "Select an analyzer",
|
|
83
|
+
options: installed.map((a) => ({
|
|
84
|
+
value: a.backend.name,
|
|
85
|
+
label: a.backend.displayName,
|
|
86
|
+
hint: a.metadata?.description || ""
|
|
87
|
+
}))
|
|
88
|
+
});
|
|
89
|
+
if (isCancel(selectedName)) {
|
|
90
|
+
outro(ansis.dim("Cancelled"));
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
const state = {
|
|
94
|
+
active_analyzer: selectedName,
|
|
95
|
+
selected_at: (/* @__PURE__ */ new Date()).toISOString()
|
|
96
|
+
};
|
|
97
|
+
await writeSession(state, projectRoot), outro(ansis.green(`\u2713 Selected analyzer: ${selectedName} (saved to .dr/analyzers/session.json)`));
|
|
98
|
+
} else if (selectedAnalyzer) {
|
|
99
|
+
const state = {
|
|
100
|
+
active_analyzer: selectedAnalyzer,
|
|
101
|
+
selected_at: (/* @__PURE__ */ new Date()).toISOString()
|
|
102
|
+
};
|
|
103
|
+
await writeSession(state, projectRoot), console.log(ansis.green(`\u2713 Selected analyzer: ${selectedAnalyzer} (non-interactive mode)`)), outro(ansis.dim("Saved to .dr/analyzers/session.json"));
|
|
104
|
+
}
|
|
105
|
+
} catch (error) {
|
|
106
|
+
if (error instanceof CLIError)
|
|
107
|
+
throw error;
|
|
108
|
+
const category = categorizeError(error), cliError = new CLIError(error instanceof Error ? error.message : String(error), category);
|
|
109
|
+
throw error instanceof Error && (cliError.cause = error), cliError;
|
|
110
|
+
}
|
|
111
|
+
}), analyzer.command("status").description("Check analyzer detection and project index status").option("--name <n>", "Analyzer name (defaults to active from session.json)").option("--json", "Output as JSON").addHelpText("after", `
|
|
112
|
+
Examples:
|
|
113
|
+
$ dr analyzer status # Show status of active analyzer
|
|
114
|
+
$ dr analyzer status --name cbm # Show status of specific analyzer
|
|
115
|
+
$ dr analyzer status --json # Output as JSON`).action(async (options) => {
|
|
116
|
+
try {
|
|
117
|
+
const projectRoot = await findProjectRoot() || process.cwd();
|
|
118
|
+
let analyzerName = options.name;
|
|
119
|
+
if (!analyzerName) {
|
|
120
|
+
const session = await readSession(projectRoot);
|
|
121
|
+
if (!session)
|
|
122
|
+
throw new CLIError("No analyzer selected. Run `dr analyzer discover` first.", ErrorCategory.USER);
|
|
123
|
+
analyzerName = session.active_analyzer;
|
|
124
|
+
}
|
|
125
|
+
const registry = AnalyzerRegistry.getInstance();
|
|
126
|
+
await registry.initialize();
|
|
127
|
+
const backend = await registry.getAnalyzer(analyzerName);
|
|
128
|
+
if (!backend)
|
|
129
|
+
throw new CLIError(`Analyzer not found: ${analyzerName}`, ErrorCategory.NOT_FOUND, ["Check the analyzer name with `dr analyzer discover`"]);
|
|
130
|
+
const actualProjectRoot = await findProjectRoot();
|
|
131
|
+
let status;
|
|
132
|
+
if (actualProjectRoot ? status = await backend.status(actualProjectRoot) : status = {
|
|
133
|
+
detected: await backend.detect(),
|
|
134
|
+
indexed: !1,
|
|
135
|
+
fresh: !1
|
|
136
|
+
}, options.json) {
|
|
137
|
+
console.log(JSON.stringify(status, null, 2)), actualProjectRoot && await writeStatus(status, actualProjectRoot, analyzerName);
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
console.log(""), console.log(ansis.bold("Analyzer Status")), console.log(ansis.dim("\u2500".repeat(40))), console.log(`Installed: ${status.detected.installed ? ansis.green("\u2713 Yes") : ansis.red("\u2717 No")}`), status.detected.binary_path && console.log(`Binary: ${ansis.dim(status.detected.binary_path)}`), status.detected.version && console.log(`Version: ${ansis.dim(status.detected.version)}`), status.detected.installed && (console.log(`MCP Registered: ${status.detected.mcp_registered ? ansis.green("\u2713 Yes") : ansis.yellow("\u2717 No")}`), console.log(`Contract Valid: ${status.detected.contract_ok ? ansis.green("\u2713 Yes") : ansis.yellow("\u2717 No")}`)), actualProjectRoot && (console.log(`Indexed: ${status.indexed ? ansis.green("\u2713 Yes") : ansis.yellow("\u2717 No")}`), status.indexed ? (console.log(`Fresh: ${status.fresh ? ansis.green("\u2713 Yes") : ansis.yellow("\u2717 No (use --force to reindex)")}`), status.last_indexed && console.log(`Last indexed: ${ansis.dim(status.last_indexed)}`)) : console.log(ansis.dim("Run `dr analyzer index` to index the project"))), console.log(""), actualProjectRoot && await writeStatus(status, actualProjectRoot, analyzerName);
|
|
141
|
+
} catch (error) {
|
|
142
|
+
if (error instanceof CLIError)
|
|
143
|
+
throw error;
|
|
144
|
+
const category = categorizeError(error), cliError = new CLIError(error instanceof Error ? error.message : String(error), category);
|
|
145
|
+
throw error instanceof Error && (cliError.cause = error), cliError;
|
|
146
|
+
}
|
|
147
|
+
}), analyzer.command("index").description("Index the current project with the analyzer").option("--name <n>", "Analyzer name (defaults to active from session.json)").option("--force", "Force re-indexing even if index is fresh").addHelpText("after", `
|
|
148
|
+
Examples:
|
|
149
|
+
$ dr analyzer index # Index with active analyzer
|
|
150
|
+
$ dr analyzer index --force # Force re-index
|
|
151
|
+
$ dr analyzer index --name cbm # Index with specific analyzer`).action(async (options) => {
|
|
152
|
+
try {
|
|
153
|
+
const projectRoot = await findProjectRoot();
|
|
154
|
+
if (!projectRoot)
|
|
155
|
+
throw new ModelNotFoundError();
|
|
156
|
+
let analyzerName = options.name;
|
|
157
|
+
if (!analyzerName) {
|
|
158
|
+
const session = await readSession(projectRoot);
|
|
159
|
+
if (!session)
|
|
160
|
+
throw new CLIError("No analyzer selected. Run `dr analyzer discover` first.", ErrorCategory.USER);
|
|
161
|
+
analyzerName = session.active_analyzer;
|
|
162
|
+
}
|
|
163
|
+
const registry = AnalyzerRegistry.getInstance();
|
|
164
|
+
await registry.initialize();
|
|
165
|
+
const backend = await registry.getAnalyzer(analyzerName);
|
|
166
|
+
if (!backend)
|
|
167
|
+
throw new CLIError(`Analyzer not found: ${analyzerName}`, ErrorCategory.NOT_FOUND, ["Check the analyzer name with `dr analyzer discover`"]);
|
|
168
|
+
if (!(await backend.detect()).installed) {
|
|
169
|
+
const homepageUrl = (await MappingLoader.load(analyzerName)).getAnalyzerMetadata()?.homepage || "https://github.com/search?q=codebase-memory";
|
|
170
|
+
throw new CLIError(`Analyzer not installed: ${analyzerName}`, ErrorCategory.USER, [
|
|
171
|
+
"Run `dr analyzer discover` to find available analyzers and installation instructions",
|
|
172
|
+
`Visit: ${homepageUrl}`
|
|
173
|
+
]);
|
|
174
|
+
}
|
|
175
|
+
console.log(`Indexing project with ${analyzerName}...`);
|
|
176
|
+
const result = await backend.index(projectRoot, { force: options.force });
|
|
177
|
+
console.log(ansis.green("\u2713 Indexing complete")), console.log(` Nodes: ${result.node_count}`), console.log(` Edges: ${result.edge_count}`), console.log(` Git HEAD: ${result.git_head}`);
|
|
178
|
+
} catch (error) {
|
|
179
|
+
if (error instanceof CLIError || error instanceof ModelNotFoundError)
|
|
180
|
+
throw error;
|
|
181
|
+
const cliError = new CLIError(error instanceof Error ? error.message : String(error), ErrorCategory.SYSTEM);
|
|
182
|
+
throw error instanceof Error && (cliError.cause = error), cliError;
|
|
183
|
+
}
|
|
184
|
+
}), analyzer.command("endpoints").description("List discovered API endpoints from indexed project").option("--name <n>", "Analyzer name (defaults to active from session.json)").option("--json", "Output as JSON").addHelpText("after", `
|
|
185
|
+
Examples:
|
|
186
|
+
$ dr analyzer endpoints # List endpoints from active analyzer
|
|
187
|
+
$ dr analyzer endpoints --json # Output as JSON
|
|
188
|
+
$ dr analyzer endpoints --name cbm # List endpoints from specific analyzer`).action(async (options) => {
|
|
189
|
+
try {
|
|
190
|
+
const projectRoot = await findProjectRoot();
|
|
191
|
+
if (!projectRoot)
|
|
192
|
+
throw new ModelNotFoundError();
|
|
193
|
+
let analyzerName = options.name;
|
|
194
|
+
if (!analyzerName) {
|
|
195
|
+
const session = await readSession(projectRoot);
|
|
196
|
+
if (!session)
|
|
197
|
+
throw new CLIError("No analyzer selected. Run `dr analyzer discover` first.", ErrorCategory.USER);
|
|
198
|
+
analyzerName = session.active_analyzer;
|
|
199
|
+
}
|
|
200
|
+
const registry = AnalyzerRegistry.getInstance();
|
|
201
|
+
await registry.initialize();
|
|
202
|
+
const backend = await registry.getAnalyzer(analyzerName);
|
|
203
|
+
if (!backend)
|
|
204
|
+
throw new CLIError(`Analyzer not found: ${analyzerName}`, ErrorCategory.NOT_FOUND);
|
|
205
|
+
if (!(await backend.status(projectRoot)).indexed)
|
|
206
|
+
throw new CLIError("Project not indexed", ErrorCategory.USER, ["Run `dr analyzer index` to index the project first"]);
|
|
207
|
+
const endpoints = await backend.endpoints(projectRoot);
|
|
208
|
+
if (options.json) {
|
|
209
|
+
console.log(JSON.stringify(endpoints, null, 2));
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
if (endpoints.length === 0) {
|
|
213
|
+
console.log(ansis.yellow("No endpoints found"));
|
|
214
|
+
return;
|
|
215
|
+
}
|
|
216
|
+
console.log(""), console.log(ansis.bold(`API Endpoints (${endpoints.length} found):`)), console.log(ansis.dim("\u2500".repeat(135)));
|
|
217
|
+
const methodWidth = 8, pathWidth = 20, nameWidth = 18, idFragmentWidth = 18, symbolWidth = 18, confidenceWidth = 12, fileWidth = 25;
|
|
218
|
+
console.log(ansis.cyan(`${"Method".padEnd(methodWidth)} ${"Path".padEnd(pathWidth)} ${"Name".padEnd(nameWidth)} ${"ID Fragment".padEnd(idFragmentWidth)} ${"Symbol".padEnd(symbolWidth)} ${"Confidence".padEnd(confidenceWidth)} File`)), console.log(ansis.dim("\u2500".repeat(135)));
|
|
219
|
+
for (const endpoint of endpoints) {
|
|
220
|
+
const method = endpoint.http_method.padEnd(methodWidth), path2 = endpoint.http_path.substring(0, pathWidth).padEnd(pathWidth), name = endpoint.suggested_name.substring(0, nameWidth).padEnd(nameWidth), idFragment = endpoint.suggested_id_fragment.substring(0, idFragmentWidth).padEnd(idFragmentWidth), symbol = endpoint.source_symbol.substring(0, symbolWidth).padEnd(symbolWidth), confidence = endpoint.confidence.toUpperCase().padEnd(confidenceWidth), file = endpoint.source_file.substring(0, fileWidth);
|
|
221
|
+
console.log(`${method} ${path2} ${name} ${idFragment} ${symbol} ${confidence} ${ansis.dim(file)}`);
|
|
222
|
+
}
|
|
223
|
+
console.log(ansis.dim("\u2500".repeat(135))), console.log(ansis.dim(`Total: ${endpoints.length} endpoint(s)`)), console.log("");
|
|
224
|
+
} catch (error) {
|
|
225
|
+
if (error instanceof CLIError || error instanceof ModelNotFoundError)
|
|
226
|
+
throw error;
|
|
227
|
+
const cliError = new CLIError(error instanceof Error ? error.message : String(error), categorizeError(error));
|
|
228
|
+
throw error instanceof Error && (cliError.cause = error), cliError;
|
|
229
|
+
}
|
|
230
|
+
}), analyzer.command("services").description("Query for services/components in the indexed project").option("--name <n>", "Analyzer name (defaults to active from session.json)").option("--layer <layer>", "Filter by layer (e.g., 'application')").option("--json", "Output as JSON").addHelpText("after", `
|
|
231
|
+
Examples:
|
|
232
|
+
$ dr analyzer services # List all services
|
|
233
|
+
$ dr analyzer services --layer application
|
|
234
|
+
$ dr analyzer services --json # Output as JSON`).action(async (options) => {
|
|
235
|
+
try {
|
|
236
|
+
const projectRoot = await findProjectRoot();
|
|
237
|
+
if (!projectRoot)
|
|
238
|
+
throw new ModelNotFoundError();
|
|
239
|
+
let analyzerName = options.name;
|
|
240
|
+
if (!analyzerName) {
|
|
241
|
+
const session = await readSession(projectRoot);
|
|
242
|
+
if (!session)
|
|
243
|
+
throw new CLIError("No analyzer selected. Run `dr analyzer discover` first.", ErrorCategory.USER);
|
|
244
|
+
analyzerName = session.active_analyzer;
|
|
245
|
+
}
|
|
246
|
+
const registry = AnalyzerRegistry.getInstance();
|
|
247
|
+
await registry.initialize();
|
|
248
|
+
const backend = await registry.getAnalyzer(analyzerName);
|
|
249
|
+
if (!backend)
|
|
250
|
+
throw new CLIError(`Analyzer not found: ${analyzerName}`, ErrorCategory.NOT_FOUND);
|
|
251
|
+
if (!await readIndexMeta(projectRoot, analyzerName))
|
|
252
|
+
throw new CLIError("Project not indexed", ErrorCategory.USER, ["Run `dr analyzer index` first"]);
|
|
253
|
+
let services = await backend.services(projectRoot);
|
|
254
|
+
if (options.layer && (services = services.filter((s) => s.suggested_layer === options.layer)), options.json) {
|
|
255
|
+
console.log(JSON.stringify(services, null, 2));
|
|
256
|
+
return;
|
|
257
|
+
}
|
|
258
|
+
if (services.length === 0) {
|
|
259
|
+
console.log(ansis.yellow("No services found"));
|
|
260
|
+
return;
|
|
261
|
+
}
|
|
262
|
+
console.log(""), console.log(ansis.bold(`Services (${services.length} found):`)), console.log(ansis.dim("\u2500".repeat(120)));
|
|
263
|
+
const nameWidth = 20, layerWidth = 15, typeWidth = 18, symbolWidth = 20, confidenceWidth = 12, fileWidth = 25;
|
|
264
|
+
console.log(ansis.cyan(`${"Name".padEnd(nameWidth)} ${"Layer".padEnd(layerWidth)} ${"Type".padEnd(typeWidth)} ${"Symbol".padEnd(symbolWidth)} ${"Confidence".padEnd(confidenceWidth)} File`)), console.log(ansis.dim("\u2500".repeat(120)));
|
|
265
|
+
for (const service of services) {
|
|
266
|
+
const name = service.suggested_name.substring(0, nameWidth).padEnd(nameWidth), layer = service.suggested_layer.substring(0, layerWidth).padEnd(layerWidth), type = service.suggested_element_type.substring(0, typeWidth).padEnd(typeWidth), symbol = service.source_symbol.substring(0, symbolWidth).padEnd(symbolWidth), confidence = service.confidence.toUpperCase().padEnd(confidenceWidth), file = service.source_file.substring(0, fileWidth);
|
|
267
|
+
console.log(`${name} ${layer} ${type} ${symbol} ${confidence} ${ansis.dim(file)}`);
|
|
268
|
+
}
|
|
269
|
+
console.log(ansis.dim("\u2500".repeat(120))), console.log(ansis.dim(`Total: ${services.length} service(s)`)), console.log("");
|
|
270
|
+
} catch (error) {
|
|
271
|
+
if (error instanceof CLIError || error instanceof ModelNotFoundError)
|
|
272
|
+
throw error;
|
|
273
|
+
const cliError = new CLIError(error instanceof Error ? error.message : String(error), categorizeError(error));
|
|
274
|
+
throw error instanceof Error && (cliError.cause = error), cliError;
|
|
275
|
+
}
|
|
276
|
+
}), analyzer.command("datastores").description("Query for datastores/databases inferred from code analysis").option("--name <n>", "Analyzer name (defaults to active from session.json)").option("--json", "Output as JSON").addHelpText("after", `
|
|
277
|
+
Examples:
|
|
278
|
+
$ dr analyzer datastores # List all inferred datastores
|
|
279
|
+
$ dr analyzer datastores --json # Output as JSON`).action(async (options) => {
|
|
280
|
+
try {
|
|
281
|
+
const projectRoot = await findProjectRoot();
|
|
282
|
+
if (!projectRoot)
|
|
283
|
+
throw new ModelNotFoundError();
|
|
284
|
+
let analyzerName = options.name;
|
|
285
|
+
if (!analyzerName) {
|
|
286
|
+
const session = await readSession(projectRoot);
|
|
287
|
+
if (!session)
|
|
288
|
+
throw new CLIError("No analyzer selected. Run `dr analyzer discover` first.", ErrorCategory.USER);
|
|
289
|
+
analyzerName = session.active_analyzer;
|
|
290
|
+
}
|
|
291
|
+
const registry = AnalyzerRegistry.getInstance();
|
|
292
|
+
await registry.initialize();
|
|
293
|
+
const backend = await registry.getAnalyzer(analyzerName);
|
|
294
|
+
if (!backend)
|
|
295
|
+
throw new CLIError(`Analyzer not found: ${analyzerName}`, ErrorCategory.NOT_FOUND);
|
|
296
|
+
if (!await readIndexMeta(projectRoot, analyzerName))
|
|
297
|
+
throw new CLIError("Project not indexed", ErrorCategory.USER, ["Run `dr analyzer index` first"]);
|
|
298
|
+
const datastores = await backend.datastores(projectRoot);
|
|
299
|
+
if (options.json) {
|
|
300
|
+
console.log(JSON.stringify(datastores, null, 2));
|
|
301
|
+
return;
|
|
302
|
+
}
|
|
303
|
+
if (datastores.length === 0) {
|
|
304
|
+
console.log(ansis.yellow("No datastores found"));
|
|
305
|
+
return;
|
|
306
|
+
}
|
|
307
|
+
console.log(""), console.log(ansis.bold(`Datastores (${datastores.length} found):`)), console.log(ansis.dim("\u2500".repeat(100)));
|
|
308
|
+
for (const ds of datastores) {
|
|
309
|
+
console.log(` ${ansis.cyan(ds.suggested_name)}`), console.log(" Inferred from:");
|
|
310
|
+
for (const evidence of ds.inferred_from)
|
|
311
|
+
console.log(` - ${evidence.source_file}: ${evidence.import_pattern}`);
|
|
312
|
+
ds.notes && console.log(` Notes: ${ds.notes}`), console.log("");
|
|
313
|
+
}
|
|
314
|
+
console.log(ansis.dim(`Total: ${datastores.length} datastore(s)`)), console.log("");
|
|
315
|
+
} catch (error) {
|
|
316
|
+
if (error instanceof CLIError || error instanceof ModelNotFoundError)
|
|
317
|
+
throw error;
|
|
318
|
+
const cliError = new CLIError(error instanceof Error ? error.message : String(error), categorizeError(error));
|
|
319
|
+
throw error instanceof Error && (cliError.cause = error), cliError;
|
|
320
|
+
}
|
|
321
|
+
}), analyzer.command("callers <qualified-name>").description("Query for callers of a specific function or symbol").option("--name <n>", "Analyzer name (defaults to active from session.json)").option("--depth <n>", "Maximum depth for call graph traversal (default: 3, max: 10)", "3").option("--json", "Output as JSON").addHelpText("after", `
|
|
322
|
+
Examples:
|
|
323
|
+
$ dr analyzer callers com.example.Service.handleRequest
|
|
324
|
+
$ dr analyzer callers com.example.Service.handleRequest --depth 5
|
|
325
|
+
$ dr analyzer callers com.example.Service.handleRequest --json`).action(async (qualifiedName, options) => {
|
|
326
|
+
try {
|
|
327
|
+
const depth = parseInt(options.depth, 10);
|
|
328
|
+
if (isNaN(depth) || depth < 1)
|
|
329
|
+
throw new CLIError("Invalid --depth value: must be a positive integer", ErrorCategory.USER);
|
|
330
|
+
const projectRoot = await findProjectRoot();
|
|
331
|
+
if (!projectRoot)
|
|
332
|
+
throw new ModelNotFoundError();
|
|
333
|
+
let analyzerName = options.name;
|
|
334
|
+
if (!analyzerName) {
|
|
335
|
+
const session = await readSession(projectRoot);
|
|
336
|
+
if (!session)
|
|
337
|
+
throw new CLIError("No analyzer selected. Run `dr analyzer discover` first.", ErrorCategory.USER);
|
|
338
|
+
analyzerName = session.active_analyzer;
|
|
339
|
+
}
|
|
340
|
+
const registry = AnalyzerRegistry.getInstance();
|
|
341
|
+
await registry.initialize();
|
|
342
|
+
const backend = await registry.getAnalyzer(analyzerName);
|
|
343
|
+
if (!backend)
|
|
344
|
+
throw new CLIError(`Analyzer not found: ${analyzerName}`, ErrorCategory.NOT_FOUND);
|
|
345
|
+
if (!await readIndexMeta(projectRoot, analyzerName))
|
|
346
|
+
throw new CLIError("Project not indexed", ErrorCategory.USER, ["Run `dr analyzer index` first"]);
|
|
347
|
+
const callers = await backend.callers(projectRoot, qualifiedName, depth);
|
|
348
|
+
if (options.json) {
|
|
349
|
+
console.log(JSON.stringify(callers, null, 2));
|
|
350
|
+
return;
|
|
351
|
+
}
|
|
352
|
+
if (callers.length === 0) {
|
|
353
|
+
console.log(ansis.yellow(`No callers found for ${qualifiedName}`));
|
|
354
|
+
return;
|
|
355
|
+
}
|
|
356
|
+
console.log(""), console.log(ansis.bold(`Callers of ${ansis.cyan(qualifiedName)} (${callers.length} found):`)), console.log(ansis.dim("\u2500".repeat(100)));
|
|
357
|
+
for (const caller of callers)
|
|
358
|
+
console.log(` ${ansis.bold(caller.qualified_name)}`), console.log(` File: ${caller.source_file}`), console.log(` Symbol: ${caller.source_symbol}`), console.log(` Depth: ${caller.depth}`), console.log(` Edge: ${caller.edge_type}`), console.log("");
|
|
359
|
+
console.log(ansis.dim(`Total: ${callers.length} caller(s)`)), console.log("");
|
|
360
|
+
} catch (error) {
|
|
361
|
+
if (error instanceof CLIError || error instanceof ModelNotFoundError)
|
|
362
|
+
throw error;
|
|
363
|
+
const cliError = new CLIError(error instanceof Error ? error.message : String(error), categorizeError(error));
|
|
364
|
+
throw error instanceof Error && (cliError.cause = error), cliError;
|
|
365
|
+
}
|
|
366
|
+
}), analyzer.command("callees <qualified-name>").description("Query for callees of a specific function or symbol").option("--name <n>", "Analyzer name (defaults to active from session.json)").option("--depth <n>", "Maximum depth for call graph traversal (default: 3, max: 10)", "3").option("--json", "Output as JSON").addHelpText("after", `
|
|
367
|
+
Examples:
|
|
368
|
+
$ dr analyzer callees com.example.Service.handleRequest
|
|
369
|
+
$ dr analyzer callees com.example.Service.handleRequest --depth 5
|
|
370
|
+
$ dr analyzer callees com.example.Service.handleRequest --json`).action(async (qualifiedName, options) => {
|
|
371
|
+
try {
|
|
372
|
+
const depth = parseInt(options.depth, 10);
|
|
373
|
+
if (isNaN(depth) || depth < 1)
|
|
374
|
+
throw new CLIError("Invalid --depth value: must be a positive integer", ErrorCategory.USER);
|
|
375
|
+
const projectRoot = await findProjectRoot();
|
|
376
|
+
if (!projectRoot)
|
|
377
|
+
throw new ModelNotFoundError();
|
|
378
|
+
let analyzerName = options.name;
|
|
379
|
+
if (!analyzerName) {
|
|
380
|
+
const session = await readSession(projectRoot);
|
|
381
|
+
if (!session)
|
|
382
|
+
throw new CLIError("No analyzer selected. Run `dr analyzer discover` first.", ErrorCategory.USER);
|
|
383
|
+
analyzerName = session.active_analyzer;
|
|
384
|
+
}
|
|
385
|
+
const registry = AnalyzerRegistry.getInstance();
|
|
386
|
+
await registry.initialize();
|
|
387
|
+
const backend = await registry.getAnalyzer(analyzerName);
|
|
388
|
+
if (!backend)
|
|
389
|
+
throw new CLIError(`Analyzer not found: ${analyzerName}`, ErrorCategory.NOT_FOUND);
|
|
390
|
+
if (!await readIndexMeta(projectRoot, analyzerName))
|
|
391
|
+
throw new CLIError("Project not indexed", ErrorCategory.USER, ["Run `dr analyzer index` first"]);
|
|
392
|
+
const callees = await backend.callees(projectRoot, qualifiedName, depth);
|
|
393
|
+
if (options.json) {
|
|
394
|
+
console.log(JSON.stringify(callees, null, 2));
|
|
395
|
+
return;
|
|
396
|
+
}
|
|
397
|
+
if (callees.length === 0) {
|
|
398
|
+
console.log(ansis.yellow(`No callees found for ${qualifiedName}`));
|
|
399
|
+
return;
|
|
400
|
+
}
|
|
401
|
+
console.log(""), console.log(ansis.bold(`Callees of ${ansis.cyan(qualifiedName)} (${callees.length} found):`)), console.log(ansis.dim("\u2500".repeat(100)));
|
|
402
|
+
for (const callee of callees)
|
|
403
|
+
console.log(` ${ansis.bold(callee.qualified_name)}`), console.log(` File: ${callee.source_file}`), console.log(` Symbol: ${callee.source_symbol}`), console.log(` Depth: ${callee.depth}`), console.log(` Edge: ${callee.edge_type}`), console.log("");
|
|
404
|
+
console.log(ansis.dim(`Total: ${callees.length} callee(s)`)), console.log("");
|
|
405
|
+
} catch (error) {
|
|
406
|
+
if (error instanceof CLIError || error instanceof ModelNotFoundError)
|
|
407
|
+
throw error;
|
|
408
|
+
const cliError = new CLIError(error instanceof Error ? error.message : String(error), categorizeError(error));
|
|
409
|
+
throw error instanceof Error && (cliError.cause = error), cliError;
|
|
410
|
+
}
|
|
411
|
+
}), analyzer.command("query <cypher>").description("Execute a raw Cypher query against the analyzer graph (advanced escape hatch)").option("--name <n>", "Analyzer name (defaults to active from session.json)").option("--json", "Output as JSON (default format for query results)").addHelpText("before", `Advanced Escape Hatch: This command directly executes graph queries without validation or wrapping.
|
|
412
|
+
Use for advanced analysis when standard commands don't meet your needs.
|
|
413
|
+
`).addHelpText("after", `
|
|
414
|
+
Query syntax depends on the analyzer backend (e.g., Cypher for graph analyzers).
|
|
415
|
+
Results are always output as JSON.
|
|
416
|
+
|
|
417
|
+
Examples:
|
|
418
|
+
$ dr analyzer query "MATCH (n) RETURN n LIMIT 10"
|
|
419
|
+
$ dr analyzer query "MATCH (n:Service) RETURN n.name"
|
|
420
|
+
$ dr analyzer query "MATCH (n) RETURN n LIMIT 10" --json`).action(async (cypher, options) => {
|
|
421
|
+
try {
|
|
422
|
+
const projectRoot = await findProjectRoot();
|
|
423
|
+
if (!projectRoot)
|
|
424
|
+
throw new ModelNotFoundError();
|
|
425
|
+
let analyzerName = options.name;
|
|
426
|
+
if (!analyzerName) {
|
|
427
|
+
const session = await readSession(projectRoot);
|
|
428
|
+
if (!session)
|
|
429
|
+
throw new CLIError("No analyzer selected. Run `dr analyzer discover` first.", ErrorCategory.USER);
|
|
430
|
+
analyzerName = session.active_analyzer;
|
|
431
|
+
}
|
|
432
|
+
const registry = AnalyzerRegistry.getInstance();
|
|
433
|
+
await registry.initialize();
|
|
434
|
+
const backend = await registry.getAnalyzer(analyzerName);
|
|
435
|
+
if (!backend)
|
|
436
|
+
throw new CLIError(`Analyzer not found: ${analyzerName}`, ErrorCategory.NOT_FOUND);
|
|
437
|
+
if (!await readIndexMeta(projectRoot, analyzerName))
|
|
438
|
+
throw new CLIError("Project not indexed", ErrorCategory.USER, ["Run `dr analyzer index` first"]);
|
|
439
|
+
const result = await backend.query(projectRoot, cypher);
|
|
440
|
+
options.json, console.log(JSON.stringify(result, null, 2));
|
|
441
|
+
} catch (error) {
|
|
442
|
+
if (error instanceof CLIError || error instanceof ModelNotFoundError)
|
|
443
|
+
throw error;
|
|
444
|
+
const cliError = new CLIError(error instanceof Error ? error.message : String(error), categorizeError(error));
|
|
445
|
+
throw error instanceof Error && (cliError.cause = error), cliError;
|
|
446
|
+
}
|
|
447
|
+
}), analyzer.command("verify").description("Verify that graph-discovered routes align with model endpoints").option("--name <n>", "Analyzer name (defaults to active from session.json)").option("--layer <layer>", "Layer(s) to verify (can be used multiple times)", (value, previous) => previous ? [...previous, value] : [value]).option("--json", "Output as JSON").option("--format <format>", "Output format: text, json, markdown (default: text)").option("--output <path>", "Write report to file").addHelpText("after", `
|
|
448
|
+
Examples:
|
|
449
|
+
$ dr analyzer verify # Verify api layer (default)
|
|
450
|
+
$ dr analyzer verify --layer api # Explicitly specify api layer
|
|
451
|
+
$ dr analyzer verify --json # Output as JSON to stdout
|
|
452
|
+
$ dr analyzer verify --format markdown # Output as Markdown to stdout
|
|
453
|
+
$ dr analyzer verify --output report.json # Save report to file (format inferred as JSON)
|
|
454
|
+
$ dr analyzer verify --output report.md # Save report as Markdown`).action(async (options) => {
|
|
455
|
+
try {
|
|
456
|
+
let format = "text";
|
|
457
|
+
if (options.json)
|
|
458
|
+
options.format && console.warn(ansis.yellow(`\u26A0 Both --json and --format "${options.format}" were provided. Using --json format (--format is ignored).`)), format = "json";
|
|
459
|
+
else if (options.format) {
|
|
460
|
+
const validFormats = ["text", "json", "markdown"];
|
|
461
|
+
if (!validFormats.includes(options.format))
|
|
462
|
+
throw new CLIError(`Invalid format: "${options.format}". Valid values are: ${validFormats.join(", ")}.`, ErrorCategory.USER);
|
|
463
|
+
format = options.format;
|
|
464
|
+
} else if (options.output) {
|
|
465
|
+
const ext = path.extname(options.output).toLowerCase();
|
|
466
|
+
ext === ".json" ? format = "json" : ext === ".md" ? format = "markdown" : ext && console.warn(ansis.yellow(`\u26A0 Unrecognized file extension "${ext}" in --output. Using text format by default.`));
|
|
467
|
+
}
|
|
468
|
+
const projectRoot = await findProjectRoot();
|
|
469
|
+
if (!projectRoot)
|
|
470
|
+
throw new ModelNotFoundError();
|
|
471
|
+
const requestedLayers = options.layer || ["api"], apiLayers = requestedLayers.filter((layer) => layer === "api"), nonApiLayers = requestedLayers.filter((layer) => layer !== "api");
|
|
472
|
+
for (const layer of nonApiLayers)
|
|
473
|
+
console.log(ansis.dim(`No verification available for layer '${layer}'`));
|
|
474
|
+
if (apiLayers.length === 0)
|
|
475
|
+
return;
|
|
476
|
+
let analyzerName = options.name;
|
|
477
|
+
if (!analyzerName) {
|
|
478
|
+
const session = await readSession(projectRoot);
|
|
479
|
+
if (!session)
|
|
480
|
+
throw new CLIError("No analyzer selected. Run `dr analyzer discover` first.", ErrorCategory.USER);
|
|
481
|
+
analyzerName = session.active_analyzer;
|
|
482
|
+
}
|
|
483
|
+
const registry = AnalyzerRegistry.getInstance();
|
|
484
|
+
await registry.initialize();
|
|
485
|
+
const backend = await registry.getAnalyzer(analyzerName);
|
|
486
|
+
if (!backend)
|
|
487
|
+
throw new CLIError(`Analyzer not found: ${analyzerName}`, ErrorCategory.NOT_FOUND);
|
|
488
|
+
if (!await readIndexMeta(projectRoot, analyzerName))
|
|
489
|
+
throw new CLIError("Project not indexed", ErrorCategory.USER, ["Run `dr analyzer index` first"]);
|
|
490
|
+
const report = await backend.verify(projectRoot, {
|
|
491
|
+
layers: apiLayers,
|
|
492
|
+
changesetAware: !0
|
|
493
|
+
}), formatted = formatVerifyReport(report, { format });
|
|
494
|
+
if (options.output) {
|
|
495
|
+
const outputPath = path.resolve(options.output);
|
|
496
|
+
await fs.writeFile(outputPath, formatted, "utf-8"), console.log(ansis.green(`\u2713 Report written to ${outputPath}`));
|
|
497
|
+
return;
|
|
498
|
+
}
|
|
499
|
+
console.log(formatted);
|
|
500
|
+
} catch (error) {
|
|
501
|
+
if (error instanceof CLIError || error instanceof ModelNotFoundError)
|
|
502
|
+
throw error;
|
|
503
|
+
const cliError = new CLIError(error instanceof Error ? error.message : String(error), categorizeError(error));
|
|
504
|
+
throw error instanceof Error && (cliError.cause = error), cliError;
|
|
505
|
+
}
|
|
506
|
+
});
|
|
507
|
+
}
|
|
508
|
+
export {
|
|
509
|
+
analyzerCommands
|
|
510
|
+
};
|
|
511
|
+
//# sourceMappingURL=analyzer.js.map
|