@documentation-robotics/cli 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (169) hide show
  1. package/PYTHON_CLI_PARITY.md +265 -0
  2. package/PYTHON_CLI_STRUCTURE_UPDATE.md +246 -0
  3. package/README.md +926 -0
  4. package/biome.json +42 -0
  5. package/bunfig.toml +3 -0
  6. package/dist/ai/claude-client.js +71 -0
  7. package/dist/ai/claude-client.js.map +7 -0
  8. package/dist/ai/context-provider.js +129 -0
  9. package/dist/ai/context-provider.js.map +7 -0
  10. package/dist/ai/tools.js +231 -0
  11. package/dist/ai/tools.js.map +7 -0
  12. package/dist/cli.js +224 -0
  13. package/dist/cli.js.map +7 -0
  14. package/dist/commands/add.js +51 -0
  15. package/dist/commands/add.js.map +7 -0
  16. package/dist/commands/changeset.js +174 -0
  17. package/dist/commands/changeset.js.map +7 -0
  18. package/dist/commands/chat.js +111 -0
  19. package/dist/commands/chat.js.map +7 -0
  20. package/dist/commands/conformance.js +132 -0
  21. package/dist/commands/conformance.js.map +7 -0
  22. package/dist/commands/delete.js +31 -0
  23. package/dist/commands/delete.js.map +7 -0
  24. package/dist/commands/element.js +28 -0
  25. package/dist/commands/element.js.map +7 -0
  26. package/dist/commands/export.js +65 -0
  27. package/dist/commands/export.js.map +7 -0
  28. package/dist/commands/info.js +40 -0
  29. package/dist/commands/info.js.map +7 -0
  30. package/dist/commands/init.js +45 -0
  31. package/dist/commands/init.js.map +7 -0
  32. package/dist/commands/list.js +32 -0
  33. package/dist/commands/list.js.map +7 -0
  34. package/dist/commands/migrate.js +36 -0
  35. package/dist/commands/migrate.js.map +7 -0
  36. package/dist/commands/project.js +74 -0
  37. package/dist/commands/project.js.map +7 -0
  38. package/dist/commands/relationship.js +118 -0
  39. package/dist/commands/relationship.js.map +7 -0
  40. package/dist/commands/search.js +48 -0
  41. package/dist/commands/search.js.map +7 -0
  42. package/dist/commands/show.js +38 -0
  43. package/dist/commands/show.js.map +7 -0
  44. package/dist/commands/trace.js +60 -0
  45. package/dist/commands/trace.js.map +7 -0
  46. package/dist/commands/update.js +37 -0
  47. package/dist/commands/update.js.map +7 -0
  48. package/dist/commands/upgrade.js +152 -0
  49. package/dist/commands/upgrade.js.map +7 -0
  50. package/dist/commands/validate.js +71 -0
  51. package/dist/commands/validate.js.map +7 -0
  52. package/dist/commands/version.js +20 -0
  53. package/dist/commands/version.js.map +7 -0
  54. package/dist/commands/visualize.js +51 -0
  55. package/dist/commands/visualize.js.map +7 -0
  56. package/dist/core/active-changeset.js +52 -0
  57. package/dist/core/active-changeset.js.map +7 -0
  58. package/dist/core/changeset.js +244 -0
  59. package/dist/core/changeset.js.map +7 -0
  60. package/dist/core/dependency-tracker.js +322 -0
  61. package/dist/core/dependency-tracker.js.map +7 -0
  62. package/dist/core/element.js +65 -0
  63. package/dist/core/element.js.map +7 -0
  64. package/dist/core/layer.js +75 -0
  65. package/dist/core/layer.js.map +7 -0
  66. package/dist/core/manifest.js +57 -0
  67. package/dist/core/manifest.js.map +7 -0
  68. package/dist/core/migration-registry.js +131 -0
  69. package/dist/core/migration-registry.js.map +7 -0
  70. package/dist/core/model.js +455 -0
  71. package/dist/core/model.js.map +7 -0
  72. package/dist/core/projection-engine.js +288 -0
  73. package/dist/core/projection-engine.js.map +7 -0
  74. package/dist/core/reference-registry.js +188 -0
  75. package/dist/core/reference-registry.js.map +7 -0
  76. package/dist/core/relationship-registry.js +114 -0
  77. package/dist/core/relationship-registry.js.map +7 -0
  78. package/dist/core/relationships.js +78 -0
  79. package/dist/core/relationships.js.map +7 -0
  80. package/dist/export/archimate-exporter.js +111 -0
  81. package/dist/export/archimate-exporter.js.map +7 -0
  82. package/dist/export/export-manager.js +63 -0
  83. package/dist/export/export-manager.js.map +7 -0
  84. package/dist/export/graphml-exporter.js +39 -0
  85. package/dist/export/graphml-exporter.js.map +7 -0
  86. package/dist/export/index.js +17 -0
  87. package/dist/export/index.js.map +7 -0
  88. package/dist/export/json-schema-exporter.js +60 -0
  89. package/dist/export/json-schema-exporter.js.map +7 -0
  90. package/dist/export/markdown-exporter.js +99 -0
  91. package/dist/export/markdown-exporter.js.map +7 -0
  92. package/dist/export/openapi-exporter.js +85 -0
  93. package/dist/export/openapi-exporter.js.map +7 -0
  94. package/dist/export/plantuml-exporter.js +60 -0
  95. package/dist/export/plantuml-exporter.js.map +7 -0
  96. package/dist/export/types.js +36 -0
  97. package/dist/export/types.js.map +7 -0
  98. package/dist/schemas/bundled/01-motivation-layer.schema.json +942 -0
  99. package/dist/schemas/bundled/02-business-layer.schema.json +1293 -0
  100. package/dist/schemas/bundled/03-security-layer.schema.json +2177 -0
  101. package/dist/schemas/bundled/04-application-layer.schema.json +1328 -0
  102. package/dist/schemas/bundled/05-technology-layer.schema.json +1465 -0
  103. package/dist/schemas/bundled/06-api-layer.schema.json +1743 -0
  104. package/dist/schemas/bundled/07-data-model-layer.schema.json +1253 -0
  105. package/dist/schemas/bundled/08-datastore-layer.schema.json +892 -0
  106. package/dist/schemas/bundled/09-ux-layer.schema.json +1506 -0
  107. package/dist/schemas/bundled/10-navigation-layer.schema.json +843 -0
  108. package/dist/schemas/bundled/11-apm-observability-layer.schema.json +1430 -0
  109. package/dist/schemas/bundled/12-testing-layer.schema.json +1091 -0
  110. package/dist/schemas/bundled/common/layer-extensions.schema.json +266 -0
  111. package/dist/schemas/bundled/common/predicates.schema.json +493 -0
  112. package/dist/schemas/bundled/common/relationships.schema.json +791 -0
  113. package/dist/schemas/bundled/common/source-references.schema.json +71 -0
  114. package/dist/schemas/bundled/link-registry.json +1839 -0
  115. package/dist/schemas/bundled/link-registry.schema.json +339 -0
  116. package/dist/schemas/bundled/relationship-catalog.json +1302 -0
  117. package/dist/schemas/bundled/relationship-type.schema.json +221 -0
  118. package/dist/server/server.js +1207 -0
  119. package/dist/server/server.js.map +7 -0
  120. package/dist/server/telemetry-middleware.js +24 -0
  121. package/dist/server/telemetry-middleware.js.map +7 -0
  122. package/dist/telemetry/console-interceptor.js +34 -0
  123. package/dist/telemetry/console-interceptor.js.map +7 -0
  124. package/dist/telemetry/index.js +54 -0
  125. package/dist/telemetry/index.js.map +7 -0
  126. package/dist/telemetry/resilient-exporter.js +41 -0
  127. package/dist/telemetry/resilient-exporter.js.map +7 -0
  128. package/dist/telemetry/resilient-log-exporter.js +41 -0
  129. package/dist/telemetry/resilient-log-exporter.js.map +7 -0
  130. package/dist/telemetry/test-instrumentation.js +32 -0
  131. package/dist/telemetry/test-instrumentation.js.map +7 -0
  132. package/dist/types/index.js +1 -0
  133. package/dist/types/index.js.map +7 -0
  134. package/dist/utils/element-utils.js +11 -0
  135. package/dist/utils/element-utils.js.map +7 -0
  136. package/dist/utils/errors.js +105 -0
  137. package/dist/utils/errors.js.map +7 -0
  138. package/dist/utils/file-io.js +69 -0
  139. package/dist/utils/file-io.js.map +7 -0
  140. package/dist/utils/globals.js +28 -0
  141. package/dist/utils/globals.js.map +7 -0
  142. package/dist/utils/model-path.js +22 -0
  143. package/dist/utils/model-path.js.map +7 -0
  144. package/dist/utils/project-paths.js +45 -0
  145. package/dist/utils/project-paths.js.map +7 -0
  146. package/dist/utils/spec-installer.js +85 -0
  147. package/dist/utils/spec-installer.js.map +7 -0
  148. package/dist/utils/spec-version.js +33 -0
  149. package/dist/utils/spec-version.js.map +7 -0
  150. package/dist/validators/index.js +15 -0
  151. package/dist/validators/index.js.map +7 -0
  152. package/dist/validators/naming-validator.js +82 -0
  153. package/dist/validators/naming-validator.js.map +7 -0
  154. package/dist/validators/reference-validator.js +106 -0
  155. package/dist/validators/reference-validator.js.map +7 -0
  156. package/dist/validators/schema-validator.js +148 -0
  157. package/dist/validators/schema-validator.js.map +7 -0
  158. package/dist/validators/semantic-validator.js +80 -0
  159. package/dist/validators/semantic-validator.js.map +7 -0
  160. package/dist/validators/types.js +48 -0
  161. package/dist/validators/types.js.map +7 -0
  162. package/dist/validators/validator.js +67 -0
  163. package/dist/validators/validator.js.map +7 -0
  164. package/docs/TEST-INSTRUMENTATION.md +405 -0
  165. package/docs/telemetry.md +427 -0
  166. package/package.json +70 -0
  167. package/test-debug.js +33 -0
  168. package/test-special.mjs +46 -0
  169. package/test_runner.ts +7 -0
package/dist/cli.js ADDED
@@ -0,0 +1,224 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from "commander";
3
+ import { setGlobalOptions } from "./utils/globals.js";
4
+ import { initCommand } from "./commands/init.js";
5
+ import { addCommand } from "./commands/add.js";
6
+ import { updateCommand } from "./commands/update.js";
7
+ import { deleteCommand } from "./commands/delete.js";
8
+ import { showCommand } from "./commands/show.js";
9
+ import { listCommand } from "./commands/list.js";
10
+ import { searchCommand } from "./commands/search.js";
11
+ import { validateCommand } from "./commands/validate.js";
12
+ import { infoCommand } from "./commands/info.js";
13
+ import { elementCommands } from "./commands/element.js";
14
+ import { relationshipCommands } from "./commands/relationship.js";
15
+ import { traceCommand } from "./commands/trace.js";
16
+ import { projectCommand, projectAllCommand } from "./commands/project.js";
17
+ import { exportCommand } from "./commands/export.js";
18
+ import { chatCommand } from "./commands/chat.js";
19
+ import { upgradeCommand } from "./commands/upgrade.js";
20
+ import { conformanceCommand } from "./commands/conformance.js";
21
+ import { changesetCommands } from "./commands/changeset.js";
22
+ import { versionCommand } from "./commands/version.js";
23
+ import { initTelemetry, startActiveSpan, shutdownTelemetry } from "./telemetry/index.js";
24
+ import { installConsoleInterceptor } from "./telemetry/console-interceptor.js";
25
+ import { readJSON, fileExists } from "./utils/file-io.js";
26
+ const isTelemetryEnabled = !1;
27
+ async function getCliVersion() {
28
+ const possiblePaths = [
29
+ `${process.cwd()}/package.json`,
30
+ `${import.meta.url.replace("file://", "").split("/src/")[0]}/package.json`
31
+ ];
32
+ for (const path of possiblePaths)
33
+ if (await fileExists(path))
34
+ try {
35
+ return (await readJSON(path)).version;
36
+ } catch {
37
+ continue;
38
+ }
39
+ return "0.1.0";
40
+ }
41
+ const cliVersion = await getCliVersion(), program = new Command();
42
+ if (process.argv.includes("--version") || process.argv.includes("-V")) {
43
+ const { versionCommand: versionCommand2 } = await import("./commands/version.js");
44
+ await versionCommand2(), process.exit(0);
45
+ }
46
+ program.name("dr").description("Documentation Robotics CLI - Architecture Model Management").option("-v, --verbose", "Enable verbose output").option("--debug", "Enable debug mode").hook("preAction", async (thisCommand) => {
47
+ const options = thisCommand.opts();
48
+ setGlobalOptions({
49
+ verbose: options.verbose,
50
+ debug: options.debug
51
+ });
52
+ }), program.command("init").description("Initialize a new architecture model").option("--name <name>", "Model name").option("--author <author>", "Model author").option("--description <desc>", "Model description").addHelpText("after", `
53
+ Examples:
54
+ $ dr init
55
+ $ dr init --name "Enterprise Architecture" --author "Team A"
56
+ $ dr init --description "12-layer federated model"`).action(initCommand), program.command("add <layer> <type> <id>").description("Add an element to a layer").option("--name <name>", "Element name (defaults to ID)").option("--description <desc>", "Element description").option("--properties <json>", "Element properties as JSON object").addHelpText("after", `
57
+ Examples:
58
+ $ dr add business business-service customer-mgmt --name "Customer Management"
59
+ $ dr add api endpoint create-customer --properties '{"method":"POST","path":"/customers"}'
60
+ $ dr add application component customer-api --description "REST API for customer operations"`).action(addCommand), program.command("update <id>").description("Update an element").option("--name <name>", "New element name").option("--description <desc>", "New description").option("--properties <json>", "Updated properties (JSON)").addHelpText("after", `
61
+ Examples:
62
+ $ dr update api-endpoint-create-customer --name "Create Customer (v2)"
63
+ $ dr update business-service-order --description "Updated description"`).action(updateCommand), program.command("delete <id>").description("Delete an element").option("--force", "Skip confirmation prompt").addHelpText("after", `
64
+ Examples:
65
+ $ dr delete api-endpoint-old-endpoint
66
+ $ dr delete api-endpoint-old-endpoint --force`).action(deleteCommand), program.command("show <id>").description("Display element details").option("--model <path>", "Path to model root (contains model/manifest.yaml)").addHelpText("after", `
67
+ Examples:
68
+ $ dr show api-endpoint-create-customer
69
+ $ dr show business-service-order-mgmt`).action((id, options) => showCommand(id, options)), program.command("list <layer>").description("List elements in a layer").option("--type <type>", "Filter by element type").option("--json", "Output as JSON").option("--model <path>", "Path to model root (contains model/manifest.yaml)").addHelpText("after", `
70
+ Examples:
71
+ $ dr list api
72
+ $ dr list business --type business-service
73
+ $ dr list api --json`).action(listCommand), program.command("search <query>").description("Search for elements by name or ID").option("--layer <layer>", "Limit search to specific layer").option("--type <type>", "Filter by element type").option("--json", "Output as JSON").addHelpText("after", `
74
+ Examples:
75
+ $ dr search customer
76
+ $ dr search "order processing" --layer business
77
+ $ dr search create-* --type endpoint`).action(searchCommand), program.command("validate").description("Validate the architecture model").option("--layers <layers...>", "Specific layers to validate").option("--strict", "Treat warnings as errors").option("--model <path>", "Path to model root (contains model/manifest.yaml)").option("--all", "Run all validations (default behavior)").option("--markdown", "Validate markdown structure").option("--schemas", "Validate JSON schemas").option("--schema", "Validate JSON schemas (alias for --schemas)").option("--relationships", "Validate relationships").option("--structure", "Validate documentation structure").option("--naming", "Validate naming conventions").option("--references", "Validate cross-layer references").addHelpText("after", `
78
+ Examples:
79
+ $ dr validate
80
+ $ dr validate --all --strict
81
+ $ dr validate --schemas
82
+ $ dr validate --relationships
83
+ $ dr validate --layers business api`).action(validateCommand), program.command("export <format>").description("Export the architecture model to various formats").option("--output <path>", "Output file path (default: print to stdout)").option("--layers <layers...>", "Specific layers to export").option("--model <path>", "Path to model root directory or manifest.yaml file").addHelpText("after", `
84
+ Supported formats:
85
+ archimate Export to ArchiMate XML (layers 1, 2, 4, 5)
86
+ openapi Export to OpenAPI 3.0 specification (layer 6)
87
+ jsonschema Export to JSON Schema (layer 7)
88
+ plantuml Export to PlantUML diagram
89
+ graphml Export to GraphML (graph visualization)
90
+ markdown Export to Markdown documentation
91
+
92
+ Examples:
93
+ $ dr export archimate --output model.xml
94
+ $ dr export openapi --layers api
95
+ $ dr export markdown --output docs/architecture.md`).action(async (format, options) => {
96
+ await exportCommand({
97
+ format,
98
+ output: options.output,
99
+ layers: options.layers,
100
+ model: options.model
101
+ });
102
+ }), program.command("info").description("Show model information").option("--layer <layer>", "Show specific layer details").addHelpText("after", `
103
+ Examples:
104
+ $ dr info
105
+ $ dr info --layer business`).action(infoCommand);
106
+ const elementGroup = program.command("element").description("Element operations");
107
+ elementCommands(elementGroup);
108
+ const relationshipGroup = program.command("relationship").description("Relationship operations");
109
+ relationshipCommands(relationshipGroup), program.command("trace <elementId>").description("Trace dependencies for an element").option("--direction <dir>", "Trace direction: up (dependencies), down (dependents), both (default)").option("--depth <num>", "Maximum traversal depth").option("--metrics", "Show graph and element metrics").option("--model <path>", "Path to model root (contains model/manifest.yaml)").addHelpText("after", `
110
+ Examples:
111
+ $ dr trace api-endpoint-create-customer
112
+ $ dr trace business-service-order --direction down --metrics
113
+ $ dr trace application-component-api --depth 3`).action(async (elementId, options) => {
114
+ await traceCommand(elementId, {
115
+ direction: options.direction,
116
+ depth: options.depth ? parseInt(options.depth) : void 0,
117
+ showMetrics: options.metrics,
118
+ model: options.model
119
+ });
120
+ }), program.command("project <elementId> <targetLayers>").description("Project an element to other layers using projection rules").option("--rule <name>", "Specific projection rule to use").option("--dry-run", "Show what would be created without saving").option("--force", "Overwrite existing elements").option("--model <path>", "Path to model directory").addHelpText("after", `
121
+ Examples:
122
+ $ dr project application.service.api-service "api,data-model"
123
+ $ dr project business.process.order-fulfillment application --dry-run
124
+ $ dr project api.endpoint.create-order data-model --rule api-to-data`).action(async (elementId, targetLayers, options) => {
125
+ await projectCommand(elementId, targetLayers, {
126
+ rule: options.rule,
127
+ dryRun: options.dryRun,
128
+ force: options.force,
129
+ model: options.model
130
+ });
131
+ }), program.command("project-all").description("Project all applicable elements based on rules").option("--from <layer>", "Source layer filter").option("--to <layer>", "Target layer filter").option("--dry-run", "Show what would be created without saving").option("--model <path>", "Path to model directory").addHelpText("after", `
132
+ Examples:
133
+ $ dr project-all --from application --to api
134
+ $ dr project-all --to data-model --dry-run
135
+ $ dr project-all`).action(async (options) => {
136
+ await projectAllCommand({
137
+ from: options.from,
138
+ to: options.to,
139
+ dryRun: options.dryRun,
140
+ model: options.model
141
+ });
142
+ }), program.command("visualize").description("Launch visualization server with WebSocket support").option("--port <num>", "Server port (default: 8080)").option("--no-browser", "Do not auto-open browser").option("--no-auth", "Disable authentication (enabled by default)").option("--token <token>", "Custom auth token (auto-generated by default)").addHelpText("after", `
143
+ Examples:
144
+ $ dr visualize
145
+ $ dr visualize --port 3000
146
+ $ dr visualize --no-browser
147
+ $ dr visualize --no-auth
148
+ $ dr visualize --token my-secret-token`).action(async (options) => {
149
+ const { visualizeCommand } = await import("./commands/visualize.js");
150
+ await visualizeCommand({
151
+ port: options.port,
152
+ noBrowser: options.browser === !1,
153
+ // Commander sets 'browser' to false when --no-browser is used
154
+ noAuth: options.auth === !1,
155
+ // Commander sets 'auth' to false when --no-auth is used
156
+ token: options.token
157
+ });
158
+ }), program.command("chat").description("Interactive chat with Claude about the architecture model").addHelpText("after", `
159
+ Examples:
160
+ $ dr chat
161
+
162
+ This launches an interactive chat interface where you can ask Claude questions
163
+ about your architecture model. Requires Claude Code CLI to be installed and authenticated.`).action(async () => {
164
+ await chatCommand();
165
+ }), program.command("version").description("Show CLI and embedded spec version information").addHelpText("after", `
166
+ Examples:
167
+ $ dr version`).action(async () => {
168
+ await versionCommand();
169
+ }), program.command("upgrade").description("Upgrade spec reference and migrate model to latest versions").option("-y, --yes", "Automatically upgrade without prompting").option("--dry-run", "Show what would be upgraded without making changes").option("--force", "Skip validation during migration").addHelpText("after", `
170
+ Examples:
171
+ $ dr upgrade # Scan, show plan, and prompt for upgrades
172
+ $ dr upgrade --dry-run # Preview available upgrades
173
+ $ dr upgrade --yes # Upgrade without prompting
174
+ $ dr upgrade --force # Skip validation during migration`).action(async (options) => {
175
+ await upgradeCommand({
176
+ yes: options.yes,
177
+ dryRun: options.dryRun,
178
+ force: options.force
179
+ });
180
+ }), program.command("conformance").description("Check model conformance to layer specifications").option("--layers <layers...>", "Specific layers to check").option("--json", "Output as JSON").option("--verbose", "Verbose output").addHelpText("after", `
181
+ Examples:
182
+ $ dr conformance
183
+ $ dr conformance --layers business api application
184
+ $ dr conformance --json
185
+ $ dr conformance --verbose`).action(async (options) => {
186
+ await conformanceCommand({
187
+ layers: options.layers,
188
+ json: options.json,
189
+ verbose: options.verbose
190
+ });
191
+ }), changesetCommands(program), (async () => {
192
+ try {
193
+ if (isTelemetryEnabled) {
194
+ await initTelemetry(), await installConsoleInterceptor();
195
+ const commandName = process.argv[2] || "unknown", args = process.argv.slice(3).join(" ");
196
+ await startActiveSpan("cli.execute", async (span) => {
197
+ span.setAttributes({
198
+ "cli.command": commandName,
199
+ "cli.args": args,
200
+ "cli.cwd": process.cwd(),
201
+ "cli.version": cliVersion
202
+ });
203
+ try {
204
+ await program.parseAsync(process.argv), span.setStatus({ code: 0 });
205
+ } catch (error) {
206
+ throw span.recordException(error), span.setStatus({
207
+ code: 2,
208
+ // SpanStatusCode.ERROR
209
+ message: error instanceof Error ? error.message : String(error)
210
+ }), error;
211
+ }
212
+ }, {
213
+ "cli.command": commandName,
214
+ "cli.args": args,
215
+ "cli.cwd": process.cwd(),
216
+ "cli.version": cliVersion
217
+ }), await shutdownTelemetry();
218
+ } else
219
+ await program.parseAsync(process.argv);
220
+ } catch (error) {
221
+ throw error;
222
+ }
223
+ })();
224
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 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 } 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 { elementCommands } from './commands/element.js';\nimport { relationshipCommands } from './commands/relationship.js';\nimport { traceCommand } from './commands/trace.js';\nimport { projectCommand, projectAllCommand } from './commands/project.js';\nimport { exportCommand } from './commands/export.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 { versionCommand } from './commands/version.js';\nimport { initTelemetry, startActiveSpan, shutdownTelemetry } from './telemetry/index.js';\nimport { installConsoleInterceptor } from './telemetry/console-interceptor.js';\nimport { readJSON, fileExists } from './utils/file-io.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\n// Get CLI version from package.json\nasync function getCliVersion(): Promise<string> {\n const possiblePaths = [\n `${process.cwd()}/package.json`,\n `${import.meta.url.replace('file://', '').split('/src/')[0]}/package.json`,\n ];\n\n for (const path of possiblePaths) {\n if (await fileExists(path)) {\n try {\n const data = await readJSON<{ version: string }>(path);\n return data.version;\n } catch {\n continue;\n }\n }\n }\n\n return '0.1.0';\n}\n\nconst cliVersion = await getCliVersion();\n\nconst program = new Command();\n\n// Handle --version and -V flags early, before commander processes them\nif (process.argv.includes('--version') || process.argv.includes('-V')) {\n const { versionCommand } = await import('./commands/version.js');\n await versionCommand();\n process.exit(0);\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 .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')\n .description('Initialize a new architecture model')\n .option('--name <name>', 'Model name')\n .option('--author <author>', 'Model author')\n .option('--description <desc>', 'Model description')\n .addHelpText(\n 'after',\n `\nExamples:\n $ dr init\n $ dr init --name \"Enterprise Architecture\" --author \"Team A\"\n $ dr init --description \"12-layer federated model\"`\n )\n .action(initCommand);\n\nprogram\n .command('add <layer> <type> <id>')\n .description('Add an element to a layer')\n .option('--name <name>', 'Element name (defaults to ID)')\n .option('--description <desc>', 'Element description')\n .option('--properties <json>', 'Element properties as JSON object')\n .addHelpText(\n 'after',\n `\nExamples:\n $ dr add business business-service customer-mgmt --name \"Customer Management\"\n $ dr add api endpoint create-customer --properties '{\"method\":\"POST\",\"path\":\"/customers\"}'\n $ dr add application component customer-api --description \"REST API for customer operations\"`\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('--properties <json>', 'Updated properties (JSON)')\n .addHelpText(\n 'after',\n `\nExamples:\n $ dr update api-endpoint-create-customer --name \"Create Customer (v2)\"\n $ dr update business-service-order --description \"Updated description\"`\n )\n .action(updateCommand);\n\nprogram\n .command('delete <id>')\n .description('Delete an element')\n .option('--force', 'Skip confirmation prompt')\n .addHelpText(\n 'after',\n `\nExamples:\n $ dr delete api-endpoint-old-endpoint\n $ dr delete api-endpoint-old-endpoint --force`\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')\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 api\n $ dr list business --type business-service\n $ dr list api --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('--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 )\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('--model <path>', 'Path to model root (contains model/manifest.yaml)')\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 --schemas\n $ dr validate --relationships\n $ dr validate --layers business api`\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 .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 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 });\n });\n\nprogram\n .command('info')\n .description('Show model information')\n .option('--layer <layer>', 'Show specific layer details')\n .addHelpText(\n 'after',\n `\nExamples:\n $ dr info\n $ dr info --layer business`\n )\n .action(infoCommand);\n\n// Element subcommands\nconst elementGroup = program\n .command('element')\n .description('Element operations');\nelementCommands(elementGroup);\n\n// Relationship subcommands\nconst relationshipGroup = program\n .command('relationship')\n .description('Relationship operations');\nrelationshipCommands(relationshipGroup);\n\n// Dependency analysis commands\nprogram\n .command('trace <elementId>')\n .description('Trace dependencies for an element')\n .option('--direction <dir>', 'Trace direction: up (dependencies), down (dependents), both (default)')\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('project <elementId> <targetLayers>')\n .description('Project an element to other layers using projection rules')\n .option('--rule <name>', 'Specific projection rule to use')\n .option('--dry-run', 'Show what would be created without saving')\n .option('--force', 'Overwrite existing elements')\n .option('--model <path>', 'Path to model directory')\n .addHelpText(\n 'after',\n `\nExamples:\n $ dr project application.service.api-service \"api,data-model\"\n $ dr project business.process.order-fulfillment application --dry-run\n $ dr project api.endpoint.create-order data-model --rule api-to-data`\n )\n .action(async (elementId, targetLayers, options) => {\n await projectCommand(elementId, targetLayers, {\n rule: options.rule,\n dryRun: options.dryRun,\n force: options.force,\n model: options.model,\n });\n });\n\nprogram\n .command('project-all')\n .description('Project all applicable elements based on rules')\n .option('--from <layer>', 'Source layer filter')\n .option('--to <layer>', 'Target layer filter')\n .option('--dry-run', 'Show what would be created without saving')\n .option('--model <path>', 'Path to model directory')\n .addHelpText(\n 'after',\n `\nExamples:\n $ dr project-all --from application --to api\n $ dr project-all --to data-model --dry-run\n $ dr project-all`\n )\n .action(async (options) => {\n await projectAllCommand({\n from: options.from,\n to: options.to,\n dryRun: options.dryRun,\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 .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 )\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 });\n });\n\n// AI Integration command\nprogram\n .command('chat')\n .description('Interactive chat with Claude about the architecture model')\n .addHelpText(\n 'after',\n `\nExamples:\n $ dr chat\n\nThis launches an interactive chat interface where you can ask Claude questions\nabout your architecture model. Requires Claude Code CLI to be installed and authenticated.`\n )\n .action(async () => {\n await chatCommand();\n });\n\n// Advanced commands\n// Note: migrate command has been merged into upgrade command\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', 'Skip validation during migration')\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 # Skip validation during migration`\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,\n });\n });\n\n// Changeset subcommands\nchangesetCommands(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 try {\n if (isTelemetryEnabled) {\n // Initialize telemetry before execution\n await initTelemetry();\n await installConsoleInterceptor();\n\n const commandName = process.argv[2] || 'unknown';\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 span.setAttributes({\n 'cli.command': commandName,\n 'cli.args': args,\n 'cli.cwd': process.cwd(),\n 'cli.version': cliVersion,\n });\n\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 span.recordException(error as Error);\n span.setStatus({\n code: 2, // SpanStatusCode.ERROR\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\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 } else {\n // No telemetry - just parse normally\n await program.parseAsync(process.argv);\n }\n } catch (error) {\n // Re-throw to preserve CLI exit behavior\n throw error;\n }\n})();\n"],
5
+ "mappings": "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",
6
+ "names": ["versionCommand"]
7
+ }
@@ -0,0 +1,51 @@
1
+ import ansis from "ansis";
2
+ import { Model } from "../core/model.js";
3
+ import { Layer } from "../core/layer.js";
4
+ import { Element } from "../core/element.js";
5
+ import { InvalidJSONError, CLIError, handleError, handleSuccess } from "../utils/errors.js";
6
+ import { startSpan, endSpan } from "../telemetry/index.js";
7
+ const isTelemetryEnabled = !1;
8
+ async function addCommand(layer, type, id, options) {
9
+ const span = isTelemetryEnabled ? startSpan("element.add", {
10
+ "layer.name": layer,
11
+ "element.type": type,
12
+ "element.id": id
13
+ }) : null;
14
+ try {
15
+ const model = await Model.load();
16
+ let layerObj = await model.getLayer(layer);
17
+ if (layerObj || (layerObj = new Layer(layer), model.addLayer(layerObj)), id.includes("_"))
18
+ throw new CLIError(`Invalid element ID: "${id}". Element IDs must use kebab-case (hyphens) not underscores.`, 1, ["Use hyphens (-) instead of underscores (_)", "Example: my-element-name not my_element_name"]);
19
+ if (!options.name)
20
+ throw new CLIError("Element name is required. Please specify --name option.", 1, ["Provide a descriptive name using --name option", 'Example: --name "User Authentication Service"']);
21
+ let properties = {};
22
+ if (options.properties)
23
+ try {
24
+ properties = JSON.parse(options.properties);
25
+ } catch {
26
+ throw new InvalidJSONError(options.properties, "--properties");
27
+ }
28
+ const element = new Element({
29
+ id,
30
+ type,
31
+ name: options.name || id,
32
+ description: options.description,
33
+ properties
34
+ });
35
+ if (layerObj.getElement(id))
36
+ throw new CLIError(`Element ${id} already exists in ${layer} layer`, 1, [`Use "dr show ${id}" to view the existing element`, `Use "dr update ${id}" to modify it`]);
37
+ layerObj.addElement(element), await model.getActiveChangesetContext().trackChange("add", id, layer, void 0, element.toJSON()), await model.saveLayer(layer), await model.saveManifest(), handleSuccess(`Added element ${ansis.bold(id)} to ${ansis.bold(layer)} layer`, {
38
+ type,
39
+ name: options.name || id,
40
+ description: options.description || "(none)"
41
+ });
42
+ } catch (error) {
43
+ isTelemetryEnabled && span && (span.recordException(error), span.setStatus({ code: 2, message: error.message })), handleError(error);
44
+ } finally {
45
+ isTelemetryEnabled && endSpan(span);
46
+ }
47
+ }
48
+ export {
49
+ addCommand
50
+ };
51
+ //# sourceMappingURL=add.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/commands/add.ts"],
4
+ "sourcesContent": ["/**\n * Add an element to a layer\n */\n\nimport ansis from 'ansis';\nimport { Model } from '../core/model.js';\nimport { Layer } from '../core/layer.js';\nimport { Element } from '../core/element.js';\nimport {\n InvalidJSONError,\n CLIError,\n handleError,\n handleSuccess,\n} from '../utils/errors.js';\nimport { startSpan, endSpan } from '../telemetry/index.js';\n\n// Telemetry flag check\ndeclare const TELEMETRY_ENABLED: boolean | undefined;\nconst isTelemetryEnabled = typeof TELEMETRY_ENABLED !== 'undefined' ? TELEMETRY_ENABLED : false;\n\nexport interface AddOptions {\n name?: string;\n description?: string;\n properties?: string;\n verbose?: boolean;\n debug?: boolean;\n}\n\nexport async function addCommand(\n layer: string,\n type: string,\n id: string,\n options: AddOptions\n): Promise<void> {\n const span = isTelemetryEnabled ? startSpan('element.add', {\n 'layer.name': layer,\n 'element.type': type,\n 'element.id': id,\n }) : null;\n\n try {\n // Load model\n const model = await Model.load();\n\n // Get or create layer\n let layerObj = await model.getLayer(layer);\n if (!layerObj) {\n layerObj = new Layer(layer);\n model.addLayer(layerObj);\n }\n\n // Validate element ID format (should be kebab-case, no underscores)\n if (id.includes('_')) {\n throw new CLIError(\n `Invalid element ID: \"${id}\". Element IDs must use kebab-case (hyphens) not underscores.`,\n 1,\n ['Use hyphens (-) instead of underscores (_)', 'Example: my-element-name not my_element_name']\n );\n }\n\n // Validate that name is explicitly provided\n // Elements should have meaningful names, not default to ID\n if (!options.name) {\n throw new CLIError(\n 'Element name is required. Please specify --name option.',\n 1,\n ['Provide a descriptive name using --name option', 'Example: --name \"User Authentication Service\"']\n );\n }\n\n // Parse properties if provided\n let properties: Record<string, unknown> = {};\n if (options.properties) {\n try {\n properties = JSON.parse(options.properties);\n } catch (e) {\n throw new InvalidJSONError(options.properties, '--properties');\n }\n }\n\n // Create element\n const element = new Element({\n id,\n type,\n name: options.name || id,\n description: options.description,\n properties,\n });\n\n // Check if element already exists\n if (layerObj.getElement(id)) {\n throw new CLIError(\n `Element ${id} already exists in ${layer} layer`,\n 1,\n [`Use \"dr show ${id}\" to view the existing element`, `Use \"dr update ${id}\" to modify it`]\n );\n }\n\n // Add to layer\n layerObj.addElement(element);\n\n // Track change in active changeset if present\n const activeChangeset = model.getActiveChangesetContext();\n await activeChangeset.trackChange(\n 'add',\n id,\n layer,\n undefined,\n element.toJSON() as unknown as Record<string, unknown>\n );\n\n // Save\n await model.saveLayer(layer);\n await model.saveManifest();\n\n handleSuccess(`Added element ${ansis.bold(id)} to ${ansis.bold(layer)} layer`, {\n type,\n name: options.name || id,\n description: options.description || '(none)',\n });\n } catch (error) {\n if (isTelemetryEnabled && span) {\n (span as any).recordException(error as Error);\n (span as any).setStatus({ code: 2, message: (error as Error).message });\n }\n handleError(error);\n } finally {\n if (isTelemetryEnabled) {\n endSpan(span);\n }\n }\n}\n"],
5
+ "mappings": "AAIA,OAAO,WAAW;AAClB,SAAS,aAAa;AACtB,SAAS,aAAa;AACtB,SAAS,eAAe;AACxB,SACE,kBACA,UACA,aACA,qBACK;AACP,SAAS,WAAW,eAAe;AAInC,MAAM,qBAAgE;AAUtE,eAAsB,WACpB,OACA,MACA,IACA,SAAmB;AAEnB,QAAM,OAAO,qBAAqB,UAAU,eAAe;IACzD,cAAc;IACd,gBAAgB;IAChB,cAAc;GACf,IAAI;AAEL,MAAI;AAEF,UAAM,QAAQ,MAAM,MAAM,KAAI;AAG9B,QAAI,WAAW,MAAM,MAAM,SAAS,KAAK;AAOzC,QANK,aACH,WAAW,IAAI,MAAM,KAAK,GAC1B,MAAM,SAAS,QAAQ,IAIrB,GAAG,SAAS,GAAG;AACjB,YAAM,IAAI,SACR,wBAAwB,EAAE,iEAC1B,GACA,CAAC,8CAA8C,8CAA8C,CAAC;AAMlG,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,SACR,2DACA,GACA,CAAC,kDAAkD,+CAA+C,CAAC;AAKvG,QAAI,aAAsC,CAAA;AAC1C,QAAI,QAAQ;AACV,UAAI;AACF,qBAAa,KAAK,MAAM,QAAQ,UAAU;MAC5C,QAAY;AACV,cAAM,IAAI,iBAAiB,QAAQ,YAAY,cAAc;MAC/D;AAIF,UAAM,UAAU,IAAI,QAAQ;MAC1B;MACA;MACA,MAAM,QAAQ,QAAQ;MACtB,aAAa,QAAQ;MACrB;KACD;AAGD,QAAI,SAAS,WAAW,EAAE;AACxB,YAAM,IAAI,SACR,WAAW,EAAE,sBAAsB,KAAK,UACxC,GACA,CAAC,gBAAgB,EAAE,kCAAkC,kBAAkB,EAAE,gBAAgB,CAAC;AAK9F,aAAS,WAAW,OAAO,GAI3B,MADwB,MAAM,0BAAyB,EACjC,YACpB,OACA,IACA,OACA,QACA,QAAQ,OAAM,CAAwC,GAIxD,MAAM,MAAM,UAAU,KAAK,GAC3B,MAAM,MAAM,aAAY,GAExB,cAAc,iBAAiB,MAAM,KAAK,EAAE,CAAC,OAAO,MAAM,KAAK,KAAK,CAAC,UAAU;MAC7E;MACA,MAAM,QAAQ,QAAQ;MACtB,aAAa,QAAQ,eAAe;KACrC;EACH,SAAS,OAAO;AACd,IAAI,sBAAsB,SACvB,KAAa,gBAAgB,KAAc,GAC3C,KAAa,UAAU,EAAE,MAAM,GAAG,SAAU,MAAgB,QAAO,CAAE,IAExE,YAAY,KAAK;EACnB;AACE,IAAI,sBACF,QAAQ,IAAI;EAEhB;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,174 @@
1
+ import ansis from "ansis";
2
+ import { Model } from "../core/model.js";
3
+ import { ChangesetManager } from "../core/changeset.js";
4
+ import { ActiveChangesetContext } from "../core/active-changeset.js";
5
+ import * as prompts from "@clack/prompts";
6
+ async function changesetCreateCommand(name, options) {
7
+ try {
8
+ const model = await Model.load(process.cwd(), { lazyLoad: !0 }), manager = new ChangesetManager(model.rootPath);
9
+ await manager.load(name) && (console.error(ansis.red(`Error: Changeset '${name}' already exists`)), process.exit(1));
10
+ let description = options.description;
11
+ if (!description) {
12
+ const result = await prompts.text({
13
+ message: "Changeset description (optional)"
14
+ });
15
+ typeof result == "string" && (description = result);
16
+ }
17
+ const changeset = await manager.create(name, description || void 0);
18
+ console.log(ansis.green(`\u2713 Created changeset: ${ansis.bold(name)}`)), changeset.description && console.log(ansis.dim(` ${changeset.description}`)), console.log(ansis.dim(` Path: .dr/changesets/${name.toLowerCase().replace(/\s+/g, "-")}.json`)), console.log();
19
+ } catch (error) {
20
+ console.error(ansis.red(`Error: ${error instanceof Error ? error.message : String(error)}`)), process.exit(1);
21
+ }
22
+ }
23
+ async function changesetListCommand() {
24
+ try {
25
+ const model = await Model.load(process.cwd(), { lazyLoad: !0 }), changesets = await new ChangesetManager(model.rootPath).list();
26
+ if (changesets.length === 0) {
27
+ console.log(ansis.yellow("No changesets found")), console.log();
28
+ return;
29
+ }
30
+ console.log(ansis.bold(`
31
+ Changesets (${changesets.length}):
32
+ `));
33
+ for (const changeset of changesets) {
34
+ const statusColor = changeset.status === "applied" ? ansis.green : changeset.status === "reverted" ? ansis.gray : ansis.yellow;
35
+ console.log(`${statusColor(changeset.status.toUpperCase())} ${ansis.bold(changeset.name)}`), changeset.description && console.log(ansis.dim(` ${changeset.description}`)), console.log(ansis.dim(` Changes: ${changeset.getChangeCount()} | Created: ${new Date(changeset.created).toLocaleDateString()}`));
36
+ const changesByType = {
37
+ add: changeset.getChangesByType("add").length,
38
+ update: changeset.getChangesByType("update").length,
39
+ delete: changeset.getChangesByType("delete").length
40
+ }, parts = [];
41
+ changesByType.add > 0 && parts.push(`+${changesByType.add}`), changesByType.update > 0 && parts.push(`~${changesByType.update}`), changesByType.delete > 0 && parts.push(`-${changesByType.delete}`), parts.length > 0 && console.log(ansis.dim(` ${parts.join(" ")}`)), console.log();
42
+ }
43
+ } catch (error) {
44
+ console.error(ansis.red(`Error: ${error instanceof Error ? error.message : String(error)}`)), process.exit(1);
45
+ }
46
+ }
47
+ async function changesetApplyCommand(name) {
48
+ try {
49
+ const model = await Model.load(process.cwd(), { lazyLoad: !1 }), manager = new ChangesetManager(model.rootPath), changeset = await manager.load(name);
50
+ changeset || (console.error(ansis.red(`Error: Changeset '${name}' not found`)), process.exit(1)), console.log(ansis.bold(`
51
+ Applying changeset: ${ansis.cyan(name)}
52
+ `)), console.log(ansis.dim(`Changes: ${changeset.getChangeCount()}`));
53
+ const result = await manager.apply(model, name);
54
+ if (console.log(), console.log(ansis.green(`\u2713 Applied ${result.applied} change(s) from changeset`)), result.failed > 0) {
55
+ console.log(ansis.red(`\u2717 Failed to apply ${result.failed} change(s):`));
56
+ for (const error of result.errors)
57
+ console.log(ansis.dim(` - ${error.change.elementId} (${error.change.type}): ${error.error}`));
58
+ }
59
+ model.manifest.changeset_history || (model.manifest.changeset_history = []), model.manifest.changeset_history.push({
60
+ name,
61
+ applied_at: (/* @__PURE__ */ new Date()).toISOString(),
62
+ action: "applied"
63
+ }), await model.saveDirtyLayers(), await model.saveManifest(), result.failed === 0 && console.log(ansis.dim("Changeset marked as applied")), console.log();
64
+ } catch (error) {
65
+ console.error(ansis.red(`Error: ${error instanceof Error ? error.message : String(error)}`)), process.exit(1);
66
+ }
67
+ }
68
+ async function changesetRevertCommand(name) {
69
+ try {
70
+ const model = await Model.load(process.cwd(), { lazyLoad: !1 }), manager = new ChangesetManager(model.rootPath), changeset = await manager.load(name);
71
+ changeset || (console.error(ansis.red(`Error: Changeset '${name}' not found`)), process.exit(1)), console.log(ansis.bold(`
72
+ Reverting changeset: ${ansis.cyan(name)}
73
+ `)), console.log(ansis.dim(`Changes to revert: ${changeset.getChangeCount()}`));
74
+ const result = await manager.revert(model, name);
75
+ if (console.log(), console.log(ansis.green(`\u2713 Reverted ${result.reverted} change(s)`)), result.failed > 0) {
76
+ console.log(ansis.red(`\u2717 Failed to revert ${result.failed} change(s):`));
77
+ for (const error of result.errors)
78
+ console.log(ansis.dim(` - ${error.change.elementId} (${error.change.type}): ${error.error}`));
79
+ }
80
+ model.manifest.changeset_history || (model.manifest.changeset_history = []), model.manifest.changeset_history.push({
81
+ name,
82
+ applied_at: (/* @__PURE__ */ new Date()).toISOString(),
83
+ action: "reverted"
84
+ }), await model.saveDirtyLayers(), await model.saveManifest(), result.failed === 0 && console.log(ansis.dim("Changeset marked as reverted")), console.log();
85
+ } catch (error) {
86
+ console.error(ansis.red(`Error: ${error instanceof Error ? error.message : String(error)}`)), process.exit(1);
87
+ }
88
+ }
89
+ async function changesetActivateCommand(name) {
90
+ try {
91
+ const model = await Model.load(process.cwd(), { lazyLoad: !0 });
92
+ await new ActiveChangesetContext(model.rootPath).setActive(name), console.log(ansis.green(`\u2713 Activated changeset: ${ansis.bold(name)}`)), console.log(ansis.dim(" All model changes will now be tracked in this changeset"));
93
+ } catch (error) {
94
+ console.error(ansis.red(`Error: ${error instanceof Error ? error.message : String(error)}`)), process.exit(1);
95
+ }
96
+ }
97
+ async function changesetDeactivateCommand() {
98
+ try {
99
+ const model = await Model.load(process.cwd(), { lazyLoad: !0 }), context = new ActiveChangesetContext(model.rootPath), active = await context.getActive();
100
+ if (!active) {
101
+ console.log(ansis.yellow("No active changeset"));
102
+ return;
103
+ }
104
+ await context.clearActive(), console.log(ansis.green(`\u2713 Deactivated changeset: ${ansis.bold(active)}`));
105
+ } catch (error) {
106
+ console.error(ansis.red(`Error: ${error instanceof Error ? error.message : String(error)}`)), process.exit(1);
107
+ }
108
+ }
109
+ async function changesetStatusCommand() {
110
+ try {
111
+ const model = await Model.load(process.cwd(), { lazyLoad: !0 }), active = await new ActiveChangesetContext(model.rootPath).getActive();
112
+ if (!active) {
113
+ console.log(ansis.dim("No active changeset"));
114
+ return;
115
+ }
116
+ console.log(ansis.bold(`Active changeset: ${ansis.cyan(active)}`));
117
+ const changeset = await new ChangesetManager(model.rootPath).load(active);
118
+ if (changeset) {
119
+ console.log(ansis.dim(` Changes tracked: ${changeset.getChangeCount()}`));
120
+ const changesByType = {
121
+ add: changeset.getChangesByType("add").length,
122
+ update: changeset.getChangesByType("update").length,
123
+ delete: changeset.getChangesByType("delete").length
124
+ }, parts = [];
125
+ changesByType.add > 0 && parts.push(`+${changesByType.add}`), changesByType.update > 0 && parts.push(`~${changesByType.update}`), changesByType.delete > 0 && parts.push(`-${changesByType.delete}`), parts.length > 0 && console.log(ansis.dim(` ${parts.join(" ")}`));
126
+ }
127
+ } catch (error) {
128
+ console.error(ansis.red(`Error: ${error instanceof Error ? error.message : String(error)}`)), process.exit(1);
129
+ }
130
+ }
131
+ function changesetCommands(program) {
132
+ const changesetGroup = program.command("changeset").description("Manage changesets");
133
+ changesetGroup.command("create <name>").description("Create a new changeset").option("--description <desc>", "Changeset description").addHelpText("after", `
134
+ Examples:
135
+ $ dr changeset create "v1.1 migration"
136
+ $ dr changeset create "api-refactoring" --description "Refactor API layer endpoints"`).action(async (name, options) => {
137
+ await changesetCreateCommand(name, options);
138
+ }), changesetGroup.command("list").description("List all changesets").addHelpText("after", `
139
+ Examples:
140
+ $ dr changeset list`).action(async () => {
141
+ await changesetListCommand();
142
+ }), changesetGroup.command("apply <name>").description("Apply a changeset to the model").addHelpText("after", `
143
+ Examples:
144
+ $ dr changeset apply "v1.1 migration"`).action(async (name) => {
145
+ await changesetApplyCommand(name);
146
+ }), changesetGroup.command("revert <name>").description("Revert a changeset from the model").addHelpText("after", `
147
+ Examples:
148
+ $ dr changeset revert "v1.1 migration"`).action(async (name) => {
149
+ await changesetRevertCommand(name);
150
+ }), changesetGroup.command("activate <name>").description("Activate a changeset for automatic change tracking").addHelpText("after", `
151
+ Examples:
152
+ $ dr changeset activate "v1.1 migration"`).action(async (name) => {
153
+ await changesetActivateCommand(name);
154
+ }), changesetGroup.command("deactivate").description("Deactivate the currently active changeset").addHelpText("after", `
155
+ Examples:
156
+ $ dr changeset deactivate`).action(async () => {
157
+ await changesetDeactivateCommand();
158
+ }), changesetGroup.command("status").description("Show the currently active changeset").addHelpText("after", `
159
+ Examples:
160
+ $ dr changeset status`).action(async () => {
161
+ await changesetStatusCommand();
162
+ });
163
+ }
164
+ export {
165
+ changesetActivateCommand,
166
+ changesetApplyCommand,
167
+ changesetCommands,
168
+ changesetCreateCommand,
169
+ changesetDeactivateCommand,
170
+ changesetListCommand,
171
+ changesetRevertCommand,
172
+ changesetStatusCommand
173
+ };
174
+ //# sourceMappingURL=changeset.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/commands/changeset.ts"],
4
+ "sourcesContent": ["/**\n * Changeset Commands - Manage model change tracking and versioning\n */\n\nimport ansis from 'ansis';\nimport { Model } from '../core/model.js';\nimport { ChangesetManager } from '../core/changeset.js';\nimport { ActiveChangesetContext } from '../core/active-changeset.js';\nimport { Command } from 'commander';\nimport * as prompts from '@clack/prompts';\n\n/**\n * Create a new changeset\n */\nexport async function changesetCreateCommand(name: string, options: {\n description?: string;\n}): Promise<void> {\n try {\n const model = await Model.load(process.cwd(), { lazyLoad: true });\n const manager = new ChangesetManager(model.rootPath);\n\n // Check if changeset already exists\n const existing = await manager.load(name);\n if (existing) {\n console.error(ansis.red(`Error: Changeset '${name}' already exists`));\n process.exit(1);\n }\n\n // Get description if not provided\n let description = options.description;\n if (!description) {\n const result = await prompts.text({\n message: 'Changeset description (optional)',\n });\n\n if (typeof result === 'string') {\n description = result;\n }\n }\n\n const changeset = await manager.create(name, description || undefined);\n\n console.log(\n ansis.green(`\u2713 Created changeset: ${ansis.bold(name)}`)\n );\n if (changeset.description) {\n console.log(ansis.dim(` ${changeset.description}`));\n }\n console.log(\n ansis.dim(` Path: .dr/changesets/${name.toLowerCase().replace(/\\s+/g, '-')}.json`)\n );\n console.log();\n } catch (error) {\n console.error(\n ansis.red(\n `Error: ${error instanceof Error ? error.message : String(error)}`\n )\n );\n process.exit(1);\n }\n}\n\n/**\n * List all changesets\n */\nexport async function changesetListCommand(): Promise<void> {\n try {\n const model = await Model.load(process.cwd(), { lazyLoad: true });\n const manager = new ChangesetManager(model.rootPath);\n const changesets = await manager.list();\n\n if (changesets.length === 0) {\n console.log(ansis.yellow('No changesets found'));\n console.log();\n return;\n }\n\n console.log(ansis.bold(`\\nChangesets (${changesets.length}):\\n`));\n\n for (const changeset of changesets) {\n const statusColor =\n changeset.status === 'applied'\n ? ansis.green\n : changeset.status === 'reverted'\n ? ansis.gray\n : ansis.yellow;\n\n console.log(\n `${statusColor(changeset.status.toUpperCase())} ${ansis.bold(\n changeset.name\n )}`\n );\n\n if (changeset.description) {\n console.log(ansis.dim(` ${changeset.description}`));\n }\n\n console.log(\n ansis.dim(\n ` Changes: ${changeset.getChangeCount()} | Created: ${new Date(\n changeset.created\n ).toLocaleDateString()}`\n )\n );\n\n const changesByType = {\n add: changeset.getChangesByType('add').length,\n update: changeset.getChangesByType('update').length,\n delete: changeset.getChangesByType('delete').length,\n };\n\n const parts = [];\n if (changesByType.add > 0) parts.push(`+${changesByType.add}`);\n if (changesByType.update > 0) parts.push(`~${changesByType.update}`);\n if (changesByType.delete > 0) parts.push(`-${changesByType.delete}`);\n\n if (parts.length > 0) {\n console.log(ansis.dim(` ${parts.join(' ')}`));\n }\n\n console.log();\n }\n } catch (error) {\n console.error(\n ansis.red(\n `Error: ${error instanceof Error ? error.message : String(error)}`\n )\n );\n process.exit(1);\n }\n}\n\n/**\n * Apply a changeset to the model\n */\nexport async function changesetApplyCommand(name: string): Promise<void> {\n try {\n const model = await Model.load(process.cwd(), { lazyLoad: false });\n const manager = new ChangesetManager(model.rootPath);\n\n const changeset = await manager.load(name);\n if (!changeset) {\n console.error(ansis.red(`Error: Changeset '${name}' not found`));\n process.exit(1);\n }\n\n console.log(\n ansis.bold(`\\nApplying changeset: ${ansis.cyan(name)}\\n`)\n );\n console.log(\n ansis.dim(`Changes: ${changeset.getChangeCount()}`)\n );\n\n const result = await manager.apply(model, name);\n\n console.log();\n\n // Always show applied message, even if 0 changes\n console.log(\n ansis.green(`\u2713 Applied ${result.applied} change(s) from changeset`)\n );\n\n if (result.failed > 0) {\n console.log(ansis.red(`\u2717 Failed to apply ${result.failed} change(s):`));\n for (const error of result.errors) {\n console.log(\n ansis.dim(\n ` - ${error.change.elementId} (${error.change.type}): ${\n error.error\n }`\n )\n );\n }\n }\n\n // Add changeset to manifest history\n if (!model.manifest.changeset_history) {\n model.manifest.changeset_history = [];\n }\n model.manifest.changeset_history.push({\n name,\n applied_at: new Date().toISOString(),\n action: 'applied'\n });\n\n // Always save the model and manifest, even if 0 changes\n // This ensures manifest is updated with changeset metadata\n await model.saveDirtyLayers();\n await model.saveManifest();\n\n if (result.failed === 0) {\n console.log(ansis.dim(`Changeset marked as applied`));\n }\n\n console.log();\n } catch (error) {\n console.error(\n ansis.red(\n `Error: ${error instanceof Error ? error.message : String(error)}`\n )\n );\n process.exit(1);\n }\n}\n\n/**\n * Revert a changeset from the model\n */\nexport async function changesetRevertCommand(name: string): Promise<void> {\n try {\n const model = await Model.load(process.cwd(), { lazyLoad: false });\n const manager = new ChangesetManager(model.rootPath);\n\n const changeset = await manager.load(name);\n if (!changeset) {\n console.error(ansis.red(`Error: Changeset '${name}' not found`));\n process.exit(1);\n }\n\n console.log(\n ansis.bold(`\\nReverting changeset: ${ansis.cyan(name)}\\n`)\n );\n console.log(\n ansis.dim(`Changes to revert: ${changeset.getChangeCount()}`)\n );\n\n const result = await manager.revert(model, name);\n\n console.log();\n\n // Always show reverted message, even if 0 changes\n console.log(\n ansis.green(`\u2713 Reverted ${result.reverted} change(s)`)\n );\n\n if (result.failed > 0) {\n console.log(ansis.red(`\u2717 Failed to revert ${result.failed} change(s):`));\n for (const error of result.errors) {\n console.log(\n ansis.dim(\n ` - ${error.change.elementId} (${error.change.type}): ${\n error.error\n }`\n )\n );\n }\n }\n\n // Add changeset to manifest history\n if (!model.manifest.changeset_history) {\n model.manifest.changeset_history = [];\n }\n model.manifest.changeset_history.push({\n name,\n applied_at: new Date().toISOString(),\n action: 'reverted'\n });\n\n // Always save the model and manifest, even if 0 changes\n // This ensures manifest is updated with changeset metadata\n await model.saveDirtyLayers();\n await model.saveManifest();\n\n if (result.failed === 0) {\n console.log(ansis.dim(`Changeset marked as reverted`));\n }\n\n console.log();\n } catch (error) {\n console.error(\n ansis.red(\n `Error: ${error instanceof Error ? error.message : String(error)}`\n )\n );\n process.exit(1);\n }\n}\n\n/**\n * Activate a changeset for automatic tracking\n */\nexport async function changesetActivateCommand(name: string): Promise<void> {\n try {\n const model = await Model.load(process.cwd(), { lazyLoad: true });\n const context = new ActiveChangesetContext(model.rootPath);\n await context.setActive(name);\n\n console.log(ansis.green(`\u2713 Activated changeset: ${ansis.bold(name)}`));\n console.log(ansis.dim(' All model changes will now be tracked in this changeset'));\n } catch (error) {\n console.error(\n ansis.red(\n `Error: ${error instanceof Error ? error.message : String(error)}`\n )\n );\n process.exit(1);\n }\n}\n\n/**\n * Deactivate the current changeset\n */\nexport async function changesetDeactivateCommand(): Promise<void> {\n try {\n const model = await Model.load(process.cwd(), { lazyLoad: true });\n const context = new ActiveChangesetContext(model.rootPath);\n const active = await context.getActive();\n\n if (!active) {\n console.log(ansis.yellow('No active changeset'));\n return;\n }\n\n await context.clearActive();\n console.log(ansis.green(`\u2713 Deactivated changeset: ${ansis.bold(active)}`));\n } catch (error) {\n console.error(\n ansis.red(\n `Error: ${error instanceof Error ? error.message : String(error)}`\n )\n );\n process.exit(1);\n }\n}\n\n/**\n * Show the currently active changeset\n */\nexport async function changesetStatusCommand(): Promise<void> {\n try {\n const model = await Model.load(process.cwd(), { lazyLoad: true });\n const context = new ActiveChangesetContext(model.rootPath);\n const active = await context.getActive();\n\n if (!active) {\n console.log(ansis.dim('No active changeset'));\n return;\n }\n\n console.log(ansis.bold(`Active changeset: ${ansis.cyan(active)}`));\n\n // Load and show changeset details\n const manager = new ChangesetManager(model.rootPath);\n const changeset = await manager.load(active);\n\n if (changeset) {\n console.log(ansis.dim(` Changes tracked: ${changeset.getChangeCount()}`));\n const changesByType = {\n add: changeset.getChangesByType('add').length,\n update: changeset.getChangesByType('update').length,\n delete: changeset.getChangesByType('delete').length,\n };\n const parts = [];\n if (changesByType.add > 0) parts.push(`+${changesByType.add}`);\n if (changesByType.update > 0) parts.push(`~${changesByType.update}`);\n if (changesByType.delete > 0) parts.push(`-${changesByType.delete}`);\n if (parts.length > 0) {\n console.log(ansis.dim(` ${parts.join(' ')}`));\n }\n }\n } catch (error) {\n console.error(\n ansis.red(\n `Error: ${error instanceof Error ? error.message : String(error)}`\n )\n );\n process.exit(1);\n }\n}\n\n/**\n * Register changeset subcommands\n */\nexport function changesetCommands(program: Command): void {\n const changesetGroup = program\n .command('changeset')\n .description('Manage changesets');\n\n changesetGroup\n .command('create <name>')\n .description('Create a new changeset')\n .option('--description <desc>', 'Changeset description')\n .addHelpText(\n 'after',\n `\nExamples:\n $ dr changeset create \"v1.1 migration\"\n $ dr changeset create \"api-refactoring\" --description \"Refactor API layer endpoints\"`\n )\n .action(async (name, options) => {\n await changesetCreateCommand(name, options);\n });\n\n changesetGroup\n .command('list')\n .description('List all changesets')\n .addHelpText(\n 'after',\n `\nExamples:\n $ dr changeset list`\n )\n .action(async () => {\n await changesetListCommand();\n });\n\n changesetGroup\n .command('apply <name>')\n .description('Apply a changeset to the model')\n .addHelpText(\n 'after',\n `\nExamples:\n $ dr changeset apply \"v1.1 migration\"`\n )\n .action(async (name) => {\n await changesetApplyCommand(name);\n });\n\n changesetGroup\n .command('revert <name>')\n .description('Revert a changeset from the model')\n .addHelpText(\n 'after',\n `\nExamples:\n $ dr changeset revert \"v1.1 migration\"`\n )\n .action(async (name) => {\n await changesetRevertCommand(name);\n });\n\n changesetGroup\n .command('activate <name>')\n .description('Activate a changeset for automatic change tracking')\n .addHelpText(\n 'after',\n `\nExamples:\n $ dr changeset activate \"v1.1 migration\"`\n )\n .action(async (name) => {\n await changesetActivateCommand(name);\n });\n\n changesetGroup\n .command('deactivate')\n .description('Deactivate the currently active changeset')\n .addHelpText(\n 'after',\n `\nExamples:\n $ dr changeset deactivate`\n )\n .action(async () => {\n await changesetDeactivateCommand();\n });\n\n changesetGroup\n .command('status')\n .description('Show the currently active changeset')\n .addHelpText(\n 'after',\n `\nExamples:\n $ dr changeset status`\n )\n .action(async () => {\n await changesetStatusCommand();\n });\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }