@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
@@ -1,12 +1,115 @@
1
- export {
2
- blockEntries,
3
- collectFieldMap,
4
- formatLoc,
5
- getField,
6
- getFieldValue,
7
- pushError,
8
- stringValue,
9
- symbolValue,
10
- symbolValues,
11
- valueAsArray
12
- } from "./index.js";
1
+ // @ts-check
2
+
3
+ /**
4
+ * @param {ValidationErrors} errors
5
+ * @param {string} message
6
+ * @param {TopogramLocation | null | undefined} [loc]
7
+ * @returns {void}
8
+ */
9
+ export function pushError(errors, message, loc) {
10
+ errors.push({
11
+ message,
12
+ loc
13
+ });
14
+ }
15
+
16
+ /**
17
+ * @param {TopogramLocation | null | undefined} loc
18
+ * @returns {string}
19
+ */
20
+ export function formatLoc(loc) {
21
+ const line = loc?.start?.line ?? 1;
22
+ const column = loc?.start?.column ?? 1;
23
+ const file = loc?.file ?? "<unknown>";
24
+ return `${file}:${line}:${column}`;
25
+ }
26
+
27
+ /**
28
+ * @param {TopogramBlockEntry} entry
29
+ * @returns {TopogramToken[]}
30
+ */
31
+ export function blockSymbolItems(entry) {
32
+ return entry.items.filter((item) => item.type === "symbol" || item.type === "string");
33
+ }
34
+
35
+ /**
36
+ * @param {TopogramToken | null | undefined} value
37
+ * @returns {TopogramToken[]}
38
+ */
39
+ export function valueAsArray(value) {
40
+ if (!value) {
41
+ return [];
42
+ }
43
+ if (value.type === "list") {
44
+ return value.items;
45
+ }
46
+ if (value.type === "sequence") {
47
+ return value.items;
48
+ }
49
+ return [value];
50
+ }
51
+
52
+ /**
53
+ * @param {TopogramToken | null | undefined} value
54
+ * @returns {string[]}
55
+ */
56
+ export function symbolValues(value) {
57
+ return valueAsArray(value).filter((item) => item.type === "symbol").map((item) => item.value);
58
+ }
59
+
60
+ /**
61
+ * @param {TopogramStatement} statement
62
+ * @returns {TopogramFieldMap}
63
+ */
64
+ export function collectFieldMap(statement) {
65
+ const map = new Map();
66
+ for (const field of statement.fields) {
67
+ if (!map.has(field.key)) {
68
+ map.set(field.key, []);
69
+ }
70
+ map.get(field.key).push(field);
71
+ }
72
+ return map;
73
+ }
74
+
75
+ /**
76
+ * @param {TopogramStatement} statement
77
+ * @param {string} key
78
+ * @returns {TopogramField | null}
79
+ */
80
+ export function getField(statement, key) {
81
+ return collectFieldMap(statement).get(key)?.[0] || null;
82
+ }
83
+
84
+ /**
85
+ * @param {TopogramStatement} statement
86
+ * @param {string} key
87
+ * @returns {TopogramToken | null}
88
+ */
89
+ export function getFieldValue(statement, key) {
90
+ return getField(statement, key)?.value || null;
91
+ }
92
+
93
+ /**
94
+ * @param {TopogramToken | null | undefined} value
95
+ * @returns {string | null}
96
+ */
97
+ export function stringValue(value) {
98
+ return value?.type === "string" ? value.value : null;
99
+ }
100
+
101
+ /**
102
+ * @param {TopogramToken | null | undefined} value
103
+ * @returns {string | null}
104
+ */
105
+ export function symbolValue(value) {
106
+ return value?.type === "symbol" ? value.value : null;
107
+ }
108
+
109
+ /**
110
+ * @param {TopogramToken | null | undefined} value
111
+ * @returns {TopogramBlockEntry[]}
112
+ */
113
+ export function blockEntries(value) {
114
+ return value?.type === "block" ? value.entries : [];
115
+ }
@@ -0,0 +1,2 @@
1
+ export function formatValidationErrors(validation: any, configPath?: string): string;
2
+ export function validateWorkspace(ast: any): any;
@@ -0,0 +1 @@
1
+ export function buildWidgetBehaviorRealizations(...args: any[]): any;
@@ -0,0 +1,26 @@
1
+ // @ts-check
2
+ import {
3
+ buildAdoptionStatusFiles as buildAdoptionStatusFilesReport,
4
+ buildAdoptionStatusSummary as buildAdoptionStatusSummaryReport
5
+ } from "../../adoption/reporting.js";
6
+ import { selectNextBundle } from "../../adoption/review-groups.js";
7
+ import {
8
+ formatDocDriftSummaryInline,
9
+ formatDocLinkSuggestionInline,
10
+ formatDocMetadataPatchInline,
11
+ reconcileWorkflow
12
+ } from "../reconcile/index.js";
13
+ import { normalizeWorkspacePaths } from "../shared.js";
14
+
15
+ /** @param {string} inputPath @returns {any} */
16
+ export function adoptionStatusWorkflow(inputPath) {
17
+ const reconcile = reconcileWorkflow(inputPath);
18
+ const report = reconcile.summary;
19
+ const summary = buildAdoptionStatusSummaryReport(report, selectNextBundle);
20
+ const files = buildAdoptionStatusFilesReport(summary, formatDocLinkSuggestionInline, formatDocDriftSummaryInline, formatDocMetadataPatchInline);
21
+ return {
22
+ summary,
23
+ files,
24
+ defaultOutDir: normalizeWorkspacePaths(inputPath).topogramRoot
25
+ };
26
+ }
@@ -0,0 +1,262 @@
1
+ // @ts-check
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+
5
+ import { stableStringify } from "../format.js";
6
+ import { parsePath } from "../parser.js";
7
+ import { resolveWorkspace } from "../resolver.js";
8
+ import { buildJourneyDrafts as buildJourneyDraftsReconcile } from "../reconcile/journeys.js";
9
+ import { relativeTo } from "../path-helpers.js";
10
+ import { ensureTrailingNewline, titleCase } from "../text-helpers.js";
11
+ import { listFilesRecursive, markdownTitle, normalizeWorkspacePaths, renderMarkdownDoc } from "./shared.js";
12
+
13
+ /** @param {string} kind @returns {any} */
14
+ export function docDirForKind(kind) {
15
+ if (kind === "glossary") {
16
+ return "glossary";
17
+ }
18
+ if (kind === "workflow") {
19
+ return "workflows";
20
+ }
21
+ if (kind === "journey") {
22
+ return "journeys";
23
+ }
24
+ return "reports";
25
+ }
26
+
27
+ /** @param {ResolvedGraph} graph @returns {any} */
28
+ export function generateDocsBundleFromGraph(graph) {
29
+ /** @type {WorkflowFiles} */
30
+ /** @type {WorkflowFiles} */
31
+ const files = {};
32
+ for (const entity of graph.byKind.entity || []) {
33
+ const id = entity.id.replace(/^entity_/, "");
34
+ /** @type {WorkflowRecord} */
35
+ const metadata = {
36
+ id,
37
+ kind: "glossary",
38
+ title: entity.name || titleCase(id),
39
+ status: "canonical",
40
+ summary: entity.description || `Generated glossary entry for ${entity.id}.`,
41
+ related_entities: [entity.id],
42
+ source_of_truth: "canonical",
43
+ confidence: "high",
44
+ review_required: false,
45
+ tags: ["generated", "glossary"]
46
+ };
47
+ const body = [
48
+ entity.description || `Canonical entity \`${entity.id}\`.`,
49
+ "",
50
+ "Fields:",
51
+ ...(entity.fields || []).map((/** @type {any} */ field) => `- \`${field.name}\` (${field.fieldType}) ${field.required ? "required" : "optional"}`)
52
+ ].join("\n");
53
+ files[`glossary/${id}.md`] = renderMarkdownDoc(metadata, body);
54
+ }
55
+
56
+ for (const capability of graph.byKind.capability || []) {
57
+ const writes = [...capability.creates, ...capability.updates, ...capability.deletes];
58
+ if (writes.length === 0) {
59
+ continue;
60
+ }
61
+ const id = capability.id.replace(/^cap_/, "");
62
+ const relatedEntities = [...new Set(writes.map((/** @type {any} */ entry) => entry.id).filter(Boolean))];
63
+ const metadata = {
64
+ id,
65
+ kind: "workflow",
66
+ title: capability.name || titleCase(id),
67
+ status: "canonical",
68
+ summary: capability.description || `Generated workflow entry for ${capability.id}.`,
69
+ related_capabilities: [capability.id],
70
+ related_entities: relatedEntities,
71
+ source_of_truth: "canonical",
72
+ confidence: "high",
73
+ review_required: false,
74
+ tags: ["generated", "workflow"]
75
+ };
76
+ const body = [
77
+ capability.description || `Canonical workflow surface for \`${capability.id}\`.`,
78
+ "",
79
+ `Actors: ${(capability.actors || []).map((/** @type {any} */ actor) => `\`${actor.id}\``).join(", ") || "_none_"}`,
80
+ `Creates: ${(capability.creates || []).map((/** @type {any} */ ref) => `\`${ref.id}\``).join(", ") || "_none_"}`,
81
+ `Updates: ${(capability.updates || []).map((/** @type {any} */ ref) => `\`${ref.id}\``).join(", ") || "_none_"}`,
82
+ `Deletes: ${(capability.deletes || []).map((/** @type {any} */ ref) => `\`${ref.id}\``).join(", ") || "_none_"}`,
83
+ `Input: ${capability.input?.id ? `\`${capability.input.id}\`` : "_none_"}`,
84
+ `Output: ${capability.output?.id ? `\`${capability.output.id}\`` : "_none_"}`
85
+ ].join("\n\n");
86
+ files[`workflows/${id}.md`] = renderMarkdownDoc(metadata, body);
87
+ }
88
+
89
+ const reportMetadata = {
90
+ id: "model_overview",
91
+ kind: "report",
92
+ title: "Model Overview",
93
+ status: "canonical",
94
+ summary: "Generated overview of the current Topogram model surface.",
95
+ source_of_truth: "canonical",
96
+ confidence: "high",
97
+ review_required: false,
98
+ tags: ["generated", "report"]
99
+ };
100
+ files["reports/model-overview.md"] = renderMarkdownDoc(
101
+ reportMetadata,
102
+ [
103
+ `Entities: ${(graph.byKind.entity || []).length}`,
104
+ `Capabilities: ${(graph.byKind.capability || []).length}`,
105
+ `Shapes: ${(graph.byKind.shape || []).length}`,
106
+ `Projections: ${(graph.byKind.projection || []).length}`,
107
+ `Companion docs: ${(graph.docs || []).length}`
108
+ ].join("\n\n")
109
+ );
110
+
111
+ const index = Object.entries(files).map(([filePath, contents]) => ({
112
+ path: filePath,
113
+ title: markdownTitle(filePath, contents)
114
+ }));
115
+ files["docs-index.json"] = `${stableStringify(index)}\n`;
116
+ return files;
117
+ }
118
+
119
+ /** @param {string} inputPath @returns {any} */
120
+ export function loadResolvedGraph(inputPath) {
121
+ const ast = parsePath(inputPath);
122
+ const resolved = resolveWorkspace(ast);
123
+ if (!resolved.ok) {
124
+ const error = /** @type {Error & { validation?: any }} */ (new Error("Workspace validation failed"));
125
+ error.validation = resolved.validation;
126
+ throw error;
127
+ }
128
+ return resolved.graph;
129
+ }
130
+
131
+ /** @param {string} inputPath @returns {any} */
132
+ export function tryLoadResolvedGraph(inputPath) {
133
+ try {
134
+ return loadResolvedGraph(inputPath);
135
+ } catch {
136
+ return null;
137
+ }
138
+ }
139
+
140
+ /** @param {string} inputPath @returns {any} */
141
+ export function refreshDocsWorkflow(inputPath) {
142
+ const paths = normalizeWorkspacePaths(inputPath);
143
+ const graph = loadResolvedGraph(paths.topogramRoot);
144
+ const generated = generateDocsBundleFromGraph(graph);
145
+ const canonicalRoot = path.join(paths.topogramRoot, "docs");
146
+ const generatedRoot = path.join(paths.topogramRoot, "candidates", "docs", "refreshed");
147
+ /** @type {WorkflowRecord} */
148
+ const report = {
149
+ type: "refresh_docs",
150
+ workspace: paths.topogramRoot,
151
+ missing: [],
152
+ stale: [],
153
+ orphaned: []
154
+ };
155
+
156
+ for (const [relativePath, contents] of Object.entries(generated)) {
157
+ if (relativePath === "docs-index.json") {
158
+ continue;
159
+ }
160
+ const canonicalPath = path.join(canonicalRoot, relativePath);
161
+ if (!fs.existsSync(canonicalPath)) {
162
+ report.missing.push(relativePath);
163
+ continue;
164
+ }
165
+ if ((fs.readFileSync(canonicalPath, "utf8")) !== contents) {
166
+ report.stale.push(relativePath);
167
+ }
168
+ }
169
+
170
+ for (const filePath of listFilesRecursive(canonicalRoot, (/** @type {any} */ child) => child.endsWith(".md"))) {
171
+ const relativePath = relativeTo(canonicalRoot, filePath);
172
+ if (!generated[relativePath]) {
173
+ report.orphaned.push(relativePath);
174
+ }
175
+ }
176
+
177
+ /** @type {WorkflowFiles} */
178
+
179
+ const files = {
180
+ "candidates/docs/refreshed/report.json": `${stableStringify(report)}\n`,
181
+ "candidates/docs/refreshed/report.md": ensureTrailingNewline(
182
+ `# Docs Refresh Report\n\n## Missing\n\n${report.missing.length ? report.missing.map((/** @type {any} */ item) => `- \`${item}\``).join("\n") : "- None"}\n\n## Stale\n\n${report.stale.length ? report.stale.map((/** @type {any} */ item) => `- \`${item}\``).join("\n") : "- None"}\n\n## Orphaned\n\n${report.orphaned.length ? report.orphaned.map((/** @type {any} */ item) => `- \`${item}\``).join("\n") : "- None"}\n`
183
+ )
184
+ };
185
+
186
+ for (const [relativePath, contents] of Object.entries(generated)) {
187
+ files[path.join("candidates/docs/refreshed/generated", relativePath).replaceAll(path.sep, "/")] = contents;
188
+ }
189
+
190
+ return {
191
+ summary: report,
192
+ files,
193
+ defaultOutDir: paths.topogramRoot
194
+ };
195
+ }
196
+
197
+ /** @param {string} inputPath @returns {any} */
198
+ export function generateDocsWorkflow(inputPath) {
199
+ const paths = normalizeWorkspacePaths(inputPath);
200
+ const graph = loadResolvedGraph(paths.topogramRoot);
201
+ const files = generateDocsBundleFromGraph(graph);
202
+ return {
203
+ summary: {
204
+ type: "generate_docs",
205
+ workspace: paths.topogramRoot,
206
+ bootstrapped_topogram_root: paths.bootstrappedTopogramRoot,
207
+ file_count: Object.keys(files).length
208
+ },
209
+ files,
210
+ defaultOutDir: path.join(paths.topogramRoot, "docs-generated")
211
+ };
212
+ }
213
+
214
+ /** @param {string} inputPath @returns {any} */
215
+ export function generateJourneyDraftsWorkflow(inputPath) {
216
+ const paths = normalizeWorkspacePaths(inputPath);
217
+ const graph = loadResolvedGraph(paths.topogramRoot);
218
+ const canonicalJourneys = (graph.docs || []).filter((/** @type {any} */ doc) => doc.kind === "journey");
219
+ const { drafts, skippedEntities } = buildJourneyDraftsReconcile(graph);
220
+ /** @type {WorkflowFiles} */
221
+ /** @type {WorkflowFiles} */
222
+ const files = {};
223
+
224
+ for (const draft of drafts) {
225
+ files[draft.path] = renderMarkdownDoc(draft.metadata, draft.body);
226
+ }
227
+
228
+ /** @type {WorkflowRecord} */
229
+ const summary = {
230
+ type: "generate_journeys",
231
+ workspace: paths.topogramRoot,
232
+ bootstrapped_topogram_root: paths.bootstrappedTopogramRoot,
233
+ canonical_journey_count: canonicalJourneys.length,
234
+ generated_draft_count: drafts.length,
235
+ draft_journeys: drafts.map((/** @type {any} */ draft) => ({
236
+ id: draft.id,
237
+ title: draft.title,
238
+ entity_id: draft.entity_id,
239
+ path: draft.path,
240
+ type: draft.type,
241
+ related_capabilities: draft.related_capabilities
242
+ })),
243
+ skipped_entities: skippedEntities
244
+ };
245
+
246
+ files["candidates/docs/journeys/import-report.json"] = `${stableStringify(summary)}\n`;
247
+ files["candidates/docs/journeys/import-report.md"] = ensureTrailingNewline(
248
+ `# Journey Draft Report\n\n` +
249
+ `Canonical journeys: ${canonicalJourneys.length}\n\n` +
250
+ `Generated drafts: ${drafts.length}\n\n` +
251
+ `## Draft Journeys\n\n` +
252
+ `${drafts.length === 0 ? "- None" : drafts.map((/** @type {any} */ draft) => `- \`${draft.id}\` -> \`${draft.path}\``).join("\n")}\n\n` +
253
+ `## Skipped Entities\n\n` +
254
+ `${skippedEntities.length === 0 ? "- None" : skippedEntities.map((/** @type {any} */ entry) => `- \`${entry.entity_id}\` (${entry.reason})`).join("\n")}\n`
255
+ );
256
+
257
+ return {
258
+ summary,
259
+ files,
260
+ defaultOutDir: paths.topogramRoot
261
+ };
262
+ }