@documentation-robotics/cli 0.1.8 → 0.1.10
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 +18 -17
- package/dist/audit/nodes/ai/prompts.js +1 -0
- package/dist/audit/nodes/ai/prompts.js.map +2 -2
- package/dist/audit/relationships/ai/prompts.js +20 -29
- package/dist/audit/relationships/ai/prompts.js.map +2 -2
- package/dist/audit/relationships/analysis/gap-analyzer.js.map +1 -1
- package/dist/audit/relationships/analysis/layer-templates.js +36 -0
- package/dist/audit/relationships/analysis/layer-templates.js.map +2 -2
- package/dist/cli.js +8 -8
- package/dist/cli.js.map +2 -2
- package/dist/commands/reports.js +3 -3
- package/dist/commands/reports.js.map +1 -1
- package/dist/commands/show.js.map +1 -1
- package/dist/commands/upgrade.js +1 -1
- package/dist/commands/upgrade.js.map +1 -1
- package/dist/commands/validate.js.map +1 -1
- package/dist/commands/version.js +1 -1
- package/dist/core/layers.js +1 -0
- package/dist/core/layers.js.map +2 -2
- package/dist/core/migration-registry.js +59 -2
- package/dist/core/migration-registry.js.map +2 -2
- package/dist/core/model.js +3 -16
- package/dist/core/model.js.map +2 -2
- package/dist/core/spec-loader.js.map +1 -1
- package/dist/core/stats-collector.js +2 -0
- package/dist/core/stats-collector.js.map +2 -2
- package/dist/export/archimate-exporter.js.map +2 -2
- package/dist/export/json-schema-exporter.js.map +1 -1
- package/dist/export/markdown-exporter.js.map +1 -1
- package/dist/export/markdown-utils.js +1 -0
- package/dist/export/markdown-utils.js.map +2 -2
- package/dist/export/mermaid-markdown-exporter.js.map +1 -1
- package/dist/export/openapi-exporter.js.map +1 -1
- package/dist/export/plantuml-exporter.js.map +1 -1
- package/dist/export/report-formatters.js +2 -2
- package/dist/export/report-formatters.js.map +1 -1
- package/dist/export/types.js +1 -0
- package/dist/export/types.js.map +2 -2
- package/dist/generated/layer-registry.js +44 -31
- package/dist/generated/layer-registry.js.map +2 -2
- package/dist/generated/layer-types.js +1 -1
- package/dist/generated/layer-types.js.map +2 -2
- package/dist/generated/node-types.js +45 -0
- package/dist/generated/node-types.js.map +2 -2
- package/dist/generated/relationship-index.js +201 -19
- package/dist/generated/relationship-index.js.map +2 -2
- package/dist/import/archimate-importer.js.map +1 -1
- package/dist/import/openapi-importer.js.map +1 -1
- package/dist/integrations/claude_code/agents/dr-advisor.md +14 -13
- package/dist/integrations/claude_code/agents/dr-extractor.md +2 -2
- package/dist/integrations/claude_code/commands/dr-info.md +1 -1
- package/dist/integrations/claude_code/commands/dr-init.md +3 -3
- package/dist/integrations/claude_code/commands/dr-map.md +2 -2
- package/dist/integrations/claude_code/commands/dr-model.md +1 -1
- package/dist/integrations/claude_code/commands/dr-relate.md +14 -4
- package/dist/integrations/claude_code/docs/END_TO_END_WALKTHROUGH.md +3 -3
- package/dist/integrations/claude_code/docs/QUICK_START.md +1 -1
- package/dist/integrations/claude_code/docs/README.md +2 -2
- package/dist/integrations/claude_code/skills/dr_01_motivation_layer/SKILL.md +2 -2
- package/dist/integrations/claude_code/skills/dr_03_product_layer/SKILL.md +679 -0
- package/dist/integrations/claude_code/skills/{dr_08_dataset_layer → dr_09_dataset_layer}/SKILL.md +1 -1
- package/dist/integrations/claude_code/skills/dr_engineering_guide/SKILL.md +2 -2
- package/dist/integrations/github_copilot/agents/dr-advisor.md +14 -13
- package/dist/integrations/github_copilot/agents/dr-architect.md +15 -14
- package/dist/integrations/github_copilot/skills/dr_01_motivation_layer/SKILL.md +2 -2
- package/dist/integrations/github_copilot/skills/dr_03_product_layer/SKILL.md +253 -0
- package/dist/reports/model-report-orchestrator.js +3 -3
- package/dist/reports/model-report-orchestrator.js.map +1 -1
- package/dist/schemas/bundled/analyzers/cbm.json +2 -2
- package/dist/schemas/bundled/analyzers/manifest.json +2 -2
- package/dist/schemas/bundled/api.json +3 -3
- package/dist/schemas/bundled/apm.json +3 -3
- package/dist/schemas/bundled/application.json +3 -3
- package/dist/schemas/bundled/base.json +29 -1
- package/dist/schemas/bundled/business.json +1 -1
- package/dist/schemas/bundled/data-model.json +3 -3
- package/dist/schemas/bundled/data-store.json +3 -3
- package/dist/schemas/bundled/manifest.json +20 -13
- package/dist/schemas/bundled/motivation.json +1 -1
- package/dist/schemas/bundled/navigation.json +3 -3
- package/dist/schemas/bundled/product.json +469 -0
- package/dist/schemas/bundled/security.json +3 -3
- package/dist/schemas/bundled/technology.json +3 -3
- package/dist/schemas/bundled/testing.json +3 -3
- package/dist/schemas/bundled/ux.json +3 -3
- package/dist/server/server.js +4 -15
- package/dist/server/server.js.map +2 -2
- package/dist/telemetry/index.js +1 -1
- package/dist/utils/spec-installer.js +2 -2
- package/dist/utils/spec-installer.js.map +1 -1
- package/dist/utils/spec-version.js +1 -1
- package/dist/utils/spec-version.js.map +2 -2
- package/dist/viewer/README.md +6 -6
- package/dist/viewer/assets/main-BRPZyc36.css +1 -0
- package/dist/viewer/assets/main-BrpLargo.js +81 -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 +1 -1
- package/dist/viewer/assets/main-CY0Xufuj.css +0 -1
- package/dist/viewer/assets/main-DtgErnwF.js +0 -81
- /package/dist/integrations/claude_code/skills/{dr_03_security_layer → dr_04_security_layer}/SKILL.md +0 -0
- /package/dist/integrations/claude_code/skills/{dr_04_application_layer → dr_05_application_layer}/SKILL.md +0 -0
- /package/dist/integrations/claude_code/skills/{dr_05_technology_layer → dr_06_technology_layer}/SKILL.md +0 -0
- /package/dist/integrations/claude_code/skills/{dr_06_api_layer → dr_07_api_layer}/SKILL.md +0 -0
- /package/dist/integrations/claude_code/skills/{dr_07_data_model_layer → dr_08_data_model_layer}/SKILL.md +0 -0
- /package/dist/integrations/claude_code/skills/{dr_09_ux_layer → dr_10_ux_layer}/SKILL.md +0 -0
- /package/dist/integrations/claude_code/skills/{dr_10_navigation_layer → dr_11_navigation_layer}/SKILL.md +0 -0
- /package/dist/integrations/claude_code/skills/{dr_11_apm_layer → dr_12_apm_layer}/SKILL.md +0 -0
- /package/dist/integrations/claude_code/skills/{dr_12_testing_layer → dr_13_testing_layer}/SKILL.md +0 -0
- /package/dist/integrations/github_copilot/skills/{dr_03_security_layer → dr_04_security_layer}/SKILL.md +0 -0
- /package/dist/integrations/github_copilot/skills/{dr_04_application_layer → dr_05_application_layer}/SKILL.md +0 -0
- /package/dist/integrations/github_copilot/skills/{dr_05_technology_layer → dr_06_technology_layer}/SKILL.md +0 -0
- /package/dist/integrations/github_copilot/skills/{dr_06_api_layer → dr_07_api_layer}/SKILL.md +0 -0
- /package/dist/integrations/github_copilot/skills/{dr_07_data_model_layer → dr_08_data_model_layer}/SKILL.md +0 -0
- /package/dist/integrations/github_copilot/skills/{dr_08_dataset_layer → dr_09_dataset_layer}/SKILL.md +0 -0
- /package/dist/integrations/github_copilot/skills/{dr_09_ux_layer → dr_10_ux_layer}/SKILL.md +0 -0
- /package/dist/integrations/github_copilot/skills/{dr_10_navigation_layer → dr_11_navigation_layer}/SKILL.md +0 -0
- /package/dist/integrations/github_copilot/skills/{dr_11_apm_layer → dr_12_apm_layer}/SKILL.md +0 -0
- /package/dist/integrations/github_copilot/skills/{dr_12_testing_layer → dr_13_testing_layer}/SKILL.md +0 -0
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 { 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 { 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 { initTelemetry, startActiveSpan, shutdownTelemetry } from \"./telemetry/index.js\";\nimport { installConsoleInterceptor } from \"./telemetry/console-interceptor.js\";\nimport { getErrorMessage } from \"./utils/errors.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/**\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\n// Declare build-time constant (substituted by esbuild)\ndeclare const CLI_VERSION: string;\nconst cliVersion = typeof CLI_VERSION !== \"undefined\" ? CLI_VERSION : \"0.1.3\";\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 .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 flags)\n const options = thisCommand.opts();\n setGlobalOptions({\n verbose: options.verbose as boolean | undefined,\n debug: options.debug as boolean | 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 \"12-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(\"--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 .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(addCommand);\n\nprogram\n .command(\"update <id>\")\n .description(\"Update an element\")\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 .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(updateCommand);\n\nprogram\n .command(\"delete <id>\")\n .description(\"Delete an element\")\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 .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(deleteCommand);\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(listCommand);\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(searchCommand);\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 .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 )\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, 4, 5)\n openapi Export to OpenAPI 3.0 specification (layer 6)\n jsonschema Export to JSON Schema (layer 7)\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, 4, 5)\n openapi Import from OpenAPI 3.0 specification (layer 6)\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 7 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// Relationship subcommands\nconst relationshipGroup = program.command(\"relationship\").description(\"Relationship operations\");\nrelationshipCommands(relationshipGroup);\n\n// Element subcommands\nconst elementGroup = program.command(\"element\").description(\"Element operations\");\nelementCommands(elementGroup);\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\nThe --with-danger flag enables dangerous mode for chat functionality:\n - Claude Code: --dangerously-skip-permissions\n - GitHub Copilot: --allow-all-tools\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\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\nDangerous mode enables:\n - Claude Code: --dangerously-skip-permissions\n - GitHub Copilot: --allow-all-tools\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,\n verbose: options.verbose ?? program.opts().verbose,\n });\n });\n\n// Changeset subcommands\nchangesetCommands(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 if (error instanceof CommanderError) {\n // Commander handled its own output; nothing to print\n } else if (error instanceof CLIError) {\n console.error(error.format());\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 if (error instanceof CommanderError) {\n // Commander handled its own output; nothing to print\n } else if (error instanceof CLIError) {\n console.error(error.format());\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,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,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,eAAe,iBAAiB,yBAAyB;AAClE,SAAS,iCAAiC;AAC1C,SAAS,uBAAuB;AAKhC,MAAM,qBAAgE,IAGhE,2BAA2B,oBAAI,IAAI,CAAC,QAAQ,YAAY,UAAU,QAAQ,CAAC;AAMjF,eAAe,gBAAgB,OAAc;AAC3C,QAAM,EAAE,SAAQ,IAAK,MAAM,OAAO,mBAAmB;AAQrD,MANI,iBAAiB,YAMjB,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;AAIA,MAAM,aAAkD,
|
|
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 { 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 { 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 { initTelemetry, startActiveSpan, shutdownTelemetry } from \"./telemetry/index.js\";\nimport { installConsoleInterceptor } from \"./telemetry/console-interceptor.js\";\nimport { getErrorMessage } from \"./utils/errors.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/**\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\n// Declare build-time constant (substituted by esbuild)\ndeclare const CLI_VERSION: string;\nconst cliVersion = typeof CLI_VERSION !== \"undefined\" ? CLI_VERSION : \"0.1.3\";\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 .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 flags)\n const options = thisCommand.opts();\n setGlobalOptions({\n verbose: options.verbose as boolean | undefined,\n debug: options.debug as boolean | 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(\"--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 .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(addCommand);\n\nprogram\n .command(\"update <id>\")\n .description(\"Update an element\")\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 .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(updateCommand);\n\nprogram\n .command(\"delete <id>\")\n .description(\"Delete an element\")\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 .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(deleteCommand);\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(listCommand);\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(searchCommand);\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 .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 )\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// Relationship subcommands\nconst relationshipGroup = program.command(\"relationship\").description(\"Relationship operations\");\nrelationshipCommands(relationshipGroup);\n\n// Element subcommands\nconst elementGroup = program.command(\"element\").description(\"Element operations\");\nelementCommands(elementGroup);\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\nThe --with-danger flag enables dangerous mode for chat functionality:\n - Claude Code: --dangerously-skip-permissions\n - GitHub Copilot: --allow-all-tools\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\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\nDangerous mode enables:\n - Claude Code: --dangerously-skip-permissions\n - GitHub Copilot: --allow-all-tools\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,\n verbose: options.verbose ?? program.opts().verbose,\n });\n });\n\n// Changeset subcommands\nchangesetCommands(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 if (error instanceof CommanderError) {\n // Commander handled its own output; nothing to print\n } else if (error instanceof CLIError) {\n console.error(error.format());\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 if (error instanceof CommanderError) {\n // Commander handled its own output; nothing to print\n } else if (error instanceof CLIError) {\n console.error(error.format());\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": []
|
|
7
7
|
}
|
package/dist/commands/reports.js
CHANGED
|
@@ -6,9 +6,9 @@ import { ModelReportOrchestrator } from "../reports/model-report-orchestrator.js
|
|
|
6
6
|
import { findProjectRoot } from "../utils/project-paths.js";
|
|
7
7
|
import { getErrorMessage } from "../utils/errors.js";
|
|
8
8
|
function reportsCommands(parent) {
|
|
9
|
-
parent.command("regenerate").description("Delete existing layer reports and regenerate all
|
|
9
|
+
parent.command("regenerate").description("Delete existing layer reports and regenerate all 13 markdown reports").addHelpText("after", `
|
|
10
10
|
Examples:
|
|
11
|
-
$ dr reports regenerate # Delete existing reports and regenerate all
|
|
11
|
+
$ dr reports regenerate # Delete existing reports and regenerate all 13 layer reports`).action(async () => {
|
|
12
12
|
await reportsRegenerateCommand();
|
|
13
13
|
});
|
|
14
14
|
}
|
|
@@ -24,7 +24,7 @@ async function regenerateLayerReports(projectRoot) {
|
|
|
24
24
|
const reportDir = path.join(projectRoot, "documentation-robotics", "reports");
|
|
25
25
|
console.log(ansis.dim("Removing existing reports...")), await fs.rm(reportDir, { recursive: !0, force: !0 }), console.log(ansis.dim("Loading model..."));
|
|
26
26
|
const model = await Model.load(projectRoot), orchestrator = new ModelReportOrchestrator(model, projectRoot);
|
|
27
|
-
console.log(ansis.dim("Generating
|
|
27
|
+
console.log(ansis.dim("Generating 13 layer reports...")), await orchestrator.regenerateAll(), console.log(ansis.green("\u2713 All 13 layer reports regenerated")), console.log(ansis.dim(" Reports written to: documentation-robotics/reports/"));
|
|
28
28
|
}
|
|
29
29
|
async function hasLayerReports(projectRoot) {
|
|
30
30
|
const reportDir = path.join(projectRoot, "documentation-robotics", "reports");
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/commands/reports.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Reports subcommands for managing the maintained set of markdown layer reports\n */\n\nimport { Command } from \"commander\";\nimport ansis from \"ansis\";\nimport * as fs from \"fs/promises\";\nimport * as path from \"path\";\nimport { Model } from \"../core/model.js\";\nimport { ModelReportOrchestrator } from \"../reports/model-report-orchestrator.js\";\nimport { findProjectRoot } from \"../utils/project-paths.js\";\nimport { getErrorMessage } from \"../utils/errors.js\";\n\nexport function reportsCommands(parent: Command): void {\n parent\n .command(\"regenerate\")\n .description(\"Delete existing layer reports and regenerate all
|
|
4
|
+
"sourcesContent": ["/**\n * Reports subcommands for managing the maintained set of markdown layer reports\n */\n\nimport { Command } from \"commander\";\nimport ansis from \"ansis\";\nimport * as fs from \"fs/promises\";\nimport * as path from \"path\";\nimport { Model } from \"../core/model.js\";\nimport { ModelReportOrchestrator } from \"../reports/model-report-orchestrator.js\";\nimport { findProjectRoot } from \"../utils/project-paths.js\";\nimport { getErrorMessage } from \"../utils/errors.js\";\n\nexport function reportsCommands(parent: Command): void {\n parent\n .command(\"regenerate\")\n .description(\"Delete existing layer reports and regenerate all 13 markdown reports\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ dr reports regenerate # Delete existing reports and regenerate all 13 layer reports`\n )\n .action(async () => {\n await reportsRegenerateCommand();\n });\n}\n\n/**\n * Delete existing layer reports and regenerate all 13 markdown reports.\n */\nexport async function reportsRegenerateCommand(): Promise<void> {\n try {\n const projectRoot = await findProjectRoot();\n if (!projectRoot) {\n console.error(ansis.red(\"Error: No DR project found\"));\n console.error(ansis.dim('Run \"dr init\" to create a new project'));\n process.exit(1);\n }\n\n await regenerateLayerReports(projectRoot);\n } catch (error) {\n console.error(ansis.red(`Error: ${getErrorMessage(error)}`));\n process.exit(1);\n }\n}\n\n/**\n * Delete existing reports directory and regenerate all 13 layer reports.\n * Exported for use in the upgrade command.\n */\nexport async function regenerateLayerReports(projectRoot: string): Promise<void> {\n const reportDir = path.join(projectRoot, \"documentation-robotics\", \"reports\");\n\n // Remove the entire reports directory so stale reports from removed/renamed layers don't linger.\n // force: true means no error if the directory doesn't exist yet.\n // ModelReportOrchestrator.regenerateAll() recreates the directory before writing.\n console.log(ansis.dim(\"Removing existing reports...\"));\n await fs.rm(reportDir, { recursive: true, force: true });\n\n // Load model and regenerate all reports\n console.log(ansis.dim(\"Loading model...\"));\n const model = await Model.load(projectRoot);\n\n const orchestrator = new ModelReportOrchestrator(model, projectRoot);\n console.log(ansis.dim(\"Generating 13 layer reports...\"));\n await orchestrator.regenerateAll();\n\n console.log(ansis.green(\"\u2713 All 13 layer reports regenerated\"));\n console.log(ansis.dim(\" Reports written to: documentation-robotics/reports/\"));\n}\n\n/**\n * Check whether any layer reports exist in the reports directory.\n * Returns false if the directory doesn't exist or contains no .md files.\n */\nexport async function hasLayerReports(projectRoot: string): Promise<boolean> {\n const reportDir = path.join(projectRoot, \"documentation-robotics\", \"reports\");\n try {\n const entries = await fs.readdir(reportDir);\n return entries.some((f) => f.endsWith(\".md\"));\n } catch (error: unknown) {\n const err = error as NodeJS.ErrnoException;\n if (err.code === \"ENOENT\") return false;\n throw error;\n }\n}\n"],
|
|
5
5
|
"mappings": "AAKA,OAAO,WAAW;AAClB,YAAY,QAAQ;AACpB,YAAY,UAAU;AACtB,SAAS,aAAa;AACtB,SAAS,+BAA+B;AACxC,SAAS,uBAAuB;AAChC,SAAS,uBAAuB;AAE1B,SAAU,gBAAgB,QAAe;AAC7C,SACG,QAAQ,YAAY,EACpB,YAAY,sEAAsE,EAClF,YACC,SACA;;2FAEqF,EAEtF,OAAO,YAAW;AACjB,UAAM,yBAAwB;EAChC,CAAC;AACL;AAKA,eAAsB,2BAAwB;AAC5C,MAAI;AACF,UAAM,cAAc,MAAM,gBAAe;AACzC,IAAK,gBACH,QAAQ,MAAM,MAAM,IAAI,4BAA4B,CAAC,GACrD,QAAQ,MAAM,MAAM,IAAI,uCAAuC,CAAC,GAChE,QAAQ,KAAK,CAAC,IAGhB,MAAM,uBAAuB,WAAW;EAC1C,SAAS,OAAO;AACd,YAAQ,MAAM,MAAM,IAAI,UAAU,gBAAgB,KAAK,CAAC,EAAE,CAAC,GAC3D,QAAQ,KAAK,CAAC;EAChB;AACF;AAMA,eAAsB,uBAAuB,aAAmB;AAC9D,QAAM,YAAY,KAAK,KAAK,aAAa,0BAA0B,SAAS;AAK5E,UAAQ,IAAI,MAAM,IAAI,8BAA8B,CAAC,GACrD,MAAM,GAAG,GAAG,WAAW,EAAE,WAAW,IAAM,OAAO,GAAI,CAAE,GAGvD,QAAQ,IAAI,MAAM,IAAI,kBAAkB,CAAC;AACzC,QAAM,QAAQ,MAAM,MAAM,KAAK,WAAW,GAEpC,eAAe,IAAI,wBAAwB,OAAO,WAAW;AACnE,UAAQ,IAAI,MAAM,IAAI,gCAAgC,CAAC,GACvD,MAAM,aAAa,cAAa,GAEhC,QAAQ,IAAI,MAAM,MAAM,yCAAoC,CAAC,GAC7D,QAAQ,IAAI,MAAM,IAAI,uDAAuD,CAAC;AAChF;AAMA,eAAsB,gBAAgB,aAAmB;AACvD,QAAM,YAAY,KAAK,KAAK,aAAa,0BAA0B,SAAS;AAC5E,MAAI;AAEF,YADgB,MAAM,GAAG,QAAQ,SAAS,GAC3B,KAAK,CAAC,MAAM,EAAE,SAAS,KAAK,CAAC;EAC9C,SAAS,OAAgB;AAEvB,QADY,MACJ,SAAS;AAAU,aAAO;AAClC,UAAM;EACR;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/commands/show.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Show detailed information about an element\n */\n\nimport ansis from \"ansis\";\nimport { Model } from \"../core/model.js\";\nimport { findElementLayer } from \"../utils/element-utils.js\";\nimport { CLIError, ErrorCategory, handleError } from \"../utils/errors.js\";\nimport { isTelemetryEnabled, startActiveSpan } from \"../telemetry/index.js\";\nimport { getErrorMessage } from \"../utils/errors.js\";\n\nexport async function showCommand(id: string, options: { model?: string } = {}): Promise<void> {\n // Infer the layer from the element ID prefix (e.g. \"api.operation.foo\" \u2192 load only \"api\" layer)\n // Falls back to loading all layers if the ID doesn't contain a layer prefix.\n const inferredLayer = id.includes(\".\") ? id.split(\".\")[0] : undefined;\n\n await startActiveSpan(\n \"show.execute\",\n async (span) => {\n try {\n // Load only the inferred layer when possible (performance: avoids loading all
|
|
4
|
+
"sourcesContent": ["/**\n * Show detailed information about an element\n */\n\nimport ansis from \"ansis\";\nimport { Model } from \"../core/model.js\";\nimport { findElementLayer } from \"../utils/element-utils.js\";\nimport { CLIError, ErrorCategory, handleError } from \"../utils/errors.js\";\nimport { isTelemetryEnabled, startActiveSpan } from \"../telemetry/index.js\";\nimport { getErrorMessage } from \"../utils/errors.js\";\n\nexport async function showCommand(id: string, options: { model?: string } = {}): Promise<void> {\n // Infer the layer from the element ID prefix (e.g. \"api.operation.foo\" \u2192 load only \"api\" layer)\n // Falls back to loading all layers if the ID doesn't contain a layer prefix.\n const inferredLayer = id.includes(\".\") ? id.split(\".\")[0] : undefined;\n\n await startActiveSpan(\n \"show.execute\",\n async (span) => {\n try {\n // Load only the inferred layer when possible (performance: avoids loading all 13 layers)\n const model = await Model.load(\n options.model,\n inferredLayer ? { layers: [inferredLayer] } : {}\n );\n\n // Find element\n const layerName = await findElementLayer(model, id);\n if (!layerName) {\n if (isTelemetryEnabled) {\n (span as any).setAttribute(\"show.found\", false);\n }\n throw new CLIError(`Element ${id} not found`, ErrorCategory.USER, [\n `Use \"dr search ${id}\" to find similar elements`,\n 'Use \"dr list <layer>\" to list all elements in a layer',\n ]);\n }\n\n const layer = await model.getLayer(layerName);\n if (!layer) {\n throw new CLIError(`Layer ${layerName} not found`, ErrorCategory.USER, [\n 'Use \"dr schema layers\" to list all available layers',\n ]);\n }\n\n const element = layer.getElement(id);\n if (!element) {\n throw new CLIError(`Element ${id} not found`, ErrorCategory.USER, [\n `Use \"dr search ${id}\" to find similar elements`,\n 'Use \"dr list <layer>\" to list all elements in a layer',\n ]);\n }\n\n // Query relationships from the central store (element.relationships is always empty\n // for modern elements since relationships moved to relationships.yaml)\n const elementId = element.path || element.id;\n const { outgoing, incoming } = model.relationships.getForElement(elementId);\n const hasRelationships = outgoing.length > 0 || incoming.length > 0;\n\n if (isTelemetryEnabled) {\n (span as any).setAttribute(\"show.found\", true);\n (span as any).setAttribute(\"show.layer\", layerName);\n (span as any).setAttribute(\"show.type\", element.type);\n (span as any).setAttribute(\n \"show.hasReferences\",\n element.references && element.references.length > 0\n );\n (span as any).setAttribute(\"show.hasRelationships\", hasRelationships);\n (span as any).setAttribute(\"show.outgoingRelationships\", outgoing.length);\n (span as any).setAttribute(\"show.incomingRelationships\", incoming.length);\n }\n\n // Display element information\n console.log(\"\");\n console.log(ansis.bold(`${ansis.blue(\"Element:\")} ${id}`));\n console.log(ansis.dim(\"\u2500\".repeat(60)));\n console.log(`${ansis.gray(\"Layer:\")} ${layerName}`);\n console.log(`${ansis.gray(\"Type:\")} ${element.type}`);\n console.log(`${ansis.gray(\"Name:\")} ${element.name}`);\n\n if (element.description) {\n console.log(`${ansis.gray(\"Description:\")} ${element.description}`);\n }\n\n // Display properties (attributes)\n if (Object.keys(element.attributes).length > 0) {\n console.log(\"\");\n console.log(ansis.bold(\"Properties:\"));\n for (const [key, value] of Object.entries(element.attributes)) {\n const displayValue = typeof value === \"string\" ? value : JSON.stringify(value, null, 2);\n console.log(` ${ansis.cyan(key)}: ${displayValue}`);\n }\n }\n\n // Display references (inline, legacy format)\n if (element.references && element.references.length > 0) {\n console.log(\"\");\n console.log(ansis.bold(\"References:\"));\n for (const ref of element.references) {\n console.log(` \u2192 ${ansis.yellow(ref.target)} (${ref.type})`);\n if (ref.description) {\n console.log(` ${ansis.dim(ref.description)}`);\n }\n }\n }\n\n // Display relationships from the central relationships store\n if (outgoing.length > 0) {\n console.log(\"\");\n console.log(ansis.bold(\"Relationships (outgoing):\"));\n for (const rel of outgoing) {\n console.log(` ${ansis.magenta(rel.predicate)} \u2192 ${rel.target}`);\n if (rel.properties && Object.keys(rel.properties).length > 0) {\n const propStr = Object.entries(rel.properties)\n .map(([k, v]) => `${k}=${v}`)\n .join(\", \");\n console.log(` ${ansis.dim(propStr)}`);\n }\n }\n }\n\n if (incoming.length > 0) {\n console.log(\"\");\n console.log(ansis.bold(\"Relationships (incoming):\"));\n for (const rel of incoming) {\n console.log(` ${ansis.magenta(rel.predicate)} \u2190 ${rel.source}`);\n }\n }\n\n // Display source code location if present\n const sourceRef = element.getSourceReference();\n if (sourceRef) {\n console.log(\"\");\n console.log(ansis.bold(\"Source Code Location:\"));\n console.log(` ${ansis.gray(\"Provenance:\")} ${sourceRef.provenance}`);\n\n (sourceRef.locations ?? []).forEach((loc, idx) => {\n console.log(` ${ansis.gray(\"Location \" + (idx + 1) + \":\")}`);\n console.log(` File: ${ansis.cyan(loc.file)}`);\n if (loc.symbol) {\n console.log(` Symbol: ${ansis.cyan(loc.symbol)}`);\n }\n });\n\n if (sourceRef.repository) {\n console.log(` ${ansis.gray(\"Repository Context:\")}`);\n if (sourceRef.repository.url) {\n console.log(` Remote: ${ansis.cyan(sourceRef.repository.url)}`);\n }\n if (sourceRef.repository.commit) {\n console.log(` Commit: ${ansis.cyan(sourceRef.repository.commit)}`);\n }\n }\n }\n\n console.log(\"\");\n\n if (isTelemetryEnabled) {\n (span as any).setStatus({ code: 0 });\n }\n } catch (error) {\n if (isTelemetryEnabled) {\n (span as any).recordException(error as Error);\n (span as any).setStatus({\n code: 2,\n message: getErrorMessage(error),\n });\n }\n handleError(error);\n }\n },\n { \"show.elementId\": id }\n );\n}\n"],
|
|
5
5
|
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/commands/upgrade.js
CHANGED
|
@@ -41,7 +41,7 @@ async function checkAndGenerateReports(projectRoot, options) {
|
|
|
41
41
|
return;
|
|
42
42
|
if (console.log(ansis.yellow(`
|
|
43
43
|
\u26A0 No layer reports found`)), options.dryRun) {
|
|
44
|
-
console.log(ansis.yellow(`[DRY RUN] Would generate all
|
|
44
|
+
console.log(ansis.yellow(`[DRY RUN] Would generate all 13 layer reports
|
|
45
45
|
`));
|
|
46
46
|
return;
|
|
47
47
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/commands/upgrade.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Upgrade Command - Manages spec reference and model upgrades\n *\n * Scans the filesystem to determine what needs upgrading:\n * 1. .dr/ (spec reference) - if CLI has newer bundled version\n * 2. Model data - if model spec version doesn't match spec reference\n *\n * Shows upgrade plan and prompts for confirmation before proceeding.\n */\n\nimport ansis from \"ansis\";\nimport { confirm } from \"@clack/prompts\";\nimport { findProjectRoot, getSpecReferencePath, getModelPath } from \"../utils/project-paths.js\";\nimport {\n getCliVersion,\n getCliBundledSpecVersion,\n getInstalledSpecVersion,\n getModelSpecVersion,\n} from \"../utils/spec-version.js\";\nimport { MigrationRegistry } from \"../core/migration-registry.js\";\nimport { installSpecReference } from \"../utils/spec-installer.js\";\nimport { Model } from \"../core/model.js\";\nimport { ClaudeIntegrationManager } from \"../integrations/claude-manager.js\";\nimport { CopilotIntegrationManager } from \"../integrations/copilot-manager.js\";\nimport { getErrorMessage } from \"../utils/errors.js\";\nimport { startSpan, endSpan } from \"../telemetry/index.js\";\nimport { hasLayerReports, regenerateLayerReports } from \"./reports.js\";\n\n// Build-time constant for telemetry feature detection\ndeclare const TELEMETRY_ENABLED: boolean | undefined;\nconst isTelemetryEnabled = typeof TELEMETRY_ENABLED !== \"undefined\" ? TELEMETRY_ENABLED : false;\n\nexport interface UpgradeOptions {\n yes?: boolean;\n dryRun?: boolean;\n force?: boolean;\n}\n\ninterface UpgradeAction {\n type: \"spec\" | \"model\" | \"integration\";\n description: string;\n fromVersion?: string;\n toVersion: string;\n details?: string[];\n integrationName?: \"claude\" | \"copilot\";\n versionBumpOnly?: boolean;\n}\n\n/**\n * Build integration upgrade actions and collect up-to-date status lines\n */\nasync function buildIntegrationActions(\n cliVersion: string,\n force: boolean\n): Promise<{ actions: UpgradeAction[]; upToDate: string[] }> {\n const actions: UpgradeAction[] = [];\n const upToDate: string[] = [];\n\n // Check Claude integration\n const claudeManager = new ClaudeIntegrationManager();\n if (await claudeManager.isInstalled()) {\n const claudeVersion = await claudeManager.loadVersionFile();\n const installedVersion = claudeVersion?.version;\n const needsUpgrade = installedVersion && installedVersion !== cliVersion;\n\n if (force || needsUpgrade) {\n actions.push({\n type: \"integration\",\n description: force\n ? \"Reinstall Claude Code integration (forced)\"\n : \"Upgrade Claude Code integration\",\n fromVersion: installedVersion,\n toVersion: cliVersion,\n integrationName: \"claude\",\n });\n } else if (installedVersion) {\n upToDate.push(\n ` ${ansis.green(\"\u2713\")} Claude Code integration up to date (v${installedVersion})`\n );\n }\n }\n\n // Check Copilot integration\n const copilotManager = new CopilotIntegrationManager();\n if (await copilotManager.isInstalled()) {\n const copilotVersion = await copilotManager.loadVersionFile();\n const installedVersion = copilotVersion?.version;\n const needsUpgrade = installedVersion && installedVersion !== cliVersion;\n\n if (force || needsUpgrade) {\n actions.push({\n type: \"integration\",\n description: force\n ? \"Reinstall GitHub Copilot integration (forced)\"\n : \"Upgrade GitHub Copilot integration\",\n fromVersion: installedVersion,\n toVersion: cliVersion,\n integrationName: \"copilot\",\n });\n } else if (installedVersion) {\n upToDate.push(\n ` ${ansis.green(\"\u2713\")} GitHub Copilot integration up to date (v${installedVersion})`\n );\n }\n }\n\n return { actions, upToDate };\n}\n\n/**\n * Check if layer reports exist; if not, offer to generate them.\n * Defaults to generating (yes) \u2014 including in non-interactive/programmatic mode.\n */\nasync function checkAndGenerateReports(\n projectRoot: string,\n options: UpgradeOptions\n): Promise<void> {\n if (await hasLayerReports(projectRoot)) {\n return;\n }\n\n console.log(ansis.yellow(\"\\n\u26A0 No layer reports found\"));\n\n if (options.dryRun) {\n console.log(ansis.yellow(\"[DRY RUN] Would generate all 12 layer reports\\n\"));\n return;\n }\n\n // Determine whether to generate: default is yes\n let shouldGenerate: boolean;\n const isInteractive = process.stdin.isTTY && process.stdout.isTTY;\n\n if (options.yes) {\n shouldGenerate = true;\n } else if (isInteractive) {\n const response = await confirm({\n message: \"Generate layer reports?\",\n initialValue: true,\n });\n shouldGenerate = response === true;\n } else {\n // Non-interactive / programmatic: auto-generate since default is yes\n shouldGenerate = true;\n }\n\n if (!shouldGenerate) {\n console.log(ansis.dim(\"Skipping report generation\\n\"));\n return;\n }\n\n try {\n console.log();\n await regenerateLayerReports(projectRoot);\n } catch (error) {\n // Warn but don't block upgrade success\n console.warn(ansis.yellow(`\\n\u26A0 Failed to generate reports: ${getErrorMessage(error)}\\n`));\n }\n}\n\nexport async function upgradeCommand(options: UpgradeOptions = {}): Promise<void> {\n const commandSpan = isTelemetryEnabled\n ? startSpan(\"upgrade.execute\", {\n \"upgrade.yes\": options.yes || false,\n \"upgrade.dry_run\": options.dryRun || false,\n \"upgrade.force\": options.force || false,\n })\n : null;\n\n try {\n console.log(ansis.bold(\"\\nScanning for available upgrades...\\n\"));\n\n // Find project root\n const projectRoot = await findProjectRoot();\n if (!projectRoot) {\n const error = new Error(\"No DR project found. Run \\\"dr init\\\" to create a new project\");\n if (commandSpan) {\n commandSpan.recordException(error);\n commandSpan.setStatus({\n code: 2, // SpanStatusCode.ERROR\n message: error.message,\n });\n commandSpan.setAttribute(\"upgrade.result\", \"no_project\");\n }\n console.error(ansis.red(\"Error: No DR project found\"));\n console.error(ansis.dim('Run \"dr init\" to create a new project'));\n throw error;\n }\n\n const bundledSpecVersion = getCliBundledSpecVersion();\n const cliVersion = getCliVersion();\n const actions: UpgradeAction[] = [];\n\n // ============================================================================\n // STEP 1: Check spec reference (.dr/ folder)\n // ============================================================================\n\n const drPath = await getSpecReferencePath();\n let currentSpecVersion: string | null = null;\n\n if (!drPath) {\n actions.push({\n type: \"spec\",\n description: \"Install spec reference\",\n toVersion: bundledSpecVersion,\n details: [\n \"Create .dr/ folder\",\n \"Install schema files\",\n `Set spec version to ${bundledSpecVersion}`,\n ],\n });\n } else {\n let installedSpecVersion: string | null = null;\n try {\n installedSpecVersion = await getInstalledSpecVersion(drPath);\n } catch (error) {\n // Manifest file exists but is corrupted or unreadable\n const message = error instanceof Error ? error.message : String(error);\n console.error(ansis.red(`Error: ${message}`));\n throw error;\n }\n currentSpecVersion = installedSpecVersion;\n\n if (!installedSpecVersion) {\n actions.push({\n type: \"spec\",\n description: \"Reinstall spec reference (manifest missing)\",\n toVersion: bundledSpecVersion,\n details: [\n \"Recreate .dr/manifest.json\",\n \"Update schema files\",\n `Set spec version to ${bundledSpecVersion}`,\n ],\n });\n } else if (installedSpecVersion !== bundledSpecVersion || options.force) {\n actions.push({\n type: \"spec\",\n description: installedSpecVersion !== bundledSpecVersion\n ? \"Upgrade spec reference\"\n : \"Reinstall spec reference (forced)\",\n fromVersion: installedSpecVersion,\n toVersion: bundledSpecVersion,\n details: [\"Update schema files\", \"Update .dr/manifest.json\"],\n });\n }\n }\n\n // ============================================================================\n // STEP 2: Check model upgrade\n // ============================================================================\n\n const modelPath = await getModelPath();\n if (!modelPath) {\n console.log(ansis.yellow(\"\u26A0 No model found\"));\n console.log(ansis.dim(' Run \"dr init\" to create a model\\n'));\n\n // If only spec needs upgrade, handle it\n if (actions.length > 0) {\n const { actions: integrationActions, upToDate: integrationUpToDate } =\n await buildIntegrationActions(cliVersion, options.force ?? false);\n actions.push(...integrationActions);\n await handleUpgrade(projectRoot, actions, options, integrationUpToDate, commandSpan);\n }\n // No model loaded \u2014 report generation not applicable\n return;\n }\n\n let modelSpecVersion: string | null = null;\n try {\n modelSpecVersion = await getModelSpecVersion(modelPath);\n } catch (error) {\n // Manifest file exists but is corrupted or unreadable\n const message = error instanceof Error ? error.message : String(error);\n console.error(ansis.red(`Error: ${message}`));\n throw error;\n }\n\n if (!modelSpecVersion) {\n console.log(ansis.yellow(\"\u26A0 Model manifest.yaml not found or missing specVersion\"));\n console.log(ansis.dim(\" Check documentation_robotics/model/manifest.yaml\\n\"));\n\n // If only spec needs upgrade, handle it\n if (actions.length > 0) {\n const { actions: integrationActions, upToDate: integrationUpToDate } =\n await buildIntegrationActions(cliVersion, options.force ?? false);\n actions.push(...integrationActions);\n await handleUpgrade(projectRoot, actions, options, integrationUpToDate, commandSpan);\n }\n // No readable model manifest \u2014 report generation not applicable\n return;\n }\n\n // Determine target spec version for model\n const targetSpecVersion = currentSpecVersion || bundledSpecVersion;\n\n if (modelSpecVersion !== targetSpecVersion) {\n // Check if we have a migration path\n const registry = new MigrationRegistry();\n const summary = registry.getMigrationSummary(modelSpecVersion, targetSpecVersion);\n\n if (summary.migrationsNeeded === 0) {\n if (options.force) {\n // No migration path exists, but --force allows bumping the model version directly.\n // This is safe for additive spec changes (new node types / relationships) that\n // require no structural data changes.\n actions.push({\n type: \"model\",\n description: \"Force-update model spec version (no migration required)\",\n fromVersion: modelSpecVersion,\n toVersion: targetSpecVersion,\n details: [\"Update manifest.yaml specVersion (no data changes needed)\"],\n versionBumpOnly: true,\n });\n } else {\n const error = new Error(\n `No migration path found from model v${modelSpecVersion} to v${targetSpecVersion}`\n );\n if (commandSpan) {\n commandSpan.recordException(error);\n commandSpan.setStatus({\n code: 2, // SpanStatusCode.ERROR\n message: error.message,\n });\n commandSpan.setAttribute(\"upgrade.result\", \"no_migration_path\");\n }\n console.log(\n ansis.yellow(\n `\u26A0 No migration path found from model v${modelSpecVersion} to v${targetSpecVersion}`\n )\n );\n console.log(ansis.dim(\"\\nAvailable migrations:\"));\n const allMigrations = registry.getMigrationSummary(\"0.5.0\").migrations;\n for (const migration of allMigrations) {\n console.log(\n ansis.dim(` \u2022 ${migration.from} \u2192 ${migration.to}: ${migration.description}`)\n );\n }\n console.log();\n throw error;\n }\n }\n\n const migrationDetails = summary.migrations.map(\n (m) => `${m.from} \u2192 ${m.to}: ${m.description}`\n );\n\n actions.push({\n type: \"model\",\n description: \"Migrate model data\",\n fromVersion: modelSpecVersion,\n toVersion: targetSpecVersion,\n details: migrationDetails,\n });\n }\n\n // ============================================================================\n // STEP 3: Check integration versions\n // ============================================================================\n\n const { actions: integrationActions, upToDate: integrationUpToDate } =\n await buildIntegrationActions(cliVersion, options.force ?? false);\n actions.push(...integrationActions);\n\n // ============================================================================\n // STEP 4: Display upgrade plan and execute\n // ============================================================================\n\n if (actions.length === 0) {\n if (commandSpan) {\n commandSpan.setAttribute(\"upgrade.result\", \"up_to_date\");\n commandSpan.setAttribute(\"upgrade.actions_count\", 0);\n }\n console.log(ansis.green(\"\u2713 Everything is up to date!\\n\"));\n console.log(ansis.dim(` Spec reference: v${currentSpecVersion || bundledSpecVersion}`));\n console.log(ansis.dim(` Model: v${modelSpecVersion}\\n`));\n await checkAndGenerateReports(projectRoot, options);\n return;\n }\n\n if (commandSpan) {\n commandSpan.setAttribute(\"upgrade.actions_count\", actions.length);\n commandSpan.setAttribute(\n \"upgrade.has_spec_upgrade\",\n actions.some((a) => a.type === \"spec\")\n );\n commandSpan.setAttribute(\n \"upgrade.has_model_migration\",\n actions.some((a) => a.type === \"model\")\n );\n commandSpan.setAttribute(\n \"upgrade.has_integration_upgrade\",\n actions.some((a) => a.type === \"integration\")\n );\n }\n\n await handleUpgrade(projectRoot, actions, options, integrationUpToDate, commandSpan);\n await checkAndGenerateReports(projectRoot, options);\n\n if (commandSpan) {\n commandSpan.setAttribute(\"upgrade.result\", \"success\");\n }\n } catch (error) {\n if (commandSpan) {\n commandSpan.recordException(error as Error);\n commandSpan.setStatus({\n code: 2, // SpanStatusCode.ERROR\n message: getErrorMessage(error),\n });\n commandSpan.setAttribute(\"upgrade.result\", \"error\");\n }\n console.error(ansis.red(`Error: ${getErrorMessage(error)}`));\n throw error;\n } finally {\n endSpan(commandSpan);\n }\n}\n\n/**\n * Handle the upgrade process\n */\nasync function handleUpgrade(\n projectRoot: string,\n actions: UpgradeAction[],\n options: UpgradeOptions,\n integrationUpToDate: string[] = [],\n parentSpan: any = null\n): Promise<void> {\n // Display upgrade plan\n if (actions.length > 0) {\n console.log(ansis.bold(\"Upgrade Plan:\\n\"));\n\n for (const action of actions) {\n const versionChange = action.fromVersion\n ? `${action.fromVersion} \u2192 ${action.toVersion}`\n : `v${action.toVersion}`;\n\n const icon = action.type === \"spec\" ? \"\uD83D\uDCE6\" : action.type === \"integration\" ? \"\uD83D\uDD0C\" : \"\uD83D\uDD04\";\n console.log(ansis.yellow(`${icon} ${action.description}`));\n console.log(ansis.dim(` Version: ${versionChange}`));\n\n if (action.details && action.details.length > 0) {\n for (const detail of action.details) {\n console.log(ansis.dim(` \u2022 ${detail}`));\n }\n }\n console.log();\n }\n }\n\n // Display integration status for up-to-date integrations\n if (integrationUpToDate.length > 0) {\n console.log(ansis.bold(\"Integration Status:\"));\n integrationUpToDate.forEach((msg) => console.log(msg));\n console.log();\n }\n\n // Handle dry-run mode\n if (options.dryRun) {\n console.log(ansis.yellow(\"[DRY RUN] No changes will be made\\n\"));\n if (parentSpan) {\n parentSpan.setAttribute(\"upgrade.dry_run_completed\", true);\n }\n return;\n }\n\n // Prompt for confirmation unless --yes flag is set\n let shouldProceed = options.yes;\n if (!shouldProceed) {\n // Check if we're in an interactive terminal\n const isInteractive = process.stdin.isTTY && process.stdout.isTTY;\n\n if (isInteractive) {\n const response = await confirm({\n message: \"Proceed with upgrade?\",\n });\n shouldProceed = response === true;\n } else {\n const error = new Error(\"Non-interactive mode requires --yes flag to proceed with upgrade\");\n if (parentSpan) {\n parentSpan.recordException(error);\n parentSpan.setAttribute(\"upgrade.result\", \"non_interactive_abort\");\n }\n console.error(\n ansis.red(\"Error: Non-interactive mode requires --yes flag to proceed with upgrade\")\n );\n throw error;\n }\n }\n\n if (!shouldProceed) {\n console.log(ansis.dim(\"\\nUpgrade cancelled\\n\"));\n if (parentSpan) {\n parentSpan.setAttribute(\"upgrade.user_cancelled\", true);\n }\n return;\n }\n\n console.log(ansis.bold(\"\\nExecuting upgrades...\\n\"));\n\n // Execute actions in order: spec, model, then integrations\n for (const action of actions) {\n if (action.type === \"spec\") {\n await executeSpecUpgrade(projectRoot, action);\n } else if (action.type === \"model\") {\n await executeModelMigration(action, options);\n } else if (action.type === \"integration\") {\n await executeIntegrationUpdate(action.description, async () => {\n if (action.integrationName === \"claude\") {\n const m = new ClaudeIntegrationManager();\n await m.upgrade({ force: true }); // force=true skips internal prompts (user confirmed above)\n } else {\n const m = new CopilotIntegrationManager();\n await m.upgrade({ force: true });\n }\n });\n }\n }\n\n console.log(ansis.green(\"\\n\u2713 All upgrades completed successfully!\\n\"));\n}\n\n/**\n * Execute spec reference upgrade\n */\nasync function executeSpecUpgrade(projectRoot: string, action: UpgradeAction): Promise<void> {\n const operationSpan = isTelemetryEnabled\n ? startSpan(\"upgrade.spec\", {\n \"upgrade.spec.from_version\": action.fromVersion || \"none\",\n \"upgrade.spec.to_version\": action.toVersion,\n \"upgrade.spec.is_reinstall\": !action.fromVersion,\n })\n : null;\n\n try {\n console.log(ansis.dim(`Installing spec reference v${action.toVersion}...`));\n await installSpecReference(projectRoot, true);\n console.log(ansis.green(`\u2713 Spec reference upgraded to v${action.toVersion}`));\n\n if (operationSpan) {\n operationSpan.setAttribute(\"upgrade.spec.result\", \"success\");\n }\n } catch (error) {\n if (operationSpan) {\n operationSpan.recordException(error as Error);\n operationSpan.setStatus({\n code: 2, // SpanStatusCode.ERROR\n message: getErrorMessage(error),\n });\n operationSpan.setAttribute(\"upgrade.spec.result\", \"error\");\n }\n console.error(\n ansis.red(\n `Error upgrading spec reference: ${getErrorMessage(error)}`\n )\n );\n throw error;\n } finally {\n endSpan(operationSpan);\n }\n}\n\n/**\n * Execute model migration\n */\nasync function executeModelMigration(\n action: UpgradeAction,\n options: UpgradeOptions\n): Promise<void> {\n const operationSpan = isTelemetryEnabled\n ? startSpan(\"upgrade.model\", {\n \"upgrade.model.from_version\": action.fromVersion || \"unknown\",\n \"upgrade.model.to_version\": action.toVersion,\n \"upgrade.model.version_bump_only\": action.versionBumpOnly || false,\n \"upgrade.model.validate\": !options.force,\n })\n : null;\n\n try {\n if (action.versionBumpOnly) {\n console.log(\n ansis.dim(`Bumping model spec version from v${action.fromVersion} to v${action.toVersion}...`)\n );\n const model = await Model.load(process.cwd(), { lazyLoad: true });\n model.manifest.specVersion = action.toVersion;\n await model.saveManifest();\n console.log(ansis.green(`\u2713 Model spec version updated to v${action.toVersion}`));\n\n if (operationSpan) {\n operationSpan.setAttribute(\"upgrade.model.result\", \"version_bumped\");\n }\n return;\n }\n\n console.log(\n ansis.dim(`Migrating model from v${action.fromVersion} to v${action.toVersion}...`)\n );\n\n // Load the model\n const model = await Model.load(process.cwd(), { lazyLoad: false });\n\n // Apply migrations\n const registry = new MigrationRegistry();\n const result = await registry.applyMigrations(model, {\n fromVersion: action.fromVersion!,\n toVersion: action.toVersion,\n dryRun: false,\n validate: !options.force,\n });\n\n // Display migration results\n for (const applied of result.applied) {\n console.log(ansis.green(` \u2713 ${applied.from} \u2192 ${applied.to}: ${applied.description}`));\n if (applied.changes?.filesModified) {\n console.log(ansis.dim(` Files modified: ${applied.changes.filesModified}`));\n }\n }\n\n // Save changes\n await model.saveManifest();\n await model.saveDirtyLayers();\n\n console.log(ansis.green(`\u2713 Model migrated to v${action.toVersion}`));\n\n if (operationSpan) {\n operationSpan.setAttribute(\"upgrade.model.result\", \"migrated\");\n operationSpan.setAttribute(\"upgrade.model.migrations_applied\", result.applied.length);\n }\n } catch (error) {\n if (operationSpan) {\n operationSpan.recordException(error as Error);\n operationSpan.setStatus({\n code: 2, // SpanStatusCode.ERROR\n message: getErrorMessage(error),\n });\n operationSpan.setAttribute(\"upgrade.model.result\", \"error\");\n }\n console.error(\n ansis.red(`Error migrating model: ${getErrorMessage(error)}`)\n );\n throw error;\n } finally {\n endSpan(operationSpan);\n }\n}\n\n/**\n * Execute integration update\n */\nasync function executeIntegrationUpdate(\n label: string,\n updateFn: () => Promise<void>\n): Promise<void> {\n const operationSpan = isTelemetryEnabled\n ? startSpan(\"upgrade.integration\", {\n \"upgrade.integration.label\": label,\n \"upgrade.integration.type\": label.includes(\"Claude\")\n ? \"claude\"\n : label.includes(\"Copilot\")\n ? \"copilot\"\n : \"unknown\",\n })\n : null;\n\n try {\n console.log(ansis.dim(`${label}...`));\n await updateFn();\n console.log(ansis.green(`\u2713 ${label}`));\n\n if (operationSpan) {\n operationSpan.setAttribute(\"upgrade.integration.result\", \"success\");\n }\n } catch (error) {\n if (operationSpan) {\n operationSpan.recordException(error as Error);\n operationSpan.setStatus({\n code: 2, // SpanStatusCode.ERROR\n message: getErrorMessage(error),\n });\n operationSpan.setAttribute(\"upgrade.integration.result\", \"error\");\n }\n console.error(ansis.red(`Error: ${label} failed: ${getErrorMessage(error)}`));\n throw error;\n } finally {\n endSpan(operationSpan);\n }\n}\n"],
|
|
4
|
+
"sourcesContent": ["/**\n * Upgrade Command - Manages spec reference and model upgrades\n *\n * Scans the filesystem to determine what needs upgrading:\n * 1. .dr/ (spec reference) - if CLI has newer bundled version\n * 2. Model data - if model spec version doesn't match spec reference\n *\n * Shows upgrade plan and prompts for confirmation before proceeding.\n */\n\nimport ansis from \"ansis\";\nimport { confirm } from \"@clack/prompts\";\nimport { findProjectRoot, getSpecReferencePath, getModelPath } from \"../utils/project-paths.js\";\nimport {\n getCliVersion,\n getCliBundledSpecVersion,\n getInstalledSpecVersion,\n getModelSpecVersion,\n} from \"../utils/spec-version.js\";\nimport { MigrationRegistry } from \"../core/migration-registry.js\";\nimport { installSpecReference } from \"../utils/spec-installer.js\";\nimport { Model } from \"../core/model.js\";\nimport { ClaudeIntegrationManager } from \"../integrations/claude-manager.js\";\nimport { CopilotIntegrationManager } from \"../integrations/copilot-manager.js\";\nimport { getErrorMessage } from \"../utils/errors.js\";\nimport { startSpan, endSpan } from \"../telemetry/index.js\";\nimport { hasLayerReports, regenerateLayerReports } from \"./reports.js\";\n\n// Build-time constant for telemetry feature detection\ndeclare const TELEMETRY_ENABLED: boolean | undefined;\nconst isTelemetryEnabled = typeof TELEMETRY_ENABLED !== \"undefined\" ? TELEMETRY_ENABLED : false;\n\nexport interface UpgradeOptions {\n yes?: boolean;\n dryRun?: boolean;\n force?: boolean;\n}\n\ninterface UpgradeAction {\n type: \"spec\" | \"model\" | \"integration\";\n description: string;\n fromVersion?: string;\n toVersion: string;\n details?: string[];\n integrationName?: \"claude\" | \"copilot\";\n versionBumpOnly?: boolean;\n}\n\n/**\n * Build integration upgrade actions and collect up-to-date status lines\n */\nasync function buildIntegrationActions(\n cliVersion: string,\n force: boolean\n): Promise<{ actions: UpgradeAction[]; upToDate: string[] }> {\n const actions: UpgradeAction[] = [];\n const upToDate: string[] = [];\n\n // Check Claude integration\n const claudeManager = new ClaudeIntegrationManager();\n if (await claudeManager.isInstalled()) {\n const claudeVersion = await claudeManager.loadVersionFile();\n const installedVersion = claudeVersion?.version;\n const needsUpgrade = installedVersion && installedVersion !== cliVersion;\n\n if (force || needsUpgrade) {\n actions.push({\n type: \"integration\",\n description: force\n ? \"Reinstall Claude Code integration (forced)\"\n : \"Upgrade Claude Code integration\",\n fromVersion: installedVersion,\n toVersion: cliVersion,\n integrationName: \"claude\",\n });\n } else if (installedVersion) {\n upToDate.push(\n ` ${ansis.green(\"\u2713\")} Claude Code integration up to date (v${installedVersion})`\n );\n }\n }\n\n // Check Copilot integration\n const copilotManager = new CopilotIntegrationManager();\n if (await copilotManager.isInstalled()) {\n const copilotVersion = await copilotManager.loadVersionFile();\n const installedVersion = copilotVersion?.version;\n const needsUpgrade = installedVersion && installedVersion !== cliVersion;\n\n if (force || needsUpgrade) {\n actions.push({\n type: \"integration\",\n description: force\n ? \"Reinstall GitHub Copilot integration (forced)\"\n : \"Upgrade GitHub Copilot integration\",\n fromVersion: installedVersion,\n toVersion: cliVersion,\n integrationName: \"copilot\",\n });\n } else if (installedVersion) {\n upToDate.push(\n ` ${ansis.green(\"\u2713\")} GitHub Copilot integration up to date (v${installedVersion})`\n );\n }\n }\n\n return { actions, upToDate };\n}\n\n/**\n * Check if layer reports exist; if not, offer to generate them.\n * Defaults to generating (yes) \u2014 including in non-interactive/programmatic mode.\n */\nasync function checkAndGenerateReports(\n projectRoot: string,\n options: UpgradeOptions\n): Promise<void> {\n if (await hasLayerReports(projectRoot)) {\n return;\n }\n\n console.log(ansis.yellow(\"\\n\u26A0 No layer reports found\"));\n\n if (options.dryRun) {\n console.log(ansis.yellow(\"[DRY RUN] Would generate all 13 layer reports\\n\"));\n return;\n }\n\n // Determine whether to generate: default is yes\n let shouldGenerate: boolean;\n const isInteractive = process.stdin.isTTY && process.stdout.isTTY;\n\n if (options.yes) {\n shouldGenerate = true;\n } else if (isInteractive) {\n const response = await confirm({\n message: \"Generate layer reports?\",\n initialValue: true,\n });\n shouldGenerate = response === true;\n } else {\n // Non-interactive / programmatic: auto-generate since default is yes\n shouldGenerate = true;\n }\n\n if (!shouldGenerate) {\n console.log(ansis.dim(\"Skipping report generation\\n\"));\n return;\n }\n\n try {\n console.log();\n await regenerateLayerReports(projectRoot);\n } catch (error) {\n // Warn but don't block upgrade success\n console.warn(ansis.yellow(`\\n\u26A0 Failed to generate reports: ${getErrorMessage(error)}\\n`));\n }\n}\n\nexport async function upgradeCommand(options: UpgradeOptions = {}): Promise<void> {\n const commandSpan = isTelemetryEnabled\n ? startSpan(\"upgrade.execute\", {\n \"upgrade.yes\": options.yes || false,\n \"upgrade.dry_run\": options.dryRun || false,\n \"upgrade.force\": options.force || false,\n })\n : null;\n\n try {\n console.log(ansis.bold(\"\\nScanning for available upgrades...\\n\"));\n\n // Find project root\n const projectRoot = await findProjectRoot();\n if (!projectRoot) {\n const error = new Error(\"No DR project found. Run \\\"dr init\\\" to create a new project\");\n if (commandSpan) {\n commandSpan.recordException(error);\n commandSpan.setStatus({\n code: 2, // SpanStatusCode.ERROR\n message: error.message,\n });\n commandSpan.setAttribute(\"upgrade.result\", \"no_project\");\n }\n console.error(ansis.red(\"Error: No DR project found\"));\n console.error(ansis.dim('Run \"dr init\" to create a new project'));\n throw error;\n }\n\n const bundledSpecVersion = getCliBundledSpecVersion();\n const cliVersion = getCliVersion();\n const actions: UpgradeAction[] = [];\n\n // ============================================================================\n // STEP 1: Check spec reference (.dr/ folder)\n // ============================================================================\n\n const drPath = await getSpecReferencePath();\n let currentSpecVersion: string | null = null;\n\n if (!drPath) {\n actions.push({\n type: \"spec\",\n description: \"Install spec reference\",\n toVersion: bundledSpecVersion,\n details: [\n \"Create .dr/ folder\",\n \"Install schema files\",\n `Set spec version to ${bundledSpecVersion}`,\n ],\n });\n } else {\n let installedSpecVersion: string | null = null;\n try {\n installedSpecVersion = await getInstalledSpecVersion(drPath);\n } catch (error) {\n // Manifest file exists but is corrupted or unreadable\n const message = error instanceof Error ? error.message : String(error);\n console.error(ansis.red(`Error: ${message}`));\n throw error;\n }\n currentSpecVersion = installedSpecVersion;\n\n if (!installedSpecVersion) {\n actions.push({\n type: \"spec\",\n description: \"Reinstall spec reference (manifest missing)\",\n toVersion: bundledSpecVersion,\n details: [\n \"Recreate .dr/manifest.json\",\n \"Update schema files\",\n `Set spec version to ${bundledSpecVersion}`,\n ],\n });\n } else if (installedSpecVersion !== bundledSpecVersion || options.force) {\n actions.push({\n type: \"spec\",\n description: installedSpecVersion !== bundledSpecVersion\n ? \"Upgrade spec reference\"\n : \"Reinstall spec reference (forced)\",\n fromVersion: installedSpecVersion,\n toVersion: bundledSpecVersion,\n details: [\"Update schema files\", \"Update .dr/manifest.json\"],\n });\n }\n }\n\n // ============================================================================\n // STEP 2: Check model upgrade\n // ============================================================================\n\n const modelPath = await getModelPath();\n if (!modelPath) {\n console.log(ansis.yellow(\"\u26A0 No model found\"));\n console.log(ansis.dim(' Run \"dr init\" to create a model\\n'));\n\n // If only spec needs upgrade, handle it\n if (actions.length > 0) {\n const { actions: integrationActions, upToDate: integrationUpToDate } =\n await buildIntegrationActions(cliVersion, options.force ?? false);\n actions.push(...integrationActions);\n await handleUpgrade(projectRoot, actions, options, integrationUpToDate, commandSpan);\n }\n // No model loaded \u2014 report generation not applicable\n return;\n }\n\n let modelSpecVersion: string | null = null;\n try {\n modelSpecVersion = await getModelSpecVersion(modelPath);\n } catch (error) {\n // Manifest file exists but is corrupted or unreadable\n const message = error instanceof Error ? error.message : String(error);\n console.error(ansis.red(`Error: ${message}`));\n throw error;\n }\n\n if (!modelSpecVersion) {\n console.log(ansis.yellow(\"\u26A0 Model manifest.yaml not found or missing specVersion\"));\n console.log(ansis.dim(\" Check documentation_robotics/model/manifest.yaml\\n\"));\n\n // If only spec needs upgrade, handle it\n if (actions.length > 0) {\n const { actions: integrationActions, upToDate: integrationUpToDate } =\n await buildIntegrationActions(cliVersion, options.force ?? false);\n actions.push(...integrationActions);\n await handleUpgrade(projectRoot, actions, options, integrationUpToDate, commandSpan);\n }\n // No readable model manifest \u2014 report generation not applicable\n return;\n }\n\n // Determine target spec version for model\n const targetSpecVersion = currentSpecVersion || bundledSpecVersion;\n\n if (modelSpecVersion !== targetSpecVersion) {\n // Check if we have a migration path\n const registry = new MigrationRegistry();\n const summary = registry.getMigrationSummary(modelSpecVersion, targetSpecVersion);\n\n if (summary.migrationsNeeded === 0) {\n if (options.force) {\n // No migration path exists, but --force allows bumping the model version directly.\n // This is safe for additive spec changes (new node types / relationships) that\n // require no structural data changes.\n actions.push({\n type: \"model\",\n description: \"Force-update model spec version (no migration required)\",\n fromVersion: modelSpecVersion,\n toVersion: targetSpecVersion,\n details: [\"Update manifest.yaml specVersion (no data changes needed)\"],\n versionBumpOnly: true,\n });\n } else {\n const error = new Error(\n `No migration path found from model v${modelSpecVersion} to v${targetSpecVersion}`\n );\n if (commandSpan) {\n commandSpan.recordException(error);\n commandSpan.setStatus({\n code: 2, // SpanStatusCode.ERROR\n message: error.message,\n });\n commandSpan.setAttribute(\"upgrade.result\", \"no_migration_path\");\n }\n console.log(\n ansis.yellow(\n `\u26A0 No migration path found from model v${modelSpecVersion} to v${targetSpecVersion}`\n )\n );\n console.log(ansis.dim(\"\\nAvailable migrations:\"));\n const allMigrations = registry.getMigrationSummary(\"0.5.0\").migrations;\n for (const migration of allMigrations) {\n console.log(\n ansis.dim(` \u2022 ${migration.from} \u2192 ${migration.to}: ${migration.description}`)\n );\n }\n console.log();\n throw error;\n }\n }\n\n const migrationDetails = summary.migrations.map(\n (m) => `${m.from} \u2192 ${m.to}: ${m.description}`\n );\n\n actions.push({\n type: \"model\",\n description: \"Migrate model data\",\n fromVersion: modelSpecVersion,\n toVersion: targetSpecVersion,\n details: migrationDetails,\n });\n }\n\n // ============================================================================\n // STEP 3: Check integration versions\n // ============================================================================\n\n const { actions: integrationActions, upToDate: integrationUpToDate } =\n await buildIntegrationActions(cliVersion, options.force ?? false);\n actions.push(...integrationActions);\n\n // ============================================================================\n // STEP 4: Display upgrade plan and execute\n // ============================================================================\n\n if (actions.length === 0) {\n if (commandSpan) {\n commandSpan.setAttribute(\"upgrade.result\", \"up_to_date\");\n commandSpan.setAttribute(\"upgrade.actions_count\", 0);\n }\n console.log(ansis.green(\"\u2713 Everything is up to date!\\n\"));\n console.log(ansis.dim(` Spec reference: v${currentSpecVersion || bundledSpecVersion}`));\n console.log(ansis.dim(` Model: v${modelSpecVersion}\\n`));\n await checkAndGenerateReports(projectRoot, options);\n return;\n }\n\n if (commandSpan) {\n commandSpan.setAttribute(\"upgrade.actions_count\", actions.length);\n commandSpan.setAttribute(\n \"upgrade.has_spec_upgrade\",\n actions.some((a) => a.type === \"spec\")\n );\n commandSpan.setAttribute(\n \"upgrade.has_model_migration\",\n actions.some((a) => a.type === \"model\")\n );\n commandSpan.setAttribute(\n \"upgrade.has_integration_upgrade\",\n actions.some((a) => a.type === \"integration\")\n );\n }\n\n await handleUpgrade(projectRoot, actions, options, integrationUpToDate, commandSpan);\n await checkAndGenerateReports(projectRoot, options);\n\n if (commandSpan) {\n commandSpan.setAttribute(\"upgrade.result\", \"success\");\n }\n } catch (error) {\n if (commandSpan) {\n commandSpan.recordException(error as Error);\n commandSpan.setStatus({\n code: 2, // SpanStatusCode.ERROR\n message: getErrorMessage(error),\n });\n commandSpan.setAttribute(\"upgrade.result\", \"error\");\n }\n console.error(ansis.red(`Error: ${getErrorMessage(error)}`));\n throw error;\n } finally {\n endSpan(commandSpan);\n }\n}\n\n/**\n * Handle the upgrade process\n */\nasync function handleUpgrade(\n projectRoot: string,\n actions: UpgradeAction[],\n options: UpgradeOptions,\n integrationUpToDate: string[] = [],\n parentSpan: any = null\n): Promise<void> {\n // Display upgrade plan\n if (actions.length > 0) {\n console.log(ansis.bold(\"Upgrade Plan:\\n\"));\n\n for (const action of actions) {\n const versionChange = action.fromVersion\n ? `${action.fromVersion} \u2192 ${action.toVersion}`\n : `v${action.toVersion}`;\n\n const icon = action.type === \"spec\" ? \"\uD83D\uDCE6\" : action.type === \"integration\" ? \"\uD83D\uDD0C\" : \"\uD83D\uDD04\";\n console.log(ansis.yellow(`${icon} ${action.description}`));\n console.log(ansis.dim(` Version: ${versionChange}`));\n\n if (action.details && action.details.length > 0) {\n for (const detail of action.details) {\n console.log(ansis.dim(` \u2022 ${detail}`));\n }\n }\n console.log();\n }\n }\n\n // Display integration status for up-to-date integrations\n if (integrationUpToDate.length > 0) {\n console.log(ansis.bold(\"Integration Status:\"));\n integrationUpToDate.forEach((msg) => console.log(msg));\n console.log();\n }\n\n // Handle dry-run mode\n if (options.dryRun) {\n console.log(ansis.yellow(\"[DRY RUN] No changes will be made\\n\"));\n if (parentSpan) {\n parentSpan.setAttribute(\"upgrade.dry_run_completed\", true);\n }\n return;\n }\n\n // Prompt for confirmation unless --yes flag is set\n let shouldProceed = options.yes;\n if (!shouldProceed) {\n // Check if we're in an interactive terminal\n const isInteractive = process.stdin.isTTY && process.stdout.isTTY;\n\n if (isInteractive) {\n const response = await confirm({\n message: \"Proceed with upgrade?\",\n });\n shouldProceed = response === true;\n } else {\n const error = new Error(\"Non-interactive mode requires --yes flag to proceed with upgrade\");\n if (parentSpan) {\n parentSpan.recordException(error);\n parentSpan.setAttribute(\"upgrade.result\", \"non_interactive_abort\");\n }\n console.error(\n ansis.red(\"Error: Non-interactive mode requires --yes flag to proceed with upgrade\")\n );\n throw error;\n }\n }\n\n if (!shouldProceed) {\n console.log(ansis.dim(\"\\nUpgrade cancelled\\n\"));\n if (parentSpan) {\n parentSpan.setAttribute(\"upgrade.user_cancelled\", true);\n }\n return;\n }\n\n console.log(ansis.bold(\"\\nExecuting upgrades...\\n\"));\n\n // Execute actions in order: spec, model, then integrations\n for (const action of actions) {\n if (action.type === \"spec\") {\n await executeSpecUpgrade(projectRoot, action);\n } else if (action.type === \"model\") {\n await executeModelMigration(action, options);\n } else if (action.type === \"integration\") {\n await executeIntegrationUpdate(action.description, async () => {\n if (action.integrationName === \"claude\") {\n const m = new ClaudeIntegrationManager();\n await m.upgrade({ force: true }); // force=true skips internal prompts (user confirmed above)\n } else {\n const m = new CopilotIntegrationManager();\n await m.upgrade({ force: true });\n }\n });\n }\n }\n\n console.log(ansis.green(\"\\n\u2713 All upgrades completed successfully!\\n\"));\n}\n\n/**\n * Execute spec reference upgrade\n */\nasync function executeSpecUpgrade(projectRoot: string, action: UpgradeAction): Promise<void> {\n const operationSpan = isTelemetryEnabled\n ? startSpan(\"upgrade.spec\", {\n \"upgrade.spec.from_version\": action.fromVersion || \"none\",\n \"upgrade.spec.to_version\": action.toVersion,\n \"upgrade.spec.is_reinstall\": !action.fromVersion,\n })\n : null;\n\n try {\n console.log(ansis.dim(`Installing spec reference v${action.toVersion}...`));\n await installSpecReference(projectRoot, true);\n console.log(ansis.green(`\u2713 Spec reference upgraded to v${action.toVersion}`));\n\n if (operationSpan) {\n operationSpan.setAttribute(\"upgrade.spec.result\", \"success\");\n }\n } catch (error) {\n if (operationSpan) {\n operationSpan.recordException(error as Error);\n operationSpan.setStatus({\n code: 2, // SpanStatusCode.ERROR\n message: getErrorMessage(error),\n });\n operationSpan.setAttribute(\"upgrade.spec.result\", \"error\");\n }\n console.error(\n ansis.red(\n `Error upgrading spec reference: ${getErrorMessage(error)}`\n )\n );\n throw error;\n } finally {\n endSpan(operationSpan);\n }\n}\n\n/**\n * Execute model migration\n */\nasync function executeModelMigration(\n action: UpgradeAction,\n options: UpgradeOptions\n): Promise<void> {\n const operationSpan = isTelemetryEnabled\n ? startSpan(\"upgrade.model\", {\n \"upgrade.model.from_version\": action.fromVersion || \"unknown\",\n \"upgrade.model.to_version\": action.toVersion,\n \"upgrade.model.version_bump_only\": action.versionBumpOnly || false,\n \"upgrade.model.validate\": !options.force,\n })\n : null;\n\n try {\n if (action.versionBumpOnly) {\n console.log(\n ansis.dim(`Bumping model spec version from v${action.fromVersion} to v${action.toVersion}...`)\n );\n const model = await Model.load(process.cwd(), { lazyLoad: true });\n model.manifest.specVersion = action.toVersion;\n await model.saveManifest();\n console.log(ansis.green(`\u2713 Model spec version updated to v${action.toVersion}`));\n\n if (operationSpan) {\n operationSpan.setAttribute(\"upgrade.model.result\", \"version_bumped\");\n }\n return;\n }\n\n console.log(\n ansis.dim(`Migrating model from v${action.fromVersion} to v${action.toVersion}...`)\n );\n\n // Load the model\n const model = await Model.load(process.cwd(), { lazyLoad: false });\n\n // Apply migrations\n const registry = new MigrationRegistry();\n const result = await registry.applyMigrations(model, {\n fromVersion: action.fromVersion!,\n toVersion: action.toVersion,\n dryRun: false,\n validate: !options.force,\n });\n\n // Display migration results\n for (const applied of result.applied) {\n console.log(ansis.green(` \u2713 ${applied.from} \u2192 ${applied.to}: ${applied.description}`));\n if (applied.changes?.filesModified) {\n console.log(ansis.dim(` Files modified: ${applied.changes.filesModified}`));\n }\n }\n\n // Save changes\n await model.saveManifest();\n await model.saveDirtyLayers();\n\n console.log(ansis.green(`\u2713 Model migrated to v${action.toVersion}`));\n\n if (operationSpan) {\n operationSpan.setAttribute(\"upgrade.model.result\", \"migrated\");\n operationSpan.setAttribute(\"upgrade.model.migrations_applied\", result.applied.length);\n }\n } catch (error) {\n if (operationSpan) {\n operationSpan.recordException(error as Error);\n operationSpan.setStatus({\n code: 2, // SpanStatusCode.ERROR\n message: getErrorMessage(error),\n });\n operationSpan.setAttribute(\"upgrade.model.result\", \"error\");\n }\n console.error(\n ansis.red(`Error migrating model: ${getErrorMessage(error)}`)\n );\n throw error;\n } finally {\n endSpan(operationSpan);\n }\n}\n\n/**\n * Execute integration update\n */\nasync function executeIntegrationUpdate(\n label: string,\n updateFn: () => Promise<void>\n): Promise<void> {\n const operationSpan = isTelemetryEnabled\n ? startSpan(\"upgrade.integration\", {\n \"upgrade.integration.label\": label,\n \"upgrade.integration.type\": label.includes(\"Claude\")\n ? \"claude\"\n : label.includes(\"Copilot\")\n ? \"copilot\"\n : \"unknown\",\n })\n : null;\n\n try {\n console.log(ansis.dim(`${label}...`));\n await updateFn();\n console.log(ansis.green(`\u2713 ${label}`));\n\n if (operationSpan) {\n operationSpan.setAttribute(\"upgrade.integration.result\", \"success\");\n }\n } catch (error) {\n if (operationSpan) {\n operationSpan.recordException(error as Error);\n operationSpan.setStatus({\n code: 2, // SpanStatusCode.ERROR\n message: getErrorMessage(error),\n });\n operationSpan.setAttribute(\"upgrade.integration.result\", \"error\");\n }\n console.error(ansis.red(`Error: ${label} failed: ${getErrorMessage(error)}`));\n throw error;\n } finally {\n endSpan(operationSpan);\n }\n}\n"],
|
|
5
5
|
"mappings": "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",
|
|
6
6
|
"names": ["integrationActions", "integrationUpToDate", "model"]
|
|
7
7
|
}
|