akm-cli 0.9.0-rc.8 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (450) hide show
  1. package/CHANGELOG.md +1063 -44
  2. package/README.md +51 -25
  3. package/SECURITY.md +14 -1
  4. package/STABILITY.md +497 -0
  5. package/dist/akm +148 -35
  6. package/dist/{akm-migrate-storage → akm-migrate} +6 -9
  7. package/dist/assets/hints/cli-hints-full.md +223 -95
  8. package/dist/assets/hints/cli-hints-short.md +85 -22
  9. package/dist/assets/improve-strategies/default.json +1 -1
  10. package/dist/assets/improve-strategies/reflect-distill.json +1 -1
  11. package/dist/assets/prompts/memory-infer-user.md +2 -3
  12. package/dist/assets/stash-skeleton/README.md +6 -5
  13. package/dist/assets/stash-skeleton/facts/conventions/assets/agent.md +2 -0
  14. package/dist/assets/stash-skeleton/facts/conventions/assets/command.md +2 -0
  15. package/dist/assets/stash-skeleton/facts/conventions/assets/fact.md +2 -0
  16. package/dist/assets/stash-skeleton/facts/conventions/assets/knowledge.md +2 -0
  17. package/dist/assets/stash-skeleton/facts/conventions/assets/lesson.md +2 -0
  18. package/dist/assets/stash-skeleton/facts/conventions/assets/memory.md +2 -0
  19. package/dist/assets/stash-skeleton/facts/conventions/assets/script.md +2 -0
  20. package/dist/assets/stash-skeleton/facts/conventions/assets/skill.md +2 -0
  21. package/dist/assets/stash-skeleton/facts/conventions/assets/workflow.md +2 -0
  22. package/dist/assets/stash-skeleton/facts/conventions/backlinks.md +2 -0
  23. package/dist/assets/stash-skeleton/facts/conventions/domains.md +2 -0
  24. package/dist/assets/stash-skeleton/facts/conventions/organization.md +20 -9
  25. package/dist/assets/tasks/core/extract.yml +1 -1
  26. package/dist/assets/tasks/core/version-check.yml +1 -1
  27. package/dist/assets/tasks/improve/akm-graph-refresh-weekly.yml +5 -0
  28. package/dist/assets/tasks/improve/akm-improve-catchup.yml +8 -0
  29. package/dist/assets/tasks/improve/akm-improve-consolidate.yml +5 -0
  30. package/dist/assets/tasks/improve/akm-improve-frequent.yml +5 -0
  31. package/dist/assets/tasks/improve/akm-improve-nightly.yml +5 -0
  32. package/dist/assets/templates/html/health.html +1 -3
  33. package/dist/assets/workflows/workflow-template.md +32 -15
  34. package/dist/cli/invocation.js +40 -15
  35. package/dist/cli/parse-args.js +0 -22
  36. package/dist/cli/retired-commands.js +121 -0
  37. package/dist/cli/shared.js +154 -22
  38. package/dist/cli/unknown-flags.js +236 -0
  39. package/dist/cli-node.mjs +2 -1
  40. package/dist/cli.js +696 -258
  41. package/dist/commands/agent/agent-dispatch.js +14 -3
  42. package/dist/commands/agent/contribute-cli.js +73 -88
  43. package/dist/commands/completions.js +79 -22
  44. package/dist/commands/config-cli.js +17 -150
  45. package/dist/commands/env/env-cli.js +59 -143
  46. package/dist/commands/env/env.js +12 -163
  47. package/dist/commands/env/marker-path.js +6 -0
  48. package/dist/commands/env/secret-cli.js +36 -66
  49. package/dist/commands/env/secret.js +24 -57
  50. package/dist/commands/feedback-cli.js +141 -87
  51. package/dist/commands/health/accept-rate.js +58 -0
  52. package/dist/commands/health/advisories.js +3 -4
  53. package/dist/commands/health/checks.js +85 -23
  54. package/dist/commands/health/html-report.js +7 -10
  55. package/dist/commands/health/improve-metrics.js +25 -83
  56. package/dist/commands/health/md-report.js +5 -9
  57. package/dist/commands/health/metrics.js +62 -20
  58. package/dist/commands/health/renderers.js +47 -0
  59. package/dist/commands/health/report-view-model.js +4 -5
  60. package/dist/commands/health/stash-exposure.js +1 -1
  61. package/dist/commands/health/surfaces.js +3 -48
  62. package/dist/commands/health/task-runs.js +3 -67
  63. package/dist/commands/health/types-improve.js +7 -0
  64. package/dist/commands/health.js +99 -28
  65. package/dist/commands/improve/anti-collapse.js +2 -2
  66. package/dist/commands/improve/autonomy-gate.js +68 -0
  67. package/dist/commands/improve/collapse-detector.js +41 -40
  68. package/dist/commands/improve/consolidate/eligibility.js +1 -23
  69. package/dist/commands/improve/consolidate/merge.js +4 -0
  70. package/dist/commands/improve/consolidate.js +140 -1000
  71. package/dist/commands/improve/distill/promote-memory.js +12 -12
  72. package/dist/commands/improve/distill/quality-gate.js +6 -6
  73. package/dist/commands/improve/distill.js +58 -69
  74. package/dist/commands/improve/eligibility.js +105 -57
  75. package/dist/commands/improve/extract-cli.js +14 -133
  76. package/dist/commands/improve/improve-cli.js +98 -114
  77. package/dist/commands/improve/improve-result-file.js +1 -28
  78. package/dist/commands/improve/improve-strategies.js +8 -5
  79. package/dist/commands/improve/improve.js +128 -91
  80. package/dist/commands/improve/loop-stages.js +182 -20
  81. package/dist/commands/improve/memory/derived-ref.js +45 -43
  82. package/dist/commands/improve/memory/memory-belief.js +1 -1
  83. package/dist/commands/improve/memory/memory-contradiction-detect.js +4 -12
  84. package/dist/commands/improve/memory/memory-improve.js +6 -5
  85. package/dist/commands/improve/outcome-loop.js +22 -65
  86. package/dist/commands/improve/preparation.js +114 -123
  87. package/dist/commands/improve/proactive-maintenance.js +2 -5
  88. package/dist/commands/improve/reflect.js +56 -160
  89. package/dist/commands/improve/salience.js +11 -122
  90. package/dist/commands/improve/source-identity.js +10 -38
  91. package/dist/commands/lint/base-linter.js +20 -124
  92. package/dist/commands/lint/env-key-rules.js +31 -47
  93. package/dist/commands/lint/index.js +249 -43
  94. package/dist/commands/{events.js → log.js} +33 -38
  95. package/dist/commands/migrate-cli.js +92 -12
  96. package/dist/commands/migration-tool.js +46 -0
  97. package/dist/commands/observability-cli.js +70 -209
  98. package/dist/commands/proposal/drain.js +101 -29
  99. package/dist/commands/proposal/proposal-cli.js +76 -48
  100. package/dist/commands/proposal/proposal.js +54 -18
  101. package/dist/commands/proposal/propose-cli.js +88 -0
  102. package/dist/commands/proposal/propose.js +23 -15
  103. package/dist/commands/proposal/repository.js +701 -278
  104. package/dist/commands/proposal/validators/proposal-quality-validators.js +2 -8
  105. package/dist/commands/proposal/validators/proposal-validators.js +55 -7
  106. package/dist/commands/proposal/validators/proposals.js +4 -7
  107. package/dist/commands/read/curate.js +34 -53
  108. package/dist/commands/read/knowledge.js +150 -95
  109. package/dist/commands/read/registry-search.js +2 -2
  110. package/dist/commands/read/remember-cli.js +42 -15
  111. package/dist/commands/read/search-cli.js +180 -78
  112. package/dist/commands/read/search.js +58 -43
  113. package/dist/commands/read/show.js +197 -141
  114. package/dist/commands/registry-cli.js +12 -51
  115. package/dist/commands/remember.js +14 -57
  116. package/dist/commands/sources/add-cli.js +100 -31
  117. package/dist/commands/sources/bundle-cli.js +166 -0
  118. package/dist/commands/sources/bundle-config-ops.js +7 -2
  119. package/dist/commands/sources/info.js +18 -5
  120. package/dist/commands/sources/init.js +12 -12
  121. package/dist/commands/sources/installed-stashes.js +382 -98
  122. package/dist/commands/sources/schema-repair.js +3 -2
  123. package/dist/commands/sources/self-update.js +131 -38
  124. package/dist/commands/sources/source-add.js +72 -17
  125. package/dist/commands/sources/source-clone.js +129 -45
  126. package/dist/commands/sources/source-manage.js +43 -23
  127. package/dist/commands/sources/sources-cli.js +57 -208
  128. package/dist/commands/sources/stash-cli.js +46 -53
  129. package/dist/commands/tasks/tasks-cli.js +91 -97
  130. package/dist/commands/tasks/tasks.js +276 -421
  131. package/dist/commands/workflow-cli.js +175 -450
  132. package/dist/core/adapter/adapters/akm-adapter.js +47 -28
  133. package/dist/core/adapter/adapters/akm-lint.js +42 -27
  134. package/dist/core/adapter/adapters/akm-metadata.js +15 -44
  135. package/dist/core/adapter/adapters/akm-task-adapter.js +15 -13
  136. package/dist/core/adapter/adapters/akm-workflow-adapter.js +55 -71
  137. package/dist/core/adapter/adapters/dotenv-adapter.js +1 -1
  138. package/dist/core/adapter/adapters/generic-files-adapter.js +2 -0
  139. package/dist/core/adapter/adapters/index.js +6 -6
  140. package/dist/core/adapter/adapters/llm-wiki-adapter.js +14 -8
  141. package/dist/core/adapter/adapters/okf-adapter.js +187 -19
  142. package/dist/core/adapter/adapters/shared.js +3 -19
  143. package/dist/core/adapter/adapters/tool-dir-shared.js +8 -3
  144. package/dist/core/adapter/adapters/website-snapshot-adapter.js +1 -0
  145. package/dist/core/adapter/detect-adapter.js +17 -0
  146. package/dist/core/adapter/recognize-match.js +6 -4
  147. package/dist/core/adapter/validate-context.js +214 -0
  148. package/dist/core/asset/akm-markdown.js +63 -0
  149. package/dist/core/asset/asset-placement.js +20 -6
  150. package/dist/core/asset/asset-ref.js +11 -9
  151. package/dist/core/asset/frontmatter-lint.js +30 -0
  152. package/dist/core/asset/frontmatter.js +37 -9
  153. package/dist/core/asset/markdown.js +40 -51
  154. package/dist/core/asset/resolve-ref.js +89 -18
  155. package/dist/core/asset/stash-meta.js +1 -1
  156. package/dist/core/bundle-id.js +51 -0
  157. package/dist/core/common.js +152 -38
  158. package/dist/core/config/config-io.js +12 -1
  159. package/dist/core/config/config-schema.js +35 -8
  160. package/dist/core/config/config-sources.js +55 -11
  161. package/dist/core/config/config-walker.js +25 -9
  162. package/dist/core/config/config.js +9 -48
  163. package/dist/core/config/experimental.js +21 -0
  164. package/dist/core/config/schema/embedding.js +5 -1
  165. package/dist/core/config/schema/experimental.js +30 -0
  166. package/dist/core/config/schema/improve-processes.js +0 -6
  167. package/dist/core/config/schema/improve.js +21 -3
  168. package/dist/core/config/schema/index-config.js +8 -15
  169. package/dist/core/config/schema/output.js +4 -1
  170. package/dist/core/config/schema/setup.js +9 -18
  171. package/dist/core/config/schema/sources-bundles.js +49 -33
  172. package/dist/core/config/schema/workflow.js +3 -3
  173. package/dist/core/env-secret-ref.js +76 -46
  174. package/dist/core/errors.js +18 -12
  175. package/dist/core/events.js +46 -128
  176. package/dist/core/file-change.js +6 -5
  177. package/dist/core/fs-txn.js +83 -7
  178. package/dist/core/git-message.js +2 -2
  179. package/dist/core/improve-result.js +1 -100
  180. package/dist/core/lesson-lint.js +1 -17
  181. package/dist/core/logs-db.js +2 -1
  182. package/dist/core/migration-operation.js +16 -0
  183. package/dist/core/mutation-target.js +78 -0
  184. package/dist/core/parse.js +4 -1
  185. package/dist/core/paths.js +17 -20
  186. package/dist/core/recognition-util.js +12 -14
  187. package/dist/core/redaction.js +34 -0
  188. package/dist/core/standards/resolve-standards-context.js +2 -14
  189. package/dist/core/standards/resolve-stash-standards.js +2 -2
  190. package/dist/core/standards/resolve-type-conventions.js +2 -2
  191. package/dist/core/state/migrations.js +41 -18
  192. package/dist/core/state-db.js +5 -14
  193. package/dist/core/structured.js +1 -1
  194. package/dist/core/subprocess.js +6 -4
  195. package/dist/core/text-truncation.js +9 -5
  196. package/dist/core/type-presentation.js +3 -3
  197. package/dist/core/warn.js +0 -3
  198. package/dist/core/write-source.js +771 -95
  199. package/dist/indexer/bundle-identity-guard.js +3 -2
  200. package/dist/indexer/db/graph-db.js +0 -24
  201. package/dist/indexer/ensure-index.js +1 -0
  202. package/dist/indexer/graph/graph-boost.js +9 -34
  203. package/dist/indexer/graph/graph-extraction.js +8 -5
  204. package/dist/indexer/index-writer-lock.js +53 -17
  205. package/dist/indexer/index-written-assets.js +16 -22
  206. package/dist/indexer/indexer.js +497 -239
  207. package/dist/indexer/installations.js +14 -96
  208. package/dist/indexer/passes/dir-staleness.js +16 -9
  209. package/dist/indexer/passes/memory-inference.js +11 -9
  210. package/dist/indexer/passes/metadata.js +113 -47
  211. package/dist/indexer/scan/doc-to-entry.js +38 -1
  212. package/dist/indexer/scan/drain-dir.js +13 -23
  213. package/dist/indexer/search/db-search.js +99 -54
  214. package/dist/indexer/search/fts-query.js +47 -24
  215. package/dist/indexer/search/ranking-contributors.js +42 -20
  216. package/dist/indexer/search/ranking.js +18 -99
  217. package/dist/indexer/search/search-fields.js +7 -2
  218. package/dist/indexer/search/search-source.js +82 -93
  219. package/dist/indexer/usage/usage-events.js +0 -89
  220. package/dist/indexer/walk/file-context.js +2 -1
  221. package/dist/indexer/walk/matchers.js +30 -43
  222. package/dist/indexer/walk/path-resolver.js +7 -2
  223. package/dist/indexer/walk/walker.js +38 -12
  224. package/dist/integrations/agent/builders.js +0 -6
  225. package/dist/integrations/agent/config.js +2 -2
  226. package/dist/integrations/agent/detect.js +49 -19
  227. package/dist/integrations/agent/engine-fallback.js +76 -0
  228. package/dist/integrations/agent/profiles.js +14 -0
  229. package/dist/integrations/agent/prompts.js +12 -8
  230. package/dist/integrations/agent/runner-dispatch.js +4 -2
  231. package/dist/integrations/agent/runner.js +0 -1
  232. package/dist/integrations/agent/spawn.js +5 -6
  233. package/dist/integrations/github.js +1 -1
  234. package/dist/integrations/harnesses/aider/agent-builder.js +6 -4
  235. package/dist/integrations/harnesses/amazonq/agent-builder.js +7 -4
  236. package/dist/integrations/harnesses/claude/session-log.js +0 -10
  237. package/dist/integrations/harnesses/codex/agent-builder.js +5 -2
  238. package/dist/integrations/harnesses/copilot/agent-builder.js +5 -3
  239. package/dist/integrations/harnesses/gemini/agent-builder.js +5 -3
  240. package/dist/integrations/harnesses/index.js +3 -7
  241. package/dist/integrations/harnesses/opencode/agent-builder.js +21 -2
  242. package/dist/integrations/harnesses/opencode/session-log.js +0 -15
  243. package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +13 -4
  244. package/dist/integrations/harnesses/openhands/agent-builder.js +9 -6
  245. package/dist/integrations/harnesses/pi/agent-builder.js +6 -4
  246. package/dist/integrations/lockfile.js +101 -6
  247. package/dist/integrations/session-logs/index.js +3 -28
  248. package/dist/llm/client.js +136 -100
  249. package/dist/llm/embedders/remote.js +13 -5
  250. package/dist/llm/feature-gate.js +4 -12
  251. package/dist/llm/graph-extract.js +5 -11
  252. package/dist/llm/memory-infer.js +144 -1
  253. package/dist/llm/metadata-enhance.js +5 -7
  254. package/dist/llm/structured-call.js +1 -1
  255. package/dist/llm/usage-persist.js +26 -5
  256. package/dist/llm/usage-telemetry.js +25 -2
  257. package/dist/output/cli-hints.js +1 -2
  258. package/dist/output/context.js +22 -7
  259. package/dist/output/format-exempt.js +80 -0
  260. package/dist/output/generic-render.js +259 -0
  261. package/dist/output/render-registry.js +57 -0
  262. package/dist/output/renderers.js +14 -36
  263. package/dist/output/shapes/curate.js +10 -1
  264. package/dist/output/shapes/events.js +12 -7
  265. package/dist/output/shapes/helpers.js +56 -83
  266. package/dist/output/shapes/migrate.js +8 -0
  267. package/dist/output/shapes/passthrough.js +7 -41
  268. package/dist/output/shapes/proposal/producer.js +15 -7
  269. package/dist/output/shapes.js +2 -9
  270. package/dist/output/text/{init.js → bundle-create.js} +3 -1
  271. package/dist/output/text/bundle-show.js +7 -0
  272. package/dist/output/text/command-format.js +164 -96
  273. package/dist/output/text/env.js +1 -3
  274. package/dist/output/text/events.js +8 -7
  275. package/dist/output/text/health-format.js +103 -0
  276. package/dist/output/text/health.js +7 -0
  277. package/dist/output/text/helpers.js +10 -8
  278. package/dist/output/text/lint-format.js +43 -0
  279. package/dist/output/text/{save.js → lint.js} +2 -2
  280. package/dist/output/text/migrate.js +88 -0
  281. package/dist/output/text/proposal/producer.js +4 -2
  282. package/dist/output/text/proposal-format.js +44 -72
  283. package/dist/output/text/registry-commands.js +1 -2
  284. package/dist/output/text/show-directives.js +15 -7
  285. package/dist/output/text/status-list.js +32 -0
  286. package/dist/output/text/sync.js +5 -0
  287. package/dist/output/text/workflow-format.js +24 -203
  288. package/dist/output/text/workflow.js +1 -7
  289. package/dist/output/text.js +16 -17
  290. package/dist/registry/factory.js +4 -6
  291. package/dist/registry/origin-resolve.js +16 -27
  292. package/dist/registry/providers/skills-sh.js +3 -3
  293. package/dist/registry/providers/static-index.js +13 -23
  294. package/dist/registry/resolve.js +42 -7
  295. package/dist/registry/semver.js +34 -84
  296. package/dist/runtime.js +2 -23
  297. package/dist/scripts/akm-migrate-node.js +60290 -0
  298. package/dist/scripts/akm-migrate.js +59628 -0
  299. package/dist/setup/detect.js +42 -15
  300. package/dist/setup/registry-stash-loader.js +2 -2
  301. package/dist/setup/setup.js +236 -136
  302. package/dist/setup/steps/connection.js +7 -9
  303. package/dist/setup/steps/platforms.js +9 -9
  304. package/dist/setup/steps/semantic.js +15 -3
  305. package/dist/setup/steps/sources.js +12 -13
  306. package/dist/setup/steps/stashdir.js +2 -3
  307. package/dist/setup/steps/tasks.js +237 -120
  308. package/dist/sources/freshness.js +1 -1
  309. package/dist/sources/provider-factory.js +11 -17
  310. package/dist/sources/providers/filesystem.js +2 -3
  311. package/dist/sources/providers/git-install.js +278 -34
  312. package/dist/sources/providers/git-provider.js +25 -23
  313. package/dist/sources/providers/git-stash.js +395 -106
  314. package/dist/sources/providers/git.js +2 -2
  315. package/dist/sources/providers/npm.js +16 -19
  316. package/dist/sources/providers/provider-utils.js +7 -4
  317. package/dist/sources/providers/sync-from-ref.js +3 -9
  318. package/dist/sources/providers/website.js +6 -1
  319. package/dist/sources/resolve.js +6 -5
  320. package/dist/sources/snapshot-fetchers/bluesky.js +146 -0
  321. package/dist/sources/snapshot-fetchers/content-extract.js +566 -0
  322. package/dist/sources/snapshot-fetchers/fetcher-util.js +41 -0
  323. package/dist/sources/snapshot-fetchers/github.js +100 -0
  324. package/dist/sources/snapshot-fetchers/host-guard.js +291 -0
  325. package/dist/sources/snapshot-fetchers/registry.js +17 -1
  326. package/dist/sources/snapshot-fetchers/robots.js +348 -0
  327. package/dist/sources/snapshot-fetchers/rss.js +282 -0
  328. package/dist/sources/snapshot-fetchers/secret-seam.js +42 -0
  329. package/dist/sources/snapshot-fetchers/website-ingest.js +566 -268
  330. package/dist/sources/snapshot-fetchers/x.js +910 -0
  331. package/dist/storage/database.js +7 -0
  332. package/dist/storage/engines/sqlite-migrations.js +23 -111
  333. package/dist/storage/managed-db.js +2 -2
  334. package/dist/storage/repositories/canaries-repository.js +1 -1
  335. package/dist/storage/repositories/events-repository.js +27 -11
  336. package/dist/storage/repositories/improve-runs-repository.js +6 -12
  337. package/dist/storage/repositories/index-connection.js +17 -6
  338. package/dist/storage/repositories/index-entries-repository.js +151 -240
  339. package/dist/storage/repositories/index-entry-mapper.js +15 -11
  340. package/dist/storage/repositories/index-fts-repository.js +5 -2
  341. package/dist/storage/repositories/index-llm-cache-repository.js +0 -1
  342. package/dist/storage/repositories/index-meta-repository.js +2 -3
  343. package/dist/storage/repositories/index-schema.js +10 -25
  344. package/dist/storage/repositories/index-utility-repository.js +15 -28
  345. package/dist/storage/repositories/index-vec-repository.js +6 -1
  346. package/dist/storage/repositories/outcome-repository.js +119 -0
  347. package/dist/storage/repositories/proposals-repository.js +296 -59
  348. package/dist/storage/repositories/registry-cache.js +19 -0
  349. package/dist/storage/repositories/salience-repository.js +172 -0
  350. package/dist/storage/repositories/task-history-repository.js +15 -13
  351. package/dist/storage/repositories/workflow-runs-repository.js +52 -40
  352. package/dist/tasks/backends/cron.js +105 -15
  353. package/dist/tasks/backends/index.js +1 -1
  354. package/dist/tasks/backends/launchd.js +85 -38
  355. package/dist/tasks/backends/schtasks.js +135 -15
  356. package/dist/tasks/embedded.js +56 -40
  357. package/dist/tasks/parser.js +7 -157
  358. package/dist/tasks/resolve-akm-bin.js +137 -59
  359. package/dist/tasks/runner.js +79 -42
  360. package/dist/tasks/scheduler-invocation.js +220 -10
  361. package/dist/tasks/schema.js +24 -1
  362. package/dist/tasks/task-id.js +1 -3
  363. package/dist/tasks/validator.js +20 -6
  364. package/dist/workflows/authoring/authoring.js +94 -143
  365. package/dist/workflows/authoring/scope-key.js +1 -1
  366. package/dist/workflows/exec/frozen-judge.js +28 -2
  367. package/dist/workflows/exec/native-executor.js +77 -57
  368. package/dist/workflows/exec/param-secrets.js +9 -9
  369. package/dist/workflows/exec/run-workflow.js +133 -79
  370. package/dist/workflows/exec/step-work.js +219 -346
  371. package/dist/{migrate-storage-node.mjs → workflows/exec/unit-dispatch.js} +1 -5
  372. package/dist/workflows/ir/compile.js +141 -270
  373. package/dist/workflows/ir/freeze.js +40 -30
  374. package/dist/workflows/ir/params.js +135 -11
  375. package/dist/workflows/ir/plan-hash.js +1 -1
  376. package/dist/workflows/ir/schema.js +25 -26
  377. package/dist/workflows/parser.js +872 -307
  378. package/dist/workflows/program/expressions.js +20 -208
  379. package/dist/workflows/program/schema.js +7 -10
  380. package/dist/workflows/renderer.js +95 -68
  381. package/dist/workflows/resource-limits.js +2 -0
  382. package/dist/workflows/runtime/checkin.js +3 -3
  383. package/dist/workflows/runtime/plan-classifier.js +16 -75
  384. package/dist/workflows/runtime/runs.js +186 -127
  385. package/dist/workflows/runtime/unit-checkin.js +1 -1
  386. package/dist/workflows/runtime/unit-phases.js +2 -2
  387. package/dist/workflows/runtime/workflow-asset-loader.js +232 -83
  388. package/dist/workflows/schema.js +1 -11
  389. package/dist/workflows/validate-summary.js +30 -36
  390. package/dist/workflows/validator.js +21 -62
  391. package/docs/README.md +68 -0
  392. package/docs/migration/README.md +8 -0
  393. package/docs/migration/release-notes/0.7.0.md +11 -11
  394. package/docs/migration/release-notes/0.9.0.md +208 -27
  395. package/docs/migration/v0.7-to-v0.8.md +46 -47
  396. package/docs/migration/v0.8-to-v0.9.md +564 -208
  397. package/docs/migration/v0.9.0-troubleshooting.md +561 -0
  398. package/docs/reference/README.md +12 -0
  399. package/docs/reference/cli.md +2253 -0
  400. package/docs/reference/configuration.md +358 -0
  401. package/docs/reference/data-and-telemetry.md +105 -42
  402. package/docs/reference/workflows.md +647 -0
  403. package/package.json +22 -11
  404. package/schemas/akm-asset-envelope.json +93 -0
  405. package/schemas/akm-config.json +81 -128
  406. package/schemas/akm-workflow.json +74 -73
  407. package/dist/assets/tasks/core/backup.yml +0 -5
  408. package/dist/assets/tasks/graph-refresh-weekly.yml +0 -10
  409. package/dist/cli/config-migrate.js +0 -1806
  410. package/dist/cli/config-validate.js +0 -41
  411. package/dist/commands/backup-cli.js +0 -56
  412. package/dist/commands/bundle/bundle-cli.js +0 -68
  413. package/dist/commands/bundle/bundle.js +0 -219
  414. package/dist/commands/graph/graph-cli.js +0 -124
  415. package/dist/commands/graph/graph.js +0 -489
  416. package/dist/commands/improve/extract-watch.js +0 -140
  417. package/dist/commands/mv-cli.js +0 -1221
  418. package/dist/commands/sources/history.js +0 -201
  419. package/dist/commands/tasks/default-tasks.js +0 -186
  420. package/dist/core/migration-backup.js +0 -1234
  421. package/dist/indexer/usage/unmigrated-vaults-guard.js +0 -95
  422. package/dist/llm/memory-infer-impl.js +0 -138
  423. package/dist/migrate/legacy/config-source-migration.js +0 -223
  424. package/dist/migrate/legacy/content-migration.js +0 -305
  425. package/dist/migrate/legacy/legacy-layout.js +0 -779
  426. package/dist/migrate/legacy/legacy-paths.js +0 -25
  427. package/dist/migrate/legacy/legacy-stash-json.js +0 -72
  428. package/dist/migrate/legacy/proposal-fs-import.js +0 -168
  429. package/dist/migrate/legacy/task-target-ref-migration.js +0 -272
  430. package/dist/migrate/legacy/three-db-cutover.js +0 -841
  431. package/dist/migrate/legacy/workflow-migrations-bodies.js +0 -52
  432. package/dist/migrate/legacy/workflow-migrations-frozen.js +0 -21
  433. package/dist/migrate/legacy-ref-grammar.js +0 -214
  434. package/dist/output/shapes/distill.js +0 -14
  435. package/dist/output/shapes/history.js +0 -11
  436. package/dist/output/text/distill.js +0 -6
  437. package/dist/output/text/enable-disable.js +0 -8
  438. package/dist/output/text/history.js +0 -6
  439. package/dist/registry/build-index.js +0 -382
  440. package/dist/schemas/akm-config.json +0 -4704
  441. package/dist/schemas/akm-task.json +0 -87
  442. package/dist/schemas/akm-workflow.json +0 -372
  443. package/dist/scripts/migrate-storage.js +0 -3816
  444. package/dist/workflows/authoring/workflow-program-template.yaml +0 -31
  445. package/dist/workflows/cli.js +0 -53
  446. package/dist/workflows/exec/brief.js +0 -481
  447. package/dist/workflows/exec/report.js +0 -1460
  448. package/dist/workflows/exec/watch.js +0 -116
  449. package/dist/workflows/program/parser.js +0 -813
  450. package/dist/workflows/program/project.js +0 -104
@@ -1,110 +1,20 @@
1
1
  // This Source Code Form is subject to the terms of the Mozilla Public
2
2
  // License, v. 2.0. If a copy of the MPL was not distributed with this
3
3
  // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
+ const GRAMMAR_HINT = "allowed forms: params.<name>, steps.<id>.output(.<ident>|[<int>])*";
4
5
  /**
5
- * The deterministic expression language for YAML orchestration programs
6
- * (R1 redesign addendum). `${{ ... }}` delimits references; everything else
7
- * is literal text that passes through byte-exact.
8
- *
9
- * The grammar is CLOSED — exactly four roots, nothing else parses:
10
- *
11
- * params.<ident>
12
- * steps.<ident>.output( .<ident> | [<non-negative int>] )*
13
- * item
14
- * item_index
15
- *
16
- * where <ident> is `[A-Za-z_][A-Za-z0-9_-]*`. No functions, no clock, no
17
- * randomness, no ambient lookup — orchestration decisions stay pure
18
- * functions of (frozen plan, params, journaled unit results).
19
- *
20
- * Templates are parsed ONCE into literal/reference segments; resolution is a
21
- * single pass over that AST. Substituted content is data, never re-scanned,
22
- * so a value containing `${{ params.x }}` is inserted literally — the P1
23
- * re-scan injection bug class is structurally impossible.
24
- *
25
- * There is deliberately NO escape syntax in v1: a literal `${{` cannot
26
- * appear in instructions. Authors who write one get a parse error from the
27
- * validator (unterminated or invalid reference) telling them so.
28
- *
29
- * Pure module: no IO, no engine imports.
6
+ * Parse a bare reference string (a whole-value frontmatter field, already
7
+ * delimiter-free: `map.over`, `route.input`, or one entry of `inputs[]`).
30
8
  */
31
- const OPEN = "${{";
32
- const CLOSE = "}}";
33
- // ── Template parsing ─────────────────────────────────────────────────────────
34
- /**
35
- * Split a template into literal and reference segments. Literal text passes
36
- * through byte-exact, including `$`, `{`, `}`, `${`, `{{`, and `}}` sequences
37
- * that do not form the exact `${{` opener. Errors are returned, not thrown.
38
- */
39
- export function parseTemplate(template) {
40
- const segments = [];
41
- const errors = [];
42
- let cursor = 0;
43
- while (cursor < template.length) {
44
- const open = template.indexOf(OPEN, cursor);
45
- if (open === -1)
46
- break;
47
- if (open > cursor)
48
- segments.push({ kind: "literal", text: template.slice(cursor, open) });
49
- const close = template.indexOf(CLOSE, open + OPEN.length);
50
- const nested = template.indexOf(OPEN, open + OPEN.length);
51
- if (close === -1) {
52
- errors.push({
53
- index: open,
54
- message: `Unterminated ${OPEN} reference (no matching ${CLOSE}). ` +
55
- `Note: there is no escape syntax — a literal ${OPEN} cannot appear in this text.`,
56
- });
57
- cursor = template.length;
58
- break;
59
- }
60
- if (nested !== -1 && nested < close) {
61
- errors.push({
62
- index: nested,
63
- message: `Nested ${OPEN} inside a reference — references cannot contain other references.`,
64
- });
65
- cursor = close + CLOSE.length;
66
- continue;
67
- }
68
- const inner = template.slice(open + OPEN.length, close);
69
- const parsed = parseExpression(inner);
70
- if (parsed.ok) {
71
- segments.push({
72
- kind: "reference",
73
- expr: parsed.expr,
74
- raw: template.slice(open, close + CLOSE.length),
75
- index: open,
76
- });
77
- }
78
- else {
79
- errors.push({ index: open, message: parsed.message });
80
- }
81
- cursor = close + CLOSE.length;
82
- }
83
- if (cursor < template.length)
84
- segments.push({ kind: "literal", text: template.slice(cursor) });
85
- return errors.length > 0 ? { ok: false, errors } : { ok: true, segments };
86
- }
87
- const GRAMMAR_HINT = "allowed forms: params.<name>, steps.<id>.output[...], item, item_index";
88
- /**
89
- * Parse a single expression (the text between `${{` and `}}`, or a bare
90
- * whole-value field such as `map.over` after delimiter stripping).
91
- */
92
- export function parseExpression(source) {
9
+ export function parseReference(source) {
93
10
  const text = source.trim();
94
11
  if (text === "")
95
- return { ok: false, message: `Empty expression inside ${OPEN} ${CLOSE}; ${GRAMMAR_HINT}.` };
12
+ return { ok: false, message: `Empty reference; ${GRAMMAR_HINT}.` };
96
13
  const root = readIdent(text, 0);
97
14
  if (!root) {
98
- return { ok: false, message: `Invalid expression "${text}" — must start with an identifier; ${GRAMMAR_HINT}.` };
15
+ return { ok: false, message: `Invalid reference "${text}" — must start with an identifier; ${GRAMMAR_HINT}.` };
99
16
  }
100
17
  switch (root.name) {
101
- case "item":
102
- case "item_index": {
103
- if (root.end !== text.length) {
104
- return { ok: false, message: `"${root.name}" takes no path — found trailing "${text.slice(root.end)}".` };
105
- }
106
- return { ok: true, expr: root.name === "item" ? { kind: "item" } : { kind: "itemIndex" } };
107
- }
108
18
  case "params": {
109
19
  if (text[root.end] !== ".") {
110
20
  return { ok: false, message: `"params" requires a name: params.<name> (got "${text}").` };
@@ -188,78 +98,10 @@ function parsePath(text, start) {
188
98
  return { ok: true, path };
189
99
  }
190
100
  // ── Resolution ───────────────────────────────────────────────────────────────
191
- /**
192
- * Resolve parsed segments against a scope in a SINGLE pass — resolved values
193
- * are concatenated as data and never re-scanned for further references.
194
- * Strings insert verbatim; numbers/booleans via String(); objects/arrays as
195
- * canonical JSON (recursively sorted keys); null/undefined/missing paths are
196
- * resolution errors naming the reference.
197
- */
198
- export function resolveTemplate(segments, scope) {
199
- const parts = [];
200
- const errors = [];
201
- for (const segment of segments) {
202
- if (segment.kind === "literal") {
203
- parts.push(segment.text);
204
- continue;
205
- }
206
- const resolved = resolveReference(segment.expr, scope);
207
- if (!resolved.ok) {
208
- errors.push(resolved.error);
209
- continue;
210
- }
211
- const value = resolved.value;
212
- if (typeof value === "string") {
213
- parts.push(value);
214
- }
215
- else if (typeof value === "number" || typeof value === "boolean") {
216
- parts.push(String(value));
217
- }
218
- else if (typeof value === "object" && value !== null) {
219
- parts.push(canonicalJson(value));
220
- }
221
- else {
222
- errors.push({
223
- reference: formatReference(segment.expr),
224
- message: `${formatReference(segment.expr)} resolved to an unsupported value type (${typeof value}).`,
225
- });
226
- }
227
- }
228
- return errors.length > 0 ? { ok: false, errors } : { ok: true, text: parts.join("") };
229
- }
230
- /**
231
- * Resolve a whole-value field (`map.over`, `route.input`) from its RAW
232
- * template string: the text must be exactly one `${{ … }}` reference with no
233
- * surrounding literal text (the compiler enforces this for YAML programs;
234
- * frozen plans are re-checked here so a tampered/legacy plan fails loudly
235
- * instead of string-splicing). The reference resolves to its RAW value —
236
- * arrays stay arrays, objects stay objects.
237
- */
238
- export function resolveWholeValue(template, scope) {
239
- const parsed = parseTemplate(template);
240
- if (!parsed.ok) {
241
- return {
242
- ok: false,
243
- error: { reference: template, message: parsed.errors.map((e) => e.message).join(" ") },
244
- };
245
- }
246
- const [first] = parsed.segments;
247
- if (parsed.segments.length !== 1 || first?.kind !== "reference") {
248
- return {
249
- ok: false,
250
- error: {
251
- reference: template,
252
- message: `expected a single whole-value \${{ … }} reference with no surrounding text ` +
253
- `(e.g. "\${{ steps.discover.output.files }}"), got ${JSON.stringify(template)}.`,
254
- },
255
- };
256
- }
257
- return resolveReference(first.expr, scope);
258
- }
259
101
  /**
260
102
  * Resolve a single reference to its RAW value for whole-value contexts
261
- * (`map.over`, `route.input`): arrays stay arrays, objects stay objects.
262
- * null/undefined values and missing paths are errors, same as in templates.
103
+ * (`map.over`, `route.input`, `inputs[]`): arrays stay arrays, objects stay
104
+ * objects. null/undefined values and missing paths are errors.
263
105
  */
264
106
  export function resolveReference(expr, scope) {
265
107
  const reference = formatReference(expr);
@@ -271,16 +113,6 @@ export function resolveReference(expr, scope) {
271
113
  }
272
114
  return finish(scope.params[expr.name], reference, fail);
273
115
  }
274
- case "item": {
275
- if (scope.item === undefined)
276
- return fail("item is only available inside a map unit.");
277
- return finish(scope.item, reference, fail);
278
- }
279
- case "itemIndex": {
280
- if (typeof scope.itemIndex !== "number")
281
- return fail("item_index is only available inside a map unit.");
282
- return { ok: true, value: scope.itemIndex };
283
- }
284
116
  case "stepOutput": {
285
117
  if (!Object.hasOwn(scope.stepOutputs, expr.stepId)) {
286
118
  return fail(`steps.${expr.stepId}.output is not available — step "${expr.stepId}" has no recorded output.`);
@@ -313,6 +145,18 @@ export function resolveReference(expr, scope) {
313
145
  }
314
146
  }
315
147
  }
148
+ /**
149
+ * Resolve a bare reference STRING directly (parse + resolve in one call) —
150
+ * the shape every whole-value frontmatter position (`map.over`, `route.input`,
151
+ * one entry of `inputs[]`) actually needs.
152
+ */
153
+ export function resolveReferenceString(text, scope) {
154
+ const parsed = parseReference(text);
155
+ if (!parsed.ok) {
156
+ return { ok: false, error: { reference: text, message: parsed.message } };
157
+ }
158
+ return resolveReference(parsed.expr, scope);
159
+ }
316
160
  function finish(value, reference, fail) {
317
161
  if (value === undefined)
318
162
  return fail(`${reference} resolved to undefined.`);
@@ -321,24 +165,11 @@ function finish(value, reference, fail) {
321
165
  return { ok: true, value };
322
166
  }
323
167
  // ── Introspection helpers ────────────────────────────────────────────────────
324
- /** The reference ASTs of a parsed template, in document order — for validator edge checking. */
325
- export function listReferences(segments) {
326
- const references = [];
327
- for (const segment of segments) {
328
- if (segment.kind === "reference")
329
- references.push(segment.expr);
330
- }
331
- return references;
332
- }
333
168
  /** Canonical source spelling of a reference, e.g. `steps.review.output.files[2].name`. */
334
169
  export function formatReference(expr) {
335
170
  switch (expr.kind) {
336
171
  case "param":
337
172
  return `params.${expr.name}`;
338
- case "item":
339
- return "item";
340
- case "itemIndex":
341
- return "item_index";
342
173
  case "stepOutput": {
343
174
  let text = `steps.${expr.stepId}.output`;
344
175
  for (const segment of expr.path) {
@@ -348,22 +179,3 @@ export function formatReference(expr) {
348
179
  }
349
180
  }
350
181
  }
351
- // ── Canonical JSON ───────────────────────────────────────────────────────────
352
- /**
353
- * Stable stringify with recursively sorted object keys, so equal values
354
- * render identically regardless of key insertion order. Same pattern as the
355
- * module-private helper in exec/native-executor.ts (not exported there).
356
- */
357
- function canonicalJson(value) {
358
- return JSON.stringify(sortKeys(value));
359
- }
360
- function sortKeys(value) {
361
- if (Array.isArray(value))
362
- return value.map(sortKeys);
363
- if (value && typeof value === "object") {
364
- return Object.fromEntries(Object.entries(value)
365
- .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))
366
- .map(([k, v]) => [k, sortKeys(v)]));
367
- }
368
- return value;
369
- }
@@ -1,14 +1,11 @@
1
1
  // This Source Code Form is subject to the terms of the Mozilla Public
2
2
  // License, v. 2.0. If a copy of the MPL was not distributed with this
3
3
  // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
- export const WORKFLOW_PROGRAM_VERSION = 2;
5
- /** @deprecated source v2 rejects runner; retained for TypeScript migration only. */
6
- export const PROGRAM_RUNNER_KINDS = ["llm", "agent", "sdk", "inherit"];
7
4
  /** How a map step folds its per-item unit results into the step artifact. */
8
5
  export const PROGRAM_REDUCERS = ["collect", "vote"];
9
6
  /** Failure policy: fail the step on first unit failure, or record and go on. */
10
7
  export const PROGRAM_ON_ERROR = ["fail", "continue"];
11
- /** Filesystem isolation for file-mutating units (enforcement is R2). */
8
+ /** Filesystem isolation for file-mutating units. */
12
9
  export const PROGRAM_ISOLATION_KINDS = ["none", "worktree"];
13
10
  /**
14
11
  * `retry.on` vocabulary — exactly the persisted `AgentFailureReason` taxonomy
@@ -32,15 +29,15 @@ const RETRY_REASON_SET = {
32
29
  };
33
30
  export const PROGRAM_RETRY_REASONS = Object.keys(RETRY_REASON_SET);
34
31
  /**
35
- * Step ids: `[A-Za-z_][A-Za-z0-9_-]*` (also pinned in the JSON Schema).
36
- *
37
- * This is EXACTLY the `<ident>` grammar `readIdent` accepts in
38
- * `program/expressions.ts` for `${{ steps.<id>.output }}` references: a
32
+ * Step ids: `[A-Za-z_][A-Za-z0-9_-]*` (also pinned in the JSON Schema) — the
33
+ * ONE id grammar for the unified format (workflow-format-unification, spec
34
+ * §2.2). This is EXACTLY the `<ident>` grammar `readIdent` accepts in
35
+ * `program/expressions.ts` for `steps.<id>.output` references: a
39
36
  * letter/underscore first char, then letters/digits/underscores/dashes, and
40
37
  * NO dots (the expression parser treats `.` as the `.output` path separator,
41
38
  * so a dotted id could never be addressed). Keeping step ids inside the
42
39
  * addressable grammar guarantees every step can be referenced from map
43
- * inputs, routes, and unit templates without renaming.
40
+ * inputs, routes, and `inputs:` without renaming.
44
41
  *
45
42
  * Forbidding dots additionally keeps the engine's internal gate-row node id
46
43
  * `<stepId>.gate` collision-free: no user step id can contain a dot, so it can
@@ -48,7 +45,7 @@ export const PROGRAM_RETRY_REASONS = Object.keys(RETRY_REASON_SET);
48
45
  */
49
46
  export const PROGRAM_STEP_ID_PATTERN = /^[A-Za-z_][A-Za-z0-9_-]*$/;
50
47
  /**
51
- * Param names must be `${{ params.<ident> }}`-addressable, so they are plain
48
+ * Param names must be `params.<ident>`-addressable, so they are plain
52
49
  * identifiers (no dots/dashes).
53
50
  */
54
51
  export const PROGRAM_PARAM_NAME_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/;
@@ -2,31 +2,21 @@
2
2
  // License, v. 2.0. If a copy of the MPL was not distributed with this
3
3
  // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
4
  /**
5
- * Show + indexing renderers for workflow assets.
6
- *
7
- * Two formats, one asset type:
8
- *
9
- * - `workflow-md` reads the classic linear markdown via `parseWorkflow`
10
- * and projects the validated `WorkflowDocument` down to the public
11
- * `ShowResponse` shape (which still uses the flat
12
- * `WorkflowStepDefinition` type for backwards compatibility) and into
13
- * search hints for the indexer.
14
- * - `workflow-program-yaml` — reads a YAML workflow *program* (redesign
15
- * addendum, R1) via `parseWorkflowProgram` and projects it through
16
- * `program/project.ts`, including a compact orchestration summary per
17
- * step (runner/model, `fanOut.over` expression, route table).
5
+ * Show + indexing renderer for the unified workflow asset (workflow-format-
6
+ * unification). One format now: reads the frontmatter+body document via
7
+ * `parseWorkflow` and projects the validated `WorkflowDocument` down to the
8
+ * public `ShowResponse` shape and into search hints for the indexer,
9
+ * including a compact per-step orchestration summary (engine/model,
10
+ * `map.over` reference, route table) when the step declares one.
18
11
  */
19
12
  import { displayRef } from "../core/asset/resolve-ref.js";
20
13
  import { UsageError } from "../core/errors.js";
21
14
  import { parseWorkflow } from "./parser.js";
22
- import { parseWorkflowProgram } from "./program/parser.js";
23
- import { programStepInstructions, projectProgramParameters, summarizeProgramStepOrchestration, WORKFLOW_PROGRAM_RENDERER_NAME, } from "./program/project.js";
24
- export { WORKFLOW_PROGRAM_RENDERER_NAME };
25
15
  function shellQuote(value) {
26
16
  return `'${value.replace(/'/g, `'\\''`)}'`;
27
17
  }
28
18
  export function buildWorkflowAction(ref) {
29
- return `Resume the active run or start a new run with \`akm workflow next ${shellQuote(ref)}\`.`;
19
+ return `Start or resume execution with \`akm workflow run ${shellQuote(ref)}\`.`;
30
20
  }
31
21
  function deriveName(ctx) {
32
22
  const metaName = ctx.matchResult.meta?.name;
@@ -42,73 +32,110 @@ function loadDocument(ctx) {
42
32
  const summary = result.errors.map((e) => `${ctx.relPath}:${e.line} — ${e.message}`).join("\n");
43
33
  throw new UsageError(`Workflow has errors:\n${summary}`);
44
34
  }
35
+ /**
36
+ * The instruction text a step contributes to the flat step projection. A
37
+ * route step has no body requirement, so a deterministic description of the
38
+ * routing table stands in when it declares no section (the spine still needs
39
+ * a non-empty instructions string).
40
+ */
41
+ function stepInstructions(step) {
42
+ if (step.instructions)
43
+ return step.instructions.text;
44
+ if (step.route) {
45
+ const branches = step.route.branches.map((b) => `"${b.match}" -> ${b.stepId}`);
46
+ if (step.route.defaultStepId !== undefined)
47
+ branches.push(`default -> ${step.route.defaultStepId}`);
48
+ return `Route on ${step.route.input}: ${branches.join(", ")}.`;
49
+ }
50
+ return "";
51
+ }
52
+ /** Project the `params` block into the flat `WorkflowParameter` list. */
53
+ function projectParameters(document) {
54
+ if (!document.params)
55
+ return undefined;
56
+ const parameters = Object.entries(document.params).map(([name, schema]) => {
57
+ const description = schema.description;
58
+ return { name, ...(typeof description === "string" && description !== "" ? { description } : {}) };
59
+ });
60
+ return parameters.length > 0 ? parameters : undefined;
61
+ }
62
+ /**
63
+ * Compact, show-facing orchestration summary for one step. Field mapping:
64
+ * `engine`/`model`/`timeoutMs` merge the run-level `defaults` exactly like the
65
+ * compiler does (per-unit override wins), `fanOut.over` carries the raw
66
+ * reference string, and `route` carries the explicit input + branch table.
67
+ * Returns undefined when the step declares nothing worth summarizing.
68
+ */
69
+ function summarizeStepOrchestration(step, defaults) {
70
+ const unit = step.unit ?? step.map?.unit;
71
+ const engine = unit?.engine ?? defaults?.engine;
72
+ const model = unit?.model ?? defaults?.model;
73
+ const timeoutMs = unit?.timeoutMs !== undefined ? unit.timeoutMs : defaults?.timeoutMs;
74
+ const summary = {
75
+ ...(engine !== undefined ? { engine } : {}),
76
+ ...(model !== undefined ? { model } : {}),
77
+ ...(timeoutMs !== undefined ? { timeoutMs } : {}),
78
+ ...(step.map
79
+ ? {
80
+ fanOut: {
81
+ over: step.map.over,
82
+ ...(step.map.concurrency !== undefined ? { concurrency: step.map.concurrency } : {}),
83
+ reducer: step.map.reducer ?? "collect",
84
+ },
85
+ }
86
+ : {}),
87
+ ...(unit?.output !== undefined || step.output !== undefined ? { hasSchema: true } : {}),
88
+ ...(unit?.env !== undefined ? { env: [...unit.env] } : {}),
89
+ ...(step.route
90
+ ? {
91
+ route: {
92
+ input: step.route.input,
93
+ branches: step.route.branches.map((b) => ({ match: b.match, stepId: b.stepId })),
94
+ ...(step.route.defaultStepId !== undefined ? { defaultStepId: step.route.defaultStepId } : {}),
95
+ },
96
+ }
97
+ : {}),
98
+ };
99
+ return Object.keys(summary).length > 0 ? summary : undefined;
100
+ }
101
+ function projectStepDefinitions(document) {
102
+ return document.steps.map((step) => {
103
+ const orchestration = summarizeStepOrchestration(step, document.defaults);
104
+ return {
105
+ id: step.id,
106
+ // No titles anywhere in the unified format — a step IS its id.
107
+ title: step.id,
108
+ instructions: stepInstructions(step),
109
+ ...(step.gateRubric?.text.trim() ? { completionCriteria: [step.gateRubric.text] } : {}),
110
+ sequenceIndex: step.sequenceIndex,
111
+ ...(orchestration ? { orchestration } : {}),
112
+ };
113
+ });
114
+ }
45
115
  export const workflowMdRenderer = {
46
116
  name: "workflow-md",
47
117
  buildShowResponse(ctx) {
48
118
  const name = deriveName(ctx);
49
119
  const doc = loadDocument(ctx);
50
- // WI-8.5b (display flip): the `akm workflow next <ref>` action is DISPLAY
120
+ // WI-8.5b (display flip): the `akm workflow run <ref>` action is DISPLAY
51
121
  // output — its spelling follows the D-R5 display rule (`displayRef`). A
52
122
  // primary/default-bundle workflow renders the SHORT conceptId
53
123
  // (`workflows/<name>`); a named source qualifies it as
54
124
  // (`<bundle>//workflows/<name>`).
55
- const ref = displayRef({ type: "workflow", name, bundleId: ctx.origin });
125
+ const ref = displayRef({ type: "workflow", name, bundleId: ctx.origin }, ctx.defaultBundle);
126
+ const parameters = projectParameters(doc);
56
127
  return {
57
128
  type: "workflow",
58
129
  name,
59
130
  path: ctx.absPath,
60
131
  action: buildWorkflowAction(ref),
132
+ ...(doc.preamble ? { content: doc.preamble } : {}),
61
133
  description: doc.description,
62
- workflowTitle: doc.title,
63
- parameters: doc.parameters?.map((p) => p.name),
64
- workflowParameters: doc.parameters?.map((p) => ({ name: p.name, description: p.description })),
65
- steps: doc.steps.map((s) => ({
66
- id: s.id,
67
- title: s.title,
68
- instructions: s.instructions.text,
69
- ...(s.completionCriteria ? { completionCriteria: s.completionCriteria.map((c) => c.text) } : {}),
70
- sequenceIndex: s.sequenceIndex,
71
- })),
72
- };
73
- },
74
- };
75
- function loadProgram(ctx) {
76
- const result = parseWorkflowProgram(ctx.content(), { path: ctx.relPath });
77
- if (result.ok)
78
- return result.program;
79
- const summary = result.errors.map((e) => `${ctx.relPath}:${e.line} — ${e.message}`).join("\n");
80
- throw new UsageError(`Workflow has errors:\n${summary}`);
81
- }
82
- /** Show renderer for YAML workflow programs — mirrors `workflowMdRenderer`. */
83
- export const workflowProgramRenderer = {
84
- name: WORKFLOW_PROGRAM_RENDERER_NAME,
85
- buildShowResponse(ctx) {
86
- const name = deriveName(ctx);
87
- const program = loadProgram(ctx);
88
- // WI-8.5b (display flip): the `akm workflow next <ref>` action is DISPLAY
89
- // output — its spelling follows the D-R5 display rule (`displayRef`), mirroring
90
- // workflowMdRenderer above.
91
- const ref = displayRef({ type: "workflow", name, bundleId: ctx.origin });
92
- const parameters = projectProgramParameters(program);
93
- return {
94
- type: "workflow",
95
- name,
96
- path: ctx.absPath,
97
- action: buildWorkflowAction(ref),
98
- description: program.description,
99
- workflowTitle: program.name,
134
+ // No authored title in the unified format — the asset's human name is
135
+ // its `description`/H1 like any other asset; this is its canonical name.
136
+ workflowTitle: name,
100
137
  ...(parameters ? { parameters: parameters.map((p) => p.name), workflowParameters: parameters } : {}),
101
- steps: program.steps.map((step, index) => {
102
- const orchestration = summarizeProgramStepOrchestration(step, program.defaults);
103
- return {
104
- id: step.id,
105
- title: step.title ?? step.id,
106
- instructions: programStepInstructions(step),
107
- ...(step.gate ? { completionCriteria: [...step.gate.criteria] } : {}),
108
- sequenceIndex: index,
109
- ...(orchestration ? { orchestration } : {}),
110
- };
111
- }),
138
+ steps: projectStepDefinitions(doc),
112
139
  };
113
140
  },
114
141
  };
@@ -12,6 +12,8 @@ export const WORKFLOW_MAX_SCHEMA_BYTES = 256 * 1024;
12
12
  export const WORKFLOW_MAX_EXTRA_PARAMS_BYTES = 64 * 1024;
13
13
  export const WORKFLOW_MAX_JSON_DEPTH = 64;
14
14
  export const WORKFLOW_MAX_MAP_EXPANSION = 10_000;
15
+ /** Max declared `inputs:` reference strings on one unit/map step. */
16
+ export const WORKFLOW_MAX_INPUTS = 64;
15
17
  export function utf8Bytes(value) {
16
18
  return Buffer.byteLength(value, "utf8");
17
19
  }
@@ -9,7 +9,7 @@
9
9
  * reconciles #506 (file/command-loop signal) with #501 (background thread) in
10
10
  * favour of the former. There is intentionally NO timer or resident process
11
11
  * here. Arming a check-in writes a timestamp (`checkin_armed_at`) on the run
12
- * row; the next time the agent polls the engine via `workflow next`/`status`,
12
+ * row; the next time the agent polls the engine via `workflow run`/`status`,
13
13
  * {@link evaluateCheckin} is called to decide — purely from timestamps — whether
14
14
  * the run looks stalled and a strong `continue` directive should be surfaced
15
15
  * through the normal command output.
@@ -48,8 +48,8 @@ export function evaluateCheckin(run, now = Date.now(), stallMs = CHECKIN_STALL_M
48
48
  return {
49
49
  signal: "continue",
50
50
  directive: "CONTINUE: this workflow run has stalled with no progress. Resume immediately — " +
51
- "re-read the current step's instructions, finish the outstanding work, then call " +
52
- "`akm workflow complete` with a summary. Do not stop until the step is complete.",
51
+ "inspect its status, then call `akm workflow run` with the run id to finish the outstanding work. " +
52
+ "Do not stop until the run reaches a terminal state or reports a verification rejection.",
53
53
  idleMs,
54
54
  agentHarness: run.agentHarness ?? null,
55
55
  agentSessionId: run.agentSessionId ?? null,