@topogram/cli 0.3.63 → 0.3.65

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 (344) hide show
  1. package/package.json +1 -1
  2. package/src/adoption/plan/index.js +703 -0
  3. package/src/adoption/plan.d.ts +6 -0
  4. package/src/adoption/plan.js +12 -703
  5. package/src/adoption/reporting.d.ts +10 -0
  6. package/src/adoption/review-groups.d.ts +6 -0
  7. package/src/agent-brief.d.ts +3 -0
  8. package/src/agent-brief.js +495 -0
  9. package/src/agent-ops/query-builders/auth.js +375 -0
  10. package/src/agent-ops/query-builders/change-risk/change-plan.js +123 -0
  11. package/src/agent-ops/query-builders/change-risk/import-plan.js +49 -0
  12. package/src/agent-ops/query-builders/change-risk/maintained.js +286 -0
  13. package/src/agent-ops/query-builders/change-risk/review-packets.js +123 -0
  14. package/src/agent-ops/query-builders/change-risk/risk.js +189 -0
  15. package/src/agent-ops/query-builders/change-risk.js +25 -0
  16. package/src/agent-ops/query-builders/common.js +149 -0
  17. package/src/agent-ops/query-builders/maintained-risk.js +539 -0
  18. package/src/agent-ops/query-builders/maintained-shared.js +120 -0
  19. package/src/agent-ops/query-builders/multi-agent.js +547 -0
  20. package/src/agent-ops/query-builders/projection-impacts.js +514 -0
  21. package/src/agent-ops/query-builders/work-packets.js +417 -0
  22. package/src/agent-ops/query-builders/workflow-context-shared.js +300 -0
  23. package/src/agent-ops/query-builders/workflow-context.js +398 -0
  24. package/src/agent-ops/query-builders/workflow-presets-core.js +676 -0
  25. package/src/agent-ops/query-builders/workflow-presets.js +341 -0
  26. package/src/agent-ops/query-builders.d.ts +26 -0
  27. package/src/agent-ops/query-builders.js +42 -5021
  28. package/src/archive/archive.d.ts +2 -0
  29. package/src/archive/compact.d.ts +1 -0
  30. package/src/archive/unarchive.d.ts +1 -0
  31. package/src/catalog/constants.js +10 -0
  32. package/src/catalog/copy.js +60 -0
  33. package/src/catalog/diagnostics.js +15 -0
  34. package/src/catalog/entries.js +42 -0
  35. package/src/catalog/files.js +67 -0
  36. package/src/catalog/provenance.js +122 -0
  37. package/src/catalog/source.js +150 -0
  38. package/src/catalog/validation.js +252 -0
  39. package/src/catalog.d.ts +12 -0
  40. package/src/catalog.js +18 -750
  41. package/src/cli/catalog-alias.d.ts +1 -0
  42. package/src/cli/command-parser.js +38 -0
  43. package/src/cli/command-parsers/core.js +102 -0
  44. package/src/cli/command-parsers/generator.js +39 -0
  45. package/src/cli/command-parsers/import.js +44 -0
  46. package/src/cli/command-parsers/legacy-workflow.js +21 -0
  47. package/src/cli/command-parsers/project.js +47 -0
  48. package/src/cli/command-parsers/sdlc.js +47 -0
  49. package/src/cli/command-parsers/shared.js +51 -0
  50. package/src/cli/command-parsers/template.js +48 -0
  51. package/src/cli/commands/agent.js +47 -0
  52. package/src/cli/commands/catalog/check.js +31 -0
  53. package/src/cli/commands/catalog/copy.js +59 -0
  54. package/src/cli/commands/catalog/doctor.js +248 -0
  55. package/src/cli/commands/catalog/help.js +21 -0
  56. package/src/cli/commands/catalog/list.js +52 -0
  57. package/src/cli/commands/catalog/runner.js +92 -0
  58. package/src/cli/commands/catalog/shared.js +17 -0
  59. package/src/cli/commands/catalog/show.js +134 -0
  60. package/src/cli/commands/catalog.js +32 -0
  61. package/src/cli/commands/check.js +268 -0
  62. package/src/cli/commands/doctor.js +268 -0
  63. package/src/cli/commands/emit.js +149 -0
  64. package/src/cli/commands/generate.js +96 -0
  65. package/src/cli/commands/generator-policy/package-info.js +162 -0
  66. package/src/cli/commands/generator-policy/payloads.js +372 -0
  67. package/src/cli/commands/generator-policy/printers.js +159 -0
  68. package/src/cli/commands/generator-policy/runner.js +81 -0
  69. package/src/cli/commands/generator-policy/shared.js +39 -0
  70. package/src/cli/commands/generator-policy.js +17 -0
  71. package/src/cli/commands/generator.js +443 -0
  72. package/src/cli/commands/import/adopt.js +170 -0
  73. package/src/cli/commands/import/check.js +91 -0
  74. package/src/cli/commands/import/diff.js +84 -0
  75. package/src/cli/commands/import/help.js +47 -0
  76. package/src/cli/commands/import/paths.js +277 -0
  77. package/src/cli/commands/import/plan.js +284 -0
  78. package/src/cli/commands/import/refresh.js +470 -0
  79. package/src/cli/commands/import/status-history.js +196 -0
  80. package/src/cli/commands/import/workspace.js +230 -0
  81. package/src/cli/commands/import-runner.js +157 -0
  82. package/src/cli/commands/import.js +35 -0
  83. package/src/cli/commands/inspect.js +55 -0
  84. package/src/cli/commands/new.js +94 -0
  85. package/src/cli/commands/package/constants.js +17 -0
  86. package/src/cli/commands/package/doctor.js +240 -0
  87. package/src/cli/commands/package/help.js +27 -0
  88. package/src/cli/commands/package/lockfile.js +135 -0
  89. package/src/cli/commands/package/npm.js +97 -0
  90. package/src/cli/commands/package/reporting.js +35 -0
  91. package/src/cli/commands/package/runner.js +33 -0
  92. package/src/cli/commands/package/shared.js +9 -0
  93. package/src/cli/commands/package/update-cli.js +252 -0
  94. package/src/cli/commands/package/versions.js +35 -0
  95. package/src/cli/commands/package.js +31 -0
  96. package/src/cli/commands/query/change-plan.js +68 -0
  97. package/src/cli/commands/query/definitions.js +202 -0
  98. package/src/cli/commands/query/import-adopt.js +121 -0
  99. package/src/cli/commands/query/runner/artifacts.js +102 -0
  100. package/src/cli/commands/query/runner/boundaries.js +211 -0
  101. package/src/cli/commands/query/runner/change.js +182 -0
  102. package/src/cli/commands/query/runner/import-adopt.js +111 -0
  103. package/src/cli/commands/query/runner/index.js +31 -0
  104. package/src/cli/commands/query/runner/output.js +12 -0
  105. package/src/cli/commands/query/runner/workflow.js +241 -0
  106. package/src/cli/commands/query/runner.js +3 -0
  107. package/src/cli/commands/query/workflow-context.js +5 -0
  108. package/src/cli/commands/query/workspace.js +274 -0
  109. package/src/cli/commands/query.js +11 -0
  110. package/src/cli/commands/release-rollout.js +257 -0
  111. package/src/cli/commands/release-shared.js +528 -0
  112. package/src/cli/commands/release-status.js +429 -0
  113. package/src/cli/commands/release.js +107 -0
  114. package/src/cli/commands/sdlc.js +168 -0
  115. package/src/cli/commands/setup.js +76 -0
  116. package/src/cli/commands/source.js +291 -0
  117. package/src/cli/commands/template/baseline.js +100 -0
  118. package/src/cli/commands/template/check.js +466 -0
  119. package/src/cli/commands/template/constants.js +8 -0
  120. package/src/cli/commands/template/diagnostics.js +26 -0
  121. package/src/cli/commands/template/help.js +28 -0
  122. package/src/cli/commands/template/lifecycle.js +404 -0
  123. package/src/cli/commands/template/list-show.js +287 -0
  124. package/src/cli/commands/template/policy.js +422 -0
  125. package/src/cli/commands/template/shared.js +127 -0
  126. package/src/cli/commands/template/updates.js +352 -0
  127. package/src/cli/commands/template-runner.js +198 -0
  128. package/src/cli/commands/template.js +43 -0
  129. package/src/cli/commands/trust.js +219 -0
  130. package/src/cli/commands/version.js +40 -0
  131. package/src/cli/commands/widget.js +168 -0
  132. package/src/cli/commands/workflow.js +63 -0
  133. package/src/cli/dispatcher.js +392 -0
  134. package/src/cli/help-dispatch.js +188 -0
  135. package/src/cli/help.js +296 -0
  136. package/src/cli/migration-guidance.js +59 -0
  137. package/src/cli/options.js +96 -0
  138. package/src/cli/output-safety.js +107 -0
  139. package/src/cli/path-normalization.js +29 -0
  140. package/src/cli.js +47 -11711
  141. package/src/example-implementation.d.ts +2 -0
  142. package/src/format.d.ts +1 -0
  143. package/src/generator/api/contracts.js +497 -0
  144. package/src/generator/api/metadata.js +221 -0
  145. package/src/generator/api/openapi.js +559 -0
  146. package/src/generator/api/schema.js +124 -0
  147. package/src/generator/api/types.d.ts +98 -0
  148. package/src/generator/api.js +3 -1195
  149. package/src/generator/check.d.ts +1 -0
  150. package/src/generator/context/bundle.d.ts +1 -0
  151. package/src/generator/context/shared/domain-sdlc.js +282 -0
  152. package/src/generator/context/shared/maintained-boundary.js +665 -0
  153. package/src/generator/context/shared/metrics.js +85 -0
  154. package/src/generator/context/shared/primitives.js +64 -0
  155. package/src/generator/context/shared/relationships.js +453 -0
  156. package/src/generator/context/shared/summaries.js +263 -0
  157. package/src/generator/context/shared/types.d.ts +207 -0
  158. package/src/generator/context/shared.d.ts +44 -0
  159. package/src/generator/context/shared.js +80 -1390
  160. package/src/generator/context/slice/core.js +397 -0
  161. package/src/generator/context/slice/sdlc.js +417 -0
  162. package/src/generator/context/slice/ui-packets.js +183 -0
  163. package/src/generator/context/slice.js +2 -859
  164. package/src/generator/native/parity-bundle.js +2 -1
  165. package/src/generator/registry/index.js +507 -0
  166. package/src/generator/registry.js +18 -504
  167. package/src/generator/runtime/environment/index.js +666 -0
  168. package/src/generator/runtime/environment.js +4 -666
  169. package/src/generator/runtime/runtime-check/index.js +554 -0
  170. package/src/generator/runtime/runtime-check.js +4 -554
  171. package/src/generator/runtime/shared/index.js +572 -0
  172. package/src/generator/runtime/shared.js +19 -570
  173. package/src/generator/shared.d.ts +2 -0
  174. package/src/generator/surfaces/shared.d.ts +3 -0
  175. package/src/generator/surfaces/web/html-escape.js +22 -0
  176. package/src/generator/surfaces/web/react.js +10 -8
  177. package/src/generator/surfaces/web/sveltekit.js +7 -5
  178. package/src/generator/surfaces/web/vanilla.js +8 -4
  179. package/src/generator/widget-conformance/behavior-report.js +258 -0
  180. package/src/generator/widget-conformance/checks.js +371 -0
  181. package/src/generator/widget-conformance/projection-context.js +200 -0
  182. package/src/generator/widget-conformance/report.js +166 -0
  183. package/src/generator/widget-conformance/types.d.ts +121 -0
  184. package/src/generator/widget-conformance.js +3 -824
  185. package/src/generator.d.ts +2 -0
  186. package/src/github-client.js +520 -0
  187. package/src/import/core/context.d.ts +3 -0
  188. package/src/import/core/contracts.d.ts +1 -0
  189. package/src/import/core/registry.d.ts +4 -0
  190. package/src/import/core/runner/candidates.js +217 -0
  191. package/src/import/core/runner/options.js +22 -0
  192. package/src/import/core/runner/reports.js +50 -0
  193. package/src/import/core/runner/run.js +79 -0
  194. package/src/import/core/runner/tracks.js +150 -0
  195. package/src/import/core/runner/ui-drafts.js +337 -0
  196. package/src/import/core/runner.js +3 -698
  197. package/src/import/core/shared/api-routes.js +221 -0
  198. package/src/import/core/shared/candidates.js +97 -0
  199. package/src/import/core/shared/files.js +177 -0
  200. package/src/import/core/shared/next-app.js +389 -0
  201. package/src/import/core/shared/types.d.ts +51 -0
  202. package/src/import/core/shared/ui-routes.js +230 -0
  203. package/src/import/core/shared.js +67 -910
  204. package/src/import/extractors/api/flutter-dio.js +4 -8
  205. package/src/import/extractors/api/react-native-repository.js +4 -8
  206. package/src/import/index.d.ts +4 -0
  207. package/src/import/provenance.d.ts +4 -0
  208. package/src/new-project/constants.js +128 -0
  209. package/src/new-project/create.js +83 -0
  210. package/src/new-project/json.js +28 -0
  211. package/src/new-project/metadata.js +96 -0
  212. package/src/new-project/package-spec.js +161 -0
  213. package/src/new-project/project-files.js +348 -0
  214. package/src/new-project/template-policy.js +269 -0
  215. package/src/new-project/template-resolution.js +368 -0
  216. package/src/new-project/template-snapshots.js +430 -0
  217. package/src/new-project/template-updates.js +512 -0
  218. package/src/new-project/types.d.ts +83 -0
  219. package/src/new-project.js +6 -2188
  220. package/src/npm-safety.js +79 -0
  221. package/src/parser.d.ts +87 -0
  222. package/src/parser.js +118 -0
  223. package/src/path-helpers.d.ts +1 -0
  224. package/src/path-helpers.js +20 -0
  225. package/src/policy/review-boundaries.d.ts +15 -0
  226. package/src/project-config/index.js +564 -0
  227. package/src/project-config.js +19 -560
  228. package/src/reconcile/docs.d.ts +8 -0
  229. package/src/reconcile/journeys.d.ts +1 -0
  230. package/src/resolver/enrich/acceptance-criterion.js +2 -0
  231. package/src/resolver/enrich/bug.js +2 -0
  232. package/src/resolver/enrich/pitch.js +2 -0
  233. package/src/resolver/enrich/requirement.js +2 -0
  234. package/src/resolver/enrich/task.js +2 -0
  235. package/src/resolver/index.js +19 -2089
  236. package/src/resolver/normalize.js +384 -1
  237. package/src/resolver/plans.js +168 -0
  238. package/src/resolver/projections-api.js +494 -0
  239. package/src/resolver/projections-db.js +133 -0
  240. package/src/resolver/projections-ui.js +317 -0
  241. package/src/resolver/shapes.js +251 -0
  242. package/src/resolver/shared.js +278 -0
  243. package/src/resolver/widgets.js +132 -0
  244. package/src/resolver.d.ts +1 -0
  245. package/src/runtime-support.js +29 -0
  246. package/src/sdlc/adopt.d.ts +1 -0
  247. package/src/sdlc/check.d.ts +1 -0
  248. package/src/sdlc/explain.d.ts +1 -0
  249. package/src/sdlc/release.d.ts +1 -0
  250. package/src/sdlc/scaffold.d.ts +1 -0
  251. package/src/sdlc/transition.d.ts +1 -0
  252. package/src/template-trust/constants.js +62 -0
  253. package/src/template-trust/content.js +258 -0
  254. package/src/template-trust/diff.js +92 -0
  255. package/src/template-trust/policy.js +61 -0
  256. package/src/template-trust/record.js +90 -0
  257. package/src/template-trust/status.js +182 -0
  258. package/src/template-trust.js +24 -687
  259. package/src/text-helpers.d.ts +7 -0
  260. package/src/text-helpers.js +245 -0
  261. package/src/topogram-config.js +306 -0
  262. package/src/topogram-types.d.ts +69 -0
  263. package/src/validator/common.js +488 -0
  264. package/src/validator/data-model.js +237 -0
  265. package/src/validator/docs.js +167 -0
  266. package/src/validator/expressions.js +146 -1
  267. package/src/validator/index.d.ts +23 -0
  268. package/src/validator/index.js +32 -3585
  269. package/src/validator/kinds.d.ts +41 -0
  270. package/src/validator/kinds.js +2 -0
  271. package/src/validator/model-helpers.js +46 -0
  272. package/src/validator/per-kind/acceptance-criterion.js +5 -0
  273. package/src/validator/per-kind/bug.js +6 -0
  274. package/src/validator/per-kind/domain.js +15 -2
  275. package/src/validator/per-kind/pitch.js +7 -0
  276. package/src/validator/per-kind/requirement.js +5 -0
  277. package/src/validator/per-kind/task.js +7 -0
  278. package/src/validator/per-kind/widget.js +14 -0
  279. package/src/validator/projections/api-http-async.js +410 -0
  280. package/src/validator/projections/api-http-authz.js +88 -0
  281. package/src/validator/projections/api-http-core.js +205 -0
  282. package/src/validator/projections/api-http-policies.js +339 -0
  283. package/src/validator/projections/api-http-responses.js +233 -0
  284. package/src/validator/projections/api-http.js +44 -0
  285. package/src/validator/projections/db.js +353 -0
  286. package/src/validator/projections/generator-defaults.js +45 -0
  287. package/src/validator/projections/helpers.js +87 -0
  288. package/src/validator/projections/ui-helpers.js +214 -0
  289. package/src/validator/projections/ui-navigation.js +344 -0
  290. package/src/validator/projections/ui-structure.js +364 -0
  291. package/src/validator/projections/ui-widgets.js +493 -0
  292. package/src/validator/projections/ui.js +46 -0
  293. package/src/validator/registry.js +48 -1
  294. package/src/validator/utils.d.ts +20 -0
  295. package/src/validator/utils.js +115 -12
  296. package/src/validator.d.ts +2 -0
  297. package/src/widget-behavior.d.ts +1 -0
  298. package/src/workflows/adoption/index.js +26 -0
  299. package/src/workflows/docs-generate.js +262 -0
  300. package/src/workflows/docs-scan.js +703 -0
  301. package/src/workflows/docs.js +15 -0
  302. package/src/workflows/import-app/api/collect.js +221 -0
  303. package/src/workflows/import-app/api/openapi.js +257 -0
  304. package/src/workflows/import-app/api/routes.js +327 -0
  305. package/src/workflows/import-app/api/sources.js +22 -0
  306. package/src/workflows/import-app/api.js +4 -0
  307. package/src/workflows/import-app/db.js +538 -0
  308. package/src/workflows/import-app/index.js +30 -0
  309. package/src/workflows/import-app/shared.js +218 -0
  310. package/src/workflows/import-app/ui.js +443 -0
  311. package/src/workflows/import-app/workflow.js +159 -0
  312. package/src/workflows/reconcile/adoption-plan/build.js +208 -0
  313. package/src/workflows/reconcile/adoption-plan/dependencies.js +75 -0
  314. package/src/workflows/reconcile/adoption-plan/outputs.js +143 -0
  315. package/src/workflows/reconcile/adoption-plan/paths.js +58 -0
  316. package/src/workflows/reconcile/adoption-plan/projection-patches.js +177 -0
  317. package/src/workflows/reconcile/adoption-plan/reasons.js +107 -0
  318. package/src/workflows/reconcile/adoption-plan.js +32 -0
  319. package/src/workflows/reconcile/auth/closures.js +115 -0
  320. package/src/workflows/reconcile/auth/formatters.js +142 -0
  321. package/src/workflows/reconcile/auth/inference.js +330 -0
  322. package/src/workflows/reconcile/auth/roles.js +122 -0
  323. package/src/workflows/reconcile/auth.js +37 -0
  324. package/src/workflows/reconcile/bundle-core/index.js +600 -0
  325. package/src/workflows/reconcile/bundle-core.js +14 -0
  326. package/src/workflows/reconcile/bundle-shared.js +75 -0
  327. package/src/workflows/reconcile/candidate-model.js +477 -0
  328. package/src/workflows/reconcile/canonical-surface.js +264 -0
  329. package/src/workflows/reconcile/gap-report.js +333 -0
  330. package/src/workflows/reconcile/ids.js +6 -0
  331. package/src/workflows/reconcile/impacts/adoption-plan.js +192 -0
  332. package/src/workflows/reconcile/impacts/indexes.js +101 -0
  333. package/src/workflows/reconcile/impacts/patches.js +252 -0
  334. package/src/workflows/reconcile/impacts/reports.js +80 -0
  335. package/src/workflows/reconcile/impacts.js +16 -0
  336. package/src/workflows/reconcile/index.js +7 -0
  337. package/src/workflows/reconcile/renderers.js +461 -0
  338. package/src/workflows/reconcile/summary.js +90 -0
  339. package/src/workflows/reconcile/workflow.js +309 -0
  340. package/src/workflows/shared.js +189 -0
  341. package/src/workflows/types.d.ts +93 -0
  342. package/src/workflows.d.ts +1 -0
  343. package/src/workflows.js +10 -7652
  344. package/src/workspace-docs.d.ts +29 -0
@@ -0,0 +1,121 @@
1
+ // @ts-check
2
+
3
+ import fs from "node:fs";
4
+
5
+ import {
6
+ buildImportPlanPayload,
7
+ buildMultiAgentPlanPayload,
8
+ buildResolvedWorkflowContextPayload,
9
+ buildSingleAgentPlanPayload,
10
+ buildWorkflowPresetState
11
+ } from "../../../agent-ops/query-builders.js";
12
+ import { parsePath } from "../../../parser.js";
13
+ import {
14
+ adoptionPlanPath,
15
+ buildMaintainedBundle,
16
+ buildTaskMode,
17
+ normalizeTopogramPath,
18
+ readJson,
19
+ requireReconcileArtifacts,
20
+ resultOk,
21
+ workflowPresetSelectors
22
+ } from "./workspace.js";
23
+
24
+ /**
25
+ * @typedef {Record<string, any>} AnyRecord
26
+ */
27
+
28
+ /**
29
+ * @param {AnyRecord} context
30
+ * @param {string} queryFamily
31
+ * @returns {AnyRecord}
32
+ */
33
+ export function buildImportPlanForContext(context, queryFamily) {
34
+ const topogramRoot = normalizeTopogramPath(context.inputPath);
35
+ const planPath = adoptionPlanPath(topogramRoot);
36
+ if (!fs.existsSync(planPath)) {
37
+ throw new Error(`No agent adoption plan found at '${planPath}'`);
38
+ }
39
+ const adoptionPlan = readJson(planPath);
40
+ const ast = parsePath(context.inputPath);
41
+ const taskModeResult = buildTaskMode(ast, {}, "import-adopt");
42
+ if (!resultOk(taskModeResult)) {
43
+ return taskModeResult;
44
+ }
45
+ const maintainedBundleResult = buildMaintainedBundle(ast);
46
+ if (!resultOk(maintainedBundleResult)) {
47
+ return maintainedBundleResult;
48
+ }
49
+ const workflowPresets = buildWorkflowPresetState({
50
+ workspace: topogramRoot,
51
+ selectors: workflowPresetSelectors(taskModeResult.artifact, context.providerId, context.presetId, queryFamily)
52
+ });
53
+ return {
54
+ ok: true,
55
+ topogramRoot,
56
+ taskModeResult,
57
+ maintainedBundleResult,
58
+ adoptionPlan,
59
+ importPlan: buildImportPlanPayload(
60
+ adoptionPlan,
61
+ taskModeResult.artifact,
62
+ maintainedBundleResult.artifact.maintained_boundary || null,
63
+ workflowPresets
64
+ )
65
+ };
66
+ }
67
+
68
+ /**
69
+ * @param {AnyRecord} context
70
+ * @param {string} queryFamily
71
+ * @returns {AnyRecord}
72
+ */
73
+ export function buildImportAdoptAgentContext(context, queryFamily) {
74
+ const topogramRoot = normalizeTopogramPath(context.inputPath);
75
+ const artifacts = requireReconcileArtifacts(topogramRoot, queryFamily);
76
+ const ast = parsePath(context.inputPath);
77
+ const taskModeResult = buildTaskMode(ast, {}, "import-adopt");
78
+ if (!resultOk(taskModeResult)) {
79
+ return taskModeResult;
80
+ }
81
+ const adoptionPlanArtifact = readJson(artifacts.adoptionPlanPath);
82
+ const reconcileReport = readJson(artifacts.reportPath);
83
+ const adoptionStatus = readJson(artifacts.adoptionStatusPath);
84
+ const workflowPresets = buildWorkflowPresetState({
85
+ workspace: topogramRoot,
86
+ selectors: workflowPresetSelectors(taskModeResult.artifact, context.providerId, context.presetId, queryFamily)
87
+ });
88
+ const importPlan = buildImportPlanPayload(adoptionPlanArtifact, taskModeResult.artifact, null, workflowPresets);
89
+ const resolvedWorkflowContext = buildResolvedWorkflowContextPayload({
90
+ workspace: topogramRoot,
91
+ taskModeArtifact: taskModeResult.artifact,
92
+ importPlan,
93
+ selectors: workflowPresetSelectors(taskModeResult.artifact, context.providerId, context.presetId, queryFamily)
94
+ });
95
+ const singleAgentPlan = buildSingleAgentPlanPayload({
96
+ workspace: topogramRoot,
97
+ taskModeArtifact: taskModeResult.artifact,
98
+ importPlan,
99
+ resolvedWorkflowContext
100
+ });
101
+ const multiAgentPlan = buildMultiAgentPlanPayload({
102
+ workspace: topogramRoot,
103
+ singleAgentPlan,
104
+ importPlan,
105
+ report: reconcileReport,
106
+ adoptionStatus,
107
+ resolvedWorkflowContext
108
+ });
109
+ return {
110
+ ok: true,
111
+ topogramRoot,
112
+ taskModeResult,
113
+ adoptionPlanArtifact,
114
+ reconcileReport,
115
+ adoptionStatus,
116
+ importPlan,
117
+ resolvedWorkflowContext,
118
+ singleAgentPlan,
119
+ multiAgentPlan
120
+ };
121
+ }
@@ -0,0 +1,102 @@
1
+ // @ts-check
2
+
3
+ import fs from "node:fs";
4
+
5
+ import { generateWorkspace } from "../../../../generator.js";
6
+ import { parsePath } from "../../../../parser.js";
7
+ import {
8
+ adoptionPlanPath,
9
+ buildMaintainedBundle,
10
+ buildSlice,
11
+ normalizeTopogramPath,
12
+ printValidationFailure,
13
+ readJson,
14
+ resultOk,
15
+ selectorOptions
16
+ } from "../workspace.js";
17
+ import { printJson } from "./output.js";
18
+
19
+ /**
20
+ * @typedef {Record<string, any>} AnyRecord
21
+ */
22
+
23
+ /**
24
+ * @param {AnyRecord} context
25
+ * @returns {number|null}
26
+ */
27
+ export function runArtifactQuery(context) {
28
+ const queryName = context.commandArgs?.queryName;
29
+ const selectors = selectorOptions(context);
30
+ const selectedWidgetId = context["componentId"];
31
+
32
+ if (queryName === "task-mode") {
33
+ const result = generateWorkspace(parsePath(context.inputPath), {
34
+ target: "context-task-mode",
35
+ modeId: context.modeId,
36
+ ...selectors,
37
+ widgetId: selectedWidgetId,
38
+ fromTopogramPath: context.fromTopogramPath
39
+ });
40
+ if (!resultOk(result)) return printValidationFailure(result);
41
+ return printJson(result.artifact);
42
+ }
43
+
44
+ if (queryName === "diff") {
45
+ const result = generateWorkspace(parsePath(context.inputPath), {
46
+ target: "context-diff",
47
+ fromTopogramPath: context.fromTopogramPath
48
+ });
49
+ if (!resultOk(result)) return printValidationFailure(result);
50
+ return printJson(result.artifact);
51
+ }
52
+
53
+ if (queryName === "slice") {
54
+ const result = buildSlice(parsePath(context.inputPath), selectors);
55
+ if (!resultOk(result)) return printValidationFailure(result);
56
+ return printJson(result.artifact);
57
+ }
58
+
59
+ if (queryName === "adoption-plan") {
60
+ const topogramRoot = normalizeTopogramPath(context.inputPath);
61
+ const planPath = adoptionPlanPath(topogramRoot);
62
+ if (!fs.existsSync(planPath)) {
63
+ throw new Error(`No agent adoption plan found at '${planPath}'`);
64
+ }
65
+ return printJson(readJson(planPath));
66
+ }
67
+
68
+ if (queryName === "maintained-boundary") {
69
+ const result = buildMaintainedBundle(parsePath(context.inputPath));
70
+ if (!resultOk(result)) return printValidationFailure(result);
71
+ return printJson(result.artifact.maintained_boundary);
72
+ }
73
+
74
+ if (queryName === "domain-list") {
75
+ const result = generateWorkspace(parsePath(context.inputPath), { target: "domain-list" });
76
+ if (!resultOk(result)) return printValidationFailure(result);
77
+ return printJson(result.artifact);
78
+ }
79
+
80
+ if (queryName === "domain-coverage") {
81
+ if (!context.domainId) {
82
+ console.error("query domain-coverage requires --domain <id>");
83
+ return 2;
84
+ }
85
+ const result = generateWorkspace(parsePath(context.inputPath), { target: "domain-coverage", domainId: context.domainId });
86
+ if (!resultOk(result)) return printValidationFailure(result);
87
+ return printJson(result.artifact);
88
+ }
89
+
90
+ if (queryName === "widget-behavior") {
91
+ const result = generateWorkspace(parsePath(normalizeTopogramPath(context.inputPath)), {
92
+ target: "widget-behavior-report",
93
+ projectionId: context.projectionId,
94
+ componentId: selectedWidgetId
95
+ });
96
+ if (!resultOk(result)) return printValidationFailure(result);
97
+ printJson(result.artifact);
98
+ return (result.artifact.summary?.errors || 0) === 0 ? 0 : 1;
99
+ }
100
+
101
+ return null;
102
+ }
@@ -0,0 +1,211 @@
1
+ // @ts-check
2
+
3
+ import { recommendedVerificationTargets } from "../../../../generator/context/shared.js";
4
+ import { parsePath } from "../../../../parser.js";
5
+ import { resolveWorkspace } from "../../../../resolver.js";
6
+ import {
7
+ buildMaintainedConformancePayload,
8
+ buildMaintainedDriftPayload,
9
+ buildSeamCheckPayload
10
+ } from "../../../../agent-ops/query-builders.js";
11
+ import {
12
+ artifactOrNull,
13
+ buildDiff,
14
+ buildMaintainedBundle,
15
+ buildSlice,
16
+ buildTaskMode,
17
+ hasSelectors,
18
+ printValidationFailure,
19
+ resultOk,
20
+ selectorOptions
21
+ } from "../workspace.js";
22
+ import { printJson } from "./output.js";
23
+
24
+ /**
25
+ * @typedef {Record<string, any>} AnyRecord
26
+ */
27
+
28
+ /**
29
+ * @param {AnyRecord} context
30
+ * @returns {number|null}
31
+ */
32
+ export function runBoundaryQuery(context) {
33
+ const queryName = context.commandArgs?.queryName;
34
+ const selectors = selectorOptions(context);
35
+
36
+ if (queryName === "maintained-drift") {
37
+ if (!context.fromTopogramPath) {
38
+ throw new Error("query maintained-drift requires --from-topogram <path>.");
39
+ }
40
+ const ast = parsePath(context.inputPath);
41
+ const diffResult = buildDiff(ast, context.fromTopogramPath);
42
+ if (diffResult && !resultOk(diffResult)) return printValidationFailure(diffResult);
43
+ const maintainedBundleResult = buildMaintainedBundle(ast);
44
+ if (!resultOk(maintainedBundleResult)) return printValidationFailure(maintainedBundleResult);
45
+ const taskModeResult = buildTaskMode(ast, {}, "diff-review", context.fromTopogramPath);
46
+ if (!resultOk(taskModeResult)) return printValidationFailure(taskModeResult);
47
+ return printJson(buildMaintainedDriftPayload({
48
+ diffArtifact: diffResult?.artifact || null,
49
+ maintainedBoundaryArtifact: maintainedBundleResult.artifact.maintained_boundary || null,
50
+ verificationTargets: maintainedBundleResult.artifact.verification_targets || taskModeResult.artifact.verification_targets || null,
51
+ nextAction: taskModeResult.artifact.next_action || null
52
+ }));
53
+ }
54
+
55
+ if (queryName === "maintained-conformance") {
56
+ const ast = parsePath(context.inputPath);
57
+ const resolved = resolveWorkspace(ast);
58
+ if (!resultOk(resolved)) return printValidationFailure(resolved);
59
+ const diffResult = buildDiff(ast, context.fromTopogramPath);
60
+ if (diffResult && !resultOk(diffResult)) return printValidationFailure(diffResult);
61
+ const maintainedBundleResult = buildMaintainedBundle(ast);
62
+ if (!resultOk(maintainedBundleResult)) return printValidationFailure(maintainedBundleResult);
63
+ const taskModeResult = buildTaskMode(ast, {}, context.fromTopogramPath ? "diff-review" : "verification", context.fromTopogramPath);
64
+ if (!resultOk(taskModeResult)) return printValidationFailure(taskModeResult);
65
+ return printJson(buildMaintainedConformancePayload({
66
+ graph: resolved.graph,
67
+ diffArtifact: artifactOrNull(diffResult),
68
+ maintainedBoundaryArtifact: maintainedBundleResult.artifact.maintained_boundary || null,
69
+ verificationTargets: maintainedBundleResult.artifact.verification_targets || taskModeResult.artifact.verification_targets || null,
70
+ nextAction: taskModeResult.artifact.next_action || null
71
+ }));
72
+ }
73
+
74
+ if (queryName === "seam-check") {
75
+ const ast = parsePath(context.inputPath);
76
+ const resolved = resolveWorkspace(ast);
77
+ if (!resultOk(resolved)) return printValidationFailure(resolved);
78
+ const diffResult = buildDiff(ast, context.fromTopogramPath);
79
+ if (diffResult && !resultOk(diffResult)) return printValidationFailure(diffResult);
80
+ const maintainedBundleResult = buildMaintainedBundle(ast);
81
+ if (!resultOk(maintainedBundleResult)) return printValidationFailure(maintainedBundleResult);
82
+ const taskModeResult = buildTaskMode(ast, {}, context.fromTopogramPath ? "diff-review" : "verification", context.fromTopogramPath);
83
+ if (!resultOk(taskModeResult)) return printValidationFailure(taskModeResult);
84
+ return printJson(buildSeamCheckPayload({
85
+ graph: resolved.graph,
86
+ maintainedBoundaryArtifact: maintainedBundleResult.artifact.maintained_boundary || null,
87
+ diffArtifact: artifactOrNull(diffResult),
88
+ verificationTargets: maintainedBundleResult.artifact.verification_targets || taskModeResult.artifact.verification_targets || null,
89
+ nextAction: taskModeResult.artifact.next_action || null,
90
+ seamId: context.seamId
91
+ }));
92
+ }
93
+
94
+ if (queryName === "review-boundary") {
95
+ const result = buildSlice(parsePath(context.inputPath), selectors);
96
+ if (!resultOk(result)) return printValidationFailure(result);
97
+ return printJson({
98
+ type: "review_boundary_query",
99
+ focus: result.artifact.focus,
100
+ review_boundary: result.artifact.review_boundary,
101
+ ownership_boundary: result.artifact.ownership_boundary,
102
+ write_scope: result.artifact.write_scope || null,
103
+ verification_targets: result.artifact.verification_targets || null
104
+ });
105
+ }
106
+
107
+ if (queryName === "write-scope") {
108
+ return runWriteScopeQuery(context, selectors);
109
+ }
110
+
111
+ if (queryName === "verification-targets") {
112
+ return runVerificationTargetsQuery(context, selectors);
113
+ }
114
+
115
+ return null;
116
+ }
117
+
118
+ /**
119
+ * @param {AnyRecord} context
120
+ * @param {AnyRecord} selectors
121
+ * @returns {number}
122
+ */
123
+ function runWriteScopeQuery(context, selectors) {
124
+ const ast = parsePath(context.inputPath);
125
+ if (context.modeId || (!hasSelectors(context) && !context.fromTopogramPath)) {
126
+ const result = buildTaskMode(ast, selectors, context.modeId || "verification", context.fromTopogramPath);
127
+ if (!resultOk(result)) return printValidationFailure(result);
128
+ return printJson({
129
+ type: "write_scope_query",
130
+ source: "context-task-mode",
131
+ mode: result.artifact.mode,
132
+ summary: result.artifact.summary || null,
133
+ rationale: "Task mode write scope is the safest file-boundary contract for the selected operating mode.",
134
+ write_scope: result.artifact.write_scope || null
135
+ });
136
+ }
137
+ if (context.surfaceId === "maintained-boundary") {
138
+ const result = buildMaintainedBundle(ast);
139
+ if (!resultOk(result)) return printValidationFailure(result);
140
+ return printJson({
141
+ type: "write_scope_query",
142
+ source: "maintained-boundary",
143
+ summary: {
144
+ maintained_file_count: (result.artifact.maintained_boundary?.maintained_files_in_scope || []).length
145
+ },
146
+ rationale: "Maintained-boundary write scope isolates the human-owned application files currently in scope.",
147
+ write_scope: result.artifact.write_scope || null
148
+ });
149
+ }
150
+ const result = buildSlice(ast, selectors);
151
+ if (!resultOk(result)) return printValidationFailure(result);
152
+ return printJson({
153
+ type: "write_scope_query",
154
+ source: "context-slice",
155
+ focus: result.artifact.focus,
156
+ summary: result.artifact.summary || null,
157
+ rationale: "Slice write scope is the narrowest file-boundary contract attached to the selected semantic surface.",
158
+ write_scope: result.artifact.write_scope || null
159
+ });
160
+ }
161
+
162
+ /**
163
+ * @param {AnyRecord} context
164
+ * @param {AnyRecord} selectors
165
+ * @returns {number}
166
+ */
167
+ function runVerificationTargetsQuery(context, selectors) {
168
+ const ast = parsePath(context.inputPath);
169
+ if (context.modeId || (!hasSelectors(context) && !context.fromTopogramPath)) {
170
+ const result = buildTaskMode(ast, selectors, context.modeId || "verification", context.fromTopogramPath);
171
+ if (!resultOk(result)) return printValidationFailure(result);
172
+ return printJson({
173
+ type: "verification_targets_query",
174
+ source: "context-task-mode",
175
+ mode: result.artifact.mode,
176
+ summary: result.artifact.summary || null,
177
+ verification_targets: result.artifact.verification_targets || null
178
+ });
179
+ }
180
+ if (context.fromTopogramPath) {
181
+ const resolved = resolveWorkspace(ast);
182
+ if (!resultOk(resolved)) return printValidationFailure(resolved);
183
+ const result = buildDiff(ast, context.fromTopogramPath);
184
+ if (result && !resultOk(result)) return printValidationFailure(result);
185
+ const affectedVerificationIds = (result?.artifact?.affected_verifications || []).map((/** @type {AnyRecord} */ item) => item.id);
186
+ const verificationTargets = recommendedVerificationTargets(resolved.graph, affectedVerificationIds, {
187
+ includeMaintainedApp: Boolean(result?.artifact?.affected_maintained_surfaces?.ownership_interpretation?.maintained_code_impact),
188
+ rationale: "Diff verification targets should cover the affected semantic proof set and any maintained-app proof gates."
189
+ });
190
+ return printJson({
191
+ type: "verification_targets_query",
192
+ source: "context-diff",
193
+ summary: {
194
+ baseline_root: result?.artifact?.baseline_root,
195
+ affected_verification_count: affectedVerificationIds.length,
196
+ maintained_code_impact: Boolean(result?.artifact?.affected_maintained_surfaces?.ownership_interpretation?.maintained_code_impact)
197
+ },
198
+ verification_targets: verificationTargets,
199
+ affected_verifications: result?.artifact?.affected_verifications || []
200
+ });
201
+ }
202
+ const result = buildSlice(ast, selectors);
203
+ if (!resultOk(result)) return printValidationFailure(result);
204
+ return printJson({
205
+ type: "verification_targets_query",
206
+ source: "context-slice",
207
+ focus: result.artifact.focus,
208
+ summary: result.artifact.summary || null,
209
+ verification_targets: result.artifact.verification_targets || null
210
+ });
211
+ }
@@ -0,0 +1,182 @@
1
+ // @ts-check
2
+
3
+ import fs from "node:fs";
4
+
5
+ import {
6
+ buildCanonicalWritesPayloadForChangePlan,
7
+ buildCanonicalWritesPayloadForImportPlan,
8
+ buildResolvedWorkflowContextPayload,
9
+ buildReviewPacketPayloadForChangePlan,
10
+ buildReviewPacketPayloadForImportPlan,
11
+ buildRiskSummaryPayload,
12
+ classifyRisk,
13
+ proceedDecisionFromRisk
14
+ } from "../../../../agent-ops/query-builders.js";
15
+ import { parsePath } from "../../../../parser.js";
16
+ import { buildChangePlanContext } from "../change-plan.js";
17
+ import { buildImportPlanForContext } from "../import-adopt.js";
18
+ import {
19
+ adoptionPlanPath,
20
+ buildTaskMode,
21
+ normalizeTopogramPath,
22
+ printValidationFailure,
23
+ readJson,
24
+ resultOk,
25
+ selectorOptions,
26
+ shouldUseImportAdoptPath,
27
+ workflowPresetSelectors
28
+ } from "../workspace.js";
29
+ import { printJson } from "./output.js";
30
+
31
+ /**
32
+ * @typedef {Record<string, any>} AnyRecord
33
+ */
34
+
35
+ /**
36
+ * @param {AnyRecord} context
37
+ * @returns {number|null}
38
+ */
39
+ export function runChangeQuery(context) {
40
+ const queryName = context.commandArgs?.queryName;
41
+ const selectors = selectorOptions(context);
42
+
43
+ if (queryName === "change-plan") {
44
+ const built = buildChangePlanContext(context, "modeling");
45
+ const failure = validateChangePlanBuild(built);
46
+ if (failure !== null) return failure;
47
+ return printJson(built.changePlan);
48
+ }
49
+
50
+ if (queryName === "risk-summary") {
51
+ if (hasImportPlan(context)) {
52
+ const built = buildImportPlanForContext(context, "risk-summary");
53
+ if (!resultOk(built)) return printValidationFailure(built);
54
+ const risk = classifyRisk({
55
+ importPlan: built.importPlan,
56
+ verificationTargets: built.importPlan.verification_targets,
57
+ maintainedRisk: built.importPlan.maintained_risk || null
58
+ });
59
+ return printJson(buildRiskSummaryPayload({
60
+ source: "import-plan",
61
+ risk,
62
+ nextAction: built.importPlan.next_action || null,
63
+ maintainedRisk: built.importPlan.maintained_risk || null
64
+ }));
65
+ }
66
+ const built = buildChangePlanContext(context, "modeling");
67
+ const failure = validateChangePlanBuild(built);
68
+ if (failure !== null) return failure;
69
+ const risk = riskFromChangePlanBuild(built);
70
+ return printJson(buildRiskSummaryPayload({
71
+ source: "change-plan",
72
+ risk,
73
+ nextAction: built.changePlan.next_action || null,
74
+ maintainedRisk: built.maintainedRisk
75
+ }));
76
+ }
77
+
78
+ if (queryName === "canonical-writes") {
79
+ if (hasImportPlan(context)) {
80
+ const adoptionPlan = readJson(adoptionPlanPath(normalizeTopogramPath(context.inputPath)));
81
+ return printJson(buildCanonicalWritesPayloadForImportPlan(adoptionPlan.imported_proposal_surfaces || []));
82
+ }
83
+ const result = buildTaskMode(parsePath(context.inputPath), selectors, context.modeId || "modeling", context.fromTopogramPath);
84
+ if (!resultOk(result)) return printValidationFailure(result);
85
+ return printJson(buildCanonicalWritesPayloadForChangePlan(result.artifact.write_scope));
86
+ }
87
+
88
+ if (queryName === "proceed-decision") {
89
+ if (hasImportPlan(context)) {
90
+ const built = buildImportPlanForContext(context, "proceed-decision");
91
+ if (!resultOk(built)) return printValidationFailure(built);
92
+ const risk = classifyRisk({
93
+ importPlan: built.importPlan,
94
+ verificationTargets: built.importPlan.verification_targets,
95
+ maintainedRisk: built.importPlan.maintained_risk || null
96
+ });
97
+ const resolvedWorkflowContext = buildResolvedWorkflowContextPayload({
98
+ workspace: built.topogramRoot,
99
+ taskModeArtifact: built.taskModeResult.artifact,
100
+ importPlan: built.importPlan,
101
+ selectors: workflowPresetSelectors(built.taskModeResult.artifact, context.providerId, context.presetId, "proceed-decision")
102
+ });
103
+ return printJson(proceedDecisionFromRisk(
104
+ risk,
105
+ built.importPlan.next_action,
106
+ built.importPlan.write_scope,
107
+ built.importPlan.verification_targets,
108
+ built.importPlan.maintained_risk || null,
109
+ built.importPlan.workflow_presets || null,
110
+ resolvedWorkflowContext
111
+ ));
112
+ }
113
+ const built = buildChangePlanContext(context, "modeling");
114
+ const failure = validateChangePlanBuild(built);
115
+ if (failure !== null) return failure;
116
+ const risk = riskFromChangePlanBuild(built);
117
+ return printJson(proceedDecisionFromRisk(
118
+ risk,
119
+ built.changePlan.next_action || null,
120
+ built.changePlan.write_scope || null,
121
+ built.changePlan.verification_targets || null,
122
+ built.maintainedRisk,
123
+ null,
124
+ null
125
+ ));
126
+ }
127
+
128
+ if (queryName === "review-packet") {
129
+ if (hasImportPlan(context)) {
130
+ const built = buildImportPlanForContext(context, "review-packet");
131
+ if (!resultOk(built)) return printValidationFailure(built);
132
+ const risk = classifyRisk({
133
+ importPlan: built.importPlan,
134
+ verificationTargets: built.importPlan.verification_targets,
135
+ maintainedRisk: built.importPlan.maintained_risk || null
136
+ });
137
+ return printJson(buildReviewPacketPayloadForImportPlan({ importPlan: built.importPlan, risk }));
138
+ }
139
+ const built = buildChangePlanContext(context, "modeling");
140
+ const failure = validateChangePlanBuild(built);
141
+ if (failure !== null) return failure;
142
+ const risk = riskFromChangePlanBuild(built);
143
+ return printJson(buildReviewPacketPayloadForChangePlan({ changePlan: built.changePlan, risk }));
144
+ }
145
+
146
+ return null;
147
+ }
148
+
149
+ /**
150
+ * @param {AnyRecord} context
151
+ * @returns {boolean}
152
+ */
153
+ function hasImportPlan(context) {
154
+ return shouldUseImportAdoptPath(context) && fs.existsSync(adoptionPlanPath(normalizeTopogramPath(context.inputPath)));
155
+ }
156
+
157
+ /**
158
+ * @param {AnyRecord} built
159
+ * @returns {number|null}
160
+ */
161
+ function validateChangePlanBuild(built) {
162
+ if (!resultOk(built.resolved)) return printValidationFailure(built.resolved);
163
+ if (!resultOk(built.taskModeResult)) return printValidationFailure(built.taskModeResult);
164
+ if (built.sliceResult && !resultOk(built.sliceResult)) return printValidationFailure(built.sliceResult);
165
+ if (built.diffResult && !resultOk(built.diffResult)) return printValidationFailure(built.diffResult);
166
+ if (built.maintainedBundleResult && !resultOk(built.maintainedBundleResult)) return printValidationFailure(built.maintainedBundleResult);
167
+ return null;
168
+ }
169
+
170
+ /**
171
+ * @param {AnyRecord} built
172
+ * @returns {AnyRecord}
173
+ */
174
+ function riskFromChangePlanBuild(built) {
175
+ return classifyRisk({
176
+ reviewBoundary: built.changePlan.review_boundary,
177
+ maintainedBoundary: built.changePlan.maintained_boundary,
178
+ diffSummary: built.diffSummary,
179
+ verificationTargets: built.changePlan.verification_targets,
180
+ maintainedRisk: built.maintainedRisk
181
+ });
182
+ }