@topogram/cli 0.3.64 → 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 (245) hide show
  1. package/package.json +1 -1
  2. package/src/adoption/plan/index.js +703 -0
  3. package/src/adoption/plan.js +12 -703
  4. package/src/agent-ops/query-builders/auth.js +375 -0
  5. package/src/agent-ops/query-builders/change-risk/change-plan.js +123 -0
  6. package/src/agent-ops/query-builders/change-risk/import-plan.js +49 -0
  7. package/src/agent-ops/query-builders/change-risk/maintained.js +286 -0
  8. package/src/agent-ops/query-builders/change-risk/review-packets.js +123 -0
  9. package/src/agent-ops/query-builders/change-risk/risk.js +189 -0
  10. package/src/agent-ops/query-builders/change-risk.js +25 -0
  11. package/src/agent-ops/query-builders/common.js +149 -0
  12. package/src/agent-ops/query-builders/maintained-risk.js +539 -0
  13. package/src/agent-ops/query-builders/maintained-shared.js +120 -0
  14. package/src/agent-ops/query-builders/multi-agent.js +547 -0
  15. package/src/agent-ops/query-builders/projection-impacts.js +514 -0
  16. package/src/agent-ops/query-builders/work-packets.js +417 -0
  17. package/src/agent-ops/query-builders/workflow-context-shared.js +300 -0
  18. package/src/agent-ops/query-builders/workflow-context.js +398 -0
  19. package/src/agent-ops/query-builders/workflow-presets-core.js +676 -0
  20. package/src/agent-ops/query-builders/workflow-presets.js +341 -0
  21. package/src/agent-ops/query-builders.d.ts +26 -26
  22. package/src/agent-ops/query-builders.js +42 -5021
  23. package/src/catalog/constants.js +10 -0
  24. package/src/catalog/copy.js +60 -0
  25. package/src/catalog/diagnostics.js +15 -0
  26. package/src/catalog/entries.js +42 -0
  27. package/src/catalog/files.js +67 -0
  28. package/src/catalog/provenance.js +122 -0
  29. package/src/catalog/source.js +150 -0
  30. package/src/catalog/validation.js +252 -0
  31. package/src/catalog.d.ts +2 -0
  32. package/src/catalog.js +18 -746
  33. package/src/cli/commands/catalog/check.js +31 -0
  34. package/src/cli/commands/catalog/copy.js +59 -0
  35. package/src/cli/commands/catalog/doctor.js +248 -0
  36. package/src/cli/commands/catalog/help.js +21 -0
  37. package/src/cli/commands/catalog/list.js +52 -0
  38. package/src/cli/commands/catalog/runner.js +92 -0
  39. package/src/cli/commands/catalog/shared.js +17 -0
  40. package/src/cli/commands/catalog/show.js +134 -0
  41. package/src/cli/commands/catalog.js +30 -615
  42. package/src/cli/commands/generator-policy/package-info.js +162 -0
  43. package/src/cli/commands/generator-policy/payloads.js +372 -0
  44. package/src/cli/commands/generator-policy/printers.js +159 -0
  45. package/src/cli/commands/generator-policy/runner.js +81 -0
  46. package/src/cli/commands/generator-policy/shared.js +39 -0
  47. package/src/cli/commands/generator-policy.js +15 -783
  48. package/src/cli/commands/import/adopt.js +170 -0
  49. package/src/cli/commands/import/check.js +91 -0
  50. package/src/cli/commands/import/diff.js +84 -0
  51. package/src/cli/commands/import/help.js +47 -0
  52. package/src/cli/commands/import/paths.js +277 -0
  53. package/src/cli/commands/import/plan.js +284 -0
  54. package/src/cli/commands/import/refresh.js +470 -0
  55. package/src/cli/commands/import/status-history.js +196 -0
  56. package/src/cli/commands/import/workspace.js +230 -0
  57. package/src/cli/commands/import.js +33 -1732
  58. package/src/cli/commands/package/constants.js +17 -0
  59. package/src/cli/commands/package/doctor.js +240 -0
  60. package/src/cli/commands/package/help.js +27 -0
  61. package/src/cli/commands/package/lockfile.js +135 -0
  62. package/src/cli/commands/package/npm.js +97 -0
  63. package/src/cli/commands/package/reporting.js +35 -0
  64. package/src/cli/commands/package/runner.js +33 -0
  65. package/src/cli/commands/package/shared.js +9 -0
  66. package/src/cli/commands/package/update-cli.js +252 -0
  67. package/src/cli/commands/package/versions.js +35 -0
  68. package/src/cli/commands/package.js +29 -813
  69. package/src/cli/commands/query/change-plan.js +68 -0
  70. package/src/cli/commands/query/definitions.js +202 -0
  71. package/src/cli/commands/query/import-adopt.js +121 -0
  72. package/src/cli/commands/query/runner/artifacts.js +102 -0
  73. package/src/cli/commands/query/runner/boundaries.js +211 -0
  74. package/src/cli/commands/query/runner/change.js +182 -0
  75. package/src/cli/commands/query/runner/import-adopt.js +111 -0
  76. package/src/cli/commands/query/runner/index.js +31 -0
  77. package/src/cli/commands/query/runner/output.js +12 -0
  78. package/src/cli/commands/query/runner/workflow.js +241 -0
  79. package/src/cli/commands/query/runner.js +3 -0
  80. package/src/cli/commands/query/workflow-context.js +5 -0
  81. package/src/cli/commands/query/workspace.js +274 -0
  82. package/src/cli/commands/query.js +9 -1300
  83. package/src/cli/commands/template/baseline.js +100 -0
  84. package/src/cli/commands/template/check.js +466 -0
  85. package/src/cli/commands/template/constants.js +8 -0
  86. package/src/cli/commands/template/diagnostics.js +26 -0
  87. package/src/cli/commands/template/help.js +28 -0
  88. package/src/cli/commands/template/lifecycle.js +404 -0
  89. package/src/cli/commands/template/list-show.js +287 -0
  90. package/src/cli/commands/template/policy.js +422 -0
  91. package/src/cli/commands/template/shared.js +127 -0
  92. package/src/cli/commands/template/updates.js +352 -0
  93. package/src/cli/commands/template.js +41 -2143
  94. package/src/generator/api/contracts.js +497 -0
  95. package/src/generator/api/metadata.js +221 -0
  96. package/src/generator/api/openapi.js +559 -0
  97. package/src/generator/api/schema.js +124 -0
  98. package/src/generator/api/types.d.ts +98 -0
  99. package/src/generator/api.js +3 -1195
  100. package/src/generator/context/shared/domain-sdlc.js +282 -0
  101. package/src/generator/context/shared/maintained-boundary.js +665 -0
  102. package/src/generator/context/shared/metrics.js +85 -0
  103. package/src/generator/context/shared/primitives.js +64 -0
  104. package/src/generator/context/shared/relationships.js +453 -0
  105. package/src/generator/context/shared/summaries.js +263 -0
  106. package/src/generator/context/shared/types.d.ts +207 -0
  107. package/src/generator/context/shared.d.ts +42 -0
  108. package/src/generator/context/shared.js +80 -1390
  109. package/src/generator/context/slice/core.js +397 -0
  110. package/src/generator/context/slice/sdlc.js +417 -0
  111. package/src/generator/context/slice/ui-packets.js +183 -0
  112. package/src/generator/context/slice.js +2 -859
  113. package/src/generator/registry/index.js +507 -0
  114. package/src/generator/registry.js +18 -504
  115. package/src/generator/runtime/environment/index.js +666 -0
  116. package/src/generator/runtime/environment.js +4 -666
  117. package/src/generator/runtime/runtime-check/index.js +554 -0
  118. package/src/generator/runtime/runtime-check.js +4 -554
  119. package/src/generator/runtime/shared/index.js +572 -0
  120. package/src/generator/runtime/shared.js +19 -570
  121. package/src/generator/shared.d.ts +2 -0
  122. package/src/generator/surfaces/shared.d.ts +3 -0
  123. package/src/generator/widget-conformance/behavior-report.js +258 -0
  124. package/src/generator/widget-conformance/checks.js +371 -0
  125. package/src/generator/widget-conformance/projection-context.js +200 -0
  126. package/src/generator/widget-conformance/report.js +166 -0
  127. package/src/generator/widget-conformance/types.d.ts +121 -0
  128. package/src/generator/widget-conformance.js +3 -824
  129. package/src/import/core/context.d.ts +3 -0
  130. package/src/import/core/contracts.d.ts +1 -0
  131. package/src/import/core/registry.d.ts +4 -0
  132. package/src/import/core/runner/candidates.js +217 -0
  133. package/src/import/core/runner/options.js +22 -0
  134. package/src/import/core/runner/reports.js +50 -0
  135. package/src/import/core/runner/run.js +79 -0
  136. package/src/import/core/runner/tracks.js +150 -0
  137. package/src/import/core/runner/ui-drafts.js +337 -0
  138. package/src/import/core/runner.js +3 -698
  139. package/src/import/core/shared/api-routes.js +221 -0
  140. package/src/import/core/shared/candidates.js +97 -0
  141. package/src/import/core/shared/files.js +177 -0
  142. package/src/import/core/shared/next-app.js +389 -0
  143. package/src/import/core/shared/types.d.ts +51 -0
  144. package/src/import/core/shared/ui-routes.js +230 -0
  145. package/src/import/core/shared.js +60 -861
  146. package/src/new-project/constants.js +128 -0
  147. package/src/new-project/create.js +83 -0
  148. package/src/new-project/json.js +28 -0
  149. package/src/new-project/metadata.js +96 -0
  150. package/src/new-project/package-spec.js +161 -0
  151. package/src/new-project/project-files.js +348 -0
  152. package/src/new-project/template-policy.js +269 -0
  153. package/src/new-project/template-resolution.js +368 -0
  154. package/src/new-project/template-snapshots.js +430 -0
  155. package/src/new-project/template-updates.js +512 -0
  156. package/src/new-project/types.d.ts +83 -0
  157. package/src/new-project.js +6 -2277
  158. package/src/parser.d.ts +87 -1
  159. package/src/parser.js +118 -0
  160. package/src/policy/review-boundaries.d.ts +15 -0
  161. package/src/project-config/index.js +564 -0
  162. package/src/project-config.js +19 -561
  163. package/src/resolver/enrich/acceptance-criterion.js +2 -0
  164. package/src/resolver/enrich/bug.js +2 -0
  165. package/src/resolver/enrich/pitch.js +2 -0
  166. package/src/resolver/enrich/requirement.js +2 -0
  167. package/src/resolver/enrich/task.js +2 -0
  168. package/src/resolver/index.js +19 -2089
  169. package/src/resolver/normalize.js +384 -1
  170. package/src/resolver/plans.js +168 -0
  171. package/src/resolver/projections-api.js +494 -0
  172. package/src/resolver/projections-db.js +133 -0
  173. package/src/resolver/projections-ui.js +317 -0
  174. package/src/resolver/shapes.js +251 -0
  175. package/src/resolver/shared.js +278 -0
  176. package/src/resolver/widgets.js +132 -0
  177. package/src/template-trust/constants.js +62 -0
  178. package/src/template-trust/content.js +258 -0
  179. package/src/template-trust/diff.js +92 -0
  180. package/src/template-trust/policy.js +61 -0
  181. package/src/template-trust/record.js +90 -0
  182. package/src/template-trust/status.js +182 -0
  183. package/src/template-trust.js +24 -687
  184. package/src/text-helpers.d.ts +1 -0
  185. package/src/topogram-types.d.ts +69 -0
  186. package/src/validator/common.js +488 -0
  187. package/src/validator/data-model.js +237 -0
  188. package/src/validator/docs.js +167 -0
  189. package/src/validator/expressions.js +146 -1
  190. package/src/validator/index.d.ts +23 -0
  191. package/src/validator/index.js +32 -3585
  192. package/src/validator/kinds.d.ts +41 -0
  193. package/src/validator/kinds.js +2 -0
  194. package/src/validator/model-helpers.js +46 -0
  195. package/src/validator/per-kind/acceptance-criterion.js +5 -0
  196. package/src/validator/per-kind/bug.js +6 -0
  197. package/src/validator/per-kind/domain.js +15 -2
  198. package/src/validator/per-kind/pitch.js +7 -0
  199. package/src/validator/per-kind/requirement.js +5 -0
  200. package/src/validator/per-kind/task.js +7 -0
  201. package/src/validator/per-kind/widget.js +14 -0
  202. package/src/validator/projections/api-http-async.js +410 -0
  203. package/src/validator/projections/api-http-authz.js +88 -0
  204. package/src/validator/projections/api-http-core.js +205 -0
  205. package/src/validator/projections/api-http-policies.js +339 -0
  206. package/src/validator/projections/api-http-responses.js +233 -0
  207. package/src/validator/projections/api-http.js +44 -0
  208. package/src/validator/projections/db.js +353 -0
  209. package/src/validator/projections/generator-defaults.js +45 -0
  210. package/src/validator/projections/helpers.js +87 -0
  211. package/src/validator/projections/ui-helpers.js +214 -0
  212. package/src/validator/projections/ui-navigation.js +344 -0
  213. package/src/validator/projections/ui-structure.js +364 -0
  214. package/src/validator/projections/ui-widgets.js +493 -0
  215. package/src/validator/projections/ui.js +46 -0
  216. package/src/validator/registry.js +48 -1
  217. package/src/validator/utils.d.ts +20 -0
  218. package/src/validator/utils.js +115 -12
  219. package/src/widget-behavior.d.ts +1 -0
  220. package/src/workflows/import-app/api/collect.js +221 -0
  221. package/src/workflows/import-app/api/openapi.js +257 -0
  222. package/src/workflows/import-app/api/routes.js +327 -0
  223. package/src/workflows/import-app/api/sources.js +22 -0
  224. package/src/workflows/import-app/api.js +2 -797
  225. package/src/workflows/reconcile/adoption-plan/build.js +208 -0
  226. package/src/workflows/reconcile/adoption-plan/dependencies.js +75 -0
  227. package/src/workflows/reconcile/adoption-plan/outputs.js +143 -0
  228. package/src/workflows/reconcile/adoption-plan/paths.js +58 -0
  229. package/src/workflows/reconcile/adoption-plan/projection-patches.js +177 -0
  230. package/src/workflows/reconcile/adoption-plan/reasons.js +107 -0
  231. package/src/workflows/reconcile/adoption-plan.js +30 -740
  232. package/src/workflows/reconcile/auth/closures.js +115 -0
  233. package/src/workflows/reconcile/auth/formatters.js +142 -0
  234. package/src/workflows/reconcile/auth/inference.js +330 -0
  235. package/src/workflows/reconcile/auth/roles.js +122 -0
  236. package/src/workflows/reconcile/auth.js +35 -690
  237. package/src/workflows/reconcile/bundle-core/index.js +600 -0
  238. package/src/workflows/reconcile/bundle-core.js +12 -598
  239. package/src/workflows/reconcile/canonical-surface.js +1 -1
  240. package/src/workflows/reconcile/impacts/adoption-plan.js +192 -0
  241. package/src/workflows/reconcile/impacts/indexes.js +101 -0
  242. package/src/workflows/reconcile/impacts/patches.js +252 -0
  243. package/src/workflows/reconcile/impacts/reports.js +80 -0
  244. package/src/workflows/reconcile/impacts.js +14 -623
  245. package/src/workspace-docs.d.ts +29 -0
@@ -0,0 +1,68 @@
1
+ // @ts-check
2
+
3
+ import { buildMaintainedRiskSummary, buildChangePlanPayload, summarizeDiffArtifact } from "../../../agent-ops/query-builders.js";
4
+ import { parsePath } from "../../../parser.js";
5
+ import { resolveWorkspace } from "../../../resolver.js";
6
+ import {
7
+ artifactOrNull,
8
+ buildDiff,
9
+ buildMaintainedBundle,
10
+ buildSlice,
11
+ buildTaskMode,
12
+ hasSelectors,
13
+ resultOk,
14
+ selectorOptions
15
+ } from "./workspace.js";
16
+
17
+ /**
18
+ * @typedef {Record<string, any>} AnyRecord
19
+ */
20
+
21
+ /**
22
+ * @param {AnyRecord} context
23
+ * @param {string} defaultMode
24
+ * @returns {{ ast: AnyRecord, resolved: AnyRecord, taskModeResult: AnyRecord, sliceResult: AnyRecord|null, diffResult: AnyRecord|null, maintainedBundleResult: AnyRecord|null, changePlan: AnyRecord, diffSummary: AnyRecord|null, maintainedRisk: AnyRecord }}
25
+ */
26
+ export function buildChangePlanContext(context, defaultMode = "modeling") {
27
+ const ast = parsePath(context.inputPath);
28
+ const resolved = resolveWorkspace(ast);
29
+ if (!resultOk(resolved)) {
30
+ return /** @type {any} */ ({ ast, resolved });
31
+ }
32
+ const selectors = selectorOptions(context);
33
+ const effectiveModeId = context.modeId || defaultMode;
34
+ const taskModeResult = buildTaskMode(ast, selectors, effectiveModeId, context.fromTopogramPath);
35
+ if (!resultOk(taskModeResult)) {
36
+ return /** @type {any} */ ({ ast, resolved, taskModeResult });
37
+ }
38
+ const sliceResult = hasSelectors(context) ? buildSlice(ast, selectors) : null;
39
+ if (sliceResult && !resultOk(sliceResult)) {
40
+ return /** @type {any} */ ({ ast, resolved, taskModeResult, sliceResult });
41
+ }
42
+ const diffResult = buildDiff(ast, context.fromTopogramPath);
43
+ if (diffResult && !resultOk(diffResult)) {
44
+ return /** @type {any} */ ({ ast, resolved, taskModeResult, sliceResult, diffResult });
45
+ }
46
+ const includeMaintainedBoundary =
47
+ effectiveModeId === "maintained-app-edit" ||
48
+ context.surfaceId === "maintained-boundary" ||
49
+ Boolean(diffResult?.artifact?.affected_maintained_surfaces?.ownership_interpretation?.maintained_code_impact);
50
+ const maintainedBundleResult = includeMaintainedBoundary ? buildMaintainedBundle(ast) : null;
51
+ if (maintainedBundleResult && !resultOk(maintainedBundleResult)) {
52
+ return /** @type {any} */ ({ ast, resolved, taskModeResult, sliceResult, diffResult, maintainedBundleResult });
53
+ }
54
+ const changePlan = buildChangePlanPayload({
55
+ graph: resolved.graph,
56
+ taskModeArtifact: taskModeResult.artifact,
57
+ sliceArtifact: artifactOrNull(sliceResult),
58
+ diffArtifact: artifactOrNull(diffResult),
59
+ maintainedBoundaryArtifact: maintainedBundleResult?.artifact?.maintained_boundary || null
60
+ });
61
+ const diffSummary = changePlan.diff_summary || summarizeDiffArtifact(diffResult?.artifact || null);
62
+ const maintainedRisk = buildMaintainedRiskSummary({
63
+ maintainedImpacts: changePlan.maintained_impacts,
64
+ maintainedBoundary: changePlan.maintained_boundary,
65
+ diffSummary
66
+ });
67
+ return { ast, resolved, taskModeResult, sliceResult, diffResult, maintainedBundleResult, changePlan, diffSummary, maintainedRisk };
68
+ }
@@ -0,0 +1,202 @@
1
+ // @ts-check
2
+
3
+ /**
4
+ * @typedef {{
5
+ * name: string,
6
+ * purpose: string,
7
+ * description: string,
8
+ * selectors: string[],
9
+ * args: string[],
10
+ * output: string,
11
+ * example: string
12
+ * }} QueryDefinition
13
+ *
14
+ * @typedef {{
15
+ * type: "query_list",
16
+ * version: 1,
17
+ * queries: QueryDefinition[]
18
+ * }} QueryListPayload
19
+ *
20
+ * @typedef {{
21
+ * type: "query_definition",
22
+ * version: 1,
23
+ * query: QueryDefinition
24
+ * }} QueryDefinitionPayload
25
+ */
26
+
27
+ /**
28
+ * @typedef {Record<string, any>} AnyRecord
29
+ */
30
+
31
+ /**
32
+ * @returns {QueryDefinition[]}
33
+ */
34
+ export function queryDefinitions() {
35
+ return [
36
+ {
37
+ name: "slice",
38
+ purpose: "Give an agent the smallest graph slice needed to reason about one selected semantic surface.",
39
+ description: "Return a focused semantic context slice for one selected surface.",
40
+ selectors: ["capability", "workflow", "projection", "widget", "entity", "journey", "domain"],
41
+ args: ["[path]", "[selectors]", "[--json]"],
42
+ output: "context_slice",
43
+ example: "topogram query slice ./topogram --widget widget_data_grid"
44
+ },
45
+ {
46
+ name: "verification-targets",
47
+ purpose: "Map a selected change or mode to the smallest verification set worth running.",
48
+ description: "Return the smallest verification target set for a mode, selector, or diff.",
49
+ selectors: ["mode", "capability", "workflow", "projection", "widget", "entity", "journey", "from-topogram"],
50
+ args: ["[path]", "[selectors]", "[--from-topogram <path>]", "[--json]"],
51
+ output: "verification_targets",
52
+ example: "topogram query verification-targets ./topogram --widget widget_data_grid"
53
+ },
54
+ {
55
+ name: "widget-behavior",
56
+ purpose: "Show how reusable widget behavior is realized by projection usage.",
57
+ description: "Return widget behavior realization data grouped by widget, screen, capability, and effect.",
58
+ selectors: ["projection", "widget"],
59
+ args: ["[path]", "[--projection <id>]", "[--widget <id>]", "[--json]"],
60
+ output: "widget_behavior_report",
61
+ example: "topogram query widget-behavior ./topogram --projection proj_web_surface --widget widget_data_grid --json"
62
+ },
63
+ {
64
+ name: "change-plan",
65
+ purpose: "Summarize what a selected change affects before code or Topogram edits start.",
66
+ description: "Return the semantic change plan, generator targets, risk, and alignment recommendations.",
67
+ selectors: ["mode", "capability", "workflow", "projection", "widget", "entity", "journey", "surface", "from-topogram"],
68
+ args: ["[path]", "[selectors]", "[--from-topogram <path>]", "[--json]"],
69
+ output: "change_plan_query",
70
+ example: "topogram query change-plan ./topogram --widget widget_data_grid"
71
+ },
72
+ {
73
+ name: "review-packet",
74
+ purpose: "Bundle the context a human or agent needs to review a selected semantic change.",
75
+ description: "Return the review packet for a selected change or diff.",
76
+ selectors: ["mode", "capability", "workflow", "projection", "widget", "entity", "journey", "surface", "from-topogram"],
77
+ args: ["[path]", "[selectors]", "[--from-topogram <path>]", "[--json]"],
78
+ output: "review_packet_query",
79
+ example: "topogram query review-packet ./topogram --widget widget_data_grid"
80
+ },
81
+ {
82
+ name: "resolved-workflow-context",
83
+ purpose: "Resolve workflow guidance and artifact load order for a selected mode or change.",
84
+ description: "Return resolved workflow guidance, artifact load order, preset policy, and recommended artifact queries.",
85
+ selectors: ["mode", "capability", "workflow", "projection", "widget", "entity", "journey", "surface", "provider", "preset", "from-topogram"],
86
+ args: ["[path]", "[--mode <id>]", "[selectors]", "[--from-topogram <path>]", "[--json]"],
87
+ output: "resolved_workflow_context_query",
88
+ example: "topogram query resolved-workflow-context ./topogram --mode modeling --widget widget_data_grid --json"
89
+ },
90
+ {
91
+ name: "single-agent-plan",
92
+ purpose: "Give one coding agent a bounded plan, artifact set, and write guidance.",
93
+ description: "Return a single-agent operating plan for a mode and optional selector.",
94
+ selectors: ["mode", "capability", "workflow", "projection", "widget", "entity", "journey", "surface", "from-topogram"],
95
+ args: ["[path]", "[--mode <id>]", "[selectors]", "[--from-topogram <path>]", "[--json]"],
96
+ output: "single_agent_plan_query",
97
+ example: "topogram query single-agent-plan ./topogram --mode modeling --widget widget_data_grid --json"
98
+ },
99
+ {
100
+ name: "risk-summary",
101
+ purpose: "Surface behavioral, ownership, and verification risks for a selected change.",
102
+ description: "Return the risk summary for a selected change, mode, or diff.",
103
+ selectors: ["mode", "capability", "workflow", "projection", "widget", "entity", "journey", "surface", "from-topogram"],
104
+ args: ["[path]", "[selectors]", "[--from-topogram <path>]", "[--json]"],
105
+ output: "risk_summary_query",
106
+ example: "topogram query risk-summary ./topogram --widget widget_data_grid"
107
+ },
108
+ {
109
+ name: "proceed-decision",
110
+ purpose: "Tell a human or agent whether enough context and proof exist to proceed.",
111
+ description: "Return a proceed/no-go decision for the current selected work.",
112
+ selectors: ["mode", "capability", "workflow", "projection", "widget", "entity", "journey", "surface", "from-topogram"],
113
+ args: ["[path]", "[--mode <id>]", "[selectors]", "[--from-topogram <path>]", "[--json]"],
114
+ output: "proceed_decision_query",
115
+ example: "topogram query proceed-decision ./topogram --mode verification"
116
+ },
117
+ {
118
+ name: "write-scope",
119
+ purpose: "Define where an agent may edit for a selected semantic surface.",
120
+ description: "Return safe edit boundaries for a selected mode or semantic surface.",
121
+ selectors: ["mode", "capability", "workflow", "projection", "widget", "entity", "journey", "from-topogram"],
122
+ args: ["[path]", "[selectors]", "[--from-topogram <path>]", "[--json]"],
123
+ output: "write_scope_query",
124
+ example: "topogram query write-scope ./topogram --widget widget_data_grid"
125
+ }
126
+ ];
127
+ }
128
+
129
+ /**
130
+ * @returns {QueryListPayload}
131
+ */
132
+ export function buildQueryListPayload() {
133
+ return {
134
+ type: "query_list",
135
+ version: 1,
136
+ queries: queryDefinitions()
137
+ };
138
+ }
139
+
140
+ /**
141
+ * @param {string} name
142
+ * @returns {QueryDefinitionPayload}
143
+ */
144
+ export function buildQueryShowPayload(name) {
145
+ const query = queryDefinitions().find((entry) => entry.name === name);
146
+ if (!query) {
147
+ const known = queryDefinitions().map((entry) => entry.name).join(", ");
148
+ throw new Error(`Unknown query '${name}'. Run 'topogram query list' to inspect available queries. Known queries: ${known}`);
149
+ }
150
+ return {
151
+ type: "query_definition",
152
+ version: 1,
153
+ query
154
+ };
155
+ }
156
+
157
+ /**
158
+ * @returns {void}
159
+ */
160
+ export function printQueryHelp() {
161
+ console.log("Usage: topogram query list [--json]");
162
+ console.log(" or: topogram query show <name> [--json]");
163
+ console.log(" or: topogram query widget-behavior [path] [--projection <id>] [--widget <id>] [--json]");
164
+ console.log(" or: topogram query <name> [path] [selectors] [--json]");
165
+ console.log("");
166
+ console.log("Agent-facing queries return focused JSON packets for context, review, verification, and generation follow-up.");
167
+ console.log("");
168
+ console.log("Common queries:");
169
+ for (const query of queryDefinitions()) {
170
+ console.log(` ${query.name}`);
171
+ console.log(` ${query.description}`);
172
+ console.log(` example: ${query.example}`);
173
+ }
174
+ }
175
+
176
+ /**
177
+ * @param {QueryDefinitionPayload} payload
178
+ * @returns {void}
179
+ */
180
+ export function printQueryDefinition(payload) {
181
+ const query = payload.query;
182
+ console.log(`Query: ${query.name}`);
183
+ console.log(`Purpose: ${query.purpose}`);
184
+ console.log(`Description: ${query.description}`);
185
+ console.log(`Output: ${query.output}`);
186
+ console.log(`Arguments: ${query.args.join(" ")}`);
187
+ console.log(`Selectors: ${query.selectors.join(", ") || "none"}`);
188
+ console.log(`Example: ${query.example}`);
189
+ }
190
+
191
+ /**
192
+ * @param {QueryListPayload} payload
193
+ * @returns {void}
194
+ */
195
+ export function printQueryList(payload) {
196
+ console.log("Topogram queries:");
197
+ for (const query of payload.queries) {
198
+ console.log(`- ${query.name}: ${query.description}`);
199
+ console.log(` selectors: ${query.selectors.join(", ") || "none"}`);
200
+ console.log(` example: ${query.example}`);
201
+ }
202
+ }
@@ -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
+ }