@documentation-robotics/cli 0.2.0 → 0.3.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/README.md +36 -2
- package/dist/analysis/relationship-classifier.js +2 -9
- package/dist/analysis/relationship-classifier.js.map +2 -2
- package/dist/analyzers/call-graph-utils.js +2 -2
- package/dist/analyzers/call-graph-utils.js.map +2 -2
- package/dist/analyzers/cards/build.js +171 -0
- package/dist/analyzers/cards/build.js.map +7 -0
- package/dist/analyzers/cards/classify.js +42 -0
- package/dist/analyzers/cards/classify.js.map +7 -0
- package/dist/analyzers/cards/edge-index.js +44 -0
- package/dist/analyzers/cards/edge-index.js.map +7 -0
- package/dist/analyzers/cards/facts.js +46 -0
- package/dist/analyzers/cards/facts.js.map +7 -0
- package/dist/analyzers/cards/graph.js +42 -0
- package/dist/analyzers/cards/graph.js.map +7 -0
- package/dist/analyzers/cards/index.js +8 -0
- package/dist/analyzers/cards/index.js.map +7 -0
- package/dist/analyzers/cards/tier0.js +18 -0
- package/dist/analyzers/cards/tier0.js.map +7 -0
- package/dist/analyzers/cards/types.js +1 -0
- package/dist/analyzers/cards/types.js.map +7 -0
- package/dist/analyzers/cbm-analyzer.js +195 -171
- package/dist/analyzers/cbm-analyzer.js.map +2 -2
- package/dist/analyzers/cbm-responses.js +336 -0
- package/dist/analyzers/cbm-responses.js.map +7 -0
- package/dist/analyzers/edge-relationships.js +45 -0
- package/dist/analyzers/edge-relationships.js.map +7 -0
- package/dist/analyzers/mapping-loader.js +9 -0
- package/dist/analyzers/mapping-loader.js.map +2 -2
- package/dist/analyzers/tier0-rules.js +153 -0
- package/dist/analyzers/tier0-rules.js.map +7 -0
- package/dist/analyzers/types.js.map +1 -1
- package/dist/audit/relationships/ai/prompts.js +10 -10
- package/dist/audit/relationships/ai/prompts.js.map +2 -2
- package/dist/audit/relationships/analysis/layer-templates.js +52 -52
- package/dist/audit/relationships/analysis/layer-templates.js.map +1 -1
- package/dist/cli.js +12 -2
- package/dist/cli.js.map +2 -2
- package/dist/coding-agents/default-permissions.js +31 -1
- package/dist/coding-agents/default-permissions.js.map +2 -2
- package/dist/coding-agents/drbot-mcp.js +167 -0
- package/dist/coding-agents/drbot-mcp.js.map +7 -0
- package/dist/commands/add.js +3 -2
- package/dist/commands/add.js.map +2 -2
- package/dist/commands/analyzer.js +117 -14
- package/dist/commands/analyzer.js.map +2 -2
- package/dist/commands/changeset-verify.js +55 -0
- package/dist/commands/changeset-verify.js.map +7 -0
- package/dist/commands/changeset.js +43 -22
- package/dist/commands/changeset.js.map +2 -2
- package/dist/commands/delete.js +10 -4
- package/dist/commands/delete.js.map +2 -2
- package/dist/commands/farm.js +176 -60
- package/dist/commands/farm.js.map +2 -2
- package/dist/commands/mcp.js +19 -4
- package/dist/commands/mcp.js.map +2 -2
- package/dist/commands/relationship.js +207 -26
- package/dist/commands/relationship.js.map +2 -2
- package/dist/commands/update.js +42 -23
- package/dist/commands/update.js.map +2 -2
- package/dist/commands/upgrade.js +99 -11
- package/dist/commands/upgrade.js.map +3 -3
- package/dist/commands/version.js +1 -1
- package/dist/commands/visualize.js +4 -3
- package/dist/commands/visualize.js.map +2 -2
- package/dist/core/catalog-migration.js +33 -0
- package/dist/core/catalog-migration.js.map +7 -0
- package/dist/core/changeset-analysis.js +421 -0
- package/dist/core/changeset-analysis.js.map +7 -0
- package/dist/core/changeset-base-index.js +153 -0
- package/dist/core/changeset-base-index.js.map +7 -0
- package/dist/core/changeset-brief-delta.js +102 -0
- package/dist/core/changeset-brief-delta.js.map +7 -0
- package/dist/core/changeset-graph.js +281 -0
- package/dist/core/changeset-graph.js.map +7 -0
- package/dist/core/changeset-only-guard.js +32 -0
- package/dist/core/changeset-only-guard.js.map +7 -0
- package/dist/core/changeset-summary.js +68 -0
- package/dist/core/changeset-summary.js.map +7 -0
- package/dist/core/changeset-validator.js +66 -20
- package/dist/core/changeset-validator.js.map +2 -2
- package/dist/core/changeset-verify.js +518 -0
- package/dist/core/changeset-verify.js.map +7 -0
- package/dist/core/changeset.js +56 -9
- package/dist/core/changeset.js.map +2 -2
- package/dist/core/element-type-migration.js +145 -0
- package/dist/core/element-type-migration.js.map +7 -0
- package/dist/core/farm-manifest.js +12 -6
- package/dist/core/farm-manifest.js.map +2 -2
- package/dist/core/farm-sync-engine.js +1 -1
- package/dist/core/farm-sync-engine.js.map +2 -2
- package/dist/core/farm-sync-state.js +10 -2
- package/dist/core/farm-sync-state.js.map +2 -2
- package/dist/core/migration-registry.js +75 -46
- package/dist/core/migration-registry.js.map +2 -2
- package/dist/core/model-upgrade.js +102 -0
- package/dist/core/model-upgrade.js.map +7 -0
- package/dist/core/model.js +82 -30
- package/dist/core/model.js.map +2 -2
- package/dist/core/mutation-handler.js +71 -6
- package/dist/core/mutation-handler.js.map +2 -2
- package/dist/core/relationship-migration-table.js +6639 -0
- package/dist/core/relationship-migration-table.js.map +7 -0
- package/dist/core/relationship-migration.js +272 -0
- package/dist/core/relationship-migration.js.map +7 -0
- package/dist/core/relationship-prune.js +49 -0
- package/dist/core/relationship-prune.js.map +7 -0
- package/dist/core/relationship-staging.js +68 -0
- package/dist/core/relationship-staging.js.map +7 -0
- package/dist/core/relationships.js +26 -4
- package/dist/core/relationships.js.map +2 -2
- package/dist/core/report-data-model.js +7 -13
- package/dist/core/report-data-model.js.map +2 -2
- package/dist/core/staged-changeset-storage.js +64 -17
- package/dist/core/staged-changeset-storage.js.map +2 -2
- package/dist/core/staged-source-reference.js +28 -0
- package/dist/core/staged-source-reference.js.map +7 -0
- package/dist/core/staging-area.js +83 -18
- package/dist/core/staging-area.js.map +2 -2
- package/dist/core/virtual-projection.js +13 -5
- package/dist/core/virtual-projection.js.map +2 -2
- package/dist/export/archimate-exporter.js +1 -0
- package/dist/export/archimate-exporter.js.map +2 -2
- package/dist/generated/compiled-validators.js +2 -2
- package/dist/generated/compiled-validators.js.map +2 -2
- package/dist/generated/layer-registry.js +16 -16
- package/dist/generated/layer-registry.js.map +2 -2
- package/dist/generated/node-types.js +186 -168
- package/dist/generated/node-types.js.map +2 -2
- package/dist/generated/relationship-index.js +2236 -7790
- package/dist/generated/relationship-index.js.map +2 -2
- package/dist/integrations/claude_code/agents/dr-architect.md +16 -3
- package/dist/integrations/claude_code/agents/dr-extractor.md +1 -1
- package/dist/integrations/claude_code/commands/dr-analyzer.md +565 -0
- package/dist/integrations/claude_code/commands/dr-map.md +13 -0
- package/dist/integrations/claude_code/commands/dr-plan.md +40 -0
- package/dist/integrations/claude_code/commands/dr-relate.md +106 -96
- package/dist/integrations/claude_code/commands/dr-verify.md +45 -2
- package/dist/integrations/claude_code/docs/END_TO_END_WALKTHROUGH.md +14 -0
- package/dist/integrations/claude_code/docs/MCP_SERVER.md +26 -2
- package/dist/integrations/claude_code/docs/QUICK_START.md +37 -8
- package/dist/integrations/claude_code/docs/README.md +48 -1
- package/dist/integrations/claude_code/skills/dr_01_motivation_layer/SKILL.md +93 -72
- package/dist/integrations/claude_code/skills/dr_02_business_layer/SKILL.md +163 -126
- package/dist/integrations/claude_code/skills/dr_03_product_layer/SKILL.md +161 -126
- package/dist/integrations/claude_code/skills/dr_04_security_layer/SKILL.md +153 -133
- package/dist/integrations/claude_code/skills/dr_05_application_layer/SKILL.md +129 -100
- package/dist/integrations/claude_code/skills/dr_06_technology_layer/SKILL.md +111 -94
- package/dist/integrations/claude_code/skills/dr_07_api_layer/SKILL.md +143 -157
- package/dist/integrations/claude_code/skills/dr_08_data_model_layer/SKILL.md +117 -33
- package/dist/integrations/claude_code/skills/dr_09_dataset_layer/SKILL.md +74 -25
- package/dist/integrations/claude_code/skills/dr_10_ux_layer/SKILL.md +88 -12
- package/dist/integrations/claude_code/skills/dr_11_navigation_layer/SKILL.md +83 -24
- package/dist/integrations/claude_code/skills/dr_12_apm_layer/SKILL.md +57 -12
- package/dist/integrations/claude_code/skills/dr_13_testing_layer/SKILL.md +92 -15
- package/dist/integrations/claude_code/skills/dr_change_planning/SKILL.md +119 -0
- package/dist/integrations/claude_code/skills/dr_changeset_reviewer/SKILL.md +3 -0
- package/dist/integrations/claude_code/skills/dr_engineering_guide/SKILL.md +1 -1
- package/dist/integrations/github_copilot/agents/dr-architect.md +1 -1
- package/dist/integrations/github_copilot/skills/dr_01_motivation_layer/SKILL.md +182 -102
- package/dist/integrations/github_copilot/skills/dr_02_business_layer/SKILL.md +266 -148
- package/dist/integrations/github_copilot/skills/dr_03_product_layer/SKILL.md +547 -86
- package/dist/integrations/github_copilot/skills/dr_04_security_layer/SKILL.md +164 -169
- package/dist/integrations/github_copilot/skills/dr_05_application_layer/SKILL.md +420 -150
- package/dist/integrations/github_copilot/skills/dr_06_technology_layer/SKILL.md +331 -138
- package/dist/integrations/github_copilot/skills/dr_07_api_layer/SKILL.md +265 -201
- package/dist/integrations/github_copilot/skills/dr_08_data_model_layer/SKILL.md +181 -58
- package/dist/integrations/github_copilot/skills/dr_09_dataset_layer/SKILL.md +209 -57
- package/dist/integrations/github_copilot/skills/dr_10_ux_layer/SKILL.md +277 -112
- package/dist/integrations/github_copilot/skills/dr_11_navigation_layer/SKILL.md +219 -70
- package/dist/integrations/github_copilot/skills/dr_12_apm_layer/SKILL.md +189 -105
- package/dist/integrations/github_copilot/skills/dr_13_testing_layer/SKILL.md +222 -102
- package/dist/integrations/github_copilot/skills/dr_change_planning/SKILL.md +119 -0
- package/dist/integrations/github_copilot/skills/dr_changeset_reviewer/SKILL.md +3 -0
- package/dist/integrations/hash-utils.js.map +2 -2
- package/dist/mcp/api-key-manager.js +14 -1
- package/dist/mcp/api-key-manager.js.map +2 -2
- package/dist/mcp/changeset-only.js +34 -0
- package/dist/mcp/changeset-only.js.map +7 -0
- package/dist/mcp/tool-registry.js +19 -3
- package/dist/mcp/tool-registry.js.map +2 -2
- package/dist/mcp/tools/changeset-analysis-tools.js +78 -0
- package/dist/mcp/tools/changeset-analysis-tools.js.map +7 -0
- package/dist/mcp/tools/changeset-editing.js +184 -0
- package/dist/mcp/tools/changeset-editing.js.map +7 -0
- package/dist/mcp/tools/changeset-lifecycle.js +83 -0
- package/dist/mcp/tools/changeset-lifecycle.js.map +7 -0
- package/dist/mcp/tools/changeset-shared.js +31 -0
- package/dist/mcp/tools/changeset-shared.js.map +7 -0
- package/dist/mcp/tools/changeset-show.js +17 -1
- package/dist/mcp/tools/changeset-show.js.map +2 -2
- package/dist/mcp/tools/changeset-verify.js +43 -0
- package/dist/mcp/tools/changeset-verify.js.map +7 -0
- package/dist/mcp/tools/index.js +19 -1
- package/dist/mcp/tools/index.js.map +2 -2
- package/dist/mcp/tools/model-add.js +6 -5
- package/dist/mcp/tools/model-add.js.map +2 -2
- package/dist/mcp/tools/model-delete.js +2 -2
- package/dist/mcp/tools/model-delete.js.map +2 -2
- package/dist/mcp/tools/model-search.js +14 -0
- package/dist/mcp/tools/model-search.js.map +2 -2
- package/dist/mcp/tools/model-show.js +29 -2
- package/dist/mcp/tools/model-show.js.map +2 -2
- package/dist/mcp/tools/model-trace.js +93 -30
- package/dist/mcp/tools/model-trace.js.map +2 -2
- package/dist/mcp/tools/model-update.js +35 -19
- package/dist/mcp/tools/model-update.js.map +2 -2
- package/dist/mcp/tools/relationship-tools.js +98 -0
- package/dist/mcp/tools/relationship-tools.js.map +7 -0
- package/dist/mcp/tools/shared.js +25 -2
- package/dist/mcp/tools/shared.js.map +2 -2
- package/dist/mcp/tools/spec-type.js +90 -0
- package/dist/mcp/tools/spec-type.js.map +7 -0
- package/dist/schemas/bundled/analyzers/cbm.json +1186 -68
- package/dist/schemas/bundled/analyzers/manifest.json +2 -2
- package/dist/schemas/bundled/api.json +1029 -1658
- package/dist/schemas/bundled/apm.json +499 -734
- package/dist/schemas/bundled/application.json +735 -371
- package/dist/schemas/bundled/base.json +3 -220
- package/dist/schemas/bundled/business.json +452 -366
- package/dist/schemas/bundled/data-model.json +395 -411
- package/dist/schemas/bundled/data-store.json +334 -558
- package/dist/schemas/bundled/manifest.json +18 -18
- package/dist/schemas/bundled/motivation.json +349 -368
- package/dist/schemas/bundled/navigation.json +415 -731
- package/dist/schemas/bundled/product.json +325 -159
- package/dist/schemas/bundled/security.json +864 -1232
- package/dist/schemas/bundled/technology.json +574 -703
- package/dist/schemas/bundled/testing.json +718 -1643
- package/dist/schemas/bundled/ux.json +739 -1352
- package/dist/server/schemas.js +8 -0
- package/dist/server/schemas.js.map +2 -2
- package/dist/server/server.js +218 -34
- package/dist/server/server.js.map +2 -2
- package/dist/server-entry.js +2 -1
- package/dist/server-entry.js.map +2 -2
- package/dist/telemetry/index.js +1 -1
- package/dist/utils/ansi-suppressor.js +6 -8
- package/dist/utils/ansi-suppressor.js.map +2 -2
- package/dist/utils/attribute-patch.js +41 -0
- package/dist/utils/attribute-patch.js.map +7 -0
- package/dist/utils/error-hints.js +29 -0
- package/dist/utils/error-hints.js.map +7 -0
- package/dist/utils/errors.js +9 -3
- package/dist/utils/errors.js.map +2 -2
- package/dist/utils/project-paths.js +26 -1
- package/dist/utils/project-paths.js.map +2 -2
- package/dist/utils/source-reference.js +14 -12
- package/dist/utils/source-reference.js.map +2 -2
- package/dist/utils/spec-version.js +2 -2
- package/dist/utils/spec-version.js.map +1 -1
- package/dist/validators/composed-reference-validator.js +5 -27
- package/dist/validators/composed-reference-validator.js.map +2 -2
- package/dist/validators/reference-validator.js +0 -7
- package/dist/validators/reference-validator.js.map +2 -2
- package/dist/validators/relationship-schema-validator.js +3 -3
- package/dist/validators/relationship-schema-validator.js.map +2 -2
- package/dist/validators/schema-validator.js +27 -9
- package/dist/validators/schema-validator.js.map +2 -2
- package/dist/validators/types.js.map +1 -1
- package/dist/viewer/README.md +6 -6
- package/dist/viewer/assets/main-CxzcuU_o.js +84 -0
- package/dist/viewer/assets/main-j-7ULYpm.css +1 -0
- package/dist/viewer/index.html +2 -2
- package/dist/viewer/manifest.json +10 -10
- package/dist/viewer/version.json +1 -1
- package/package.json +2 -1
- package/dist/viewer/assets/main-B7AOQXXX.js +0 -81
- package/dist/viewer/assets/main-vdrFrG7q.css +0 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/audit/relationships/analysis/layer-templates.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Layer-specific relationship templates for gap analysis and standard alignment\n */\n\nexport interface LayerTemplate {\n layer: string;\n standard: string;\n patterns: Array<{\n sourcePattern: string;\n destinationPattern: string;\n predicate: string;\n description: string;\n }>;\n}\n\nexport const LAYER_TEMPLATES: LayerTemplate[] = [\n {\n layer: \"motivation\",\n standard: \"ArchiMate 3.2\",\n patterns: [\n {\n sourcePattern: \"goal\",\n destinationPattern: \"principle\",\n predicate: \"supports\",\n description: \"Goals support principles\",\n },\n {\n sourcePattern: \"requirement\",\n destinationPattern: \"goal\",\n predicate: \"realizes\",\n description: \"Requirements realize goals\",\n },\n {\n sourcePattern: \"constraint\",\n destinationPattern: \"requirement\",\n predicate: \"restricts\",\n description: \"Constraints restrict requirements\",\n },\n ],\n },\n {\n layer: \"business\",\n standard: \"ArchiMate 3.2\",\n patterns: [\n {\n sourcePattern: \"process\",\n destinationPattern: \"process\",\n predicate: \"triggers\",\n description: \"Processes trigger other processes\",\n },\n {\n sourcePattern: \"role\",\n destinationPattern: \"process\",\n predicate: \"
|
|
4
|
+
"sourcesContent": ["/**\n * Layer-specific relationship templates for gap analysis and standard alignment\n */\n\nexport interface LayerTemplate {\n layer: string;\n standard: string;\n patterns: Array<{\n sourcePattern: string;\n destinationPattern: string;\n predicate: string;\n description: string;\n }>;\n}\n\nexport const LAYER_TEMPLATES: LayerTemplate[] = [\n {\n layer: \"motivation\",\n standard: \"ArchiMate 3.2\",\n patterns: [\n {\n sourcePattern: \"goal\",\n destinationPattern: \"principle\",\n predicate: \"supports\",\n description: \"Goals support principles\",\n },\n {\n sourcePattern: \"requirement\",\n destinationPattern: \"goal\",\n predicate: \"realizes\",\n description: \"Requirements realize goals\",\n },\n {\n sourcePattern: \"constraint\",\n destinationPattern: \"requirement\",\n predicate: \"restricts\",\n description: \"Constraints restrict requirements\",\n },\n ],\n },\n {\n layer: \"business\",\n standard: \"ArchiMate 3.2\",\n patterns: [\n {\n sourcePattern: \"process\",\n destinationPattern: \"process\",\n predicate: \"triggers\",\n description: \"Processes trigger other processes\",\n },\n {\n sourcePattern: \"role\",\n destinationPattern: \"process\",\n predicate: \"assigned-to\",\n description: \"Roles are assigned to the processes they perform\",\n },\n {\n sourcePattern: \"process\",\n destinationPattern: \"service\",\n predicate: \"realizes\",\n description: \"Processes realize services\",\n },\n ],\n },\n {\n layer: \"product\",\n standard: \"Product Management Practice\",\n patterns: [\n {\n sourcePattern: \"feature\",\n destinationPattern: \"softwarecapability\",\n predicate: \"realizes\",\n description: \"Features realize software capabilities\",\n },\n {\n sourcePattern: \"softwarecapability\",\n destinationPattern: \"milestone\",\n predicate: \"scheduled-for\",\n description: \"Software capabilities are scheduled for milestones\",\n },\n {\n sourcePattern: \"feature\",\n destinationPattern: \"milestone\",\n predicate: \"scheduled-for\",\n description: \"Features are scheduled for milestones\",\n },\n {\n sourcePattern: \"feature\",\n destinationPattern: \"feature\",\n predicate: \"depends-on\",\n description: \"Features depend on other features\",\n },\n {\n sourcePattern: \"userworkflow\",\n destinationPattern: \"feature\",\n predicate: \"composes\",\n description: \"User workflows compose features\",\n },\n ],\n },\n {\n layer: \"security\",\n standard: \"NIST SP 800-53\",\n patterns: [\n {\n sourcePattern: \"countermeasure\",\n destinationPattern: \"threat\",\n predicate: \"mitigates\",\n description: \"Countermeasures mitigate threats\",\n },\n {\n sourcePattern: \"role\",\n destinationPattern: \"permission\",\n predicate: \"aggregates\",\n description: \"Roles aggregate the permissions they grant\",\n },\n {\n sourcePattern: \"policy\",\n destinationPattern: \"countermeasure\",\n predicate: \"mandates\",\n description: \"Policies mandate countermeasures\",\n },\n ],\n },\n {\n layer: \"application\",\n standard: \"ArchiMate 3.2\",\n patterns: [\n {\n sourcePattern: \"component\",\n destinationPattern: \"service\",\n predicate: \"realizes\",\n description: \"Components realize services\",\n },\n {\n sourcePattern: \"component\",\n destinationPattern: \"component\",\n predicate: \"uses\",\n description: \"Components use other components\",\n },\n {\n sourcePattern: \"interface\",\n destinationPattern: \"service\",\n predicate: \"serves\",\n description: \"Interfaces serve services\",\n },\n ],\n },\n {\n layer: \"technology\",\n standard: \"ArchiMate 3.2\",\n patterns: [\n {\n sourcePattern: \"node\",\n destinationPattern: \"device\",\n predicate: \"composes\",\n description: \"Nodes compose devices\",\n },\n {\n sourcePattern: \"artifact\",\n destinationPattern: \"component\",\n predicate: \"realizes\",\n description: \"Artifacts realize components\",\n },\n {\n sourcePattern: \"node\",\n destinationPattern: \"systemsoftware\",\n predicate: \"composes\",\n description: \"Nodes compose the system software they run\",\n },\n ],\n },\n {\n layer: \"api\",\n standard: \"OpenAPI 3.0\",\n patterns: [\n {\n sourcePattern: \"pathitem\",\n destinationPattern: \"operation\",\n predicate: \"composes\",\n description: \"Path items compose their operations\",\n },\n {\n sourcePattern: \"operation\",\n destinationPattern: \"responses\",\n predicate: \"composes\",\n description: \"Operations compose their responses map\",\n },\n {\n sourcePattern: \"mediatype\",\n destinationPattern: \"schema\",\n predicate: \"references\",\n description: \"Media types reference their schema by $ref\",\n },\n ],\n },\n {\n layer: \"ux\",\n standard: \"HTML 5.3 / component libraries\",\n patterns: [\n {\n sourcePattern: \"view\",\n destinationPattern: \"componentinstance\",\n predicate: \"composes\",\n description: \"Views compose the component instances placed in them\",\n },\n {\n sourcePattern: \"componentinstance\",\n destinationPattern: \"librarycomponent\",\n predicate: \"realizes\",\n description: \"Instances realize the library component they place\",\n },\n {\n sourcePattern: \"view\",\n destinationPattern: \"dataconfig\",\n predicate: \"binds-to\",\n description: \"Views bind to their data configuration\",\n },\n ],\n },\n {\n layer: \"navigation\",\n standard: \"Router patterns\",\n patterns: [\n {\n sourcePattern: \"route\",\n destinationPattern: \"screen\",\n predicate: \"navigates-to\",\n description: \"Routes navigate to screens\",\n },\n {\n sourcePattern: \"menuitem\",\n destinationPattern: \"route\",\n predicate: \"references\",\n description: \"Menu items reference routes\",\n },\n {\n sourcePattern: \"link\",\n destinationPattern: \"route\",\n predicate: \"targets\",\n description: \"Links target routes\",\n },\n ],\n },\n {\n layer: \"data-model\",\n standard: \"JSON Schema Draft 7\",\n patterns: [\n {\n sourcePattern: \"entity\",\n destinationPattern: \"entity\",\n predicate: \"references\",\n description: \"Entities reference other entities\",\n },\n {\n sourcePattern: \"entity\",\n destinationPattern: \"property\",\n predicate: \"has\",\n description: \"Entities have properties\",\n },\n {\n sourcePattern: \"property\",\n destinationPattern: \"entity\",\n predicate: \"references\",\n description: \"Properties reference entities\",\n },\n ],\n },\n {\n layer: \"data-store\",\n standard: \"Database schema patterns\",\n patterns: [\n {\n sourcePattern: \"table\",\n destinationPattern: \"table\",\n predicate: \"references\",\n description: \"Tables reference other tables via foreign keys\",\n },\n {\n sourcePattern: \"index\",\n destinationPattern: \"table\",\n predicate: \"indexes\",\n description: \"Indexes apply to tables\",\n },\n {\n sourcePattern: \"view\",\n destinationPattern: \"table\",\n predicate: \"derives-from\",\n description: \"Views derive from tables\",\n },\n ],\n },\n {\n layer: \"apm\",\n standard: \"OpenTelemetry\",\n patterns: [\n {\n sourcePattern: \"trace\",\n destinationPattern: \"service\",\n predicate: \"monitors\",\n description: \"Traces monitor services\",\n },\n {\n sourcePattern: \"metric\",\n destinationPattern: \"component\",\n predicate: \"measures\",\n description: \"Metrics measure components\",\n },\n {\n sourcePattern: \"alert\",\n destinationPattern: \"metric\",\n predicate: \"triggers-on\",\n description: \"Alerts trigger on metrics\",\n },\n ],\n },\n {\n layer: \"testing\",\n standard: \"IEEE 829-2008 test documentation\",\n patterns: [\n {\n sourcePattern: \"testcasesketch\",\n destinationPattern: \"coveragerequirement\",\n predicate: \"validates\",\n description: \"Test case sketches validate the coverage requirement they exercise\",\n },\n {\n sourcePattern: \"testcoveragetarget\",\n destinationPattern: \"coveragerequirement\",\n predicate: \"composes\",\n description: \"Coverage targets compose their coverage requirements\",\n },\n {\n sourcePattern: \"testcoveragemodel\",\n destinationPattern: \"testcoveragetarget\",\n predicate: \"composes\",\n description: \"Coverage models compose their coverage targets\",\n },\n ],\n },\n];\n"],
|
|
5
5
|
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/cli.js
CHANGED
|
@@ -73,7 +73,7 @@ Examples:
|
|
|
73
73
|
$ dr add application component "Customer API" --description "REST API for customer operations"
|
|
74
74
|
$ dr add security policy "Auth Validator" --source-file "src/auth/validator.ts" --source-symbol "validateToken" --source-provenance "extracted"
|
|
75
75
|
|
|
76
|
-
Note: Element IDs are generated automatically in format {layer}.{type}.{kebab-name}`).action((layer, type, name, options) => addCommand(layer, type, name, { ...options, verbose: options.verbose ?? program.opts().verbose })), program.command("update <id>").description("Update an element").option("--model <path>", "Path to model root (contains model/manifest.yaml)").option("--name <name>", "New element name").option("--description <desc>", "New description").option("--type <new-type>", "Change element type (must be valid for the element's layer; incompatible attributes must be cleaned up manually)").option("--attributes <json>", "Updated type-specific attributes (JSON)").option("--source-file <path>", "Source file path (relative from repository root)").option("--source-symbol <name>", "Symbol name (class, function, variable) in source file").option("--source-provenance <type>", "Provenance type: extracted, manual, inferred, generated").option("--source-repo-remote <url>", "Git remote URL for repository context").option("--source-repo-commit <sha>", "Git commit SHA (40 hex characters) for repository context").option("--clear-source-reference", "Remove source reference from element").option("--verbose", "Show detailed output (can also use global -v flag)").addHelpText("after", `
|
|
76
|
+
Note: Element IDs are generated automatically in format {layer}.{type}.{kebab-name}`).action((layer, type, name, options) => addCommand(layer, type, name, { ...options, verbose: options.verbose ?? program.opts().verbose })), program.command("update <id>").description("Update an element").option("--model <path>", "Path to model root (contains model/manifest.yaml)").option("--name <name>", "New element name").option("--description <desc>", "New description").option("--type <new-type>", "Change element type (must be valid for the element's layer; incompatible attributes must be cleaned up manually)").option("--attributes <json>", "Updated type-specific attributes (JSON)").option("--attribute-patch <json>", "Merge these attributes into the current ones (JSON object; null removes a key). Cannot be combined with --attributes").option("--source-file <path>", "Source file path (relative from repository root)").option("--source-symbol <name>", "Symbol name (class, function, variable) in source file").option("--source-provenance <type>", "Provenance type: extracted, manual, inferred, generated").option("--source-repo-remote <url>", "Git remote URL for repository context").option("--source-repo-commit <sha>", "Git commit SHA (40 hex characters) for repository context").option("--clear-source-reference", "Remove source reference from element").option("--verbose", "Show detailed output (can also use global -v flag)").addHelpText("after", `
|
|
77
77
|
Note: Changes are written immediately to model files.
|
|
78
78
|
To track changes for review, activate a changeset first:
|
|
79
79
|
$ dr changeset activate my-changeset
|
|
@@ -82,6 +82,7 @@ Examples:
|
|
|
82
82
|
$ dr update api-endpoint-create-customer --name "Create Customer (v2)"
|
|
83
83
|
$ dr update business-service-order --description "Updated description"
|
|
84
84
|
$ dr update application-applicationfunction-process-orders --type applicationservice
|
|
85
|
+
$ dr update api.operation.create-customer --attribute-patch '{"summary":"Create a customer (v2)"}'
|
|
85
86
|
$ dr update security-policy-auth --source-file "src/auth/policy.ts" --source-provenance "extracted"`).action((id, options) => updateCommand(id, { ...options, verbose: options.verbose ?? program.opts().verbose })), program.command("delete <id>").description("Delete an element").option("--model <path>", "Path to model root (contains model/manifest.yaml)").option("--force", "Skip dependency checks (confirmation is also skipped in non-TTY environments)").option("--cascade", "Remove dependent elements automatically").option("--dry-run", "Show what would be removed without actually removing").option("--verbose", "Show detailed output (can also use global -v flag)").addHelpText("after", `
|
|
86
87
|
Examples:
|
|
87
88
|
$ dr delete api-endpoint-old-endpoint
|
|
@@ -256,7 +257,7 @@ Examples:
|
|
|
256
257
|
showMetrics: options.metrics,
|
|
257
258
|
model: options.model
|
|
258
259
|
});
|
|
259
|
-
}), program.command("visualize").description("Launch visualization server with WebSocket support").option("--port <num>", "Server port (default: 8080)").option("--no-browser", "Do not auto-open browser").option("--no-auth", "Disable authentication (enabled by default)").option("--token <token>", "Custom auth token (auto-generated by default)").option("--with-danger", "Enable dangerous mode for chat (skip permissions)").option("--viewer-path <path>", "Path to custom viewer build (e.g., ./dist/embedded/dr-viewer-bundle)").addHelpText("after", `
|
|
260
|
+
}), program.command("visualize").description("Launch visualization server with WebSocket support").option("--port <num>", "Server port (default: 8080)").option("--no-browser", "Do not auto-open browser").option("--no-auth", "Disable authentication (enabled by default)").option("--token <token>", "Custom auth token (auto-generated by default)").option("--with-danger", "Enable dangerous mode for chat (skip permissions)").option("--with-changesets", "Let chat stage model changes in a changeset (no commit, apply or delete)").option("--viewer-path <path>", "Path to custom viewer build (e.g., ./dist/embedded/dr-viewer-bundle)").addHelpText("after", `
|
|
260
261
|
Examples:
|
|
261
262
|
$ dr visualize
|
|
262
263
|
$ dr visualize --port 3000
|
|
@@ -264,6 +265,7 @@ Examples:
|
|
|
264
265
|
$ dr visualize --no-auth
|
|
265
266
|
$ dr visualize --token my-secret-token
|
|
266
267
|
$ dr visualize --with-danger
|
|
268
|
+
$ dr visualize --with-changesets
|
|
267
269
|
$ dr visualize --viewer-path ./dist/embedded/dr-viewer-bundle
|
|
268
270
|
|
|
269
271
|
Default mode (read-safe permissions) enables:
|
|
@@ -272,6 +274,13 @@ Default mode (read-safe permissions) enables:
|
|
|
272
274
|
- Reading the documentation-robotics/ model folder
|
|
273
275
|
- Reading the .dr/ configuration folder
|
|
274
276
|
|
|
277
|
+
Changeset mode (--with-changesets, Claude Code) adds to the read-safe mode:
|
|
278
|
+
- Creating, activating and inspecting changesets
|
|
279
|
+
- Staging new elements, element updates and new relationships (dr add,
|
|
280
|
+
dr update, dr relationship add) in the active changeset
|
|
281
|
+
- Never committing, applying, reverting or deleting: those stay with you.
|
|
282
|
+
Writes outside an active changeset are refused.
|
|
283
|
+
|
|
275
284
|
Dangerous mode (--with-danger) enables unrestricted access:
|
|
276
285
|
- Claude Code: --dangerously-skip-permissions (full tool access)
|
|
277
286
|
- GitHub Copilot: --allow-all-tools (full tool access)
|
|
@@ -288,6 +297,7 @@ The --viewer-path option allows loading a local build of the web UI:
|
|
|
288
297
|
// Commander sets 'auth' to false when --no-auth is used
|
|
289
298
|
token: options.token,
|
|
290
299
|
withDanger: options.withDanger,
|
|
300
|
+
withChangesets: options.withChangesets,
|
|
291
301
|
viewerPath: options.viewerPath
|
|
292
302
|
});
|
|
293
303
|
}), program.command("mcp").description("Start MCP server for AI assistant integration").option("--regenerate-key", "Generate a new MCP API key, overwrite it at the configured storage path, and print it (does not start the server)").option("--transport <type>", "Transport type: stdio or http (default: stdio)", "stdio").option("--port <number>", "Port for HTTP transport (default: 3100, only meaningful with --transport http)", "3100").option("--host <address>", "Host address for HTTP transport (default: 127.0.0.1, only meaningful with --transport http)", "127.0.0.1").addHelpText("after", `
|
package/dist/cli.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/cli.ts"],
|
|
4
|
-
"sourcesContent": ["#!/usr/bin/env node\n\n/**\n * Documentation Robotics CLI - Bun Implementation\n * Entry point for the command-line interface\n *\n * Instrumented with OpenTelemetry to create root spans for command execution.\n * Telemetry is controlled by the TELEMETRY_ENABLED build-time constant.\n */\n\nimport { Command, CommanderError } from \"commander\";\nimport { setGlobalOptions } from \"./utils/globals.js\";\nimport { installAnsiSuppressor } from \"./utils/ansi-suppressor.js\";\nimport { initCommand } from \"./commands/init.js\";\nimport { addCommand } from \"./commands/add.js\";\nimport { updateCommand } from \"./commands/update.js\";\nimport { deleteCommand } from \"./commands/delete.js\";\nimport { showCommand } from \"./commands/show.js\";\nimport { listCommand } from \"./commands/list.js\";\nimport { searchCommand } from \"./commands/search.js\";\nimport { validateCommand } from \"./commands/validate.js\";\nimport { infoCommand } from \"./commands/info.js\";\nimport { relationshipCommands } from \"./commands/relationship.js\";\nimport { elementCommands } from \"./commands/element.js\";\nimport { schemaCommands } from \"./commands/schema.js\";\nimport { catalogCommands } from \"./commands/catalog.js\";\nimport { docsCommands } from \"./commands/docs.js\";\nimport { traceCommand } from \"./commands/trace.js\";\nimport { exportCommand } from \"./commands/export.js\";\nimport { importCommand } from \"./commands/import.js\";\nimport { chatCommand } from \"./commands/chat.js\";\nimport { upgradeCommand } from \"./commands/upgrade.js\";\nimport { conformanceCommand } from \"./commands/conformance.js\";\nimport { changesetCommands } from \"./commands/changeset.js\";\nimport { farmCommands } from \"./commands/farm.js\";\nimport { claudeCommands } from \"./commands/claude.js\";\nimport { copilotCommands } from \"./commands/copilot.js\";\nimport { analyzerCommands } from \"./commands/analyzer.js\";\nimport { versionCommand } from \"./commands/version.js\";\nimport { statsCommand } from \"./commands/stats.js\";\nimport { reportCommand } from \"./commands/report.js\";\nimport { reportsCommands } from \"./commands/reports.js\";\nimport { auditCommand } from \"./commands/audit.js\";\nimport { auditDiffCommand } from \"./commands/audit-diff.js\";\nimport { auditSnapshotsCommand } from \"./commands/audit-snapshots.js\";\nimport { repairAttributeCollisionCommand } from \"./commands/repair.js\";\nimport { initTelemetry, startActiveSpan, shutdownTelemetry } from \"./telemetry/index.js\";\nimport { installConsoleInterceptor } from \"./telemetry/console-interceptor.js\";\nimport { getErrorMessage, CLIError } from \"./utils/errors.js\";\nimport { getCliVersion } from \"./utils/spec-version.js\";\n\n// Declare TELEMETRY_ENABLED as a build-time constant (substituted by esbuild)\n// Provide runtime fallback when not running through esbuild\ndeclare const TELEMETRY_ENABLED: boolean;\nconst isTelemetryEnabled = typeof TELEMETRY_ENABLED !== \"undefined\" ? TELEMETRY_ENABLED : false;\n\n// Commands that require console interceptor for telemetry logging\nconst CONSOLE_LOGGING_COMMANDS = new Set(['chat', 'validate', 'import', 'export']);\n\n// Suppress ANSI color output on non-TTY stdout\nif (!process.stdout.isTTY) {\n process.env.FORCE_COLOR = \"0\";\n process.env.NO_COLOR = \"1\";\n}\n\n// Install the ANSI suppressor to strip color codes from console output when not on TTY\ninstallAnsiSuppressor();\n\n/**\n * Extract exit code from an error object.\n * Handles CLIError instances and duck-typed objects with exitCode property.\n */\nasync function extractExitCode(error: unknown): Promise<number> {\n const { CLIError } = await import(\"./utils/errors.js\");\n\n if (error instanceof CLIError) {\n return error.exitCode;\n }\n\n // Commander's own errors (--help, unknown commands, etc.) carry exitCode as\n // expected control flow \u2014 handle them directly without duck-typing.\n if (error instanceof CommanderError) {\n return error.exitCode;\n }\n\n // Fallback for duck-typing (handles bundling/module issues)\n if (error && typeof error === \"object\" && \"exitCode\" in error) {\n const errorObj = error as any;\n if (typeof errorObj.exitCode === \"number\") {\n // Validate this looks like a CLIError before accepting\n if (errorObj.name === \"CLIError\" || errorObj.message) {\n if (process.argv.includes(\"--debug\")) {\n console.warn(\n \"[DEBUG] Using duck-typed error object as fallback - this may indicate a module loading issue\"\n );\n }\n return errorObj.exitCode;\n }\n }\n }\n\n return 1;\n}\n\nconst cliVersion = getCliVersion();\n\nconst program = new Command();\n\n// Handle --version and -V flags by redirecting to version command\n// This ensures they go through the telemetry wrapper\nif (process.argv.includes(\"--version\") || process.argv.includes(\"-V\")) {\n process.argv = [\"node\", \"dr\", \"version\"];\n}\n\nprogram\n .name(\"dr\")\n .description(\"Documentation Robotics CLI - Architecture Model Management\")\n .option(\"-v, --verbose\", \"Enable verbose output\")\n .option(\"--debug\", \"Enable debug mode\")\n .option(\"--json\", \"Output as JSON (supported on mutating and query commands)\")\n .option(\"--codebase-path <path>\", \"Override codebase root path (default: resolved from manifest or project root)\")\n .exitOverride() // Prevent Commander from calling process.exit() - we handle exit ourselves\n .showSuggestionAfterError() // \"Did you mean X?\" on unknown commands/options\n .hook(\"preAction\", async (thisCommand) => {\n // Set up global state (verbose/debug/json flags)\n const options = thisCommand.opts();\n setGlobalOptions({\n verbose: options.verbose as boolean | undefined,\n debug: options.debug as boolean | undefined,\n json: options.json as boolean | undefined,\n codebasePath: options.codebasePath as string | undefined,\n });\n });\n\n// Model commands\nprogram\n .command(\"init [name]\")\n .description(\"Initialize a new architecture model\")\n .option(\"--name <name>\", \"Model name (overrides positional argument)\")\n .option(\"--author <author>\", \"Model author\")\n .option(\"--description <desc>\", \"Model description\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ dr init\n $ dr init claudetoreum\n $ dr init \"Enterprise Architecture\" --author \"Team A\"\n $ dr init --name \"My Project\" --description \"13-layer federated model\"`\n )\n .action((name, options) => initCommand({ ...options, name: options.name || name }));\n\nprogram\n .command(\"add <layer> <type> <name>\")\n .description(\"Add an element to a layer\")\n .option(\"--model <path>\", \"Path to model root (contains model/manifest.yaml)\")\n .option(\"--name <name>\", \"Element display name (defaults to the name argument)\")\n .option(\"--description <desc>\", \"Element description\")\n .option(\"--attributes <json>\", \"Element type-specific attributes as JSON object\")\n .option(\"--source-file <path>\", \"Source file path (relative from repository root)\")\n .option(\"--source-symbol <name>\", \"Symbol name (class, function, variable) in source file\")\n .option(\"--source-provenance <type>\", \"Provenance type: extracted, manual, inferred, generated\")\n .option(\"--source-repo-remote <url>\", \"Git remote URL for repository context\")\n .option(\"--source-repo-commit <sha>\", \"Git commit SHA (40 hex characters) for repository context\")\n .option(\"--verbose\", \"Show detailed output (can also use global -v flag)\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ dr add business service \"Customer Management\"\n $ dr add api operation \"Create Customer\" --attributes '{\"operationId\":\"createCustomer\",\"summary\":\"Create a customer\",\"tags\":\"customers\"}'\n $ dr add application component \"Customer API\" --description \"REST API for customer operations\"\n $ dr add security policy \"Auth Validator\" --source-file \"src/auth/validator.ts\" --source-symbol \"validateToken\" --source-provenance \"extracted\"\n\nNote: Element IDs are generated automatically in format {layer}.{type}.{kebab-name}`\n )\n .action((layer, type, name, options) =>\n addCommand(layer, type, name, { ...options, verbose: options.verbose ?? program.opts().verbose }));\n\nprogram\n .command(\"update <id>\")\n .description(\"Update an element\")\n .option(\"--model <path>\", \"Path to model root (contains model/manifest.yaml)\")\n .option(\"--name <name>\", \"New element name\")\n .option(\"--description <desc>\", \"New description\")\n .option(\"--type <new-type>\", \"Change element type (must be valid for the element's layer; incompatible attributes must be cleaned up manually)\")\n .option(\"--attributes <json>\", \"Updated type-specific attributes (JSON)\")\n .option(\"--source-file <path>\", \"Source file path (relative from repository root)\")\n .option(\"--source-symbol <name>\", \"Symbol name (class, function, variable) in source file\")\n .option(\"--source-provenance <type>\", \"Provenance type: extracted, manual, inferred, generated\")\n .option(\"--source-repo-remote <url>\", \"Git remote URL for repository context\")\n .option(\"--source-repo-commit <sha>\", \"Git commit SHA (40 hex characters) for repository context\")\n .option(\"--clear-source-reference\", \"Remove source reference from element\")\n .option(\"--verbose\", \"Show detailed output (can also use global -v flag)\")\n .addHelpText(\n \"after\",\n `\nNote: Changes are written immediately to model files.\nTo track changes for review, activate a changeset first:\n $ dr changeset activate my-changeset\n\nExamples:\n $ dr update api-endpoint-create-customer --name \"Create Customer (v2)\"\n $ dr update business-service-order --description \"Updated description\"\n $ dr update application-applicationfunction-process-orders --type applicationservice\n $ dr update security-policy-auth --source-file \"src/auth/policy.ts\" --source-provenance \"extracted\"`\n )\n .action((id, options) =>\n updateCommand(id, { ...options, verbose: options.verbose ?? program.opts().verbose }));\n\nprogram\n .command(\"delete <id>\")\n .description(\"Delete an element\")\n .option(\"--model <path>\", \"Path to model root (contains model/manifest.yaml)\")\n .option(\"--force\", \"Skip dependency checks (confirmation is also skipped in non-TTY environments)\")\n .option(\"--cascade\", \"Remove dependent elements automatically\")\n .option(\"--dry-run\", \"Show what would be removed without actually removing\")\n .option(\"--verbose\", \"Show detailed output (can also use global -v flag)\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ dr delete api-endpoint-old-endpoint\n $ dr delete api-endpoint-old-endpoint --force\n $ dr delete api-endpoint-old-endpoint --cascade\n $ dr delete api-endpoint-old-endpoint --dry-run\n $ dr delete api-endpoint-old-endpoint --cascade --dry-run`\n )\n .action((id, options) =>\n deleteCommand(id, { ...options, verbose: options.verbose ?? program.opts().verbose }));\n\nprogram\n .command(\"show <id>\")\n .description(\"Display element details\")\n .option(\"--model <path>\", \"Path to model root (contains model/manifest.yaml)\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ dr show api-endpoint-create-customer\n $ dr show business-service-order-mgmt`\n )\n .action((id, options) => showCommand(id, options));\n\nprogram\n .command(\"list [layer]\")\n .description(\"List elements in a layer (or all layers if omitted)\")\n .option(\"--type <type>\", \"Filter by element type\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--model <path>\", \"Path to model root (contains model/manifest.yaml)\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ dr list\n $ dr list api\n $ dr list business --type businessservice\n $ dr list api --json\n $ dr list --json`\n )\n .action((layer, options) => {\n return listCommand(layer, { ...options, json: options.json ?? program.opts().json });\n });\n\nprogram\n .command(\"search <query>\")\n .description(\"Search for elements by name or ID\")\n .option(\"--layer <layer>\", \"Limit search to specific layer\")\n .option(\"--type <type>\", \"Filter by element type\")\n .option(\n \"--source-file <path>\",\n \"Find elements referencing a source file (takes precedence over pattern matching)\"\n )\n .option(\"--json\", \"Output as JSON\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ dr search customer\n $ dr search \"order processing\" --layer business\n $ dr search create-* --type endpoint\n $ dr search \"\" --source-file src/api/customer.ts`\n )\n .action((query, options) => {\n return searchCommand(query, { ...options, json: options.json ?? program.opts().json });\n });\n\nprogram\n .command(\"validate\")\n .description(\"Validate the architecture model\")\n .option(\"--layers <layers...>\", \"Specific layers to validate\")\n .option(\"--strict\", \"Treat warnings as errors\")\n .option(\"--verbose\", \"Show detailed validation output with relationship breakdown\")\n .option(\"--quiet\", \"Show minimal output\")\n .option(\"--output <path>\", \"Export validation report to file (JSON or Markdown)\")\n .option(\"--model <path>\", \"Path to model root (contains model/manifest.yaml)\")\n .option(\"--orphans\", \"Show only orphaned elements grouped by layer with relationship suggestions\")\n .option(\"--all\", \"Run all validations (default behavior)\")\n .option(\"--markdown\", \"Validate markdown structure\")\n .option(\"--schemas\", \"Validate JSON schemas\")\n .option(\"--schema\", \"Validate JSON schemas (alias for --schemas)\")\n .option(\"--relationships\", \"Validate relationships\")\n .option(\"--structure\", \"Validate documentation structure\")\n .option(\"--naming\", \"Validate naming conventions\")\n .option(\"--references\", \"Validate cross-layer references\")\n .option(\"--scope <scope>\", \"Validation scope: 'local' (default) or 'composed' for cross-model validation\")\n .option(\"--model-path <mapping...>\", \"Override filesystem path for external model (format: model-name=/path/to/project-root, can be repeated)\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ dr validate\n $ dr validate --all --strict\n $ dr validate --verbose\n $ dr validate --quiet\n $ dr validate --output report.json\n $ dr validate --output report.md\n $ dr validate --schemas\n $ dr validate --relationships\n $ dr validate --layers business api\n $ dr validate --orphans\n $ dr validate --orphans --output orphans.json\n $ dr validate --scope composed --model-path auth-service=/path/to/auth-service-repo\n $ dr validate --scope composed --model-path auth-service=/path/to/auth-service-repo --model-path payment-service=/path/to/payment-repo\n\nNote: When using --model-path, pass the project root (where documentation-robotics/model/ is located).`\n )\n .action(validateCommand);\n\nprogram\n .command(\"export <format>\")\n .description(\"Export the architecture model to various formats\")\n .option(\"--output <path>\", \"Output file path (default: print to stdout)\")\n .option(\"--layers <layers...>\", \"Specific layers to export\")\n .option(\"--model <path>\", \"Path to model root directory or manifest.yaml file\")\n .option(\"--include-sources\", \"Include source file paths in PlantUML diagrams as notes\")\n .addHelpText(\n \"after\",\n `\nSupported formats:\n archimate Export to ArchiMate XML (layers 1, 2, 5, 6)\n openapi Export to OpenAPI 3.0 specification (layer 7)\n jsonschema Export to JSON Schema (layer 8)\n plantuml Export to PlantUML diagram\n graphml Export to GraphML (graph visualization)\n markdown Export to Markdown documentation\n\nExamples:\n $ dr export archimate --output model.xml\n $ dr export openapi --layers api\n $ dr export plantuml --include-sources --output diagram.puml\n $ dr export markdown --output docs/architecture.md`\n )\n .action(async (format, options) => {\n await exportCommand({\n format,\n output: options.output,\n layers: options.layers,\n model: options.model,\n includeSources: options.includeSources,\n });\n });\n\nprogram\n .command(\"import <format>\")\n .description(\"Import architecture model from various formats\")\n .option(\"--input <path>\", \"Input file path (required)\", undefined)\n .option(\"--model <path>\", \"Path to model root directory or manifest.yaml file\")\n .option(\n \"--merge-strategy <strategy>\",\n \"How to handle existing elements: add, update, skip (default: add)\"\n )\n .addHelpText(\n \"after\",\n `\nSupported formats:\n archimate Import from ArchiMate XML (layers 1, 2, 5, 6)\n openapi Import from OpenAPI 3.0 specification (layer 7)\n\nExamples:\n $ dr import archimate --input model.xml\n $ dr import openapi --input api.json --merge-strategy add\n $ dr import archimate --input model.xml --model ./myproject`\n )\n .action(async (format, options) => {\n if (!options.input) {\n console.error(\"Error: --input path is required\");\n process.exit(1);\n }\n await importCommand({\n format,\n input: options.input,\n model: options.model,\n mergeStrategy: options.mergeStrategy as \"add\" | \"update\" | \"skip\" | undefined,\n });\n });\n\nprogram\n .command(\"info\")\n .description(\"Show model information\")\n .option(\"--layer <layer>\", \"Show specific layer details\")\n .option(\"--verbose\", \"Show detailed breakdown by element type\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ dr info\n $ dr info --layer business\n $ dr info --layer api --verbose`\n )\n .action(infoCommand);\n\nprogram\n .command(\"stats\")\n .description(\"Display model statistics and health metrics\")\n .option(\"--model <path>\", \"Path to the model directory\")\n .option(\"--format <format>\", \"Output format: text (default), json, markdown, compact\")\n .option(\"--output <path>\", \"Output file path (auto-detects format from extension)\")\n .option(\"--compact\", \"Show compact one-line summary\")\n .option(\"--verbose\", \"Show detailed information\")\n .addHelpText(\n \"after\",\n `\nOutput formats:\n text Full formatted statistics (default)\n json JSON output for automation\n markdown Markdown report format\n compact Single-line summary\n\nExamples:\n $ dr stats # Show full statistics\n $ dr stats --compact # Show one-line summary\n $ dr stats --format json # Output as JSON\n $ dr stats --output stats.md # Save as markdown file\n $ dr stats --output stats.json # Save as JSON file\n $ dr stats --verbose # Show detailed information`\n )\n .action((options) => statsCommand(options));\n\nprogram\n .command(\"report\")\n .description(\"Generate comprehensive architecture reports\")\n .option(\"--model <path>\", \"Path to the model directory\")\n .option(\"--type <type>\", \"Report type: comprehensive (default), statistics, relationships, data-model, quality\")\n .option(\"--format <format>\", \"Output format: text (default), json, markdown\")\n .option(\"--output <path>\", \"Output file path (auto-detects format from extension)\")\n .option(\"--verbose\", \"Show detailed information\")\n .option(\"--include-data-model\", \"Include data model analysis (default: true)\")\n .option(\"--include-quality\", \"Include quality metrics (default: true)\")\n .addHelpText(\n \"after\",\n `\nReport types:\n comprehensive Full report with statistics, relationships, and data model (default)\n statistics Statistics and quality metrics\n relationships Relationship analysis and classification\n data-model Layer 8 data model analysis\n quality Quality metrics and recommendations\n\nOutput formats:\n text Full formatted report (default)\n json JSON output for automation\n markdown Markdown report format\n\nExamples:\n $ dr report # Show comprehensive report\n $ dr report --type relationships # Show relationship analysis\n $ dr report --format json # Output as JSON\n $ dr report --output report.md # Save as markdown file\n $ dr report --type data-model --output dm.md # Data model report as markdown\n $ dr report --verbose # Show detailed information`\n )\n .action((options) => reportCommand(options));\n\n// Reports subcommands (managed layer report files)\nconst reportsGroup = program.command(\"reports\").description(\"Manage architecture layer reports\");\nreportsCommands(reportsGroup);\n\n// Audit command - Relationship analysis\nprogram\n .command(\"audit [layer]\")\n .description(\"Analyze relationship coverage, gaps, duplicates, and balance\")\n .option(\"--type <type>\", \"Audit type: relationships (default), nodes, all\")\n .option(\"--format <format>\", \"Output format: text (default), json, markdown\")\n .option(\"--output <path>\", \"Output file path (auto-detects format from extension)\")\n .option(\"--verbose\", \"Show detailed analysis\")\n .option(\"--save-snapshot\", \"Save audit report as snapshot for differential analysis\")\n .addHelpText(\n \"after\",\n `\nAudit types:\n relationships Relationship coverage, gaps, duplicates, balance (default)\n nodes Node type usage distribution across model layers\n all Both relationship and node audits\n\nOutput formats:\n text Full formatted audit report (default)\n json JSON output for automation\n markdown Markdown audit report format\n\nExamples:\n $ dr audit # Full relationship audit of all layers\n $ dr audit security # Audit security layer only\n $ dr audit --type nodes # Node type distribution audit\n $ dr audit --type all # Combined relationship + node audit\n $ dr audit --format json # Output as JSON\n $ dr audit --output audit.md # Save as markdown file\n $ dr audit --verbose # Show detailed analysis\n $ dr audit --save-snapshot # Save snapshot for later comparison\n $ dr audit api --output api-audit.json # API layer audit as JSON`\n )\n .action((layer, options) =>\n auditCommand({ ...options, layer, verbose: options.verbose ?? program.opts().verbose }));\n\n// Audit diff command - Compare snapshots\nprogram\n .command(\"audit:diff\")\n .description(\"Compare before/after audit snapshots\")\n .option(\"--before <id>\", \"Before snapshot ID or timestamp\")\n .option(\"--after <id>\", \"After snapshot ID or timestamp\")\n .option(\"--format <format>\", \"Output format: text (default), json, markdown\")\n .option(\"--output <path>\", \"Output file path\")\n .option(\"--verbose\", \"Show detailed comparison\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ dr audit:diff # Compare latest two snapshots\n $ dr audit:diff --before 20260220-100000 --after 20260220-150000\n $ dr audit:diff --format markdown --output diff.md\n $ dr audit:diff --verbose # Show detailed changes`\n )\n .action((options) => auditDiffCommand(options));\n\n// Audit snapshots command - Manage snapshots\nprogram\n .command(\"audit:snapshots <action>\")\n .description(\"Manage audit snapshots (list, delete, clear)\")\n .option(\"--id <id>\", \"Snapshot ID (for delete action)\")\n .addHelpText(\n \"after\",\n `\nActions:\n list List all available snapshots\n delete Delete a specific snapshot (requires --id)\n clear Delete all snapshots\n\nExamples:\n $ dr audit:snapshots list\n $ dr audit:snapshots delete --id 20260220-100000\n $ dr audit:snapshots clear`\n )\n .action((action, options) => auditSnapshotsCommand({ ...options, action }));\n\n// Repair command - Detect and recover data lost to fixed data-integrity bugs\nprogram\n .command(\"repair:attribute-collision\")\n .description(\n 'Find and best-effort-recover model data lost to a fixed bug where saveLayer() stripped \"source\"/\"x-source-reference\" attributes from every element, even when a node type\\'s schema declared one as a real (sometimes required) attribute'\n )\n .option(\"--apply\", \"Restore recoverable values found in changeset history (default: report only)\")\n .option(\"--format <format>\", \"Output format: text (default), json\")\n .option(\"--output <path>\", \"Write the report to a file instead of stdout\")\n .addHelpText(\n \"after\",\n `\nThis repairs damage from a fixed bug in Model.saveLayer(): a hardcoded, type-blind \"internal\nfields\" blocklist unconditionally stripped any attribute literally named \"source\" or\n\"x-source-reference\" from every element's attributes before writing YAML, regardless of whether\nthe element's own schema declared it as a real domain attribute. 41 of 191 node schemas across 8\nlayers do (3 mark it required, meaning affected elements fail validation today).\n\nRecovery is best-effort: values can only be restored if they still exist in changeset history\n(committing a changeset does not delete it). Elements with no recoverable value are always\nreported, never fabricated \u2014 you'll need to re-supply those manually with\n\"dr update <id> --attributes '{...}'\".\n\nExamples:\n $ dr repair:attribute-collision # Report only \u2014 no changes made\n $ dr repair:attribute-collision --apply # Restore every recoverable value\n $ dr repair:attribute-collision --format json --output report.json`\n )\n .action((options) => repairAttributeCollisionCommand(options));\n\n// Relationship subcommands\nconst relationshipGroup = program.command(\"relationship\").description(\"Relationship operations\");\nrelationshipCommands(relationshipGroup, program);\n\n// Element subcommands\nconst elementGroup = program.command(\"element\").description(\"Element operations\");\nelementCommands(elementGroup, program);\n\n// Schema introspection subcommands\nschemaCommands(program);\n\n// Catalog subcommands (modern relationship catalog)\ncatalogCommands(program);\n\n// Documentation subcommands (schema-driven generation)\ndocsCommands(program);\n\n// Dependency analysis commands\nprogram\n .command(\"trace <elementId>\")\n .description(\"Trace dependencies for an element\")\n .option(\n \"--direction <dir>\",\n \"Trace direction: up (dependencies), down (dependents), both (default)\"\n )\n .option(\"--depth <num>\", \"Maximum traversal depth\")\n .option(\"--metrics\", \"Show graph and element metrics\")\n .option(\"--model <path>\", \"Path to model root (contains model/manifest.yaml)\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ dr trace api-endpoint-create-customer\n $ dr trace business-service-order --direction down --metrics\n $ dr trace application-component-api --depth 3`\n )\n .action(async (elementId, options) => {\n await traceCommand(elementId, {\n direction: options.direction as \"up\" | \"down\" | \"both\" | undefined,\n depth: options.depth ? parseInt(options.depth) : undefined,\n showMetrics: options.metrics,\n model: options.model,\n });\n });\n\nprogram\n .command(\"visualize\")\n .description(\"Launch visualization server with WebSocket support\")\n .option(\"--port <num>\", \"Server port (default: 8080)\")\n .option(\"--no-browser\", \"Do not auto-open browser\")\n .option(\"--no-auth\", \"Disable authentication (enabled by default)\")\n .option(\"--token <token>\", \"Custom auth token (auto-generated by default)\")\n .option(\"--with-danger\", \"Enable dangerous mode for chat (skip permissions)\")\n .option(\n \"--viewer-path <path>\",\n \"Path to custom viewer build (e.g., ./dist/embedded/dr-viewer-bundle)\"\n )\n .addHelpText(\n \"after\",\n `\nExamples:\n $ dr visualize\n $ dr visualize --port 3000\n $ dr visualize --no-browser\n $ dr visualize --no-auth\n $ dr visualize --token my-secret-token\n $ dr visualize --with-danger\n $ dr visualize --viewer-path ./dist/embedded/dr-viewer-bundle\n\nDefault mode (read-safe permissions) enables:\n - Running 'dr' CLI commands to query the architecture model\n - Reading the codebase\n - Reading the documentation-robotics/ model folder\n - Reading the .dr/ configuration folder\n\nDangerous mode (--with-danger) enables unrestricted access:\n - Claude Code: --dangerously-skip-permissions (full tool access)\n - GitHub Copilot: --allow-all-tools (full tool access)\n\nThe --viewer-path option allows loading a local build of the web UI:\n - Point to a directory containing index.html and supporting files\n - Useful for developing custom viewers or using bundled distributions`\n )\n .action(async (options) => {\n const { visualizeCommand } = await import(\"./commands/visualize.js\");\n await visualizeCommand({\n port: options.port,\n noBrowser: options.browser === false, // Commander sets 'browser' to false when --no-browser is used\n noAuth: options.auth === false, // Commander sets 'auth' to false when --no-auth is used\n token: options.token,\n withDanger: options.withDanger,\n viewerPath: options.viewerPath,\n });\n });\n\nprogram\n .command(\"mcp\")\n .description(\"Start MCP server for AI assistant integration\")\n .option(\n \"--regenerate-key\",\n \"Generate a new MCP API key, overwrite it at the configured storage path, and print it (does not start the server)\"\n )\n .option(\n \"--transport <type>\",\n \"Transport type: stdio or http (default: stdio)\",\n \"stdio\"\n )\n .option(\n \"--port <number>\",\n \"Port for HTTP transport (default: 3100, only meaningful with --transport http)\",\n \"3100\"\n )\n .option(\n \"--host <address>\",\n \"Host address for HTTP transport (default: 127.0.0.1, only meaningful with --transport http)\",\n \"127.0.0.1\"\n )\n .addHelpText(\n \"after\",\n `\nExamples:\n\nStdio transport (default):\n $ dr mcp\n\nHTTP transport:\n $ dr mcp --transport http # HTTP on localhost:3100\n $ dr mcp --transport http --port 8200 # HTTP on custom port\n $ dr mcp --transport http --host 0.0.0.0 --port 3100 # Listen on all interfaces\n\nKey management:\n $ dr mcp --regenerate-key # Generate new API key\n\nInitial Setup:\nOn first launch, generates an API key and asks where to store it (interactive\nsessions only; non-interactive launches default to ~/.dr-mcp-key). The key is\nprinted to stderr on every launch and must be supplied via environment variable.\n\nStdio Configuration:\nFor stdio transport, supply the key via environment variable:\n\n {\n \"command\": \"dr\",\n \"args\": [\"mcp\"],\n \"env\": { \"DR_MCP_API_KEY\": \"<your-api-key>\" }\n }\n\nHTTP Configuration:\nFor HTTP transport, include the API key as a Bearer token in the Authorization header:\n\n {\n \"url\": \"http://localhost:3100/mcp\",\n \"headers\": {\n \"Authorization\": \"Bearer <your-api-key>\"\n }\n }\n\nUse --regenerate-key to rotate the key (e.g. after a suspected leak) without\nmanually deleting the stored key file or config.`\n )\n .action(async (options) => {\n const { mcpCommand } = await import(\"./commands/mcp.js\");\n const transport = (options.transport as string).toLowerCase();\n if (transport !== \"stdio\" && transport !== \"http\") {\n throw new CLIError(`Invalid transport: ${transport}. Allowed values: stdio, http`, 1);\n }\n const port = parseInt(options.port as string, 10);\n if (!Number.isFinite(port) || port < 1 || port > 65535) {\n throw new CLIError(`Invalid port: ${options.port}. Must be a number between 1 and 65535`, 1);\n }\n await mcpCommand({\n regenerateKey: options.regenerateKey,\n transport: transport as \"stdio\" | \"http\",\n port,\n host: options.host as string,\n });\n });\n\n// AI Integration command\nprogram\n .command(\"chat [client] [withDanger]\")\n .description(\"Interactive chat with AI about the architecture model\")\n .addHelpText(\n \"after\",\n `\nArguments:\n client Optional AI client to use: \"claude-code\" or \"github-copilot\"\n withDanger Enable dangerous mode: \"with-danger\"\n\nExamples:\n $ dr chat # Auto-detect or use saved preference\n $ dr chat claude-code # Use Claude Code, save as preference\n $ dr chat github-copilot # Use GitHub Copilot, save as preference\n $ dr chat with-danger # Auto-detect with dangerous mode\n $ dr chat claude-code with-danger # Use Claude Code with dangerous mode\n $ dr chat github-copilot with-danger # Use GitHub Copilot with dangerous mode\n\nDefault mode (read-safe permissions) enables:\n - Running 'dr' CLI commands to query the architecture model\n - Reading the codebase\n - Reading the documentation-robotics/ model folder\n - Reading the .dr/ configuration folder\n\nDangerous mode (--with-danger) enables unrestricted access:\n - Claude Code: --dangerously-skip-permissions (full tool access)\n - GitHub Copilot: --allow-all-tools (full tool access)\n\nThis launches an interactive chat interface where you can ask AI questions\nabout your architecture model. Supports Claude Code CLI and GitHub Copilot CLI.\n\nInstall instructions:\n - Claude Code: https://claude.ai\n - GitHub Copilot: gh extension install github/gh-copilot`\n )\n .action(async (client?: string, withDangerArg?: string) => {\n // Parse arguments - handle both \"with-danger\" as first or second arg\n let selectedClient: string | undefined;\n let withDanger = false;\n\n if (client === \"with-danger\") {\n // Format: dr chat with-danger\n withDanger = true;\n selectedClient = undefined;\n } else if (withDangerArg === \"with-danger\") {\n // Format: dr chat <client> with-danger\n withDanger = true;\n selectedClient = client;\n } else {\n // Format: dr chat <client>\n selectedClient = client;\n }\n\n await chatCommand(selectedClient, withDanger);\n });\n\n// Advanced commands\nprogram\n .command(\"version\")\n .description(\"Show CLI and embedded spec version information\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ dr version`\n )\n .action(async () => {\n await versionCommand();\n });\n\nprogram\n .command(\"upgrade\")\n .description(\"Upgrade spec reference and migrate model to latest versions\")\n .option(\"-y, --yes\", \"Automatically upgrade without prompting\")\n .option(\"--dry-run\", \"Show what would be upgraded without making changes\")\n .option(\"--force\", \"Force all upgrades regardless of current versions; skips migration validation\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ dr upgrade # Scan, show plan, and prompt for upgrades\n $ dr upgrade --dry-run # Preview available upgrades\n $ dr upgrade --yes # Upgrade without prompting\n $ dr upgrade --force # Force all upgrades, ignoring version checks`\n )\n .action(async (options) => {\n await upgradeCommand({\n yes: options.yes,\n dryRun: options.dryRun,\n force: options.force,\n });\n });\n\nprogram\n .command(\"conformance\")\n .description(\"Check model conformance to layer specifications\")\n .option(\"--layers <layers...>\", \"Specific layers to check\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--verbose\", \"Verbose output\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ dr conformance\n $ dr conformance --layers business api application\n $ dr conformance --json\n $ dr conformance --verbose`\n )\n .action(async (options) => {\n await conformanceCommand({\n layers: options.layers,\n json: options.json ?? program.opts().json,\n verbose: options.verbose ?? program.opts().verbose,\n });\n });\n\n// Changeset subcommands\nchangesetCommands(program);\n\n// Farm subcommands\nfarmCommands(program);\n\n// Claude Code integration subcommands\nclaudeCommands(program);\n\n// GitHub Copilot integration subcommands\ncopilotCommands(program);\n\n// Analyzer integration subcommands\nanalyzerCommands(program);\n\n// Execute CLI with proper telemetry span wrapping\n// This creates a root span that all child spans will be linked to\n(async () => {\n let exitCode = 0;\n try {\n if (isTelemetryEnabled) {\n // Initialize telemetry before execution\n await initTelemetry();\n\n // Only install console interceptor for commands that need it\n const commandName = process.argv[2] || \"unknown\";\n if (CONSOLE_LOGGING_COMMANDS.has(commandName)) {\n await installConsoleInterceptor();\n }\n\n const args = process.argv.slice(3).join(\" \");\n\n // Wrap entire CLI execution in active span for proper context propagation\n await startActiveSpan(\n \"cli.execute\",\n async (span) => {\n // Attributes already set via options parameter - no duplicate setAttributes needed\n try {\n // Execute command - all child spans will now link to this root span\n await program.parseAsync(process.argv);\n\n // Set success status\n span.setStatus({ code: 0 }); // SpanStatusCode.OK\n } catch (error) {\n // Record exception and set error status\n // CommanderError with exitCode 0 is help text / unknown subcommand shown \u2014 not a real error\n if (error instanceof CommanderError) {\n if (error.exitCode === 0) {\n span.setStatus({ code: 0 }); // SpanStatusCode.OK\n } else {\n span.recordException(error as Error);\n span.setStatus({\n code: 2, // SpanStatusCode.ERROR\n message: error.message,\n });\n }\n } else {\n span.recordException(error as Error);\n span.setStatus({\n code: 2, // SpanStatusCode.ERROR\n message: getErrorMessage(error),\n });\n }\n\n // Print error message for CLIError instances\n // Skip CommanderError \u2014 Commander already printed its own output (e.g. help text, unknown command)\n const { CLIError } = await import(\"./utils/errors.js\");\n const { isJson } = await import(\"./utils/globals.js\");\n if (error instanceof CommanderError) {\n // Commander handled its own output; nothing to print\n } else if (error instanceof CLIError) {\n // In JSON mode, handleError already output structured JSON; skip text formatting\n if (!isJson()) {\n console.error(error.format());\n }\n } else if (error instanceof Error) {\n console.error(error.message);\n } else {\n console.error(String(error));\n }\n\n // Extract exit code from CLIError if available\n exitCode = await extractExitCode(error);\n // Don't throw - let telemetry shutdown complete\n }\n },\n {\n \"cli.command\": commandName,\n \"cli.args\": args,\n \"cli.cwd\": process.cwd(),\n \"cli.version\": cliVersion,\n }\n );\n\n // Shutdown telemetry after execution completes\n await shutdownTelemetry();\n\n // Exit with exit code (keepAlive disabled in exporters prevents hanging)\n process.exit(exitCode);\n } else {\n // No telemetry - just parse normally with error handling\n try {\n await program.parseAsync(process.argv);\n } catch (error) {\n // Extract exit code from CLIError if available\n // Skip CommanderError \u2014 Commander already printed its own output (e.g. help text, unknown command)\n const { CLIError } = await import(\"./utils/errors.js\");\n const { isJson } = await import(\"./utils/globals.js\");\n if (error instanceof CommanderError) {\n // Commander handled its own output; nothing to print\n } else if (error instanceof CLIError) {\n // In JSON mode, handleError already output structured JSON; skip text formatting\n if (!isJson()) {\n console.error(error.format());\n }\n } else {\n // Unexpected exceptions need to be printed\n if (error instanceof Error) {\n console.error(error.message);\n } else {\n console.error(String(error));\n }\n }\n const exitCodeFromError = await extractExitCode(error);\n process.exit(exitCodeFromError);\n }\n }\n } catch (error) {\n // Error during telemetry init or shutdown\n if (!isTelemetryEnabled) {\n // No telemetry - exit immediately with error\n process.exit(1);\n }\n // Telemetry enabled - try to shutdown before exit\n await shutdownTelemetry();\n process.exit(1);\n }\n})();\n"],
|
|
5
|
-
"mappings": ";AAUA,SAAS,SAAS,sBAAsB;AACxC,SAAS,wBAAwB;AACjC,SAAS,6BAA6B;AACtC,SAAS,mBAAmB;AAC5B,SAAS,kBAAkB;AAC3B,SAAS,qBAAqB;AAC9B,SAAS,qBAAqB;AAC9B,SAAS,mBAAmB;AAC5B,SAAS,mBAAmB;AAC5B,SAAS,qBAAqB;AAC9B,SAAS,uBAAuB;AAChC,SAAS,mBAAmB;AAC5B,SAAS,4BAA4B;AACrC,SAAS,uBAAuB;AAChC,SAAS,sBAAsB;AAC/B,SAAS,uBAAuB;AAChC,SAAS,oBAAoB;AAC7B,SAAS,oBAAoB;AAC7B,SAAS,qBAAqB;AAC9B,SAAS,qBAAqB;AAC9B,SAAS,mBAAmB;AAC5B,SAAS,sBAAsB;AAC/B,SAAS,0BAA0B;AACnC,SAAS,yBAAyB;AAClC,SAAS,oBAAoB;AAC7B,SAAS,sBAAsB;AAC/B,SAAS,uBAAuB;AAChC,SAAS,wBAAwB;AACjC,SAAS,sBAAsB;AAC/B,SAAS,oBAAoB;AAC7B,SAAS,qBAAqB;AAC9B,SAAS,uBAAuB;AAChC,SAAS,oBAAoB;AAC7B,SAAS,wBAAwB;AACjC,SAAS,6BAA6B;AACtC,SAAS,uCAAuC;AAChD,SAAS,eAAe,iBAAiB,yBAAyB;AAClE,SAAS,iCAAiC;AAC1C,SAAS,iBAAiB,gBAAgB;AAC1C,SAAS,qBAAqB;AAK9B,MAAM,qBAAgE,IAGhE,2BAA2B,oBAAI,IAAI,CAAC,QAAQ,YAAY,UAAU,QAAQ,CAAC;AAG5E,QAAQ,OAAO,UAClB,QAAQ,IAAI,cAAc,KAC1B,QAAQ,IAAI,WAAW,MAIzB,sBAAqB;AAMrB,eAAe,gBAAgB,OAAc;AAC3C,QAAM,EAAE,UAAAA,UAAQ,IAAK,MAAM,OAAO,mBAAmB;AAQrD,MANI,iBAAiBA,aAMjB,iBAAiB;AACnB,WAAO,MAAM;AAIf,MAAI,SAAS,OAAO,SAAU,YAAY,cAAc,OAAO;AAC7D,UAAM,WAAW;AACjB,QAAI,OAAO,SAAS,YAAa,aAE3B,SAAS,SAAS,cAAc,SAAS;AAC3C,aAAI,QAAQ,KAAK,SAAS,SAAS,KACjC,QAAQ,KACN,8FAA8F,GAG3F,SAAS;EAGtB;AAEA,SAAO;AACT;AAEA,MAAM,aAAa,cAAa,GAE1B,UAAU,IAAI,QAAO;CAIvB,QAAQ,KAAK,SAAS,WAAW,KAAK,QAAQ,KAAK,SAAS,IAAI,OAClE,QAAQ,OAAO,CAAC,QAAQ,MAAM,SAAS,IAGzC,QACG,KAAK,IAAI,EACT,YAAY,4DAA4D,EACxE,OAAO,iBAAiB,uBAAuB,EAC/C,OAAO,WAAW,mBAAmB,EACrC,OAAO,UAAU,2DAA2D,EAC5E,OAAO,0BAA0B,+EAA+E,EAChH,aAAY,EACZ,yBAAwB,EACxB,KAAK,aAAa,OAAO,gBAAe;AAEvC,QAAM,UAAU,YAAY,KAAI;AAChC,mBAAiB;IACf,SAAS,QAAQ;IACjB,OAAO,QAAQ;IACf,MAAM,QAAQ;IACd,cAAc,QAAQ;GACvB;AACH,CAAC,GAGH,QACG,QAAQ,aAAa,EACrB,YAAY,qCAAqC,EACjD,OAAO,iBAAiB,4CAA4C,EACpE,OAAO,qBAAqB,cAAc,EAC1C,OAAO,wBAAwB,mBAAmB,EAClD,YACC,SACA;;;;;yEAKqE,EAEtE,OAAO,CAAC,MAAM,YAAY,YAAY,EAAE,GAAG,SAAS,MAAM,QAAQ,QAAQ,KAAI,CAAE,CAAC,GAEpF,QACG,QAAQ,2BAA2B,EACnC,YAAY,2BAA2B,EACvC,OAAO,kBAAkB,mDAAmD,EAC5E,OAAO,iBAAiB,sDAAsD,EAC9E,OAAO,wBAAwB,qBAAqB,EACpD,OAAO,uBAAuB,iDAAiD,EAC/E,OAAO,wBAAwB,kDAAkD,EACjF,OAAO,0BAA0B,wDAAwD,EACzF,OAAO,8BAA8B,yDAAyD,EAC9F,OAAO,8BAA8B,uCAAuC,EAC5E,OAAO,8BAA8B,2DAA2D,EAChG,OAAO,aAAa,oDAAoD,EACxE,YACC,SACA;;;;;;;oFAOgF,EAEjF,OAAO,CAAC,OAAO,MAAM,MAAM,YAC1B,WAAW,OAAO,MAAM,MAAM,EAAE,GAAG,SAAS,SAAS,QAAQ,WAAW,QAAQ,KAAI,EAAG,QAAO,CAAE,CAAC,GAErG,QACG,QAAQ,aAAa,EACrB,YAAY,mBAAmB,EAC/B,OAAO,kBAAkB,mDAAmD,EAC5E,OAAO,iBAAiB,kBAAkB,EAC1C,OAAO,wBAAwB,iBAAiB,EAChD,OAAO,qBAAqB,kHAAkH,EAC9I,OAAO,uBAAuB,yCAAyC,EACvE,OAAO,wBAAwB,kDAAkD,EACjF,OAAO,0BAA0B,wDAAwD,EACzF,OAAO,8BAA8B,yDAAyD,EAC9F,OAAO,8BAA8B,uCAAuC,EAC5E,OAAO,8BAA8B,2DAA2D,EAChG,OAAO,4BAA4B,sCAAsC,EACzE,OAAO,aAAa,oDAAoD,EACxE,YACC,SACA;;;;;;;;;sGASkG,EAEnG,OAAO,CAAC,IAAI,YACX,cAAc,IAAI,EAAE,GAAG,SAAS,SAAS,QAAQ,WAAW,QAAQ,KAAI,EAAG,QAAO,CAAE,CAAC,GAEzF,QACG,QAAQ,aAAa,EACrB,YAAY,mBAAmB,EAC/B,OAAO,kBAAkB,mDAAmD,EAC5E,OAAO,WAAW,+EAA+E,EACjG,OAAO,aAAa,yCAAyC,EAC7D,OAAO,aAAa,sDAAsD,EAC1E,OAAO,aAAa,oDAAoD,EACxE,YACC,SACA;;;;;;4DAMwD,EAEzD,OAAO,CAAC,IAAI,YACX,cAAc,IAAI,EAAE,GAAG,SAAS,SAAS,QAAQ,WAAW,QAAQ,KAAI,EAAG,QAAO,CAAE,CAAC,GAEzF,QACG,QAAQ,WAAW,EACnB,YAAY,yBAAyB,EACrC,OAAO,kBAAkB,mDAAmD,EAC5E,YACC,SACA;;;wCAGoC,EAErC,OAAO,CAAC,IAAI,YAAY,YAAY,IAAI,OAAO,CAAC,GAEnD,QACG,QAAQ,cAAc,EACtB,YAAY,qDAAqD,EACjE,OAAO,iBAAiB,wBAAwB,EAChD,OAAO,UAAU,gBAAgB,EACjC,OAAO,kBAAkB,mDAAmD,EAC5E,YACC,SACA;;;;;;mBAMe,EAEhB,OAAO,CAAC,OAAO,YACP,YAAY,OAAO,EAAE,GAAG,SAAS,MAAM,QAAQ,QAAQ,QAAQ,KAAI,EAAG,KAAI,CAAE,CACpF,GAEH,QACG,QAAQ,gBAAgB,EACxB,YAAY,mCAAmC,EAC/C,OAAO,mBAAmB,gCAAgC,EAC1D,OAAO,iBAAiB,wBAAwB,EAChD,OACC,wBACA,kFAAkF,EAEnF,OAAO,UAAU,gBAAgB,EACjC,YACC,SACA;;;;;mDAK+C,EAEhD,OAAO,CAAC,OAAO,YACP,cAAc,OAAO,EAAE,GAAG,SAAS,MAAM,QAAQ,QAAQ,QAAQ,KAAI,EAAG,KAAI,CAAE,CACtF,GAEH,QACG,QAAQ,UAAU,EAClB,YAAY,iCAAiC,EAC7C,OAAO,wBAAwB,6BAA6B,EAC5D,OAAO,YAAY,0BAA0B,EAC7C,OAAO,aAAa,6DAA6D,EACjF,OAAO,WAAW,qBAAqB,EACvC,OAAO,mBAAmB,qDAAqD,EAC/E,OAAO,kBAAkB,mDAAmD,EAC5E,OAAO,aAAa,4EAA4E,EAChG,OAAO,SAAS,wCAAwC,EACxD,OAAO,cAAc,6BAA6B,EAClD,OAAO,aAAa,uBAAuB,EAC3C,OAAO,YAAY,6CAA6C,EAChE,OAAO,mBAAmB,wBAAwB,EAClD,OAAO,eAAe,kCAAkC,EACxD,OAAO,YAAY,6BAA6B,EAChD,OAAO,gBAAgB,iCAAiC,EACxD,OAAO,mBAAmB,8EAA8E,EACxG,OAAO,6BAA6B,yGAAyG,EAC7I,YACC,SACA;;;;;;;;;;;;;;;;uGAgBmG,EAEpG,OAAO,eAAe,GAEzB,QACG,QAAQ,iBAAiB,EACzB,YAAY,kDAAkD,EAC9D,OAAO,mBAAmB,6CAA6C,EACvE,OAAO,wBAAwB,2BAA2B,EAC1D,OAAO,kBAAkB,oDAAoD,EAC7E,OAAO,qBAAqB,yDAAyD,EACrF,YACC,SACA;;;;;;;;;;;;;qDAaiD,EAElD,OAAO,OAAO,QAAQ,YAAW;AAChC,QAAM,cAAc;IAClB;IACA,QAAQ,QAAQ;IAChB,QAAQ,QAAQ;IAChB,OAAO,QAAQ;IACf,gBAAgB,QAAQ;GACzB;AACH,CAAC,GAEH,QACG,QAAQ,iBAAiB,EACzB,YAAY,gDAAgD,EAC5D,OAAO,kBAAkB,8BAA8B,MAAS,EAChE,OAAO,kBAAkB,oDAAoD,EAC7E,OACC,+BACA,mEAAmE,EAEpE,YACC,SACA;;;;;;;;8DAQ0D,EAE3D,OAAO,OAAO,QAAQ,YAAW;AAChC,EAAK,QAAQ,UACX,QAAQ,MAAM,iCAAiC,GAC/C,QAAQ,KAAK,CAAC,IAEhB,MAAM,cAAc;IAClB;IACA,OAAO,QAAQ;IACf,OAAO,QAAQ;IACf,eAAe,QAAQ;GACxB;AACH,CAAC,GAEH,QACG,QAAQ,MAAM,EACd,YAAY,wBAAwB,EACpC,OAAO,mBAAmB,6BAA6B,EACvD,OAAO,aAAa,yCAAyC,EAC7D,YACC,SACA;;;;kCAI8B,EAE/B,OAAO,WAAW,GAErB,QACG,QAAQ,OAAO,EACf,YAAY,6CAA6C,EACzD,OAAO,kBAAkB,6BAA6B,EACtD,OAAO,qBAAqB,wDAAwD,EACpF,OAAO,mBAAmB,uDAAuD,EACjF,OAAO,aAAa,+BAA+B,EACnD,OAAO,aAAa,2BAA2B,EAC/C,YACC,SACA;;;;;;;;;;;;;mEAa+D,EAEhE,OAAO,CAAC,YAAY,aAAa,OAAO,CAAC,GAE5C,QACG,QAAQ,QAAQ,EAChB,YAAY,6CAA6C,EACzD,OAAO,kBAAkB,6BAA6B,EACtD,OAAO,iBAAiB,sFAAsF,EAC9G,OAAO,qBAAqB,+CAA+C,EAC3E,OAAO,mBAAmB,uDAAuD,EACjF,OAAO,aAAa,2BAA2B,EAC/C,OAAO,wBAAwB,6CAA6C,EAC5E,OAAO,qBAAqB,yCAAyC,EACrE,YACC,SACA;;;;;;;;;;;;;;;;;;;+EAmB2E,EAE5E,OAAO,CAAC,YAAY,cAAc,OAAO,CAAC;AAG7C,MAAM,eAAe,QAAQ,QAAQ,SAAS,EAAE,YAAY,mCAAmC;AAC/F,gBAAgB,YAAY,GAG5B,QACG,QAAQ,eAAe,EACvB,YAAY,8DAA8D,EAC1E,OAAO,iBAAiB,iDAAiD,EACzE,OAAO,qBAAqB,+CAA+C,EAC3E,OAAO,mBAAmB,uDAAuD,EACjF,OAAO,aAAa,wBAAwB,EAC5C,OAAO,mBAAmB,yDAAyD,EACnF,YACC,SACA;;;;;;;;;;;;;;;;;;;;oEAoBgE,EAEjE,OAAO,CAAC,OAAO,YACd,aAAa,EAAE,GAAG,SAAS,OAAO,SAAS,QAAQ,WAAW,QAAQ,KAAI,EAAG,QAAO,CAAE,CAAC,GAG3F,QACG,QAAQ,YAAY,EACpB,YAAY,sCAAsC,EAClD,OAAO,iBAAiB,iCAAiC,EACzD,OAAO,gBAAgB,gCAAgC,EACvD,OAAO,qBAAqB,+CAA+C,EAC3E,OAAO,mBAAmB,kBAAkB,EAC5C,OAAO,aAAa,0BAA0B,EAC9C,YACC,SACA;;;;;2EAKuE,EAExE,OAAO,CAAC,YAAY,iBAAiB,OAAO,CAAC,GAGhD,QACG,QAAQ,0BAA0B,EAClC,YAAY,8CAA8C,EAC1D,OAAO,aAAa,iCAAiC,EACrD,YACC,SACA;;;;;;;;;6BASyB,EAE1B,OAAO,CAAC,QAAQ,YAAY,sBAAsB,EAAE,GAAG,SAAS,OAAM,CAAE,CAAC,GAG5E,QACG,QAAQ,4BAA4B,EACpC,YACC,0OAA2O,EAE5O,OAAO,WAAW,8EAA8E,EAChG,OAAO,qBAAqB,qCAAqC,EACjE,OAAO,mBAAmB,8CAA8C,EACxE,YACC,SACA;;;;;;;;;;;;;;;qEAeiE,EAElE,OAAO,CAAC,YAAY,gCAAgC,OAAO,CAAC;AAG/D,MAAM,oBAAoB,QAAQ,QAAQ,cAAc,EAAE,YAAY,yBAAyB;AAC/F,qBAAqB,mBAAmB,OAAO;AAG/C,MAAM,eAAe,QAAQ,QAAQ,SAAS,EAAE,YAAY,oBAAoB;AAChF,gBAAgB,cAAc,OAAO,GAGrC,eAAe,OAAO,GAGtB,gBAAgB,OAAO,GAGvB,aAAa,OAAO,GAGpB,QACG,QAAQ,mBAAmB,EAC3B,YAAY,mCAAmC,EAC/C,OACC,qBACA,uEAAuE,EAExE,OAAO,iBAAiB,yBAAyB,EACjD,OAAO,aAAa,gCAAgC,EACpD,OAAO,kBAAkB,mDAAmD,EAC5E,YACC,SACA;;;;iDAI6C,EAE9C,OAAO,OAAO,WAAW,YAAW;AACnC,QAAM,aAAa,WAAW;IAC5B,WAAW,QAAQ;IACnB,OAAO,QAAQ,QAAQ,SAAS,QAAQ,KAAK,IAAI;IACjD,aAAa,QAAQ;IACrB,OAAO,QAAQ;GAChB;AACH,CAAC,GAEH,QACG,QAAQ,WAAW,EACnB,YAAY,oDAAoD,EAChE,OAAO,gBAAgB,6BAA6B,EACpD,OAAO,gBAAgB,0BAA0B,EACjD,OAAO,aAAa,6CAA6C,EACjE,OAAO,mBAAmB,+CAA+C,EACzE,OAAO,iBAAiB,mDAAmD,EAC3E,OACC,wBACA,sEAAsE,EAEvE,YACC,SACA;;;;;;;;;;;;;;;;;;;;;;wEAsBoE,EAErE,OAAO,OAAO,YAAW;AACxB,QAAM,EAAE,iBAAgB,IAAK,MAAM,OAAO,yBAAyB;AACnE,QAAM,iBAAiB;IACrB,MAAM,QAAQ;IACd,WAAW,QAAQ,YAAY;;IAC/B,QAAQ,QAAQ,SAAS;;IACzB,OAAO,QAAQ;IACf,YAAY,QAAQ;IACpB,YAAY,QAAQ;GACrB;AACH,CAAC,GAEH,QACG,QAAQ,KAAK,EACb,YAAY,+CAA+C,EAC3D,OACC,oBACA,mHAAmH,EAEpH,OACC,sBACA,kDACA,OAAO,EAER,OACC,mBACA,kFACA,MAAM,EAEP,OACC,oBACA,+FACA,WAAW,EAEZ,YACC,SACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iDAuC6C,EAE9C,OAAO,OAAO,YAAW;AACxB,QAAM,EAAE,WAAU,IAAK,MAAM,OAAO,mBAAmB,GACjD,YAAa,QAAQ,UAAqB,YAAW;AAC3D,MAAI,cAAc,WAAW,cAAc;AACzC,UAAM,IAAI,SAAS,sBAAsB,SAAS,iCAAiC,CAAC;AAEtF,QAAM,OAAO,SAAS,QAAQ,MAAgB,EAAE;AAChD,MAAI,CAAC,OAAO,SAAS,IAAI,KAAK,OAAO,KAAK,OAAO;AAC/C,UAAM,IAAI,SAAS,iBAAiB,QAAQ,IAAI,0CAA0C,CAAC;AAE7F,QAAM,WAAW;IACf,eAAe,QAAQ;IACvB;IACA;IACA,MAAM,QAAQ;GACf;AACH,CAAC,GAGH,QACG,QAAQ,4BAA4B,EACpC,YAAY,uDAAuD,EACnE,YACC,SACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;2DA4BuD,EAExD,OAAO,OAAO,QAAiB,kBAA0B;AAExD,MAAI,gBACA,aAAa;AAEjB,EAAI,WAAW,iBAEb,aAAa,IACb,iBAAiB,WACR,kBAAkB,kBAE3B,aAAa,KACb,iBAAiB,SAMnB,MAAM,YAAY,gBAAgB,UAAU;AAC9C,CAAC,GAGH,QACG,QAAQ,SAAS,EACjB,YAAY,gDAAgD,EAC5D,YACC,SACA;;eAEW,EAEZ,OAAO,YAAW;AACjB,QAAM,eAAc;AACtB,CAAC,GAEH,QACG,QAAQ,SAAS,EACjB,YAAY,6DAA6D,EACzE,OAAO,aAAa,yCAAyC,EAC7D,OAAO,aAAa,oDAAoD,EACxE,OAAO,WAAW,+EAA+E,EACjG,YACC,SACA;;;;;0EAKsE,EAEvE,OAAO,OAAO,YAAW;AACxB,QAAM,eAAe;IACnB,KAAK,QAAQ;IACb,QAAQ,QAAQ;IAChB,OAAO,QAAQ;GAChB;AACH,CAAC,GAEH,QACG,QAAQ,aAAa,EACrB,YAAY,iDAAiD,EAC7D,OAAO,wBAAwB,0BAA0B,EACzD,OAAO,UAAU,gBAAgB,EACjC,OAAO,aAAa,gBAAgB,EACpC,YACC,SACA;;;;;6BAKyB,EAE1B,OAAO,OAAO,YAAW;AACxB,QAAM,mBAAmB;IACvB,QAAQ,QAAQ;IAChB,MAAM,QAAQ,QAAQ,QAAQ,KAAI,EAAG;IACrC,SAAS,QAAQ,WAAW,QAAQ,KAAI,EAAG;GAC5C;AACH,CAAC,GAGH,kBAAkB,OAAO,GAGzB,aAAa,OAAO,GAGpB,eAAe,OAAO,GAGtB,gBAAgB,OAAO,GAGvB,iBAAiB,OAAO,IAIvB,YAAW;AACV,MAAI,WAAW;AACf,MAAI;AACF,QAAI,oBAAoB;AAEtB,YAAM,cAAa;AAGnB,YAAM,cAAc,QAAQ,KAAK,CAAC,KAAK;AACvC,MAAI,yBAAyB,IAAI,WAAW,KAC1C,MAAM,0BAAyB;AAGjC,YAAM,OAAO,QAAQ,KAAK,MAAM,CAAC,EAAE,KAAK,GAAG;AAG3C,YAAM,gBACJ,eACA,OAAO,SAAQ;AAEb,YAAI;AAEF,gBAAM,QAAQ,WAAW,QAAQ,IAAI,GAGrC,KAAK,UAAU,EAAE,MAAM,EAAC,CAAE;QAC5B,SAAS,OAAO;AAGd,UAAI,iBAAiB,iBACf,MAAM,aAAa,IACrB,KAAK,UAAU,EAAE,MAAM,EAAC,CAAE,KAE1B,KAAK,gBAAgB,KAAc,GACnC,KAAK,UAAU;YACb,MAAM;;YACN,SAAS,MAAM;WAChB,MAGH,KAAK,gBAAgB,KAAc,GACnC,KAAK,UAAU;YACb,MAAM;;YACN,SAAS,gBAAgB,KAAK;WAC/B;AAKH,gBAAM,EAAE,UAAAA,UAAQ,IAAK,MAAM,OAAO,mBAAmB,GAC/C,EAAE,OAAM,IAAK,MAAM,OAAO,oBAAoB;AACpD,UAAI,iBAAiB,mBAEV,iBAAiBA,YAErB,OAAM,KACT,QAAQ,MAAM,MAAM,OAAM,CAAE,IAErB,iBAAiB,QAC1B,QAAQ,MAAM,MAAM,OAAO,IAE3B,QAAQ,MAAM,OAAO,KAAK,CAAC,IAI7B,WAAW,MAAM,gBAAgB,KAAK;QAExC;MACF,GACA;QACE,eAAe;QACf,YAAY;QACZ,WAAW,QAAQ,IAAG;QACtB,eAAe;OAChB,GAIH,MAAM,kBAAiB,GAGvB,QAAQ,KAAK,QAAQ;IACvB;AAEE,UAAI;AACF,cAAM,QAAQ,WAAW,QAAQ,IAAI;MACvC,SAAS,OAAO;AAGd,cAAM,EAAE,UAAAA,UAAQ,IAAK,MAAM,OAAO,mBAAmB,GAC/C,EAAE,OAAM,IAAK,MAAM,OAAO,oBAAoB;AACpD,QAAI,iBAAiB,mBAEV,iBAAiBA,YAErB,OAAM,KACT,QAAQ,MAAM,MAAM,OAAM,CAAE,IAI1B,iBAAiB,QACnB,QAAQ,MAAM,MAAM,OAAO,IAE3B,QAAQ,MAAM,OAAO,KAAK,CAAC;AAG/B,cAAM,oBAAoB,MAAM,gBAAgB,KAAK;AACrD,gBAAQ,KAAK,iBAAiB;MAChC;EAEJ,QAAgB;AAEd,IAAK,sBAEH,QAAQ,KAAK,CAAC,GAGhB,MAAM,kBAAiB,GACvB,QAAQ,KAAK,CAAC;EAChB;AACF,GAAE;",
|
|
4
|
+
"sourcesContent": ["#!/usr/bin/env node\n\n/**\n * Documentation Robotics CLI - Bun Implementation\n * Entry point for the command-line interface\n *\n * Instrumented with OpenTelemetry to create root spans for command execution.\n * Telemetry is controlled by the TELEMETRY_ENABLED build-time constant.\n */\n\nimport { Command, CommanderError } from \"commander\";\nimport { setGlobalOptions } from \"./utils/globals.js\";\nimport { installAnsiSuppressor } from \"./utils/ansi-suppressor.js\";\nimport { initCommand } from \"./commands/init.js\";\nimport { addCommand } from \"./commands/add.js\";\nimport { updateCommand } from \"./commands/update.js\";\nimport { deleteCommand } from \"./commands/delete.js\";\nimport { showCommand } from \"./commands/show.js\";\nimport { listCommand } from \"./commands/list.js\";\nimport { searchCommand } from \"./commands/search.js\";\nimport { validateCommand } from \"./commands/validate.js\";\nimport { infoCommand } from \"./commands/info.js\";\nimport { relationshipCommands } from \"./commands/relationship.js\";\nimport { elementCommands } from \"./commands/element.js\";\nimport { schemaCommands } from \"./commands/schema.js\";\nimport { catalogCommands } from \"./commands/catalog.js\";\nimport { docsCommands } from \"./commands/docs.js\";\nimport { traceCommand } from \"./commands/trace.js\";\nimport { exportCommand } from \"./commands/export.js\";\nimport { importCommand } from \"./commands/import.js\";\nimport { chatCommand } from \"./commands/chat.js\";\nimport { upgradeCommand } from \"./commands/upgrade.js\";\nimport { conformanceCommand } from \"./commands/conformance.js\";\nimport { changesetCommands } from \"./commands/changeset.js\";\nimport { farmCommands } from \"./commands/farm.js\";\nimport { claudeCommands } from \"./commands/claude.js\";\nimport { copilotCommands } from \"./commands/copilot.js\";\nimport { analyzerCommands } from \"./commands/analyzer.js\";\nimport { versionCommand } from \"./commands/version.js\";\nimport { statsCommand } from \"./commands/stats.js\";\nimport { reportCommand } from \"./commands/report.js\";\nimport { reportsCommands } from \"./commands/reports.js\";\nimport { auditCommand } from \"./commands/audit.js\";\nimport { auditDiffCommand } from \"./commands/audit-diff.js\";\nimport { auditSnapshotsCommand } from \"./commands/audit-snapshots.js\";\nimport { repairAttributeCollisionCommand } from \"./commands/repair.js\";\nimport { initTelemetry, startActiveSpan, shutdownTelemetry } from \"./telemetry/index.js\";\nimport { installConsoleInterceptor } from \"./telemetry/console-interceptor.js\";\nimport { getErrorMessage, CLIError } from \"./utils/errors.js\";\nimport { getCliVersion } from \"./utils/spec-version.js\";\n\n// Declare TELEMETRY_ENABLED as a build-time constant (substituted by esbuild)\n// Provide runtime fallback when not running through esbuild\ndeclare const TELEMETRY_ENABLED: boolean;\nconst isTelemetryEnabled = typeof TELEMETRY_ENABLED !== \"undefined\" ? TELEMETRY_ENABLED : false;\n\n// Commands that require console interceptor for telemetry logging\nconst CONSOLE_LOGGING_COMMANDS = new Set(['chat', 'validate', 'import', 'export']);\n\n// Suppress ANSI color output on non-TTY stdout\nif (!process.stdout.isTTY) {\n process.env.FORCE_COLOR = \"0\";\n process.env.NO_COLOR = \"1\";\n}\n\n// Install the ANSI suppressor to strip color codes from console output when not on TTY\ninstallAnsiSuppressor();\n\n/**\n * Extract exit code from an error object.\n * Handles CLIError instances and duck-typed objects with exitCode property.\n */\nasync function extractExitCode(error: unknown): Promise<number> {\n const { CLIError } = await import(\"./utils/errors.js\");\n\n if (error instanceof CLIError) {\n return error.exitCode;\n }\n\n // Commander's own errors (--help, unknown commands, etc.) carry exitCode as\n // expected control flow \u2014 handle them directly without duck-typing.\n if (error instanceof CommanderError) {\n return error.exitCode;\n }\n\n // Fallback for duck-typing (handles bundling/module issues)\n if (error && typeof error === \"object\" && \"exitCode\" in error) {\n const errorObj = error as any;\n if (typeof errorObj.exitCode === \"number\") {\n // Validate this looks like a CLIError before accepting\n if (errorObj.name === \"CLIError\" || errorObj.message) {\n if (process.argv.includes(\"--debug\")) {\n console.warn(\n \"[DEBUG] Using duck-typed error object as fallback - this may indicate a module loading issue\"\n );\n }\n return errorObj.exitCode;\n }\n }\n }\n\n return 1;\n}\n\nconst cliVersion = getCliVersion();\n\nconst program = new Command();\n\n// Handle --version and -V flags by redirecting to version command\n// This ensures they go through the telemetry wrapper\nif (process.argv.includes(\"--version\") || process.argv.includes(\"-V\")) {\n process.argv = [\"node\", \"dr\", \"version\"];\n}\n\nprogram\n .name(\"dr\")\n .description(\"Documentation Robotics CLI - Architecture Model Management\")\n .option(\"-v, --verbose\", \"Enable verbose output\")\n .option(\"--debug\", \"Enable debug mode\")\n .option(\"--json\", \"Output as JSON (supported on mutating and query commands)\")\n .option(\"--codebase-path <path>\", \"Override codebase root path (default: resolved from manifest or project root)\")\n .exitOverride() // Prevent Commander from calling process.exit() - we handle exit ourselves\n .showSuggestionAfterError() // \"Did you mean X?\" on unknown commands/options\n .hook(\"preAction\", async (thisCommand) => {\n // Set up global state (verbose/debug/json flags)\n const options = thisCommand.opts();\n setGlobalOptions({\n verbose: options.verbose as boolean | undefined,\n debug: options.debug as boolean | undefined,\n json: options.json as boolean | undefined,\n codebasePath: options.codebasePath as string | undefined,\n });\n });\n\n// Model commands\nprogram\n .command(\"init [name]\")\n .description(\"Initialize a new architecture model\")\n .option(\"--name <name>\", \"Model name (overrides positional argument)\")\n .option(\"--author <author>\", \"Model author\")\n .option(\"--description <desc>\", \"Model description\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ dr init\n $ dr init claudetoreum\n $ dr init \"Enterprise Architecture\" --author \"Team A\"\n $ dr init --name \"My Project\" --description \"13-layer federated model\"`\n )\n .action((name, options) => initCommand({ ...options, name: options.name || name }));\n\nprogram\n .command(\"add <layer> <type> <name>\")\n .description(\"Add an element to a layer\")\n .option(\"--model <path>\", \"Path to model root (contains model/manifest.yaml)\")\n .option(\"--name <name>\", \"Element display name (defaults to the name argument)\")\n .option(\"--description <desc>\", \"Element description\")\n .option(\"--attributes <json>\", \"Element type-specific attributes as JSON object\")\n .option(\"--source-file <path>\", \"Source file path (relative from repository root)\")\n .option(\"--source-symbol <name>\", \"Symbol name (class, function, variable) in source file\")\n .option(\"--source-provenance <type>\", \"Provenance type: extracted, manual, inferred, generated\")\n .option(\"--source-repo-remote <url>\", \"Git remote URL for repository context\")\n .option(\"--source-repo-commit <sha>\", \"Git commit SHA (40 hex characters) for repository context\")\n .option(\"--verbose\", \"Show detailed output (can also use global -v flag)\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ dr add business service \"Customer Management\"\n $ dr add api operation \"Create Customer\" --attributes '{\"operationId\":\"createCustomer\",\"summary\":\"Create a customer\",\"tags\":\"customers\"}'\n $ dr add application component \"Customer API\" --description \"REST API for customer operations\"\n $ dr add security policy \"Auth Validator\" --source-file \"src/auth/validator.ts\" --source-symbol \"validateToken\" --source-provenance \"extracted\"\n\nNote: Element IDs are generated automatically in format {layer}.{type}.{kebab-name}`\n )\n .action((layer, type, name, options) =>\n addCommand(layer, type, name, { ...options, verbose: options.verbose ?? program.opts().verbose }));\n\nprogram\n .command(\"update <id>\")\n .description(\"Update an element\")\n .option(\"--model <path>\", \"Path to model root (contains model/manifest.yaml)\")\n .option(\"--name <name>\", \"New element name\")\n .option(\"--description <desc>\", \"New description\")\n .option(\"--type <new-type>\", \"Change element type (must be valid for the element's layer; incompatible attributes must be cleaned up manually)\")\n .option(\"--attributes <json>\", \"Updated type-specific attributes (JSON)\")\n .option(\"--attribute-patch <json>\", \"Merge these attributes into the current ones (JSON object; null removes a key). Cannot be combined with --attributes\")\n .option(\"--source-file <path>\", \"Source file path (relative from repository root)\")\n .option(\"--source-symbol <name>\", \"Symbol name (class, function, variable) in source file\")\n .option(\"--source-provenance <type>\", \"Provenance type: extracted, manual, inferred, generated\")\n .option(\"--source-repo-remote <url>\", \"Git remote URL for repository context\")\n .option(\"--source-repo-commit <sha>\", \"Git commit SHA (40 hex characters) for repository context\")\n .option(\"--clear-source-reference\", \"Remove source reference from element\")\n .option(\"--verbose\", \"Show detailed output (can also use global -v flag)\")\n .addHelpText(\n \"after\",\n `\nNote: Changes are written immediately to model files.\nTo track changes for review, activate a changeset first:\n $ dr changeset activate my-changeset\n\nExamples:\n $ dr update api-endpoint-create-customer --name \"Create Customer (v2)\"\n $ dr update business-service-order --description \"Updated description\"\n $ dr update application-applicationfunction-process-orders --type applicationservice\n $ dr update api.operation.create-customer --attribute-patch '{\"summary\":\"Create a customer (v2)\"}'\n $ dr update security-policy-auth --source-file \"src/auth/policy.ts\" --source-provenance \"extracted\"`\n )\n .action((id, options) =>\n updateCommand(id, { ...options, verbose: options.verbose ?? program.opts().verbose }));\n\nprogram\n .command(\"delete <id>\")\n .description(\"Delete an element\")\n .option(\"--model <path>\", \"Path to model root (contains model/manifest.yaml)\")\n .option(\"--force\", \"Skip dependency checks (confirmation is also skipped in non-TTY environments)\")\n .option(\"--cascade\", \"Remove dependent elements automatically\")\n .option(\"--dry-run\", \"Show what would be removed without actually removing\")\n .option(\"--verbose\", \"Show detailed output (can also use global -v flag)\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ dr delete api-endpoint-old-endpoint\n $ dr delete api-endpoint-old-endpoint --force\n $ dr delete api-endpoint-old-endpoint --cascade\n $ dr delete api-endpoint-old-endpoint --dry-run\n $ dr delete api-endpoint-old-endpoint --cascade --dry-run`\n )\n .action((id, options) =>\n deleteCommand(id, { ...options, verbose: options.verbose ?? program.opts().verbose }));\n\nprogram\n .command(\"show <id>\")\n .description(\"Display element details\")\n .option(\"--model <path>\", \"Path to model root (contains model/manifest.yaml)\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ dr show api-endpoint-create-customer\n $ dr show business-service-order-mgmt`\n )\n .action((id, options) => showCommand(id, options));\n\nprogram\n .command(\"list [layer]\")\n .description(\"List elements in a layer (or all layers if omitted)\")\n .option(\"--type <type>\", \"Filter by element type\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--model <path>\", \"Path to model root (contains model/manifest.yaml)\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ dr list\n $ dr list api\n $ dr list business --type businessservice\n $ dr list api --json\n $ dr list --json`\n )\n .action((layer, options) => {\n return listCommand(layer, { ...options, json: options.json ?? program.opts().json });\n });\n\nprogram\n .command(\"search <query>\")\n .description(\"Search for elements by name or ID\")\n .option(\"--layer <layer>\", \"Limit search to specific layer\")\n .option(\"--type <type>\", \"Filter by element type\")\n .option(\n \"--source-file <path>\",\n \"Find elements referencing a source file (takes precedence over pattern matching)\"\n )\n .option(\"--json\", \"Output as JSON\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ dr search customer\n $ dr search \"order processing\" --layer business\n $ dr search create-* --type endpoint\n $ dr search \"\" --source-file src/api/customer.ts`\n )\n .action((query, options) => {\n return searchCommand(query, { ...options, json: options.json ?? program.opts().json });\n });\n\nprogram\n .command(\"validate\")\n .description(\"Validate the architecture model\")\n .option(\"--layers <layers...>\", \"Specific layers to validate\")\n .option(\"--strict\", \"Treat warnings as errors\")\n .option(\"--verbose\", \"Show detailed validation output with relationship breakdown\")\n .option(\"--quiet\", \"Show minimal output\")\n .option(\"--output <path>\", \"Export validation report to file (JSON or Markdown)\")\n .option(\"--model <path>\", \"Path to model root (contains model/manifest.yaml)\")\n .option(\"--orphans\", \"Show only orphaned elements grouped by layer with relationship suggestions\")\n .option(\"--all\", \"Run all validations (default behavior)\")\n .option(\"--markdown\", \"Validate markdown structure\")\n .option(\"--schemas\", \"Validate JSON schemas\")\n .option(\"--schema\", \"Validate JSON schemas (alias for --schemas)\")\n .option(\"--relationships\", \"Validate relationships\")\n .option(\"--structure\", \"Validate documentation structure\")\n .option(\"--naming\", \"Validate naming conventions\")\n .option(\"--references\", \"Validate cross-layer references\")\n .option(\"--scope <scope>\", \"Validation scope: 'local' (default) or 'composed' for cross-model validation\")\n .option(\"--model-path <mapping...>\", \"Override filesystem path for external model (format: model-name=/path/to/project-root, can be repeated)\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ dr validate\n $ dr validate --all --strict\n $ dr validate --verbose\n $ dr validate --quiet\n $ dr validate --output report.json\n $ dr validate --output report.md\n $ dr validate --schemas\n $ dr validate --relationships\n $ dr validate --layers business api\n $ dr validate --orphans\n $ dr validate --orphans --output orphans.json\n $ dr validate --scope composed --model-path auth-service=/path/to/auth-service-repo\n $ dr validate --scope composed --model-path auth-service=/path/to/auth-service-repo --model-path payment-service=/path/to/payment-repo\n\nNote: When using --model-path, pass the project root (where documentation-robotics/model/ is located).`\n )\n .action(validateCommand);\n\nprogram\n .command(\"export <format>\")\n .description(\"Export the architecture model to various formats\")\n .option(\"--output <path>\", \"Output file path (default: print to stdout)\")\n .option(\"--layers <layers...>\", \"Specific layers to export\")\n .option(\"--model <path>\", \"Path to model root directory or manifest.yaml file\")\n .option(\"--include-sources\", \"Include source file paths in PlantUML diagrams as notes\")\n .addHelpText(\n \"after\",\n `\nSupported formats:\n archimate Export to ArchiMate XML (layers 1, 2, 5, 6)\n openapi Export to OpenAPI 3.0 specification (layer 7)\n jsonschema Export to JSON Schema (layer 8)\n plantuml Export to PlantUML diagram\n graphml Export to GraphML (graph visualization)\n markdown Export to Markdown documentation\n\nExamples:\n $ dr export archimate --output model.xml\n $ dr export openapi --layers api\n $ dr export plantuml --include-sources --output diagram.puml\n $ dr export markdown --output docs/architecture.md`\n )\n .action(async (format, options) => {\n await exportCommand({\n format,\n output: options.output,\n layers: options.layers,\n model: options.model,\n includeSources: options.includeSources,\n });\n });\n\nprogram\n .command(\"import <format>\")\n .description(\"Import architecture model from various formats\")\n .option(\"--input <path>\", \"Input file path (required)\", undefined)\n .option(\"--model <path>\", \"Path to model root directory or manifest.yaml file\")\n .option(\n \"--merge-strategy <strategy>\",\n \"How to handle existing elements: add, update, skip (default: add)\"\n )\n .addHelpText(\n \"after\",\n `\nSupported formats:\n archimate Import from ArchiMate XML (layers 1, 2, 5, 6)\n openapi Import from OpenAPI 3.0 specification (layer 7)\n\nExamples:\n $ dr import archimate --input model.xml\n $ dr import openapi --input api.json --merge-strategy add\n $ dr import archimate --input model.xml --model ./myproject`\n )\n .action(async (format, options) => {\n if (!options.input) {\n console.error(\"Error: --input path is required\");\n process.exit(1);\n }\n await importCommand({\n format,\n input: options.input,\n model: options.model,\n mergeStrategy: options.mergeStrategy as \"add\" | \"update\" | \"skip\" | undefined,\n });\n });\n\nprogram\n .command(\"info\")\n .description(\"Show model information\")\n .option(\"--layer <layer>\", \"Show specific layer details\")\n .option(\"--verbose\", \"Show detailed breakdown by element type\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ dr info\n $ dr info --layer business\n $ dr info --layer api --verbose`\n )\n .action(infoCommand);\n\nprogram\n .command(\"stats\")\n .description(\"Display model statistics and health metrics\")\n .option(\"--model <path>\", \"Path to the model directory\")\n .option(\"--format <format>\", \"Output format: text (default), json, markdown, compact\")\n .option(\"--output <path>\", \"Output file path (auto-detects format from extension)\")\n .option(\"--compact\", \"Show compact one-line summary\")\n .option(\"--verbose\", \"Show detailed information\")\n .addHelpText(\n \"after\",\n `\nOutput formats:\n text Full formatted statistics (default)\n json JSON output for automation\n markdown Markdown report format\n compact Single-line summary\n\nExamples:\n $ dr stats # Show full statistics\n $ dr stats --compact # Show one-line summary\n $ dr stats --format json # Output as JSON\n $ dr stats --output stats.md # Save as markdown file\n $ dr stats --output stats.json # Save as JSON file\n $ dr stats --verbose # Show detailed information`\n )\n .action((options) => statsCommand(options));\n\nprogram\n .command(\"report\")\n .description(\"Generate comprehensive architecture reports\")\n .option(\"--model <path>\", \"Path to the model directory\")\n .option(\"--type <type>\", \"Report type: comprehensive (default), statistics, relationships, data-model, quality\")\n .option(\"--format <format>\", \"Output format: text (default), json, markdown\")\n .option(\"--output <path>\", \"Output file path (auto-detects format from extension)\")\n .option(\"--verbose\", \"Show detailed information\")\n .option(\"--include-data-model\", \"Include data model analysis (default: true)\")\n .option(\"--include-quality\", \"Include quality metrics (default: true)\")\n .addHelpText(\n \"after\",\n `\nReport types:\n comprehensive Full report with statistics, relationships, and data model (default)\n statistics Statistics and quality metrics\n relationships Relationship analysis and classification\n data-model Layer 8 data model analysis\n quality Quality metrics and recommendations\n\nOutput formats:\n text Full formatted report (default)\n json JSON output for automation\n markdown Markdown report format\n\nExamples:\n $ dr report # Show comprehensive report\n $ dr report --type relationships # Show relationship analysis\n $ dr report --format json # Output as JSON\n $ dr report --output report.md # Save as markdown file\n $ dr report --type data-model --output dm.md # Data model report as markdown\n $ dr report --verbose # Show detailed information`\n )\n .action((options) => reportCommand(options));\n\n// Reports subcommands (managed layer report files)\nconst reportsGroup = program.command(\"reports\").description(\"Manage architecture layer reports\");\nreportsCommands(reportsGroup);\n\n// Audit command - Relationship analysis\nprogram\n .command(\"audit [layer]\")\n .description(\"Analyze relationship coverage, gaps, duplicates, and balance\")\n .option(\"--type <type>\", \"Audit type: relationships (default), nodes, all\")\n .option(\"--format <format>\", \"Output format: text (default), json, markdown\")\n .option(\"--output <path>\", \"Output file path (auto-detects format from extension)\")\n .option(\"--verbose\", \"Show detailed analysis\")\n .option(\"--save-snapshot\", \"Save audit report as snapshot for differential analysis\")\n .addHelpText(\n \"after\",\n `\nAudit types:\n relationships Relationship coverage, gaps, duplicates, balance (default)\n nodes Node type usage distribution across model layers\n all Both relationship and node audits\n\nOutput formats:\n text Full formatted audit report (default)\n json JSON output for automation\n markdown Markdown audit report format\n\nExamples:\n $ dr audit # Full relationship audit of all layers\n $ dr audit security # Audit security layer only\n $ dr audit --type nodes # Node type distribution audit\n $ dr audit --type all # Combined relationship + node audit\n $ dr audit --format json # Output as JSON\n $ dr audit --output audit.md # Save as markdown file\n $ dr audit --verbose # Show detailed analysis\n $ dr audit --save-snapshot # Save snapshot for later comparison\n $ dr audit api --output api-audit.json # API layer audit as JSON`\n )\n .action((layer, options) =>\n auditCommand({ ...options, layer, verbose: options.verbose ?? program.opts().verbose }));\n\n// Audit diff command - Compare snapshots\nprogram\n .command(\"audit:diff\")\n .description(\"Compare before/after audit snapshots\")\n .option(\"--before <id>\", \"Before snapshot ID or timestamp\")\n .option(\"--after <id>\", \"After snapshot ID or timestamp\")\n .option(\"--format <format>\", \"Output format: text (default), json, markdown\")\n .option(\"--output <path>\", \"Output file path\")\n .option(\"--verbose\", \"Show detailed comparison\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ dr audit:diff # Compare latest two snapshots\n $ dr audit:diff --before 20260220-100000 --after 20260220-150000\n $ dr audit:diff --format markdown --output diff.md\n $ dr audit:diff --verbose # Show detailed changes`\n )\n .action((options) => auditDiffCommand(options));\n\n// Audit snapshots command - Manage snapshots\nprogram\n .command(\"audit:snapshots <action>\")\n .description(\"Manage audit snapshots (list, delete, clear)\")\n .option(\"--id <id>\", \"Snapshot ID (for delete action)\")\n .addHelpText(\n \"after\",\n `\nActions:\n list List all available snapshots\n delete Delete a specific snapshot (requires --id)\n clear Delete all snapshots\n\nExamples:\n $ dr audit:snapshots list\n $ dr audit:snapshots delete --id 20260220-100000\n $ dr audit:snapshots clear`\n )\n .action((action, options) => auditSnapshotsCommand({ ...options, action }));\n\n// Repair command - Detect and recover data lost to fixed data-integrity bugs\nprogram\n .command(\"repair:attribute-collision\")\n .description(\n 'Find and best-effort-recover model data lost to a fixed bug where saveLayer() stripped \"source\"/\"x-source-reference\" attributes from every element, even when a node type\\'s schema declared one as a real (sometimes required) attribute'\n )\n .option(\"--apply\", \"Restore recoverable values found in changeset history (default: report only)\")\n .option(\"--format <format>\", \"Output format: text (default), json\")\n .option(\"--output <path>\", \"Write the report to a file instead of stdout\")\n .addHelpText(\n \"after\",\n `\nThis repairs damage from a fixed bug in Model.saveLayer(): a hardcoded, type-blind \"internal\nfields\" blocklist unconditionally stripped any attribute literally named \"source\" or\n\"x-source-reference\" from every element's attributes before writing YAML, regardless of whether\nthe element's own schema declared it as a real domain attribute. 41 of 191 node schemas across 8\nlayers do (3 mark it required, meaning affected elements fail validation today).\n\nRecovery is best-effort: values can only be restored if they still exist in changeset history\n(committing a changeset does not delete it). Elements with no recoverable value are always\nreported, never fabricated \u2014 you'll need to re-supply those manually with\n\"dr update <id> --attributes '{...}'\".\n\nExamples:\n $ dr repair:attribute-collision # Report only \u2014 no changes made\n $ dr repair:attribute-collision --apply # Restore every recoverable value\n $ dr repair:attribute-collision --format json --output report.json`\n )\n .action((options) => repairAttributeCollisionCommand(options));\n\n// Relationship subcommands\nconst relationshipGroup = program.command(\"relationship\").description(\"Relationship operations\");\nrelationshipCommands(relationshipGroup, program);\n\n// Element subcommands\nconst elementGroup = program.command(\"element\").description(\"Element operations\");\nelementCommands(elementGroup, program);\n\n// Schema introspection subcommands\nschemaCommands(program);\n\n// Catalog subcommands (modern relationship catalog)\ncatalogCommands(program);\n\n// Documentation subcommands (schema-driven generation)\ndocsCommands(program);\n\n// Dependency analysis commands\nprogram\n .command(\"trace <elementId>\")\n .description(\"Trace dependencies for an element\")\n .option(\n \"--direction <dir>\",\n \"Trace direction: up (dependencies), down (dependents), both (default)\"\n )\n .option(\"--depth <num>\", \"Maximum traversal depth\")\n .option(\"--metrics\", \"Show graph and element metrics\")\n .option(\"--model <path>\", \"Path to model root (contains model/manifest.yaml)\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ dr trace api-endpoint-create-customer\n $ dr trace business-service-order --direction down --metrics\n $ dr trace application-component-api --depth 3`\n )\n .action(async (elementId, options) => {\n await traceCommand(elementId, {\n direction: options.direction as \"up\" | \"down\" | \"both\" | undefined,\n depth: options.depth ? parseInt(options.depth) : undefined,\n showMetrics: options.metrics,\n model: options.model,\n });\n });\n\nprogram\n .command(\"visualize\")\n .description(\"Launch visualization server with WebSocket support\")\n .option(\"--port <num>\", \"Server port (default: 8080)\")\n .option(\"--no-browser\", \"Do not auto-open browser\")\n .option(\"--no-auth\", \"Disable authentication (enabled by default)\")\n .option(\"--token <token>\", \"Custom auth token (auto-generated by default)\")\n .option(\"--with-danger\", \"Enable dangerous mode for chat (skip permissions)\")\n .option(\n \"--with-changesets\",\n \"Let chat stage model changes in a changeset (no commit, apply or delete)\"\n )\n .option(\n \"--viewer-path <path>\",\n \"Path to custom viewer build (e.g., ./dist/embedded/dr-viewer-bundle)\"\n )\n .addHelpText(\n \"after\",\n `\nExamples:\n $ dr visualize\n $ dr visualize --port 3000\n $ dr visualize --no-browser\n $ dr visualize --no-auth\n $ dr visualize --token my-secret-token\n $ dr visualize --with-danger\n $ dr visualize --with-changesets\n $ dr visualize --viewer-path ./dist/embedded/dr-viewer-bundle\n\nDefault mode (read-safe permissions) enables:\n - Running 'dr' CLI commands to query the architecture model\n - Reading the codebase\n - Reading the documentation-robotics/ model folder\n - Reading the .dr/ configuration folder\n\nChangeset mode (--with-changesets, Claude Code) adds to the read-safe mode:\n - Creating, activating and inspecting changesets\n - Staging new elements, element updates and new relationships (dr add,\n dr update, dr relationship add) in the active changeset\n - Never committing, applying, reverting or deleting: those stay with you.\n Writes outside an active changeset are refused.\n\nDangerous mode (--with-danger) enables unrestricted access:\n - Claude Code: --dangerously-skip-permissions (full tool access)\n - GitHub Copilot: --allow-all-tools (full tool access)\n\nThe --viewer-path option allows loading a local build of the web UI:\n - Point to a directory containing index.html and supporting files\n - Useful for developing custom viewers or using bundled distributions`\n )\n .action(async (options) => {\n const { visualizeCommand } = await import(\"./commands/visualize.js\");\n await visualizeCommand({\n port: options.port,\n noBrowser: options.browser === false, // Commander sets 'browser' to false when --no-browser is used\n noAuth: options.auth === false, // Commander sets 'auth' to false when --no-auth is used\n token: options.token,\n withDanger: options.withDanger,\n withChangesets: options.withChangesets,\n viewerPath: options.viewerPath,\n });\n });\n\nprogram\n .command(\"mcp\")\n .description(\"Start MCP server for AI assistant integration\")\n .option(\n \"--regenerate-key\",\n \"Generate a new MCP API key, overwrite it at the configured storage path, and print it (does not start the server)\"\n )\n .option(\n \"--transport <type>\",\n \"Transport type: stdio or http (default: stdio)\",\n \"stdio\"\n )\n .option(\n \"--port <number>\",\n \"Port for HTTP transport (default: 3100, only meaningful with --transport http)\",\n \"3100\"\n )\n .option(\n \"--host <address>\",\n \"Host address for HTTP transport (default: 127.0.0.1, only meaningful with --transport http)\",\n \"127.0.0.1\"\n )\n .addHelpText(\n \"after\",\n `\nExamples:\n\nStdio transport (default):\n $ dr mcp\n\nHTTP transport:\n $ dr mcp --transport http # HTTP on localhost:3100\n $ dr mcp --transport http --port 8200 # HTTP on custom port\n $ dr mcp --transport http --host 0.0.0.0 --port 3100 # Listen on all interfaces\n\nKey management:\n $ dr mcp --regenerate-key # Generate new API key\n\nInitial Setup:\nOn first launch, generates an API key and asks where to store it (interactive\nsessions only; non-interactive launches default to ~/.dr-mcp-key). The key is\nprinted to stderr on every launch and must be supplied via environment variable.\n\nStdio Configuration:\nFor stdio transport, supply the key via environment variable:\n\n {\n \"command\": \"dr\",\n \"args\": [\"mcp\"],\n \"env\": { \"DR_MCP_API_KEY\": \"<your-api-key>\" }\n }\n\nHTTP Configuration:\nFor HTTP transport, include the API key as a Bearer token in the Authorization header:\n\n {\n \"url\": \"http://localhost:3100/mcp\",\n \"headers\": {\n \"Authorization\": \"Bearer <your-api-key>\"\n }\n }\n\nUse --regenerate-key to rotate the key (e.g. after a suspected leak) without\nmanually deleting the stored key file or config.`\n )\n .action(async (options) => {\n const { mcpCommand } = await import(\"./commands/mcp.js\");\n const transport = (options.transport as string).toLowerCase();\n if (transport !== \"stdio\" && transport !== \"http\") {\n throw new CLIError(`Invalid transport: ${transport}. Allowed values: stdio, http`, 1);\n }\n const port = parseInt(options.port as string, 10);\n if (!Number.isFinite(port) || port < 1 || port > 65535) {\n throw new CLIError(`Invalid port: ${options.port}. Must be a number between 1 and 65535`, 1);\n }\n await mcpCommand({\n regenerateKey: options.regenerateKey,\n transport: transport as \"stdio\" | \"http\",\n port,\n host: options.host as string,\n });\n });\n\n// AI Integration command\nprogram\n .command(\"chat [client] [withDanger]\")\n .description(\"Interactive chat with AI about the architecture model\")\n .addHelpText(\n \"after\",\n `\nArguments:\n client Optional AI client to use: \"claude-code\" or \"github-copilot\"\n withDanger Enable dangerous mode: \"with-danger\"\n\nExamples:\n $ dr chat # Auto-detect or use saved preference\n $ dr chat claude-code # Use Claude Code, save as preference\n $ dr chat github-copilot # Use GitHub Copilot, save as preference\n $ dr chat with-danger # Auto-detect with dangerous mode\n $ dr chat claude-code with-danger # Use Claude Code with dangerous mode\n $ dr chat github-copilot with-danger # Use GitHub Copilot with dangerous mode\n\nDefault mode (read-safe permissions) enables:\n - Running 'dr' CLI commands to query the architecture model\n - Reading the codebase\n - Reading the documentation-robotics/ model folder\n - Reading the .dr/ configuration folder\n\nDangerous mode (--with-danger) enables unrestricted access:\n - Claude Code: --dangerously-skip-permissions (full tool access)\n - GitHub Copilot: --allow-all-tools (full tool access)\n\nThis launches an interactive chat interface where you can ask AI questions\nabout your architecture model. Supports Claude Code CLI and GitHub Copilot CLI.\n\nInstall instructions:\n - Claude Code: https://claude.ai\n - GitHub Copilot: gh extension install github/gh-copilot`\n )\n .action(async (client?: string, withDangerArg?: string) => {\n // Parse arguments - handle both \"with-danger\" as first or second arg\n let selectedClient: string | undefined;\n let withDanger = false;\n\n if (client === \"with-danger\") {\n // Format: dr chat with-danger\n withDanger = true;\n selectedClient = undefined;\n } else if (withDangerArg === \"with-danger\") {\n // Format: dr chat <client> with-danger\n withDanger = true;\n selectedClient = client;\n } else {\n // Format: dr chat <client>\n selectedClient = client;\n }\n\n await chatCommand(selectedClient, withDanger);\n });\n\n// Advanced commands\nprogram\n .command(\"version\")\n .description(\"Show CLI and embedded spec version information\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ dr version`\n )\n .action(async () => {\n await versionCommand();\n });\n\nprogram\n .command(\"upgrade\")\n .description(\"Upgrade spec reference and migrate model to latest versions\")\n .option(\"-y, --yes\", \"Automatically upgrade without prompting\")\n .option(\"--dry-run\", \"Show what would be upgraded without making changes\")\n .option(\"--force\", \"Force all upgrades regardless of current versions; skips migration validation\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ dr upgrade # Scan, show plan, and prompt for upgrades\n $ dr upgrade --dry-run # Preview available upgrades\n $ dr upgrade --yes # Upgrade without prompting\n $ dr upgrade --force # Force all upgrades, ignoring version checks`\n )\n .action(async (options) => {\n await upgradeCommand({\n yes: options.yes,\n dryRun: options.dryRun,\n force: options.force,\n });\n });\n\nprogram\n .command(\"conformance\")\n .description(\"Check model conformance to layer specifications\")\n .option(\"--layers <layers...>\", \"Specific layers to check\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--verbose\", \"Verbose output\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ dr conformance\n $ dr conformance --layers business api application\n $ dr conformance --json\n $ dr conformance --verbose`\n )\n .action(async (options) => {\n await conformanceCommand({\n layers: options.layers,\n json: options.json ?? program.opts().json,\n verbose: options.verbose ?? program.opts().verbose,\n });\n });\n\n// Changeset subcommands\nchangesetCommands(program);\n\n// Farm subcommands\nfarmCommands(program);\n\n// Claude Code integration subcommands\nclaudeCommands(program);\n\n// GitHub Copilot integration subcommands\ncopilotCommands(program);\n\n// Analyzer integration subcommands\nanalyzerCommands(program);\n\n// Execute CLI with proper telemetry span wrapping\n// This creates a root span that all child spans will be linked to\n(async () => {\n let exitCode = 0;\n try {\n if (isTelemetryEnabled) {\n // Initialize telemetry before execution\n await initTelemetry();\n\n // Only install console interceptor for commands that need it\n const commandName = process.argv[2] || \"unknown\";\n if (CONSOLE_LOGGING_COMMANDS.has(commandName)) {\n await installConsoleInterceptor();\n }\n\n const args = process.argv.slice(3).join(\" \");\n\n // Wrap entire CLI execution in active span for proper context propagation\n await startActiveSpan(\n \"cli.execute\",\n async (span) => {\n // Attributes already set via options parameter - no duplicate setAttributes needed\n try {\n // Execute command - all child spans will now link to this root span\n await program.parseAsync(process.argv);\n\n // Set success status\n span.setStatus({ code: 0 }); // SpanStatusCode.OK\n } catch (error) {\n // Record exception and set error status\n // CommanderError with exitCode 0 is help text / unknown subcommand shown \u2014 not a real error\n if (error instanceof CommanderError) {\n if (error.exitCode === 0) {\n span.setStatus({ code: 0 }); // SpanStatusCode.OK\n } else {\n span.recordException(error as Error);\n span.setStatus({\n code: 2, // SpanStatusCode.ERROR\n message: error.message,\n });\n }\n } else {\n span.recordException(error as Error);\n span.setStatus({\n code: 2, // SpanStatusCode.ERROR\n message: getErrorMessage(error),\n });\n }\n\n // Print error message for CLIError instances\n // Skip CommanderError \u2014 Commander already printed its own output (e.g. help text, unknown command)\n const { CLIError } = await import(\"./utils/errors.js\");\n const { isJson } = await import(\"./utils/globals.js\");\n if (error instanceof CommanderError) {\n // Commander handled its own output; nothing to print\n } else if (error instanceof CLIError) {\n // In JSON mode, handleError already output structured JSON; skip text formatting\n if (!isJson()) {\n console.error(error.format());\n }\n } else if (error instanceof Error) {\n console.error(error.message);\n } else {\n console.error(String(error));\n }\n\n // Extract exit code from CLIError if available\n exitCode = await extractExitCode(error);\n // Don't throw - let telemetry shutdown complete\n }\n },\n {\n \"cli.command\": commandName,\n \"cli.args\": args,\n \"cli.cwd\": process.cwd(),\n \"cli.version\": cliVersion,\n }\n );\n\n // Shutdown telemetry after execution completes\n await shutdownTelemetry();\n\n // Exit with exit code (keepAlive disabled in exporters prevents hanging)\n process.exit(exitCode);\n } else {\n // No telemetry - just parse normally with error handling\n try {\n await program.parseAsync(process.argv);\n } catch (error) {\n // Extract exit code from CLIError if available\n // Skip CommanderError \u2014 Commander already printed its own output (e.g. help text, unknown command)\n const { CLIError } = await import(\"./utils/errors.js\");\n const { isJson } = await import(\"./utils/globals.js\");\n if (error instanceof CommanderError) {\n // Commander handled its own output; nothing to print\n } else if (error instanceof CLIError) {\n // In JSON mode, handleError already output structured JSON; skip text formatting\n if (!isJson()) {\n console.error(error.format());\n }\n } else {\n // Unexpected exceptions need to be printed\n if (error instanceof Error) {\n console.error(error.message);\n } else {\n console.error(String(error));\n }\n }\n const exitCodeFromError = await extractExitCode(error);\n process.exit(exitCodeFromError);\n }\n }\n } catch (error) {\n // Error during telemetry init or shutdown\n if (!isTelemetryEnabled) {\n // No telemetry - exit immediately with error\n process.exit(1);\n }\n // Telemetry enabled - try to shutdown before exit\n await shutdownTelemetry();\n process.exit(1);\n }\n})();\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["CLIError"]
|
|
7
7
|
}
|
|
@@ -27,7 +27,33 @@ const PERMISSIONS_DEFINITION = [
|
|
|
27
27
|
}
|
|
28
28
|
], DEFAULT_READ_SAFE_PERMISSIONS = Object.freeze(PERMISSIONS_DEFINITION.map((p) => Object.freeze({ ...p })));
|
|
29
29
|
function formatForClaudeCode() {
|
|
30
|
-
return DEFAULT_READ_SAFE_PERMISSIONS.
|
|
30
|
+
return DEFAULT_READ_SAFE_PERMISSIONS.flatMap((p) => p.scope ? p.name === "Bash" ? bashCommands(p.scope).map((command) => `Bash(${command}:*)`) : [`${p.name}(${p.scope})`] : [p.name]).join(",");
|
|
31
|
+
}
|
|
32
|
+
const CHANGESET_WRITE_COMMANDS = Object.freeze([
|
|
33
|
+
"dr changeset create",
|
|
34
|
+
"dr changeset activate",
|
|
35
|
+
"dr changeset deactivate",
|
|
36
|
+
"dr changeset status",
|
|
37
|
+
"dr changeset list",
|
|
38
|
+
"dr changeset show",
|
|
39
|
+
"dr changeset staged",
|
|
40
|
+
"dr changeset stage",
|
|
41
|
+
"dr changeset unstage",
|
|
42
|
+
"dr changeset preview",
|
|
43
|
+
"dr changeset diff",
|
|
44
|
+
"dr add",
|
|
45
|
+
"dr update",
|
|
46
|
+
"dr relationship add",
|
|
47
|
+
"dr relationship list",
|
|
48
|
+
"dr relationship show",
|
|
49
|
+
"dr schema"
|
|
50
|
+
]);
|
|
51
|
+
import { CHANGESET_ONLY_ENV } from "../core/changeset-only-guard.js";
|
|
52
|
+
function formatForClaudeCodeWithChangesets() {
|
|
53
|
+
return [formatForClaudeCode(), ...CHANGESET_WRITE_COMMANDS.map((command) => `Bash(${command}:*)`)].join(",");
|
|
54
|
+
}
|
|
55
|
+
function bashCommands(scope) {
|
|
56
|
+
return scope.split("|").map((command) => command.trim()).filter((command) => command.length > 0);
|
|
31
57
|
}
|
|
32
58
|
function formatForCopilot() {
|
|
33
59
|
return formatForClaudeCode();
|
|
@@ -112,9 +138,13 @@ function applyCopilotPermissions(cmd, variant, copilotCommand, withDanger, onTel
|
|
|
112
138
|
}
|
|
113
139
|
validateReadSafeConstraints();
|
|
114
140
|
export {
|
|
141
|
+
CHANGESET_ONLY_ENV,
|
|
142
|
+
CHANGESET_WRITE_COMMANDS,
|
|
115
143
|
DEFAULT_READ_SAFE_PERMISSIONS,
|
|
116
144
|
applyCopilotPermissions,
|
|
145
|
+
bashCommands,
|
|
117
146
|
formatForClaudeCode,
|
|
147
|
+
formatForClaudeCodeWithChangesets,
|
|
118
148
|
formatForCopilot,
|
|
119
149
|
validatePermissions,
|
|
120
150
|
validateReadSafeConstraints
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/coding-agents/default-permissions.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Default Read-Safe Permissions Module\n *\n * Defines the read-safe permission allowlist for AI agents (Claude Code and GitHub Copilot)\n * when launched in default (non-danger) mode. This module provides a centralized,\n * client-agnostic definition of permitted tools and operations that both integration\n * managers can consume identically, despite their different CLI permission models.\n *\n * Permission Model:\n * - Read-Safe (Default): Limited to read operations and CLI execution\n * - Unrestricted (--with-danger): Full tool access\n *\n * The read-safe allowlist covers exactly four capabilities:\n * 1. Running the `dr` CLI\n * 2. Reading the codebase\n * 3. Reading the `documentation-robotics/` folder\n * 4. Reading the `.dr/` folder\n */\n\nimport { spawnSync } from \"child_process\";\nimport ansis from \"ansis\";\n\n/**\n * Represents a single tool permission with optional scoping\n */\nexport interface ToolPermission {\n /** Name of the tool (e.g., 'Bash', 'Read') */\n name: string;\n\n /** Human-readable description of what this permission allows */\n description: string;\n\n /** Optional directory/file path scope restriction (relative to project root) */\n scope?: string;\n\n /** Whether this tool allows write/modify operations (should be false for read-safe) */\n allowsWrite: boolean;\n}\n\n/**\n * Read-safe permission allowlist for default (non-danger) mode\n *\n * This is the core configuration that defines which tools are available\n * when launched without the --with-danger flag. Both Claude Code and\n * GitHub Copilot integrations consume this identically.\n *\n * IMPORTANT: This array is deeply immutable via Object.freeze() and validated at module load time.\n * Mutating or adding entries after module initialization will not re-validate constraints.\n */\nconst PERMISSIONS_DEFINITION: ToolPermission[] = [\n {\n name: \"Bash\",\n description: \"Execute the dr CLI tool for read-safe model queries\",\n scope: \"dr query|dr show|dr list|dr search|dr export|dr validate|dr info|dr stats|dr report|dr audit|dr chat|dr version|dr conformance\",\n allowsWrite: false,\n },\n {\n name: \"Read\",\n description: \"Read files from the codebase\",\n scope: \".\",\n allowsWrite: false,\n },\n {\n name: \"Read\",\n description: \"Read from the documentation-robotics model folder\",\n scope: \"documentation-robotics\",\n allowsWrite: false,\n },\n {\n name: \"Read\",\n description: \"Read from the dr configuration folder\",\n scope: \".dr\",\n allowsWrite: false,\n },\n];\n\nexport const DEFAULT_READ_SAFE_PERMISSIONS: readonly ToolPermission[] = Object.freeze(\n PERMISSIONS_DEFINITION.map((p) => Object.freeze({ ...p }))\n);\n\n/**\n * Convert read-safe permissions to Claude Code CLI format\n *\n * Claude Code uses the --allowedTools flag with scoped tool permissions.\n * This function formats the permission list as expected by Claude Code's --allowedTools parameter,\n * including scope constraints for each tool (e.g., \"Bash(dr query|dr show|dr list|...),Read(.),Read(documentation-robotics)\").\n *\n * @returns String formatted for Claude Code --allowedTools flag\n */\nexport function formatForClaudeCode(): string {\n // Format each permission as \"ToolName\" or \"ToolName(scope)\" with scope constraints\n const formatted = DEFAULT_READ_SAFE_PERMISSIONS.map((p) => {\n if (p.scope) {\n return `${p.name}(${p.scope})`;\n }\n return p.name;\n });\n return formatted.join(\",\");\n}\n\n/**\n * Convert read-safe permissions to GitHub Copilot CLI format\n *\n * GitHub Copilot CLI may support a --allowedTools flag (or equivalent) for granular permission control.\n * This function formats the permission list similarly to Claude Code for potential future Copilot versions\n * that support granular scoped permissions. If the installed Copilot version doesn't support this flag,\n * the caller should gracefully degrade (e.g., launch without the flag, with a warning).\n *\n * Format: \"Bash(dr query|dr show|dr list|...),Read(.),Read(documentation-robotics),Read(.dr)\"\n *\n * @returns String formatted for Copilot --allowedTools flag (if supported)\n */\nexport function formatForCopilot(): string {\n return formatForClaudeCode();\n}\n\n/**\n * Validate a permission array against read-safe constraints\n *\n * Internal function that validates any permission array. Used by tests to verify\n * that invalid configurations are properly rejected.\n *\n * @param permissions The permission array to validate\n * @throws {Error} If any constraint is violated\n */\nexport function validatePermissions(permissions: readonly ToolPermission[]): void {\n // Constraint 1: Non-empty allowlist\n if (!Array.isArray(permissions) || permissions.length === 0) {\n throw new Error(\n \"Permissions must be a non-empty array\"\n );\n }\n\n // Constraint 2: All permissions must have required fields with correct types\n for (let i = 0; i < permissions.length; i++) {\n const perm = permissions[i];\n\n if (typeof perm.name !== \"string\" || perm.name.length === 0) {\n throw new Error(\n `Permission[${i}].name must be a non-empty string, got: ${typeof perm.name}`\n );\n }\n\n if (typeof perm.description !== \"string\" || perm.description.length === 0) {\n throw new Error(\n `Permission[${i}].description must be a non-empty string, got: ${typeof perm.description}`\n );\n }\n\n if (typeof perm.allowsWrite !== \"boolean\") {\n throw new Error(\n `Permission[${i}].allowsWrite must be a boolean, got: ${typeof perm.allowsWrite}`\n );\n }\n }\n\n // Constraint 3: No permission should allow write operations (read-safe invariant)\n const writePerms = permissions.filter((p) => p.allowsWrite);\n if (writePerms.length > 0) {\n throw new Error(\n `Read-safe permissions must not allow write operations. Found ${writePerms.length} permission(s) with allowsWrite=true`\n );\n }\n\n // Constraint 4: Only Bash and Read tools allowed (allowlist validation, not denylist)\n const allowedToolNames = new Set([\"Bash\", \"Read\"]);\n const disallowedTools = permissions.filter(\n (p) => !allowedToolNames.has(p.name)\n );\n if (disallowedTools.length > 0) {\n throw new Error(\n `Read-safe permissions must only include Bash and Read tools. Found disallowed tool(s): ${disallowedTools.map((p) => p.name).join(\", \")}`\n );\n }\n\n // Constraint 5: Bash must be for dr CLI only with properly restricted scope (no wildcards or bare patterns)\n const bashPerms = permissions.filter((p) => p.name === \"Bash\");\n if (bashPerms.length > 0) {\n const invalidBash = bashPerms.filter((p) => {\n const hasValidDescription = p.description.toLowerCase().includes(\"dr\") && p.description.toLowerCase().includes(\"cli\");\n const hasValidScope = typeof p.scope === \"string\" && p.scope.length > 0;\n\n // Validate scope content: reject bare wildcards and unsafe patterns\n let hasValidScopeContent = true;\n if (hasValidScope) {\n const scope = p.scope;\n // Reject dangerous scope patterns: bare \"*\", \".\", or \"dr *\"\n if (scope === \"*\" || scope === \".\" || scope === \"dr *\" || scope.startsWith(\"dr *\")) {\n hasValidScopeContent = false;\n }\n // Ensure scope starts with \"dr \" for Bash tool\n if (!scope.startsWith(\"dr \")) {\n hasValidScopeContent = false;\n }\n }\n\n return !hasValidDescription || !hasValidScope || !hasValidScopeContent;\n });\n if (invalidBash.length > 0) {\n const errors = invalidBash.map((p) => {\n const issues = [];\n if (!p.description.toLowerCase().includes(\"dr\") || !p.description.toLowerCase().includes(\"cli\")) {\n issues.push(\"invalid description (must include 'dr' and 'cli')\");\n }\n if (typeof p.scope !== \"string\" || p.scope.length === 0) {\n issues.push(\"missing or empty scope\");\n } else {\n const scope = p.scope;\n if (scope === \"*\" || scope === \".\" || scope === \"dr *\" || scope.startsWith(\"dr *\")) {\n issues.push(\"scope uses dangerous wildcard pattern (must specify read-safe commands)\");\n }\n if (!scope.startsWith(\"dr \")) {\n issues.push(\"scope must start with 'dr ' for Bash tool\");\n }\n }\n return `${p.description} (${issues.join(\", \")})`;\n });\n throw new Error(\n `Bash permission must be for dr CLI only with properly restricted scope. Found invalid Bash permission(s): ${errors.join(\"; \")}`\n );\n }\n }\n\n // Constraint 6: Must have Read permission for codebase\n const codebaseRead = permissions.find(\n (p) => p.name === \"Read\" && p.description.toLowerCase().includes(\"codebase\")\n );\n if (!codebaseRead) {\n throw new Error(\"Read-safe permissions must include Read permission for codebase\");\n }\n\n // Constraint 7: Must have Read permission for documentation-robotics folder\n const docRoboticsRead = permissions.find(\n (p) => p.name === \"Read\" && p.description.includes(\"documentation-robotics\")\n );\n if (!docRoboticsRead) {\n throw new Error(\"Read-safe permissions must include Read permission for documentation-robotics folder\");\n }\n\n // Constraint 8: Must have Read permission for .dr folder\n const drFolderRead = permissions.find(\n (p) => p.name === \"Read\" && (p.scope === \".dr\" || p.description.includes(\".dr\"))\n );\n if (!drFolderRead) {\n throw new Error(\"Read-safe permissions must include Read permission for .dr folder\");\n }\n\n // All constraints passed\n}\n\n/**\n * Validate read-safe permission constraints\n *\n * Called during module initialization to verify the permission allowlist maintains\n * its safety invariants: all permissions are read-only, required tools are present,\n * and no dangerous tools are included.\n *\n * Throws an error if constraints are violated, preventing runtime with an invalid configuration.\n *\n * @throws {Error} If any constraint is violated\n */\nexport function validateReadSafeConstraints(): void {\n validatePermissions(DEFAULT_READ_SAFE_PERMISSIONS);\n}\n\n/**\n * Apply Copilot permissions to command arguments with graceful degradation\n *\n * Shared utility for both CopilotClient and VisualizationServer to probe\n * Copilot CLI capability and apply appropriate permission flags.\n * Handles both default mode (read-safe --allowedTools) and danger mode (--allow-all-tools).\n *\n * @param cmd The command array to modify (mutated in place)\n * @param variant Display name for error messages (e.g., \"gh copilot\" or \"copilot\")\n * @param copilotCommand The copilot CLI name (\"copilot\" or \"gh\")\n * @param withDanger Whether to use danger mode (--allow-all-tools)\n * @param onTelemetry Optional callback for telemetry logging\n * @param testSpawnSync Optional injected spawnSync for testing (allows mocking CLI probe)\n */\nexport function applyCopilotPermissions(\n cmd: string[],\n variant: string,\n copilotCommand: string,\n withDanger: boolean,\n onTelemetry?: (attr: string, value: any) => void,\n testSpawnSync?: typeof spawnSync\n): void {\n const spawnSyncFn = testSpawnSync || spawnSync;\n\n if (withDanger) {\n try {\n const helpResult = spawnSyncFn(\n copilotCommand === \"copilot\" ? \"copilot\" : \"gh\",\n copilotCommand === \"copilot\" ? [\"--help\"] : [\"copilot\", \"--help\"],\n { stdio: \"pipe\", encoding: \"utf-8\", timeout: 1000 }\n );\n if (\n helpResult.stdout?.includes(\"--allow-all-tools\") ||\n helpResult.stdout?.includes(\"allow-all-tools\")\n ) {\n cmd.push(\"--allow-all-tools\");\n onTelemetry?.(\"process.allowAllToolsSupported\", true);\n } else {\n onTelemetry?.(\"process.allowAllToolsSupported\", false);\n console.warn(\n ansis.yellow(`Note: --allow-all-tools flag not supported by your ${variant} version`)\n );\n }\n } catch {\n onTelemetry?.(\"process.allowAllToolsCheckFailed\", true);\n console.warn(\n ansis.yellow(\n `WARNING: Could not verify --allow-all-tools support for ${variant}. ` +\n `Launching WITHOUT permission escalation. If you need full tool access, ` +\n `please ensure your ${variant} CLI is up-to-date.`\n )\n );\n }\n } else {\n try {\n const helpResult = spawnSyncFn(\n copilotCommand === \"copilot\" ? \"copilot\" : \"gh\",\n copilotCommand === \"copilot\" ? [\"--help\"] : [\"copilot\", \"--help\"],\n { stdio: \"pipe\", encoding: \"utf-8\", timeout: 1000 }\n );\n\n const helpText = helpResult.stdout || \"\";\n const supportsAllowedTools =\n helpText.includes(\"--allowedTools\") ||\n helpText.includes(\"allowedTools\") ||\n helpText.includes(\"--allowed-tools\") ||\n helpText.includes(\"allowed-tools\");\n\n if (supportsAllowedTools) {\n const allowedToolsValue = formatForCopilot();\n cmd.push(\"--allowedTools\", allowedToolsValue);\n onTelemetry?.(\"process.readSafePermissionsApplied\", true);\n onTelemetry?.(\"process.allowedTools\", allowedToolsValue);\n } else {\n // Flag not advertised in help, but still try to apply it optimistically\n // (fail-safe: try to restrict access even if we're not 100% sure the flag exists)\n const allowedToolsValue = formatForCopilot();\n cmd.push(\"--allowedTools\", allowedToolsValue);\n onTelemetry?.(\"process.readSafePermissionsApplied\", true);\n onTelemetry?.(\"process.allowedTools\", allowedToolsValue);\n console.warn(\n ansis.yellow(\n `Note: Your ${variant} version doesn't advertise --allowedTools in help, ` +\n `but attempting to apply it. If not supported, ` +\n `please upgrade @github/copilot for granular permission controls.`\n )\n );\n }\n } catch {\n onTelemetry?.(\"process.readSafePermissionCheckFailed\", true);\n // Fail-closed approach: unable to verify support, so apply read-safe restrictions defensively\n // to maintain the read-safe guarantee even when the CLI probe fails.\n const allowedToolsValue = formatForCopilot();\n cmd.push(\"--allowedTools\", allowedToolsValue);\n onTelemetry?.(\"process.readSafePermissionsApplied\", true);\n onTelemetry?.(\"process.allowedTools\", allowedToolsValue);\n console.warn(\n ansis.yellow(\n `WARNING: Could not verify read-safe permission support for ${variant}. ` +\n `Applying read-safe restrictions defensively. ` +\n `If this is not supported by your ${variant} version, please upgrade @github/copilot or copilot CLI.`\n )\n );\n }\n }\n}\n\n// Validate read-safe constraints during module initialization\nvalidateReadSafeConstraints();\n"],
|
|
5
|
-
"mappings": "AAmBA,SAAS,iBAAiB;AAC1B,OAAO,WAAW;AA6BlB,MAAM,yBAA2C;EAC/C;IACE,MAAM;IACN,aAAa;IACb,OAAO;IACP,aAAa;;EAEf;IACE,MAAM;IACN,aAAa;IACb,OAAO;IACP,aAAa;;EAEf;IACE,MAAM;IACN,aAAa;IACb,OAAO;IACP,aAAa;;EAEf;IACE,MAAM;IACN,aAAa;IACb,OAAO;IACP,aAAa;;GAIJ,gCAA2D,OAAO,OAC7E,uBAAuB,IAAI,CAAC,MAAM,OAAO,OAAO,EAAE,GAAG,EAAC,CAAE,CAAC,CAAC;
|
|
4
|
+
"sourcesContent": ["/**\n * Default Read-Safe Permissions Module\n *\n * Defines the read-safe permission allowlist for AI agents (Claude Code and GitHub Copilot)\n * when launched in default (non-danger) mode. This module provides a centralized,\n * client-agnostic definition of permitted tools and operations that both integration\n * managers can consume identically, despite their different CLI permission models.\n *\n * Permission Model:\n * - Read-Safe (Default): Limited to read operations and CLI execution\n * - Unrestricted (--with-danger): Full tool access\n *\n * The read-safe allowlist covers exactly four capabilities:\n * 1. Running the `dr` CLI\n * 2. Reading the codebase\n * 3. Reading the `documentation-robotics/` folder\n * 4. Reading the `.dr/` folder\n */\n\nimport { spawnSync } from \"child_process\";\nimport ansis from \"ansis\";\n\n/**\n * Represents a single tool permission with optional scoping\n */\nexport interface ToolPermission {\n /** Name of the tool (e.g., 'Bash', 'Read') */\n name: string;\n\n /** Human-readable description of what this permission allows */\n description: string;\n\n /** Optional directory/file path scope restriction (relative to project root) */\n scope?: string;\n\n /** Whether this tool allows write/modify operations (should be false for read-safe) */\n allowsWrite: boolean;\n}\n\n/**\n * Read-safe permission allowlist for default (non-danger) mode\n *\n * This is the core configuration that defines which tools are available\n * when launched without the --with-danger flag. Both Claude Code and\n * GitHub Copilot integrations consume this identically.\n *\n * IMPORTANT: This array is deeply immutable via Object.freeze() and validated at module load time.\n * Mutating or adding entries after module initialization will not re-validate constraints.\n */\nconst PERMISSIONS_DEFINITION: ToolPermission[] = [\n {\n name: \"Bash\",\n description: \"Execute the dr CLI tool for read-safe model queries\",\n scope: \"dr query|dr show|dr list|dr search|dr export|dr validate|dr info|dr stats|dr report|dr audit|dr chat|dr version|dr conformance\",\n allowsWrite: false,\n },\n {\n name: \"Read\",\n description: \"Read files from the codebase\",\n scope: \".\",\n allowsWrite: false,\n },\n {\n name: \"Read\",\n description: \"Read from the documentation-robotics model folder\",\n scope: \"documentation-robotics\",\n allowsWrite: false,\n },\n {\n name: \"Read\",\n description: \"Read from the dr configuration folder\",\n scope: \".dr\",\n allowsWrite: false,\n },\n];\n\nexport const DEFAULT_READ_SAFE_PERMISSIONS: readonly ToolPermission[] = Object.freeze(\n PERMISSIONS_DEFINITION.map((p) => Object.freeze({ ...p }))\n);\n\n/**\n * Convert read-safe permissions to Claude Code CLI format\n *\n * Claude Code uses the --allowedTools flag with scoped tool permissions.\n * This function formats the permission list as expected by Claude Code's --allowedTools parameter,\n * including scope constraints for each tool (e.g., \"Bash(dr query:*),Bash(dr show:*),...,Read(.),Read(documentation-robotics)\").\n *\n * A Bash scope lists several commands separated by \"|\". Claude Code's rule syntax has no \"or\":\n * `Bash(dr query|dr show)` matches no command at all, so each command becomes its own prefix\n * rule, `Bash(dr show:*)`. Other tools keep their scope as-is, e.g. `Read(.dr)`.\n *\n * @returns String formatted for Claude Code --allowedTools flag\n */\nexport function formatForClaudeCode(): string {\n const formatted = DEFAULT_READ_SAFE_PERMISSIONS.flatMap((p) => {\n if (!p.scope) {\n return [p.name];\n }\n if (p.name === \"Bash\") {\n return bashCommands(p.scope).map((command) => `Bash(${command}:*)`);\n }\n return [`${p.name}(${p.scope})`];\n });\n return formatted.join(\",\");\n}\n\n/**\n * Extra dr commands for the changeset-only write mode (`dr visualize --with-changesets`).\n *\n * On top of the read-safe list, the agent can open and work in a changeset and stage new\n * elements, element updates and new relationships, and unstage one element it staged by\n * mistake. Committing, applying, reverting, discarding (which throws away every staged change,\n * the user's included) or deleting a changeset, and deleting elements or relationships, stay\n * with the user.\n *\n * `dr add`, `dr update` and `dr relationship add` write straight to the model when no\n * changeset is active, so the permissions alone don't keep writes in a changeset: the\n * agent also runs with `CHANGESET_ONLY_ENV` set, which makes the model refuse to save\n * (see core/changeset-only-guard.ts).\n */\nexport const CHANGESET_WRITE_COMMANDS: readonly string[] = Object.freeze([\n \"dr changeset create\",\n \"dr changeset activate\",\n \"dr changeset deactivate\",\n \"dr changeset status\",\n \"dr changeset list\",\n \"dr changeset show\",\n \"dr changeset staged\",\n \"dr changeset stage\",\n \"dr changeset unstage\",\n \"dr changeset preview\",\n \"dr changeset diff\",\n \"dr add\",\n \"dr update\",\n \"dr relationship add\",\n \"dr relationship list\",\n \"dr relationship show\",\n \"dr schema\",\n]);\n\nexport { CHANGESET_ONLY_ENV } from \"../core/changeset-only-guard.js\";\n\n/**\n * Claude Code --allowedTools value for changeset-only mode: the read-safe list plus one\n * `Bash(<cmd>:*)` rule per `CHANGESET_WRITE_COMMANDS` entry.\n */\nexport function formatForClaudeCodeWithChangesets(): string {\n return [formatForClaudeCode(), ...CHANGESET_WRITE_COMMANDS.map((command) => `Bash(${command}:*)`)].join(\",\");\n}\n\n/** The individual commands in a \"|\"-separated Bash scope, e.g. \"dr query|dr show\". */\nexport function bashCommands(scope: string): string[] {\n return scope\n .split(\"|\")\n .map((command) => command.trim())\n .filter((command) => command.length > 0);\n}\n\n/**\n * Convert read-safe permissions to GitHub Copilot CLI format\n *\n * GitHub Copilot CLI may support a --allowedTools flag (or equivalent) for granular permission control.\n * This function formats the permission list similarly to Claude Code for potential future Copilot versions\n * that support granular scoped permissions. If the installed Copilot version doesn't support this flag,\n * the caller should gracefully degrade (e.g., launch without the flag, with a warning).\n *\n * Format: \"Bash(dr query|dr show|dr list|...),Read(.),Read(documentation-robotics),Read(.dr)\"\n *\n * @returns String formatted for Copilot --allowedTools flag (if supported)\n */\nexport function formatForCopilot(): string {\n return formatForClaudeCode();\n}\n\n/**\n * Validate a permission array against read-safe constraints\n *\n * Internal function that validates any permission array. Used by tests to verify\n * that invalid configurations are properly rejected.\n *\n * @param permissions The permission array to validate\n * @throws {Error} If any constraint is violated\n */\nexport function validatePermissions(permissions: readonly ToolPermission[]): void {\n // Constraint 1: Non-empty allowlist\n if (!Array.isArray(permissions) || permissions.length === 0) {\n throw new Error(\n \"Permissions must be a non-empty array\"\n );\n }\n\n // Constraint 2: All permissions must have required fields with correct types\n for (let i = 0; i < permissions.length; i++) {\n const perm = permissions[i];\n\n if (typeof perm.name !== \"string\" || perm.name.length === 0) {\n throw new Error(\n `Permission[${i}].name must be a non-empty string, got: ${typeof perm.name}`\n );\n }\n\n if (typeof perm.description !== \"string\" || perm.description.length === 0) {\n throw new Error(\n `Permission[${i}].description must be a non-empty string, got: ${typeof perm.description}`\n );\n }\n\n if (typeof perm.allowsWrite !== \"boolean\") {\n throw new Error(\n `Permission[${i}].allowsWrite must be a boolean, got: ${typeof perm.allowsWrite}`\n );\n }\n }\n\n // Constraint 3: No permission should allow write operations (read-safe invariant)\n const writePerms = permissions.filter((p) => p.allowsWrite);\n if (writePerms.length > 0) {\n throw new Error(\n `Read-safe permissions must not allow write operations. Found ${writePerms.length} permission(s) with allowsWrite=true`\n );\n }\n\n // Constraint 4: Only Bash and Read tools allowed (allowlist validation, not denylist)\n const allowedToolNames = new Set([\"Bash\", \"Read\"]);\n const disallowedTools = permissions.filter(\n (p) => !allowedToolNames.has(p.name)\n );\n if (disallowedTools.length > 0) {\n throw new Error(\n `Read-safe permissions must only include Bash and Read tools. Found disallowed tool(s): ${disallowedTools.map((p) => p.name).join(\", \")}`\n );\n }\n\n // Constraint 5: Bash must be for dr CLI only with properly restricted scope (no wildcards or bare patterns)\n const bashPerms = permissions.filter((p) => p.name === \"Bash\");\n if (bashPerms.length > 0) {\n const invalidBash = bashPerms.filter((p) => {\n const hasValidDescription = p.description.toLowerCase().includes(\"dr\") && p.description.toLowerCase().includes(\"cli\");\n const hasValidScope = typeof p.scope === \"string\" && p.scope.length > 0;\n\n // Validate scope content: reject bare wildcards and unsafe patterns\n let hasValidScopeContent = true;\n if (hasValidScope) {\n const scope = p.scope;\n // Reject dangerous scope patterns: bare \"*\", \".\", or \"dr *\"\n if (scope === \"*\" || scope === \".\" || scope === \"dr *\" || scope.startsWith(\"dr *\")) {\n hasValidScopeContent = false;\n }\n // Ensure scope starts with \"dr \" for Bash tool\n if (!scope.startsWith(\"dr \")) {\n hasValidScopeContent = false;\n }\n }\n\n return !hasValidDescription || !hasValidScope || !hasValidScopeContent;\n });\n if (invalidBash.length > 0) {\n const errors = invalidBash.map((p) => {\n const issues = [];\n if (!p.description.toLowerCase().includes(\"dr\") || !p.description.toLowerCase().includes(\"cli\")) {\n issues.push(\"invalid description (must include 'dr' and 'cli')\");\n }\n if (typeof p.scope !== \"string\" || p.scope.length === 0) {\n issues.push(\"missing or empty scope\");\n } else {\n const scope = p.scope;\n if (scope === \"*\" || scope === \".\" || scope === \"dr *\" || scope.startsWith(\"dr *\")) {\n issues.push(\"scope uses dangerous wildcard pattern (must specify read-safe commands)\");\n }\n if (!scope.startsWith(\"dr \")) {\n issues.push(\"scope must start with 'dr ' for Bash tool\");\n }\n }\n return `${p.description} (${issues.join(\", \")})`;\n });\n throw new Error(\n `Bash permission must be for dr CLI only with properly restricted scope. Found invalid Bash permission(s): ${errors.join(\"; \")}`\n );\n }\n }\n\n // Constraint 6: Must have Read permission for codebase\n const codebaseRead = permissions.find(\n (p) => p.name === \"Read\" && p.description.toLowerCase().includes(\"codebase\")\n );\n if (!codebaseRead) {\n throw new Error(\"Read-safe permissions must include Read permission for codebase\");\n }\n\n // Constraint 7: Must have Read permission for documentation-robotics folder\n const docRoboticsRead = permissions.find(\n (p) => p.name === \"Read\" && p.description.includes(\"documentation-robotics\")\n );\n if (!docRoboticsRead) {\n throw new Error(\"Read-safe permissions must include Read permission for documentation-robotics folder\");\n }\n\n // Constraint 8: Must have Read permission for .dr folder\n const drFolderRead = permissions.find(\n (p) => p.name === \"Read\" && (p.scope === \".dr\" || p.description.includes(\".dr\"))\n );\n if (!drFolderRead) {\n throw new Error(\"Read-safe permissions must include Read permission for .dr folder\");\n }\n\n // All constraints passed\n}\n\n/**\n * Validate read-safe permission constraints\n *\n * Called during module initialization to verify the permission allowlist maintains\n * its safety invariants: all permissions are read-only, required tools are present,\n * and no dangerous tools are included.\n *\n * Throws an error if constraints are violated, preventing runtime with an invalid configuration.\n *\n * @throws {Error} If any constraint is violated\n */\nexport function validateReadSafeConstraints(): void {\n validatePermissions(DEFAULT_READ_SAFE_PERMISSIONS);\n}\n\n/**\n * Apply Copilot permissions to command arguments with graceful degradation\n *\n * Shared utility for both CopilotClient and VisualizationServer to probe\n * Copilot CLI capability and apply appropriate permission flags.\n * Handles both default mode (read-safe --allowedTools) and danger mode (--allow-all-tools).\n *\n * @param cmd The command array to modify (mutated in place)\n * @param variant Display name for error messages (e.g., \"gh copilot\" or \"copilot\")\n * @param copilotCommand The copilot CLI name (\"copilot\" or \"gh\")\n * @param withDanger Whether to use danger mode (--allow-all-tools)\n * @param onTelemetry Optional callback for telemetry logging\n * @param testSpawnSync Optional injected spawnSync for testing (allows mocking CLI probe)\n */\nexport function applyCopilotPermissions(\n cmd: string[],\n variant: string,\n copilotCommand: string,\n withDanger: boolean,\n onTelemetry?: (attr: string, value: any) => void,\n testSpawnSync?: typeof spawnSync\n): void {\n const spawnSyncFn = testSpawnSync || spawnSync;\n\n if (withDanger) {\n try {\n const helpResult = spawnSyncFn(\n copilotCommand === \"copilot\" ? \"copilot\" : \"gh\",\n copilotCommand === \"copilot\" ? [\"--help\"] : [\"copilot\", \"--help\"],\n { stdio: \"pipe\", encoding: \"utf-8\", timeout: 1000 }\n );\n if (\n helpResult.stdout?.includes(\"--allow-all-tools\") ||\n helpResult.stdout?.includes(\"allow-all-tools\")\n ) {\n cmd.push(\"--allow-all-tools\");\n onTelemetry?.(\"process.allowAllToolsSupported\", true);\n } else {\n onTelemetry?.(\"process.allowAllToolsSupported\", false);\n console.warn(\n ansis.yellow(`Note: --allow-all-tools flag not supported by your ${variant} version`)\n );\n }\n } catch {\n onTelemetry?.(\"process.allowAllToolsCheckFailed\", true);\n console.warn(\n ansis.yellow(\n `WARNING: Could not verify --allow-all-tools support for ${variant}. ` +\n `Launching WITHOUT permission escalation. If you need full tool access, ` +\n `please ensure your ${variant} CLI is up-to-date.`\n )\n );\n }\n } else {\n try {\n const helpResult = spawnSyncFn(\n copilotCommand === \"copilot\" ? \"copilot\" : \"gh\",\n copilotCommand === \"copilot\" ? [\"--help\"] : [\"copilot\", \"--help\"],\n { stdio: \"pipe\", encoding: \"utf-8\", timeout: 1000 }\n );\n\n const helpText = helpResult.stdout || \"\";\n const supportsAllowedTools =\n helpText.includes(\"--allowedTools\") ||\n helpText.includes(\"allowedTools\") ||\n helpText.includes(\"--allowed-tools\") ||\n helpText.includes(\"allowed-tools\");\n\n if (supportsAllowedTools) {\n const allowedToolsValue = formatForCopilot();\n cmd.push(\"--allowedTools\", allowedToolsValue);\n onTelemetry?.(\"process.readSafePermissionsApplied\", true);\n onTelemetry?.(\"process.allowedTools\", allowedToolsValue);\n } else {\n // Flag not advertised in help, but still try to apply it optimistically\n // (fail-safe: try to restrict access even if we're not 100% sure the flag exists)\n const allowedToolsValue = formatForCopilot();\n cmd.push(\"--allowedTools\", allowedToolsValue);\n onTelemetry?.(\"process.readSafePermissionsApplied\", true);\n onTelemetry?.(\"process.allowedTools\", allowedToolsValue);\n console.warn(\n ansis.yellow(\n `Note: Your ${variant} version doesn't advertise --allowedTools in help, ` +\n `but attempting to apply it. If not supported, ` +\n `please upgrade @github/copilot for granular permission controls.`\n )\n );\n }\n } catch {\n onTelemetry?.(\"process.readSafePermissionCheckFailed\", true);\n // Fail-closed approach: unable to verify support, so apply read-safe restrictions defensively\n // to maintain the read-safe guarantee even when the CLI probe fails.\n const allowedToolsValue = formatForCopilot();\n cmd.push(\"--allowedTools\", allowedToolsValue);\n onTelemetry?.(\"process.readSafePermissionsApplied\", true);\n onTelemetry?.(\"process.allowedTools\", allowedToolsValue);\n console.warn(\n ansis.yellow(\n `WARNING: Could not verify read-safe permission support for ${variant}. ` +\n `Applying read-safe restrictions defensively. ` +\n `If this is not supported by your ${variant} version, please upgrade @github/copilot or copilot CLI.`\n )\n );\n }\n }\n}\n\n// Validate read-safe constraints during module initialization\nvalidateReadSafeConstraints();\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|