@documentation-robotics/cli 0.3.0 → 0.4.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 (182) hide show
  1. package/README.md +10 -14
  2. package/dist/analyzers/active-analyzer.js +62 -0
  3. package/dist/analyzers/active-analyzer.js.map +7 -0
  4. package/dist/analyzers/cards/build.js +21 -1
  5. package/dist/analyzers/cards/build.js.map +2 -2
  6. package/dist/analyzers/cards/extract.js +138 -0
  7. package/dist/analyzers/cards/extract.js.map +7 -0
  8. package/dist/analyzers/cards/routes.js +96 -0
  9. package/dist/analyzers/cards/routes.js.map +7 -0
  10. package/dist/analyzers/cbm-analyzer.js +76 -4
  11. package/dist/analyzers/cbm-analyzer.js.map +2 -2
  12. package/dist/analyzers/cbm-responses.js +12 -6
  13. package/dist/analyzers/cbm-responses.js.map +2 -2
  14. package/dist/analyzers/code-changes.js +159 -0
  15. package/dist/analyzers/code-changes.js.map +7 -0
  16. package/dist/analyzers/edge-relationships.js +6 -2
  17. package/dist/analyzers/edge-relationships.js.map +2 -2
  18. package/dist/analyzers/extraction-plan.js +541 -0
  19. package/dist/analyzers/extraction-plan.js.map +7 -0
  20. package/dist/analyzers/index-job.js +229 -0
  21. package/dist/analyzers/index-job.js.map +7 -0
  22. package/dist/cli.js +12 -10
  23. package/dist/cli.js.map +2 -2
  24. package/dist/coding-agents/drbot-mcp.js +120 -18
  25. package/dist/coding-agents/drbot-mcp.js.map +2 -2
  26. package/dist/commands/add.js +4 -2
  27. package/dist/commands/add.js.map +2 -2
  28. package/dist/commands/analyzer.js +35 -35
  29. package/dist/commands/analyzer.js.map +2 -2
  30. package/dist/commands/changeset-verify.js +16 -8
  31. package/dist/commands/changeset-verify.js.map +2 -2
  32. package/dist/commands/changeset.js +41 -11
  33. package/dist/commands/changeset.js.map +2 -2
  34. package/dist/commands/init.js +9 -26
  35. package/dist/commands/init.js.map +2 -2
  36. package/dist/commands/mcp.js +35 -31
  37. package/dist/commands/mcp.js.map +3 -3
  38. package/dist/commands/relationship.js +2 -12
  39. package/dist/commands/relationship.js.map +2 -2
  40. package/dist/commands/reports.js +3 -3
  41. package/dist/commands/reports.js.map +2 -2
  42. package/dist/commands/update.js +14 -13
  43. package/dist/commands/update.js.map +2 -2
  44. package/dist/commands/upgrade.js +28 -120
  45. package/dist/commands/upgrade.js.map +2 -2
  46. package/dist/commands/validate.js +19 -3
  47. package/dist/commands/validate.js.map +2 -2
  48. package/dist/commands/version.js +1 -1
  49. package/dist/commands/visualize.js +30 -12
  50. package/dist/commands/visualize.js.map +2 -2
  51. package/dist/core/annotation-store.js +15 -5
  52. package/dist/core/annotation-store.js.map +2 -2
  53. package/dist/core/catalog-migration.js +2 -1
  54. package/dist/core/catalog-migration.js.map +2 -2
  55. package/dist/core/changeset-base-index.js +7 -0
  56. package/dist/core/changeset-base-index.js.map +2 -2
  57. package/dist/core/changeset-brief-compact.js +256 -0
  58. package/dist/core/changeset-brief-compact.js.map +7 -0
  59. package/dist/core/changeset-verify.js +356 -26
  60. package/dist/core/changeset-verify.js.map +3 -3
  61. package/dist/core/extraction-observability.js +161 -0
  62. package/dist/core/extraction-observability.js.map +7 -0
  63. package/dist/core/migration-registry.js +13 -1
  64. package/dist/core/migration-registry.js.map +2 -2
  65. package/dist/core/project-init.js +53 -0
  66. package/dist/core/project-init.js.map +7 -0
  67. package/dist/core/relationship-staging.js +94 -1
  68. package/dist/core/relationship-staging.js.map +2 -2
  69. package/dist/core/staged-changeset-storage.js +83 -3
  70. package/dist/core/staged-changeset-storage.js.map +2 -2
  71. package/dist/core/staging-area.js +85 -8
  72. package/dist/core/staging-area.js.map +2 -2
  73. package/dist/core/upgrade-plan.js +117 -0
  74. package/dist/core/upgrade-plan.js.map +7 -0
  75. package/dist/generated/relationship-index.js +124 -15
  76. package/dist/generated/relationship-index.js.map +2 -2
  77. package/dist/integrations/claude_code/.claude-plugin/plugin.json +24 -0
  78. package/dist/integrations/claude_code/agents/dr-architect.md +19 -5
  79. package/dist/integrations/claude_code/agents/dr-extractor.md +7 -1
  80. package/dist/integrations/claude_code/commands/dr-changeset.md +2 -1
  81. package/dist/integrations/claude_code/commands/dr-map.md +7 -1
  82. package/dist/integrations/claude_code/commands/dr-plan.md +42 -16
  83. package/dist/integrations/claude_code/docs/MCP_SERVER.md +28 -31
  84. package/dist/integrations/claude_code/docs/README.md +20 -1
  85. package/dist/integrations/claude_code/plugin-agents/dr-advisor.md +255 -0
  86. package/dist/integrations/claude_code/plugin-agents/dr-architect.md +306 -0
  87. package/dist/integrations/claude_code/skills/dr_13_testing_layer/SKILL.md +3 -0
  88. package/dist/integrations/claude_code/skills/dr_change_planning/SKILL.md +90 -31
  89. package/dist/integrations/claude_code/skills/dr_changeset_reviewer/SKILL.md +5 -0
  90. package/dist/integrations/claude_code/skills/dr_engineering_guide/SKILL.md +5 -0
  91. package/dist/integrations/github_copilot/agents/dr-architect.md +2 -0
  92. package/dist/integrations/github_copilot/skills/dr_13_testing_layer/SKILL.md +3 -0
  93. package/dist/integrations/github_copilot/skills/dr_change_planning/SKILL.md +88 -30
  94. package/dist/mcp/changeset-only.js +14 -3
  95. package/dist/mcp/changeset-only.js.map +2 -2
  96. package/dist/mcp/project-root.js +85 -0
  97. package/dist/mcp/project-root.js.map +7 -0
  98. package/dist/mcp/server-instructions.js +27 -0
  99. package/dist/mcp/server-instructions.js.map +7 -0
  100. package/dist/mcp/strict-schema.js +52 -0
  101. package/dist/mcp/strict-schema.js.map +7 -0
  102. package/dist/mcp/tool-registry.js +39 -5
  103. package/dist/mcp/tool-registry.js.map +2 -2
  104. package/dist/mcp/tools/changeset-analysis-tools.js +25 -5
  105. package/dist/mcp/tools/changeset-analysis-tools.js.map +3 -3
  106. package/dist/mcp/tools/changeset-commit.js +224 -0
  107. package/dist/mcp/tools/changeset-commit.js.map +7 -0
  108. package/dist/mcp/tools/changeset-editing.js +133 -57
  109. package/dist/mcp/tools/changeset-editing.js.map +3 -3
  110. package/dist/mcp/tools/changeset-lifecycle.js +1 -1
  111. package/dist/mcp/tools/changeset-lifecycle.js.map +2 -2
  112. package/dist/mcp/tools/changeset-verify.js +12 -6
  113. package/dist/mcp/tools/changeset-verify.js.map +2 -2
  114. package/dist/mcp/tools/codebase-extract.js +836 -0
  115. package/dist/mcp/tools/codebase-extract.js.map +7 -0
  116. package/dist/mcp/tools/codebase-index.js +125 -0
  117. package/dist/mcp/tools/codebase-index.js.map +7 -0
  118. package/dist/mcp/tools/codebase-shared.js +265 -0
  119. package/dist/mcp/tools/codebase-shared.js.map +7 -0
  120. package/dist/mcp/tools/codebase-verify.js +48 -0
  121. package/dist/mcp/tools/codebase-verify.js.map +7 -0
  122. package/dist/mcp/tools/index.js +15 -0
  123. package/dist/mcp/tools/index.js.map +2 -2
  124. package/dist/mcp/tools/model-add.js +189 -73
  125. package/dist/mcp/tools/model-add.js.map +2 -2
  126. package/dist/mcp/tools/model-update.js +16 -12
  127. package/dist/mcp/tools/model-update.js.map +2 -2
  128. package/dist/mcp/tools/model-validate.js +46 -4
  129. package/dist/mcp/tools/model-validate.js.map +2 -2
  130. package/dist/mcp/tools/project-status-collectors.js +381 -0
  131. package/dist/mcp/tools/project-status-collectors.js.map +7 -0
  132. package/dist/mcp/tools/project-status.js +237 -0
  133. package/dist/mcp/tools/project-status.js.map +7 -0
  134. package/dist/mcp/tools/project-tools.js +505 -0
  135. package/dist/mcp/tools/project-tools.js.map +7 -0
  136. package/dist/mcp/tools/relationship-tools.js +89 -20
  137. package/dist/mcp/tools/relationship-tools.js.map +2 -2
  138. package/dist/mcp/tools/review-open.js +210 -0
  139. package/dist/mcp/tools/review-open.js.map +7 -0
  140. package/dist/mcp/tools/shared.js +10 -2
  141. package/dist/mcp/tools/shared.js.map +2 -2
  142. package/dist/reports/model-report-orchestrator.js +31 -2
  143. package/dist/reports/model-report-orchestrator.js.map +2 -2
  144. package/dist/schemas/bundled/analyzers/cbm.json +22 -10
  145. package/dist/schemas/bundled/analyzers/manifest.json +2 -2
  146. package/dist/schemas/bundled/api.json +1 -1
  147. package/dist/schemas/bundled/apm.json +1 -1
  148. package/dist/schemas/bundled/application.json +1 -1
  149. package/dist/schemas/bundled/base.json +1 -1
  150. package/dist/schemas/bundled/business.json +1 -1
  151. package/dist/schemas/bundled/data-model.json +1 -1
  152. package/dist/schemas/bundled/data-store.json +1 -1
  153. package/dist/schemas/bundled/manifest.json +3 -3
  154. package/dist/schemas/bundled/motivation.json +1 -1
  155. package/dist/schemas/bundled/navigation.json +1 -1
  156. package/dist/schemas/bundled/product.json +1 -1
  157. package/dist/schemas/bundled/security.json +1 -1
  158. package/dist/schemas/bundled/technology.json +1 -1
  159. package/dist/schemas/bundled/testing.json +145 -1
  160. package/dist/schemas/bundled/ux.json +1 -1
  161. package/dist/server/server.js +508 -237
  162. package/dist/server/server.js.map +3 -3
  163. package/dist/server/viewer-registry.js +264 -0
  164. package/dist/server/viewer-registry.js.map +7 -0
  165. package/dist/telemetry/index.js +1 -1
  166. package/dist/utils/id-generator.js +5 -2
  167. package/dist/utils/id-generator.js.map +2 -2
  168. package/dist/utils/source-reference.js +58 -27
  169. package/dist/utils/source-reference.js.map +2 -2
  170. package/dist/utils/spec-version.js +2 -2
  171. package/dist/utils/spec-version.js.map +1 -1
  172. package/dist/validators/model-warnings.js +28 -0
  173. package/dist/validators/model-warnings.js.map +7 -0
  174. package/dist/viewer/README.md +6 -6
  175. package/dist/viewer/assets/main-CUOQGGRA.css +1 -0
  176. package/dist/viewer/assets/main-DvH3gYrI.js +84 -0
  177. package/dist/viewer/index.html +2 -2
  178. package/dist/viewer/manifest.json +10 -10
  179. package/dist/viewer/version.json +1 -1
  180. package/package.json +1 -1
  181. package/dist/viewer/assets/main-CxzcuU_o.js +0 -84
  182. package/dist/viewer/assets/main-j-7ULYpm.css +0 -1
@@ -1,10 +1,8 @@
1
1
  import ansis from "ansis";
2
2
  import { confirm } from "@clack/prompts";
3
- import { findProjectRoot, getSpecReferencePath, getModelPath } from "../utils/project-paths.js";
4
- import { getCliVersion, getCliBundledSpecVersion, getInstalledSpecVersion, getModelSpecVersion } from "../utils/spec-version.js";
5
- import { MigrationRegistry } from "../core/migration-registry.js";
6
- import { Model } from "../core/model.js";
7
- import { pendingCatalogMigrations } from "../core/catalog-migration.js";
3
+ import { findProjectRoot } from "../utils/project-paths.js";
4
+ import { getCliVersion, getCliBundledSpecVersion } from "../utils/spec-version.js";
5
+ import { scanUpgrades, UpgradeScanError } from "../core/upgrade-plan.js";
8
6
  import { upgradeModel } from "../core/model-upgrade.js";
9
7
  import { summarizeRelationshipChanges } from "../core/relationship-migration.js";
10
8
  import { installSpecReference } from "../utils/spec-installer.js";
@@ -85,106 +83,37 @@ Scanning for available upgrades...
85
83
  message: error.message
86
84
  }), commandSpan.setAttribute("upgrade.result", "no_project")), console.error(ansis.red("Error: No DR project found")), console.error(ansis.dim('Run "dr init" to create a new project')), error;
87
85
  }
88
- const bundledSpecVersion = getCliBundledSpecVersion(), cliVersion = getCliVersion(), actions = [], drPath = await getSpecReferencePath();
89
- let currentSpecVersion = null;
90
- if (!drPath)
91
- actions.push({
92
- type: "spec",
93
- description: "Install spec reference",
94
- toVersion: bundledSpecVersion,
95
- details: [
96
- "Create .dr/ folder",
97
- "Install schema files",
98
- `Set spec version to ${bundledSpecVersion}`
99
- ]
100
- });
101
- else {
102
- let installedSpecVersion = null;
103
- try {
104
- installedSpecVersion = await getInstalledSpecVersion(drPath);
105
- } catch (error) {
106
- const message = error instanceof Error ? error.message : String(error);
107
- throw console.error(ansis.red(`Error: ${message}`)), error;
108
- }
109
- currentSpecVersion = installedSpecVersion, installedSpecVersion ? (installedSpecVersion !== bundledSpecVersion || options.force) && actions.push({
110
- type: "spec",
111
- description: installedSpecVersion !== bundledSpecVersion ? "Upgrade spec reference" : "Reinstall spec reference (forced)",
112
- fromVersion: installedSpecVersion,
113
- toVersion: bundledSpecVersion,
114
- details: ["Update schema files", "Update .dr/manifest.json"]
115
- }) : actions.push({
116
- type: "spec",
117
- description: "Reinstall spec reference (manifest missing)",
118
- toVersion: bundledSpecVersion,
119
- details: [
120
- "Recreate .dr/manifest.json",
121
- "Update schema files",
122
- `Set spec version to ${bundledSpecVersion}`
123
- ]
124
- });
125
- }
126
- const modelPath = await getModelPath();
127
- if (!modelPath) {
128
- if (console.log(ansis.yellow("\u26A0 No model found")), console.log(ansis.dim(` Run "dr init" to create a model
129
- `)), actions.length > 0) {
130
- const { actions: integrationActions2, upToDate: integrationUpToDate2 } = await buildIntegrationActions(cliVersion, options.force ?? !1);
131
- actions.push(...integrationActions2), await handleUpgrade(projectRoot, actions, options, integrationUpToDate2, commandSpan);
132
- }
133
- return;
134
- }
135
- let modelSpecVersion = null;
86
+ const bundledSpecVersion = getCliBundledSpecVersion(), cliVersion = getCliVersion();
87
+ let scan;
136
88
  try {
137
- modelSpecVersion = await getModelSpecVersion(modelPath);
89
+ scan = await scanUpgrades(projectRoot, { force: options.force });
138
90
  } catch (error) {
139
- const message = error instanceof Error ? error.message : String(error);
140
- throw console.error(ansis.red(`Error: ${message}`)), error;
91
+ throw error instanceof UpgradeScanError && console.error(ansis.red(`Error: ${error.message}`)), error;
141
92
  }
142
- if (!modelSpecVersion) {
143
- if (console.log(ansis.yellow("\u26A0 Model manifest.yaml not found or missing specVersion")), console.log(ansis.dim(` Check documentation_robotics/model/manifest.yaml
144
- `)), actions.length > 0) {
93
+ const actions = [...scan.actions], currentSpecVersion = scan.installedSpecVersion;
94
+ if (scan.model.state !== "found") {
95
+ if (scan.model.state === "missing" ? (console.log(ansis.yellow("\u26A0 No model found")), console.log(ansis.dim(` Run "dr init" to create a model
96
+ `))) : (console.log(ansis.yellow("\u26A0 Model manifest.yaml not found or missing specVersion")), console.log(ansis.dim(` Check documentation_robotics/model/manifest.yaml
97
+ `))), actions.length > 0) {
145
98
  const { actions: integrationActions2, upToDate: integrationUpToDate2 } = await buildIntegrationActions(cliVersion, options.force ?? !1);
146
99
  actions.push(...integrationActions2), await handleUpgrade(projectRoot, actions, options, integrationUpToDate2, commandSpan);
147
100
  }
148
101
  return;
149
102
  }
150
- const targetSpecVersion = currentSpecVersion || bundledSpecVersion;
151
- if (modelSpecVersion !== targetSpecVersion) {
152
- const registry = new MigrationRegistry(), summary = registry.getMigrationSummary(modelSpecVersion, targetSpecVersion);
153
- if (summary.migrationsNeeded === 0)
154
- if (options.force)
155
- actions.push({
156
- type: "model",
157
- description: "Force-update model spec version (no migration required)",
158
- fromVersion: modelSpecVersion,
159
- toVersion: targetSpecVersion,
160
- details: ["Update manifest.yaml specVersion (no data changes needed)"],
161
- versionBumpOnly: !0
162
- });
163
- else {
164
- const error = new Error(`No migration path found from model v${modelSpecVersion} to v${targetSpecVersion}`);
165
- commandSpan && (commandSpan.recordException(error), commandSpan.setStatus({
166
- code: 2,
167
- // SpanStatusCode.ERROR
168
- message: error.message
169
- }), commandSpan.setAttribute("upgrade.result", "no_migration_path")), console.log(ansis.yellow(`\u26A0 No migration path found from model v${modelSpecVersion} to v${targetSpecVersion}`)), console.log(ansis.dim(`
103
+ const modelSpecVersion = scan.model.specVersion;
104
+ if (scan.noMigrationPath) {
105
+ const { from, to, available } = scan.noMigrationPath, error = new Error(`No migration path found from model v${from} to v${to}`);
106
+ commandSpan && (commandSpan.recordException(error), commandSpan.setStatus({
107
+ code: 2,
108
+ // SpanStatusCode.ERROR
109
+ message: error.message
110
+ }), commandSpan.setAttribute("upgrade.result", "no_migration_path")), console.log(ansis.yellow(`\u26A0 No migration path found from model v${from} to v${to}`)), console.log(ansis.dim(`
170
111
  Available migrations:`));
171
- const allMigrations = registry.getMigrationSummary("0.5.0").migrations;
172
- for (const migration of allMigrations)
173
- console.log(ansis.dim(` \u2022 ${migration.from} \u2192 ${migration.to}: ${migration.description}`));
174
- throw console.log(), error;
175
- }
176
- const migrationDetails = summary.migrations.map((m) => `${m.from} \u2192 ${m.to}: ${m.description}`);
177
- actions.push({
178
- type: "model",
179
- description: "Migrate model data",
180
- fromVersion: modelSpecVersion,
181
- toVersion: targetSpecVersion,
182
- details: migrationDetails
183
- });
184
- } else {
185
- const catalogAction = await buildCatalogAction(projectRoot, targetSpecVersion);
186
- catalogAction && actions.push(catalogAction);
112
+ for (const migration of available)
113
+ console.log(ansis.dim(` \u2022 ${migration.from} \u2192 ${migration.to}: ${migration.description}`));
114
+ throw console.log(), error;
187
115
  }
116
+ scan.catalogCheckError !== void 0 && console.log(ansis.yellow(`\u26A0 Could not check the model against the catalog: ${scan.catalogCheckError}`));
188
117
  const { actions: integrationActions, upToDate: integrationUpToDate } = await buildIntegrationActions(cliVersion, options.force ?? !1);
189
118
  if (actions.push(...integrationActions), actions.length === 0) {
190
119
  commandSpan && (commandSpan.setAttribute("upgrade.result", "up_to_date"), commandSpan.setAttribute("upgrade.actions_count", 0)), console.log(ansis.green(`\u2713 Everything is up to date!
@@ -240,7 +169,7 @@ Upgrade cancelled
240
169
  Executing upgrades...
241
170
  `));
242
171
  for (const action of actions)
243
- action.type === "spec" ? await executeSpecUpgrade(projectRoot, action) : action.type === "model" ? await executeModelMigration(action, options) : action.type === "integration" && await executeIntegrationUpdate(action.description, async () => {
172
+ action.type === "spec" ? await executeSpecUpgrade(projectRoot, action) : action.type === "model" ? await executeModelMigration(projectRoot, action, options) : action.type === "integration" && await executeIntegrationUpdate(action.description, async () => {
244
173
  action.integrationName === "claude" ? await new ClaudeIntegrationManager().upgrade({ force: !0 }) : await new CopilotIntegrationManager().upgrade({ force: !0 });
245
174
  });
246
175
  console.log(ansis.green(`
@@ -265,28 +194,7 @@ async function executeSpecUpgrade(projectRoot, action) {
265
194
  endSpan(operationSpan);
266
195
  }
267
196
  }
268
- async function buildCatalogAction(projectRoot, version) {
269
- let pending;
270
- try {
271
- pending = await pendingCatalogMigrations(await Model.load(projectRoot, { lazyLoad: !1 }));
272
- } catch (error) {
273
- return console.log(ansis.yellow(`\u26A0 Could not check the model against the catalog: ${getErrorMessage(error)}`)), null;
274
- }
275
- const details = [
276
- ...pending.elementTypes > 0 ? [`Rename ${pending.elementTypes} element(s) whose type was renamed`] : [],
277
- ...pending.relationships > 0 ? [`Rewrite or drop ${pending.relationships} relationship(s) of retired types`] : [],
278
- ...pending.stagedRelationships > 0 ? [`Rewrite ${pending.stagedRelationships} staged relationship change(s)`] : []
279
- ];
280
- return details.length === 0 ? null : {
281
- type: "model",
282
- description: `Apply catalog changes to the model (spec v${version})`,
283
- fromVersion: version,
284
- toVersion: version,
285
- details,
286
- catalogOnly: !0
287
- };
288
- }
289
- async function executeModelMigration(action, options) {
197
+ async function executeModelMigration(projectRoot, action, options) {
290
198
  const operationSpan = isTelemetryEnabled ? startSpan("upgrade.model", {
291
199
  "upgrade.model.from_version": action.fromVersion || "unknown",
292
200
  "upgrade.model.to_version": action.toVersion,
@@ -296,7 +204,7 @@ async function executeModelMigration(action, options) {
296
204
  try {
297
205
  if (action.versionBumpOnly) {
298
206
  console.log(ansis.dim(`Bumping model spec version from v${action.fromVersion} to v${action.toVersion}...`));
299
- const result2 = await upgradeModel(process.cwd(), {
207
+ const result2 = await upgradeModel(projectRoot, {
300
208
  fromVersion: action.fromVersion,
301
209
  toVersion: action.toVersion,
302
210
  versionBumpOnly: !0
@@ -305,7 +213,7 @@ async function executeModelMigration(action, options) {
305
213
  return;
306
214
  }
307
215
  console.log(ansis.dim(action.catalogOnly ? `Applying catalog changes to the model (v${action.toVersion})...` : `Migrating model from v${action.fromVersion} to v${action.toVersion}...`));
308
- const result = await upgradeModel(process.cwd(), {
216
+ const result = await upgradeModel(projectRoot, {
309
217
  fromVersion: action.fromVersion,
310
218
  toVersion: action.toVersion,
311
219
  validate: !options.force,
@@ -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 { Model } from \"../core/model.js\";\nimport { pendingCatalogMigrations } from \"../core/catalog-migration.js\";\nimport {\n upgradeModel,\n type ChangesetRebaselineResult,\n type ChangesetRef,\n} from \"../core/model-upgrade.js\";\nimport {\n summarizeRelationshipChanges,\n type RelationshipRewriteChange,\n type StagedRelationshipRewriteChange,\n} from \"../core/relationship-migration.js\";\nimport { installSpecReference } from \"../utils/spec-installer.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 /** Model already at the target version, but with catalog changes it has not received */\n catalogOnly?: 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 } else {\n // Same spec version, but the relationship catalog can change between version bumps: a\n // model stamped with the current version before a catalog change still needs it\n const catalogAction = await buildCatalogAction(projectRoot, targetSpecVersion);\n if (catalogAction) {\n actions.push(catalogAction);\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 */\n/**\n * A model action when a model at the current spec version still names element types or\n * relationship types the catalog has retired; null when it is in line with the catalog\n */\nasync function buildCatalogAction(projectRoot: string, version: string): Promise<UpgradeAction | null> {\n let pending: Awaited<ReturnType<typeof pendingCatalogMigrations>>;\n try {\n pending = await pendingCatalogMigrations(await Model.load(projectRoot, { lazyLoad: false }));\n } catch (error) {\n console.log(ansis.yellow(`\u26A0 Could not check the model against the catalog: ${getErrorMessage(error)}`));\n return null;\n }\n const details = [\n ...(pending.elementTypes > 0 ? [`Rename ${pending.elementTypes} element(s) whose type was renamed`] : []),\n ...(pending.relationships > 0 ? [`Rewrite or drop ${pending.relationships} relationship(s) of retired types`] : []),\n ...(pending.stagedRelationships > 0 ? [`Rewrite ${pending.stagedRelationships} staged relationship change(s)`] : []),\n ];\n if (details.length === 0) {\n return null;\n }\n return {\n type: \"model\",\n description: `Apply catalog changes to the model (spec v${version})`,\n fromVersion: version,\n toVersion: version,\n details,\n catalogOnly: true,\n };\n}\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 result = await upgradeModel(process.cwd(), {\n fromVersion: action.fromVersion!,\n toVersion: action.toVersion,\n versionBumpOnly: true,\n });\n console.log(ansis.green(`\u2713 Model spec version updated to v${action.toVersion}`));\n printChangesetRebaseline(result.changesets);\n\n if (operationSpan) {\n operationSpan.setAttribute(\"upgrade.model.result\", \"version_bumped\");\n operationSpan.setAttribute(\n \"upgrade.model.changesets_rebaselined\",\n result.changesets.rebaselined.length\n );\n }\n return;\n }\n\n console.log(\n ansis.dim(\n action.catalogOnly\n ? `Applying catalog changes to the model (v${action.toVersion})...`\n : `Migrating model from v${action.fromVersion} to v${action.toVersion}...`\n )\n );\n\n // Apply migrations, save the model and re-baseline staged changesets on it\n const result = await upgradeModel(process.cwd(), {\n fromVersion: action.fromVersion!,\n toVersion: action.toVersion,\n validate: !options.force,\n catalogOnly: action.catalogOnly,\n });\n const applied = result.migration?.applied ?? [];\n\n // Display migration results\n for (const migration of applied) {\n console.log(ansis.green(` \u2713 ${migration.from} \u2192 ${migration.to}: ${migration.description}`));\n if (migration.changes?.filesModified) {\n console.log(ansis.dim(` Files modified: ${migration.changes.filesModified}`));\n }\n printElementTypeChanges(migration.changes?.details?.elementTypeChanges);\n printRelationshipChanges(migration.changes?.details?.relationshipChanges);\n printStagedRelationshipChanges(migration.changes?.details?.stagedRelationshipChanges);\n }\n\n console.log(\n ansis.green(\n action.catalogOnly\n ? `\u2713 Model in line with the v${action.toVersion} catalog`\n : `\u2713 Model migrated to v${action.toVersion}`\n )\n );\n printChangesetRebaseline(result.changesets);\n\n if (operationSpan) {\n operationSpan.setAttribute(\"upgrade.model.result\", \"migrated\");\n operationSpan.setAttribute(\"upgrade.model.migrations_applied\", applied.length);\n operationSpan.setAttribute(\n \"upgrade.model.changesets_rebaselined\",\n result.changesets.rebaselined.length\n );\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 * Report elements whose type a catalog migration renamed\n */\nfunction printElementTypeChanges(changes: unknown): void {\n if (!Array.isArray(changes) || changes.length === 0) {\n return;\n }\n const byType = new Map<string, number>();\n for (const c of changes as Array<{ fromType: string; toType: string }>) {\n const key = `${c.fromType} \u2192 ${c.toType}`;\n byType.set(key, (byType.get(key) ?? 0) + 1);\n }\n for (const [key, n] of byType) {\n console.log(ansis.dim(` Renamed ${n} element(s): ${key}`));\n }\n}\n\n/**\n * Report relationships a catalog migration rewrote, listing each one it dropped\n */\nfunction printRelationshipChanges(changes: unknown): void {\n if (!Array.isArray(changes) || changes.length === 0) {\n return;\n }\n const relationshipChanges = changes as RelationshipRewriteChange[];\n\n console.log(ansis.dim(` ${summarizeRelationshipChanges(relationshipChanges)}`));\n for (const change of relationshipChanges) {\n if (change.action === \"dropped-duplicate\" && change.after) {\n console.log(\n ansis.dim(\n ` dropped ${formatRelationship(change.before)} (now the same as ${formatRelationship(change.after)})`\n )\n );\n } else if (change.action === \"dropped\") {\n console.log(\n ansis.dim(` dropped ${formatRelationship(change.before)} (no replacement in the catalog)`)\n );\n }\n }\n}\n\n/**\n * Report staged changeset changes a catalog migration rewrote, per changeset, listing each one\n * it removed from its changeset\n */\nfunction printStagedRelationshipChanges(changes: unknown): void {\n if (!Array.isArray(changes) || changes.length === 0) {\n return;\n }\n const byChangeset = new Map<string, StagedRelationshipRewriteChange[]>();\n for (const change of changes as StagedRelationshipRewriteChange[]) {\n byChangeset.set(change.changeset, [...(byChangeset.get(change.changeset) ?? []), change]);\n }\n\n for (const [changeset, staged] of byChangeset) {\n console.log(\n ansis.dim(` ${summarizeRelationshipChanges(staged, `changeset ${changeset}, staged relationships`)}`)\n );\n for (const change of staged) {\n if (change.action === \"rewritten\") {\n continue;\n }\n const kind = change.stagedAs === \"relationship-add\" ? \"add\" : \"delete\";\n console.log(\n ansis.dim(\n ` dropped staged ${kind} of ${formatRelationship(change.before)} (${stagedDropReason(change)})`\n )\n );\n }\n }\n}\n\nfunction stagedDropReason(change: StagedRelationshipRewriteChange): string {\n if (change.action === \"dropped\" || !change.after) {\n return \"no replacement in the catalog\";\n }\n const sameAs = `now the same as ${formatRelationship(change.after)}`;\n switch (change.duplicateOf) {\n case \"model\":\n return `${sameAs}, already in the model`;\n case \"kept\":\n return `${sameAs}, which also stands for a relationship the changeset keeps`;\n default:\n return change.stagedAs === \"relationship-add\"\n ? `${sameAs}, which the changeset already adds`\n : `${sameAs}, which the changeset already deletes`;\n }\n}\n\nfunction formatRelationship(rel: { source: string; predicate: string; target: string }): string {\n return `${rel.source} --[${rel.predicate}]--> ${rel.target}`;\n}\n\n/**\n * Report the staged changesets re-baselined on the upgraded model, and those left on their old\n * base snapshot because they had drifted before the upgrade\n */\nfunction printChangesetRebaseline(result: ChangesetRebaselineResult): void {\n const names = (refs: ChangesetRef[]) => refs.map((ref) => ref.name).join(\", \");\n const count = (n: number) => `${n} staged changeset${n === 1 ? \"\" : \"s\"}`;\n\n if (result.rebaselined.length > 0) {\n console.log(\n ansis.green(\n `\u2713 Re-baselined ${count(result.rebaselined.length)} on the upgraded model: ${names(result.rebaselined)}`\n )\n );\n }\n if (result.drifted.length > 0) {\n console.log(\n ansis.yellow(\n `\u26A0 ${count(result.drifted.length)} had drifted from the model before the upgrade and still ${result.drifted.length === 1 ? \"needs\" : \"need\"} --force to commit: ${names(result.drifted)}`\n )\n );\n }\n for (const error of result.errors) {\n console.log(ansis.yellow(`\u26A0 ${error}`));\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
- "mappings": "AAUA,OAAO,WAAW;AAClB,SAAS,eAAe;AACxB,SAAS,iBAAiB,sBAAsB,oBAAoB;AACpE,SACE,eACA,0BACA,yBACA,2BACK;AACP,SAAS,yBAAyB;AAClC,SAAS,aAAa;AACtB,SAAS,gCAAgC;AACzC,SACE,oBAGK;AACP,SACE,oCAGK;AACP,SAAS,4BAA4B;AACrC,SAAS,gCAAgC;AACzC,SAAS,iCAAiC;AAC1C,SAAS,uBAAuB;AAChC,SAAS,WAAW,eAAe;AACnC,SAAS,iBAAiB,8BAA8B;AAIxD,MAAM,qBAAgE;AAuBtE,eAAe,wBACb,YACA,OAAc;AAEd,QAAM,UAA2B,CAAA,GAC3B,WAAqB,CAAA,GAGrB,gBAAgB,IAAI,yBAAwB;AAClD,MAAI,MAAM,cAAc,YAAW,GAAI;AAErC,UAAM,oBADgB,MAAM,cAAc,gBAAe,IACjB;AAGxC,IAAI,SAFiB,oBAAoB,qBAAqB,aAG5D,QAAQ,KAAK;MACX,MAAM;MACN,aAAa,QACT,+CACA;MACJ,aAAa;MACb,WAAW;MACX,iBAAiB;KAClB,IACQ,oBACT,SAAS,KACP,KAAK,MAAM,MAAM,QAAG,CAAC,yCAAyC,gBAAgB,GAAG;EAGvF;AAGA,QAAM,iBAAiB,IAAI,0BAAyB;AACpD,MAAI,MAAM,eAAe,YAAW,GAAI;AAEtC,UAAM,oBADiB,MAAM,eAAe,gBAAe,IAClB;AAGzC,IAAI,SAFiB,oBAAoB,qBAAqB,aAG5D,QAAQ,KAAK;MACX,MAAM;MACN,aAAa,QACT,kDACA;MACJ,aAAa;MACb,WAAW;MACX,iBAAiB;KAClB,IACQ,oBACT,SAAS,KACP,KAAK,MAAM,MAAM,QAAG,CAAC,4CAA4C,gBAAgB,GAAG;EAG1F;AAEA,SAAO,EAAE,SAAS,SAAQ;AAC5B;AAMA,eAAe,wBACb,aACA,SAAuB;AAEvB,MAAI,MAAM,gBAAgB,WAAW;AACnC;AAKF,MAFA,QAAQ,IAAI,MAAM,OAAO;8BAA4B,CAAC,GAElD,QAAQ,QAAQ;AAClB,YAAQ,IAAI,MAAM,OAAO;CAAiD,CAAC;AAC3E;EACF;AAGA,MAAI;AACJ,QAAM,gBAAgB,QAAQ,MAAM,SAAS,QAAQ,OAAO;AAe5D,MAbI,QAAQ,MACV,iBAAiB,KACR,gBAKT,iBAJiB,MAAM,QAAQ;IAC7B,SAAS;IACT,cAAc;GACf,MAC6B,KAG9B,iBAAiB,IAGf,CAAC,gBAAgB;AACnB,YAAQ,IAAI,MAAM,IAAI;CAA8B,CAAC;AACrD;EACF;AAEA,MAAI;AACF,YAAQ,IAAG,GACX,MAAM,uBAAuB,WAAW;EAC1C,SAAS,OAAO;AAEd,YAAQ,KAAK,MAAM,OAAO;qCAAmC,gBAAgB,KAAK,CAAC;CAAI,CAAC;EAC1F;AACF;AAEA,eAAsB,eAAe,UAA0B,CAAA,GAAE;AAC/D,QAAM,cAAc,qBAChB,UAAU,mBAAmB;IAC3B,eAAe,QAAQ,OAAO;IAC9B,mBAAmB,QAAQ,UAAU;IACrC,iBAAiB,QAAQ,SAAS;GACnC,IACD;AAEJ,MAAI;AACF,YAAQ,IAAI,MAAM,KAAK;;CAAwC,CAAC;AAGhE,UAAM,cAAc,MAAM,gBAAe;AACzC,QAAI,CAAC,aAAa;AAChB,YAAM,QAAQ,IAAI,MAAM,4DAA8D;AACtF,YAAI,gBACF,YAAY,gBAAgB,KAAK,GACjC,YAAY,UAAU;QACpB,MAAM;;QACN,SAAS,MAAM;OAChB,GACD,YAAY,aAAa,kBAAkB,YAAY,IAEzD,QAAQ,MAAM,MAAM,IAAI,4BAA4B,CAAC,GACrD,QAAQ,MAAM,MAAM,IAAI,uCAAuC,CAAC,GAC1D;IACR;AAEA,UAAM,qBAAqB,yBAAwB,GAC7C,aAAa,cAAa,GAC1B,UAA2B,CAAA,GAM3B,SAAS,MAAM,qBAAoB;AACzC,QAAI,qBAAoC;AAExC,QAAI,CAAC;AACH,cAAQ,KAAK;QACX,MAAM;QACN,aAAa;QACb,WAAW;QACX,SAAS;UACP;UACA;UACA,uBAAuB,kBAAkB;;OAE5C;SACI;AACL,UAAI,uBAAsC;AAC1C,UAAI;AACF,+BAAuB,MAAM,wBAAwB,MAAM;MAC7D,SAAS,OAAO;AAEd,cAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,sBAAQ,MAAM,MAAM,IAAI,UAAU,OAAO,EAAE,CAAC,GACtC;MACR;AACA,2BAAqB,sBAEhB,wBAWM,yBAAyB,sBAAsB,QAAQ,UAChE,QAAQ,KAAK;QACX,MAAM;QACN,aAAa,yBAAyB,qBAClC,2BACA;QACJ,aAAa;QACb,WAAW;QACX,SAAS,CAAC,uBAAuB,0BAA0B;OAC5D,IAnBD,QAAQ,KAAK;QACX,MAAM;QACN,aAAa;QACb,WAAW;QACX,SAAS;UACP;UACA;UACA,uBAAuB,kBAAkB;;OAE5C;IAYL;AAMA,UAAM,YAAY,MAAM,aAAY;AACpC,QAAI,CAAC,WAAW;AAKd,UAJA,QAAQ,IAAI,MAAM,OAAO,uBAAkB,CAAC,GAC5C,QAAQ,IAAI,MAAM,IAAI;CAAqC,CAAC,GAGxD,QAAQ,SAAS,GAAG;AACtB,cAAM,EAAE,SAASA,qBAAoB,UAAUC,qBAAmB,IAChE,MAAM,wBAAwB,YAAY,QAAQ,SAAS,EAAK;AAClE,gBAAQ,KAAK,GAAGD,mBAAkB,GAClC,MAAM,cAAc,aAAa,SAAS,SAASC,sBAAqB,WAAW;MACrF;AAEA;IACF;AAEA,QAAI,mBAAkC;AACtC,QAAI;AACF,yBAAmB,MAAM,oBAAoB,SAAS;IACxD,SAAS,OAAO;AAEd,YAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,oBAAQ,MAAM,MAAM,IAAI,UAAU,OAAO,EAAE,CAAC,GACtC;IACR;AAEA,QAAI,CAAC,kBAAkB;AAKrB,UAJA,QAAQ,IAAI,MAAM,OAAO,6DAAwD,CAAC,GAClF,QAAQ,IAAI,MAAM,IAAI;CAAsD,CAAC,GAGzE,QAAQ,SAAS,GAAG;AACtB,cAAM,EAAE,SAASD,qBAAoB,UAAUC,qBAAmB,IAChE,MAAM,wBAAwB,YAAY,QAAQ,SAAS,EAAK;AAClE,gBAAQ,KAAK,GAAGD,mBAAkB,GAClC,MAAM,cAAc,aAAa,SAAS,SAASC,sBAAqB,WAAW;MACrF;AAEA;IACF;AAGA,UAAM,oBAAoB,sBAAsB;AAEhD,QAAI,qBAAqB,mBAAmB;AAE1C,YAAM,WAAW,IAAI,kBAAiB,GAChC,UAAU,SAAS,oBAAoB,kBAAkB,iBAAiB;AAEhF,UAAI,QAAQ,qBAAqB;AAC/B,YAAI,QAAQ;AAIV,kBAAQ,KAAK;YACX,MAAM;YACN,aAAa;YACb,aAAa;YACb,WAAW;YACX,SAAS,CAAC,2DAA2D;YACrE,iBAAiB;WAClB;aACI;AACL,gBAAM,QAAQ,IAAI,MAChB,uCAAuC,gBAAgB,QAAQ,iBAAiB,EAAE;AAEpF,UAAI,gBACF,YAAY,gBAAgB,KAAK,GACjC,YAAY,UAAU;YACpB,MAAM;;YACN,SAAS,MAAM;WAChB,GACD,YAAY,aAAa,kBAAkB,mBAAmB,IAEhE,QAAQ,IACN,MAAM,OACJ,8CAAyC,gBAAgB,QAAQ,iBAAiB,EAAE,CACrF,GAEH,QAAQ,IAAI,MAAM,IAAI;sBAAyB,CAAC;AAChD,gBAAM,gBAAgB,SAAS,oBAAoB,OAAO,EAAE;AAC5D,qBAAW,aAAa;AACtB,oBAAQ,IACN,MAAM,IAAI,YAAO,UAAU,IAAI,WAAM,UAAU,EAAE,KAAK,UAAU,WAAW,EAAE,CAAC;AAGlF,wBAAQ,IAAG,GACL;QACR;AAGF,YAAM,mBAAmB,QAAQ,WAAW,IAC1C,CAAC,MAAM,GAAG,EAAE,IAAI,WAAM,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE;AAGhD,cAAQ,KAAK;QACX,MAAM;QACN,aAAa;QACb,aAAa;QACb,WAAW;QACX,SAAS;OACV;IACH,OAAO;AAGL,YAAM,gBAAgB,MAAM,mBAAmB,aAAa,iBAAiB;AAC7E,MAAI,iBACF,QAAQ,KAAK,aAAa;IAE9B;AAMA,UAAM,EAAE,SAAS,oBAAoB,UAAU,oBAAmB,IAChE,MAAM,wBAAwB,YAAY,QAAQ,SAAS,EAAK;AAOlE,QANA,QAAQ,KAAK,GAAG,kBAAkB,GAM9B,QAAQ,WAAW,GAAG;AACxB,MAAI,gBACF,YAAY,aAAa,kBAAkB,YAAY,GACvD,YAAY,aAAa,yBAAyB,CAAC,IAErD,QAAQ,IAAI,MAAM,MAAM;CAA+B,CAAC,GACxD,QAAQ,IAAI,MAAM,IAAI,sBAAsB,sBAAsB,kBAAkB,EAAE,CAAC,GACvF,QAAQ,IAAI,MAAM,IAAI,aAAa,gBAAgB;CAAI,CAAC,GACxD,MAAM,wBAAwB,aAAa,OAAO;AAClD;IACF;AAEA,IAAI,gBACF,YAAY,aAAa,yBAAyB,QAAQ,MAAM,GAChE,YAAY,aACV,4BACA,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,MAAM,CAAC,GAExC,YAAY,aACV,+BACA,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,OAAO,CAAC,GAEzC,YAAY,aACV,mCACA,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,aAAa,CAAC,IAIjD,MAAM,cAAc,aAAa,SAAS,SAAS,qBAAqB,WAAW,GACnF,MAAM,wBAAwB,aAAa,OAAO,GAE9C,eACF,YAAY,aAAa,kBAAkB,SAAS;EAExD,SAAS,OAAO;AACd,UAAI,gBACF,YAAY,gBAAgB,KAAc,GAC1C,YAAY,UAAU;MACpB,MAAM;;MACN,SAAS,gBAAgB,KAAK;KAC/B,GACD,YAAY,aAAa,kBAAkB,OAAO,IAEpD,QAAQ,MAAM,MAAM,IAAI,UAAU,gBAAgB,KAAK,CAAC,EAAE,CAAC,GACrD;EACR;AACE,YAAQ,WAAW;EACrB;AACF;AAKA,eAAe,cACb,aACA,SACA,SACA,sBAAgC,CAAA,GAChC,aAAkB,MAAI;AAGtB,MAAI,QAAQ,SAAS,GAAG;AACtB,YAAQ,IAAI,MAAM,KAAK;CAAiB,CAAC;AAEzC,eAAW,UAAU,SAAS;AAC5B,YAAM,gBAAgB,OAAO,cACzB,GAAG,OAAO,WAAW,WAAM,OAAO,SAAS,KAC3C,IAAI,OAAO,SAAS,IAElB,OAAO,OAAO,SAAS,SAAS,cAAO,OAAO,SAAS,gBAAgB,cAAO;AAIpF,UAHA,QAAQ,IAAI,MAAM,OAAO,GAAG,IAAI,IAAI,OAAO,WAAW,EAAE,CAAC,GACzD,QAAQ,IAAI,MAAM,IAAI,eAAe,aAAa,EAAE,CAAC,GAEjD,OAAO,WAAW,OAAO,QAAQ,SAAS;AAC5C,mBAAW,UAAU,OAAO;AAC1B,kBAAQ,IAAI,MAAM,IAAI,aAAQ,MAAM,EAAE,CAAC;AAG3C,cAAQ,IAAG;IACb;EACF;AAUA,MAPI,oBAAoB,SAAS,MAC/B,QAAQ,IAAI,MAAM,KAAK,qBAAqB,CAAC,GAC7C,oBAAoB,QAAQ,CAAC,QAAQ,QAAQ,IAAI,GAAG,CAAC,GACrD,QAAQ,IAAG,IAIT,QAAQ,QAAQ;AAClB,YAAQ,IAAI,MAAM,OAAO;CAAqC,CAAC,GAC3D,cACF,WAAW,aAAa,6BAA6B,EAAI;AAE3D;EACF;AAGA,MAAI,gBAAgB,QAAQ;AAC5B,MAAI,CAAC;AAIH,QAFsB,QAAQ,MAAM,SAAS,QAAQ,OAAO;AAM1D,sBAHiB,MAAM,QAAQ;QAC7B,SAAS;OACV,MAC4B;SACxB;AACL,YAAM,QAAQ,IAAI,MAAM,kEAAkE;AAC1F,YAAI,eACF,WAAW,gBAAgB,KAAK,GAChC,WAAW,aAAa,kBAAkB,uBAAuB,IAEnE,QAAQ,MACN,MAAM,IAAI,yEAAyE,CAAC,GAEhF;IACR;AAGF,MAAI,CAAC,eAAe;AAClB,YAAQ,IAAI,MAAM,IAAI;;CAAuB,CAAC,GAC1C,cACF,WAAW,aAAa,0BAA0B,EAAI;AAExD;EACF;AAEA,UAAQ,IAAI,MAAM,KAAK;;CAA2B,CAAC;AAGnD,aAAW,UAAU;AACnB,IAAI,OAAO,SAAS,SAClB,MAAM,mBAAmB,aAAa,MAAM,IACnC,OAAO,SAAS,UACzB,MAAM,sBAAsB,QAAQ,OAAO,IAClC,OAAO,SAAS,iBACzB,MAAM,yBAAyB,OAAO,aAAa,YAAW;AAC5D,MAAI,OAAO,oBAAoB,WAE7B,MADU,IAAI,yBAAwB,EAC9B,QAAQ,EAAE,OAAO,GAAI,CAAE,IAG/B,MADU,IAAI,0BAAyB,EAC/B,QAAQ,EAAE,OAAO,GAAI,CAAE;IAEnC,CAAC;AAIL,UAAQ,IAAI,MAAM,MAAM;;CAA4C,CAAC;AACvE;AAKA,eAAe,mBAAmB,aAAqB,QAAqB;AAC1E,QAAM,gBAAgB,qBAClB,UAAU,gBAAgB;IACxB,6BAA6B,OAAO,eAAe;IACnD,2BAA2B,OAAO;IAClC,6BAA6B,CAAC,OAAO;GACtC,IACD;AAEJ,MAAI;AACF,YAAQ,IAAI,MAAM,IAAI,8BAA8B,OAAO,SAAS,KAAK,CAAC,GAC1E,MAAM,qBAAqB,aAAa,EAAI,GAC5C,QAAQ,IAAI,MAAM,MAAM,sCAAiC,OAAO,SAAS,EAAE,CAAC,GAExE,iBACF,cAAc,aAAa,uBAAuB,SAAS;EAE/D,SAAS,OAAO;AACd,UAAI,kBACF,cAAc,gBAAgB,KAAc,GAC5C,cAAc,UAAU;MACtB,MAAM;;MACN,SAAS,gBAAgB,KAAK;KAC/B,GACD,cAAc,aAAa,uBAAuB,OAAO,IAE3D,QAAQ,MACN,MAAM,IACJ,mCAAmC,gBAAgB,KAAK,CAAC,EAAE,CAC5D,GAEG;EACR;AACE,YAAQ,aAAa;EACvB;AACF;AASA,eAAe,mBAAmB,aAAqB,SAAe;AACpE,MAAI;AACJ,MAAI;AACF,cAAU,MAAM,yBAAyB,MAAM,MAAM,KAAK,aAAa,EAAE,UAAU,GAAK,CAAE,CAAC;EAC7F,SAAS,OAAO;AACd,mBAAQ,IAAI,MAAM,OAAO,yDAAoD,gBAAgB,KAAK,CAAC,EAAE,CAAC,GAC/F;EACT;AACA,QAAM,UAAU;IACd,GAAI,QAAQ,eAAe,IAAI,CAAC,UAAU,QAAQ,YAAY,oCAAoC,IAAI,CAAA;IACtG,GAAI,QAAQ,gBAAgB,IAAI,CAAC,mBAAmB,QAAQ,aAAa,mCAAmC,IAAI,CAAA;IAChH,GAAI,QAAQ,sBAAsB,IAAI,CAAC,WAAW,QAAQ,mBAAmB,gCAAgC,IAAI,CAAA;;AAEnH,SAAI,QAAQ,WAAW,IACd,OAEF;IACL,MAAM;IACN,aAAa,6CAA6C,OAAO;IACjE,aAAa;IACb,WAAW;IACX;IACA,aAAa;;AAEjB;AAEA,eAAe,sBACb,QACA,SAAuB;AAEvB,QAAM,gBAAgB,qBAClB,UAAU,iBAAiB;IACzB,8BAA8B,OAAO,eAAe;IACpD,4BAA4B,OAAO;IACnC,mCAAmC,OAAO,mBAAmB;IAC7D,0BAA0B,CAAC,QAAQ;GACpC,IACD;AAEJ,MAAI;AACF,QAAI,OAAO,iBAAiB;AAC1B,cAAQ,IACN,MAAM,IAAI,oCAAoC,OAAO,WAAW,QAAQ,OAAO,SAAS,KAAK,CAAC;AAEhG,YAAMC,UAAS,MAAM,aAAa,QAAQ,IAAG,GAAI;QAC/C,aAAa,OAAO;QACpB,WAAW,OAAO;QAClB,iBAAiB;OAClB;AACD,cAAQ,IAAI,MAAM,MAAM,yCAAoC,OAAO,SAAS,EAAE,CAAC,GAC/E,yBAAyBA,QAAO,UAAU,GAEtC,kBACF,cAAc,aAAa,wBAAwB,gBAAgB,GACnE,cAAc,aACZ,wCACAA,QAAO,WAAW,YAAY,MAAM;AAGxC;IACF;AAEA,YAAQ,IACN,MAAM,IACJ,OAAO,cACH,2CAA2C,OAAO,SAAS,SAC3D,yBAAyB,OAAO,WAAW,QAAQ,OAAO,SAAS,KAAK,CAC7E;AAIH,UAAM,SAAS,MAAM,aAAa,QAAQ,IAAG,GAAI;MAC/C,aAAa,OAAO;MACpB,WAAW,OAAO;MAClB,UAAU,CAAC,QAAQ;MACnB,aAAa,OAAO;KACrB,GACK,UAAU,OAAO,WAAW,WAAW,CAAA;AAG7C,eAAW,aAAa;AACtB,cAAQ,IAAI,MAAM,MAAM,YAAO,UAAU,IAAI,WAAM,UAAU,EAAE,KAAK,UAAU,WAAW,EAAE,CAAC,GACxF,UAAU,SAAS,iBACrB,QAAQ,IAAI,MAAM,IAAI,uBAAuB,UAAU,QAAQ,aAAa,EAAE,CAAC,GAEjF,wBAAwB,UAAU,SAAS,SAAS,kBAAkB,GACtE,yBAAyB,UAAU,SAAS,SAAS,mBAAmB,GACxE,+BAA+B,UAAU,SAAS,SAAS,yBAAyB;AAGtF,YAAQ,IACN,MAAM,MACJ,OAAO,cACH,kCAA6B,OAAO,SAAS,aAC7C,6BAAwB,OAAO,SAAS,EAAE,CAC/C,GAEH,yBAAyB,OAAO,UAAU,GAEtC,kBACF,cAAc,aAAa,wBAAwB,UAAU,GAC7D,cAAc,aAAa,oCAAoC,QAAQ,MAAM,GAC7E,cAAc,aACZ,wCACA,OAAO,WAAW,YAAY,MAAM;EAG1C,SAAS,OAAO;AACd,UAAI,kBACF,cAAc,gBAAgB,KAAc,GAC5C,cAAc,UAAU;MACtB,MAAM;;MACN,SAAS,gBAAgB,KAAK;KAC/B,GACD,cAAc,aAAa,wBAAwB,OAAO,IAE5D,QAAQ,MACN,MAAM,IAAI,0BAA0B,gBAAgB,KAAK,CAAC,EAAE,CAAC,GAEzD;EACR;AACE,YAAQ,aAAa;EACvB;AACF;AAKA,SAAS,wBAAwB,SAAgB;AAC/C,MAAI,CAAC,MAAM,QAAQ,OAAO,KAAK,QAAQ,WAAW;AAChD;AAEF,QAAM,SAAS,oBAAI,IAAG;AACtB,aAAW,KAAK,SAAwD;AACtE,UAAM,MAAM,GAAG,EAAE,QAAQ,WAAM,EAAE,MAAM;AACvC,WAAO,IAAI,MAAM,OAAO,IAAI,GAAG,KAAK,KAAK,CAAC;EAC5C;AACA,aAAW,CAAC,KAAK,CAAC,KAAK;AACrB,YAAQ,IAAI,MAAM,IAAI,eAAe,CAAC,gBAAgB,GAAG,EAAE,CAAC;AAEhE;AAKA,SAAS,yBAAyB,SAAgB;AAChD,MAAI,CAAC,MAAM,QAAQ,OAAO,KAAK,QAAQ,WAAW;AAChD;AAEF,QAAM,sBAAsB;AAE5B,UAAQ,IAAI,MAAM,IAAI,OAAO,6BAA6B,mBAAmB,CAAC,EAAE,CAAC;AACjF,aAAW,UAAU;AACnB,IAAI,OAAO,WAAW,uBAAuB,OAAO,QAClD,QAAQ,IACN,MAAM,IACJ,iBAAiB,mBAAmB,OAAO,MAAM,CAAC,qBAAqB,mBAAmB,OAAO,KAAK,CAAC,GAAG,CAC3G,IAEM,OAAO,WAAW,aAC3B,QAAQ,IACN,MAAM,IAAI,iBAAiB,mBAAmB,OAAO,MAAM,CAAC,kCAAkC,CAAC;AAIvG;AAMA,SAAS,+BAA+B,SAAgB;AACtD,MAAI,CAAC,MAAM,QAAQ,OAAO,KAAK,QAAQ,WAAW;AAChD;AAEF,QAAM,cAAc,oBAAI,IAAG;AAC3B,aAAW,UAAU;AACnB,gBAAY,IAAI,OAAO,WAAW,CAAC,GAAI,YAAY,IAAI,OAAO,SAAS,KAAK,CAAA,GAAK,MAAM,CAAC;AAG1F,aAAW,CAAC,WAAW,MAAM,KAAK,aAAa;AAC7C,YAAQ,IACN,MAAM,IAAI,OAAO,6BAA6B,QAAQ,aAAa,SAAS,wBAAwB,CAAC,EAAE,CAAC;AAE1G,eAAW,UAAU,QAAQ;AAC3B,UAAI,OAAO,WAAW;AACpB;AAEF,YAAM,OAAO,OAAO,aAAa,qBAAqB,QAAQ;AAC9D,cAAQ,IACN,MAAM,IACJ,wBAAwB,IAAI,OAAO,mBAAmB,OAAO,MAAM,CAAC,KAAK,iBAAiB,MAAM,CAAC,GAAG,CACrG;IAEL;EACF;AACF;AAEA,SAAS,iBAAiB,QAAuC;AAC/D,MAAI,OAAO,WAAW,aAAa,CAAC,OAAO;AACzC,WAAO;AAET,QAAM,SAAS,mBAAmB,mBAAmB,OAAO,KAAK,CAAC;AAClE,UAAQ,OAAO,aAAa;IAC1B,KAAK;AACH,aAAO,GAAG,MAAM;IAClB,KAAK;AACH,aAAO,GAAG,MAAM;IAClB;AACE,aAAO,OAAO,aAAa,qBACvB,GAAG,MAAM,uCACT,GAAG,MAAM;EACjB;AACF;AAEA,SAAS,mBAAmB,KAA0D;AACpF,SAAO,GAAG,IAAI,MAAM,OAAO,IAAI,SAAS,QAAQ,IAAI,MAAM;AAC5D;AAMA,SAAS,yBAAyB,QAAiC;AACjE,QAAM,QAAQ,CAAC,SAAyB,KAAK,IAAI,CAAC,QAAQ,IAAI,IAAI,EAAE,KAAK,IAAI,GACvE,QAAQ,CAAC,MAAc,GAAG,CAAC,oBAAoB,MAAM,IAAI,KAAK,GAAG;AAEvE,EAAI,OAAO,YAAY,SAAS,KAC9B,QAAQ,IACN,MAAM,MACJ,uBAAkB,MAAM,OAAO,YAAY,MAAM,CAAC,2BAA2B,MAAM,OAAO,WAAW,CAAC,EAAE,CACzG,GAGD,OAAO,QAAQ,SAAS,KAC1B,QAAQ,IACN,MAAM,OACJ,UAAK,MAAM,OAAO,QAAQ,MAAM,CAAC,4DAA4D,OAAO,QAAQ,WAAW,IAAI,UAAU,MAAM,uBAAuB,MAAM,OAAO,OAAO,CAAC,EAAE,CAC1L;AAGL,aAAW,SAAS,OAAO;AACzB,YAAQ,IAAI,MAAM,OAAO,UAAK,KAAK,EAAE,CAAC;AAE1C;AAKA,eAAe,yBACb,OACA,UAA6B;AAE7B,QAAM,gBAAgB,qBAClB,UAAU,uBAAuB;IAC/B,6BAA6B;IAC7B,4BAA4B,MAAM,SAAS,QAAQ,IAC/C,WACA,MAAM,SAAS,SAAS,IACxB,YACA;GACL,IACD;AAEJ,MAAI;AACF,YAAQ,IAAI,MAAM,IAAI,GAAG,KAAK,KAAK,CAAC,GACpC,MAAM,SAAQ,GACd,QAAQ,IAAI,MAAM,MAAM,UAAK,KAAK,EAAE,CAAC,GAEjC,iBACF,cAAc,aAAa,8BAA8B,SAAS;EAEtE,SAAS,OAAO;AACd,UAAI,kBACF,cAAc,gBAAgB,KAAc,GAC5C,cAAc,UAAU;MACtB,MAAM;;MACN,SAAS,gBAAgB,KAAK;KAC/B,GACD,cAAc,aAAa,8BAA8B,OAAO,IAElE,QAAQ,MAAM,MAAM,IAAI,UAAU,KAAK,YAAY,gBAAgB,KAAK,CAAC,EAAE,CAAC,GACtE;EACR;AACE,YAAQ,aAAa;EACvB;AACF;",
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 } from \"../utils/project-paths.js\";\nimport { getCliVersion, getCliBundledSpecVersion } from \"../utils/spec-version.js\";\nimport { scanUpgrades, UpgradeScanError, type UpgradeAction, type UpgradeScan } from \"../core/upgrade-plan.js\";\nimport {\n upgradeModel,\n type ChangesetRebaselineResult,\n type ChangesetRef,\n} from \"../core/model-upgrade.js\";\nimport {\n summarizeRelationshipChanges,\n type RelationshipRewriteChange,\n type StagedRelationshipRewriteChange,\n} from \"../core/relationship-migration.js\";\nimport { installSpecReference } from \"../utils/spec-installer.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\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\n // ============================================================================\n // STEPS 1-2: Check the spec reference (.dr/ folder) and the model\n // ============================================================================\n\n let scan: UpgradeScan;\n try {\n scan = await scanUpgrades(projectRoot, { force: options.force });\n } catch (error) {\n // The spec reference or model manifest exists but is corrupted or unreadable\n if (error instanceof UpgradeScanError) {\n console.error(ansis.red(`Error: ${error.message}`));\n }\n throw error;\n }\n const actions: UpgradeAction[] = [...scan.actions];\n const currentSpecVersion = scan.installedSpecVersion;\n\n if (scan.model.state !== \"found\") {\n if (scan.model.state === \"missing\") {\n console.log(ansis.yellow(\"\u26A0 No model found\"));\n console.log(ansis.dim(' Run \"dr init\" to create a model\\n'));\n } else {\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\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 \u2014 report generation not applicable\n return;\n }\n\n const modelSpecVersion = scan.model.specVersion;\n\n if (scan.noMigrationPath) {\n const { from, to, available } = scan.noMigrationPath;\n const error = new Error(`No migration path found from model v${from} to v${to}`);\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(ansis.yellow(`\u26A0 No migration path found from model v${from} to v${to}`));\n console.log(ansis.dim(\"\\nAvailable migrations:\"));\n for (const migration of available) {\n console.log(ansis.dim(` \u2022 ${migration.from} \u2192 ${migration.to}: ${migration.description}`));\n }\n console.log();\n throw error;\n }\n\n if (scan.catalogCheckError !== undefined) {\n console.log(ansis.yellow(`\u26A0 Could not check the model against the catalog: ${scan.catalogCheckError}`));\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(projectRoot, 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 projectRoot: string,\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 result = await upgradeModel(projectRoot, {\n fromVersion: action.fromVersion!,\n toVersion: action.toVersion,\n versionBumpOnly: true,\n });\n console.log(ansis.green(`\u2713 Model spec version updated to v${action.toVersion}`));\n printChangesetRebaseline(result.changesets);\n\n if (operationSpan) {\n operationSpan.setAttribute(\"upgrade.model.result\", \"version_bumped\");\n operationSpan.setAttribute(\n \"upgrade.model.changesets_rebaselined\",\n result.changesets.rebaselined.length\n );\n }\n return;\n }\n\n console.log(\n ansis.dim(\n action.catalogOnly\n ? `Applying catalog changes to the model (v${action.toVersion})...`\n : `Migrating model from v${action.fromVersion} to v${action.toVersion}...`\n )\n );\n\n // Apply migrations, save the model and re-baseline staged changesets on it\n const result = await upgradeModel(projectRoot, {\n fromVersion: action.fromVersion!,\n toVersion: action.toVersion,\n validate: !options.force,\n catalogOnly: action.catalogOnly,\n });\n const applied = result.migration?.applied ?? [];\n\n // Display migration results\n for (const migration of applied) {\n console.log(ansis.green(` \u2713 ${migration.from} \u2192 ${migration.to}: ${migration.description}`));\n if (migration.changes?.filesModified) {\n console.log(ansis.dim(` Files modified: ${migration.changes.filesModified}`));\n }\n printElementTypeChanges(migration.changes?.details?.elementTypeChanges);\n printRelationshipChanges(migration.changes?.details?.relationshipChanges);\n printStagedRelationshipChanges(migration.changes?.details?.stagedRelationshipChanges);\n }\n\n console.log(\n ansis.green(\n action.catalogOnly\n ? `\u2713 Model in line with the v${action.toVersion} catalog`\n : `\u2713 Model migrated to v${action.toVersion}`\n )\n );\n printChangesetRebaseline(result.changesets);\n\n if (operationSpan) {\n operationSpan.setAttribute(\"upgrade.model.result\", \"migrated\");\n operationSpan.setAttribute(\"upgrade.model.migrations_applied\", applied.length);\n operationSpan.setAttribute(\n \"upgrade.model.changesets_rebaselined\",\n result.changesets.rebaselined.length\n );\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 * Report elements whose type a catalog migration renamed\n */\nfunction printElementTypeChanges(changes: unknown): void {\n if (!Array.isArray(changes) || changes.length === 0) {\n return;\n }\n const byType = new Map<string, number>();\n for (const c of changes as Array<{ fromType: string; toType: string }>) {\n const key = `${c.fromType} \u2192 ${c.toType}`;\n byType.set(key, (byType.get(key) ?? 0) + 1);\n }\n for (const [key, n] of byType) {\n console.log(ansis.dim(` Renamed ${n} element(s): ${key}`));\n }\n}\n\n/**\n * Report relationships a catalog migration rewrote, listing each one it dropped\n */\nfunction printRelationshipChanges(changes: unknown): void {\n if (!Array.isArray(changes) || changes.length === 0) {\n return;\n }\n const relationshipChanges = changes as RelationshipRewriteChange[];\n\n console.log(ansis.dim(` ${summarizeRelationshipChanges(relationshipChanges)}`));\n for (const change of relationshipChanges) {\n if (change.action === \"dropped-duplicate\" && change.after) {\n console.log(\n ansis.dim(\n ` dropped ${formatRelationship(change.before)} (now the same as ${formatRelationship(change.after)})`\n )\n );\n } else if (change.action === \"dropped\") {\n console.log(\n ansis.dim(` dropped ${formatRelationship(change.before)} (no replacement in the catalog)`)\n );\n }\n }\n}\n\n/**\n * Report staged changeset changes a catalog migration rewrote, per changeset, listing each one\n * it removed from its changeset\n */\nfunction printStagedRelationshipChanges(changes: unknown): void {\n if (!Array.isArray(changes) || changes.length === 0) {\n return;\n }\n const byChangeset = new Map<string, StagedRelationshipRewriteChange[]>();\n for (const change of changes as StagedRelationshipRewriteChange[]) {\n byChangeset.set(change.changeset, [...(byChangeset.get(change.changeset) ?? []), change]);\n }\n\n for (const [changeset, staged] of byChangeset) {\n console.log(\n ansis.dim(` ${summarizeRelationshipChanges(staged, `changeset ${changeset}, staged relationships`)}`)\n );\n for (const change of staged) {\n if (change.action === \"rewritten\") {\n continue;\n }\n const kind = change.stagedAs === \"relationship-add\" ? \"add\" : \"delete\";\n console.log(\n ansis.dim(\n ` dropped staged ${kind} of ${formatRelationship(change.before)} (${stagedDropReason(change)})`\n )\n );\n }\n }\n}\n\nfunction stagedDropReason(change: StagedRelationshipRewriteChange): string {\n if (change.action === \"dropped\" || !change.after) {\n return \"no replacement in the catalog\";\n }\n const sameAs = `now the same as ${formatRelationship(change.after)}`;\n switch (change.duplicateOf) {\n case \"model\":\n return `${sameAs}, already in the model`;\n case \"kept\":\n return `${sameAs}, which also stands for a relationship the changeset keeps`;\n default:\n return change.stagedAs === \"relationship-add\"\n ? `${sameAs}, which the changeset already adds`\n : `${sameAs}, which the changeset already deletes`;\n }\n}\n\nfunction formatRelationship(rel: { source: string; predicate: string; target: string }): string {\n return `${rel.source} --[${rel.predicate}]--> ${rel.target}`;\n}\n\n/**\n * Report the staged changesets re-baselined on the upgraded model, and those left on their old\n * base snapshot because they had drifted before the upgrade\n */\nfunction printChangesetRebaseline(result: ChangesetRebaselineResult): void {\n const names = (refs: ChangesetRef[]) => refs.map((ref) => ref.name).join(\", \");\n const count = (n: number) => `${n} staged changeset${n === 1 ? \"\" : \"s\"}`;\n\n if (result.rebaselined.length > 0) {\n console.log(\n ansis.green(\n `\u2713 Re-baselined ${count(result.rebaselined.length)} on the upgraded model: ${names(result.rebaselined)}`\n )\n );\n }\n if (result.drifted.length > 0) {\n console.log(\n ansis.yellow(\n `\u26A0 ${count(result.drifted.length)} had drifted from the model before the upgrade and still ${result.drifted.length === 1 ? \"needs\" : \"need\"} --force to commit: ${names(result.drifted)}`\n )\n );\n }\n for (const error of result.errors) {\n console.log(ansis.yellow(`\u26A0 ${error}`));\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
+ "mappings": "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",
6
6
  "names": ["integrationActions", "integrationUpToDate", "result"]
7
7
  }
@@ -9,6 +9,7 @@ import { getErrorMessage } from "../utils/errors.js";
9
9
  import { RELATIONSHIPS_BY_SOURCE, RELATIONSHIPS_BY_DESTINATION } from "../generated/relationship-index.js";
10
10
  import { getActiveSpan } from "../telemetry/index.js";
11
11
  import { StagedChangesetStorage } from "../core/staged-changeset-storage.js";
12
+ import { CANONICAL_LAYER_NAMES } from "../core/layers.js";
12
13
  async function findJsonFiles(dir, baseDir = dir) {
13
14
  const entries = await fs.readdir(dir, { withFileTypes: !0 }), files = [];
14
15
  for (const entry of entries) {
@@ -139,12 +140,25 @@ function parseModelPaths(modelPathArray) {
139
140
  }
140
141
  return result;
141
142
  }
143
+ function parseLayersOption(layers) {
144
+ if (!layers)
145
+ return;
146
+ const names = layers.flatMap((value) => value.split(",")).map((name) => name.trim()).filter(Boolean), known = new Set(CANONICAL_LAYER_NAMES), unknown = names.filter((name) => !known.has(name));
147
+ if (unknown.length > 0)
148
+ throw new Error(`Unknown layer${unknown.length > 1 ? "s" : ""}: ${unknown.map((n) => `'${n}'`).join(", ")}. Layers are: ${CANONICAL_LAYER_NAMES.join(", ")}.`);
149
+ return names;
150
+ }
151
+ function keepRequestedLayers(model, layers) {
152
+ if (!(!layers || layers.length === 0))
153
+ for (const name of [...model.layers.keys()])
154
+ layers.includes(name) || model.layers.delete(name);
155
+ }
142
156
  async function validateCommand(options) {
143
157
  options.modelPath && (options.modelPaths = parseModelPaths(options.modelPath));
144
158
  const activeSpan = getActiveSpan();
145
159
  activeSpan && (activeSpan.setAttribute("validate.layers", options.layers?.join(",") || "all"), activeSpan.setAttribute("validate.strict", options.strict || !1), activeSpan.setAttribute("validate.verbose", options.verbose || !1), activeSpan.setAttribute("validate.orphans", options.orphans || !1), activeSpan.setAttribute("validate.schemas", options.schemas || options.schema || !1), activeSpan.setAttribute("validate.output", options.output || "console"), activeSpan.setAttribute("validate.scope", options.scope || "local"));
146
160
  try {
147
- if (options.schemas || options.schema) {
161
+ if (options.layers = parseLayersOption(options.layers), options.schemas || options.schema) {
148
162
  await validateSchemaSynchronization(), activeSpan && (activeSpan.setAttribute("validate.mode", "schema-sync"), activeSpan.setAttribute("validate.result", "success"));
149
163
  return;
150
164
  }
@@ -152,11 +166,11 @@ async function validateCommand(options) {
152
166
  if (options.orphans) {
153
167
  activeSpan && activeSpan.setAttribute("validate.mode", "orphans-only");
154
168
  const activeChangesetId2 = model.getActiveChangesetId(), modelForOrphans = activeChangesetId2 ? await model.getVirtualProjectionEngine().projectModel(model, activeChangesetId2) : model;
155
- activeChangesetId2 && await reportStagedChangesIncluded(model.rootPath, activeChangesetId2, options.layers && options.layers.length > 0 ? options.layers : modelForOrphans.layers.keys()), await validateOrphansOnly(modelForOrphans, options.output), activeSpan && activeSpan.setAttribute("validate.result", "success");
169
+ keepRequestedLayers(modelForOrphans, options.layers), activeChangesetId2 && await reportStagedChangesIncluded(model.rootPath, activeChangesetId2, options.layers && options.layers.length > 0 ? options.layers : modelForOrphans.layers.keys()), await validateOrphansOnly(modelForOrphans, options.output), activeSpan && activeSpan.setAttribute("validate.result", "success");
156
170
  return;
157
171
  }
158
172
  const scope = options.scope || "local", activeChangesetId = model.getActiveChangesetId(), modelToValidate = activeChangesetId ? await model.getVirtualProjectionEngine().projectModel(model, activeChangesetId) : model;
159
- activeChangesetId && await reportStagedChangesIncluded(model.rootPath, activeChangesetId, options.layers && options.layers.length > 0 ? options.layers : modelToValidate.layers.keys());
173
+ keepRequestedLayers(modelToValidate, options.layers), activeChangesetId && await reportStagedChangesIncluded(model.rootPath, activeChangesetId, options.layers && options.layers.length > 0 ? options.layers : modelToValidate.layers.keys());
160
174
  let result;
161
175
  if (scope === "composed") {
162
176
  const { ComposedReferenceValidator } = await import("../validators/composed-reference-validator.js");
@@ -223,6 +237,8 @@ Debug mode enabled. Additional context:`)), error instanceof Error && (console.e
223
237
  }
224
238
  }
225
239
  export {
240
+ keepRequestedLayers,
241
+ parseLayersOption,
226
242
  validateCommand
227
243
  };
228
244
  //# sourceMappingURL=validate.js.map