akm-cli 0.9.0-rc.1 → 0.9.0-rc.13

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 (587) hide show
  1. package/CHANGELOG.md +1190 -52
  2. package/README.md +62 -37
  3. package/SECURITY.md +46 -31
  4. package/dist/akm +162 -38
  5. package/dist/akm-migrate +44 -0
  6. package/dist/assets/backends/schtasks-template.xml +2 -1
  7. package/dist/assets/hints/cli-hints-full.md +268 -118
  8. package/dist/assets/hints/cli-hints-short.md +87 -24
  9. package/dist/assets/{profiles → improve-strategies}/catchup.json +3 -1
  10. package/dist/assets/{profiles → improve-strategies}/consolidate.json +3 -1
  11. package/dist/assets/{profiles → improve-strategies}/default.json +6 -7
  12. package/dist/assets/improve-strategies/frequent.json +15 -0
  13. package/dist/assets/{profiles → improve-strategies}/graph-refresh.json +4 -2
  14. package/dist/assets/{profiles → improve-strategies}/memory-focus.json +4 -1
  15. package/dist/assets/{profiles → improve-strategies}/proactive-maintenance.json +5 -5
  16. package/dist/assets/{profiles → improve-strategies}/quick.json +4 -2
  17. package/dist/assets/improve-strategies/reflect-distill.json +30 -0
  18. package/dist/assets/{profiles → improve-strategies}/thorough.json +1 -1
  19. package/dist/assets/prompts/consolidate-system.md +5 -5
  20. package/dist/assets/prompts/extract-session.md +2 -6
  21. package/dist/assets/prompts/memory-infer-user.md +2 -3
  22. package/dist/assets/prompts/reflect-llm-framed-contract.md +11 -0
  23. package/dist/assets/prompts/reflect-llm-schema-contract.md +3 -0
  24. package/dist/assets/prompts/reflect-output-repair.md +3 -0
  25. package/dist/assets/stash-skeleton/README.md +38 -10
  26. package/dist/assets/stash-skeleton/facts/conventions/assets/agent.md +8 -0
  27. package/dist/assets/stash-skeleton/facts/conventions/assets/command.md +8 -0
  28. package/dist/assets/stash-skeleton/facts/conventions/assets/fact.md +14 -1
  29. package/dist/assets/stash-skeleton/facts/conventions/assets/knowledge.md +13 -1
  30. package/dist/assets/stash-skeleton/facts/conventions/assets/lesson.md +9 -1
  31. package/dist/assets/stash-skeleton/facts/conventions/assets/memory.md +11 -0
  32. package/dist/assets/stash-skeleton/facts/conventions/assets/script.md +9 -0
  33. package/dist/assets/stash-skeleton/facts/conventions/assets/skill.md +9 -0
  34. package/dist/assets/stash-skeleton/facts/conventions/assets/workflow.md +8 -0
  35. package/dist/assets/stash-skeleton/facts/conventions/backlinks.md +100 -0
  36. package/dist/assets/stash-skeleton/facts/conventions/domains.md +64 -0
  37. package/dist/assets/stash-skeleton/facts/conventions/organization.md +136 -0
  38. package/dist/assets/tasks/core/extract.yml +3 -2
  39. package/dist/assets/tasks/core/improve.yml +2 -1
  40. package/dist/assets/tasks/core/index-refresh.yml +1 -0
  41. package/dist/assets/tasks/core/sync.yml +1 -0
  42. package/dist/assets/tasks/core/version-check.yml +2 -1
  43. package/dist/assets/tasks/improve/akm-graph-refresh-weekly.yml +5 -0
  44. package/dist/assets/tasks/improve/akm-improve-catchup.yml +8 -0
  45. package/dist/assets/tasks/improve/akm-improve-consolidate.yml +5 -0
  46. package/dist/assets/tasks/improve/akm-improve-frequent.yml +5 -0
  47. package/dist/assets/tasks/improve/akm-improve-nightly.yml +5 -0
  48. package/dist/assets/templates/html/health.html +5 -4
  49. package/dist/assets/workflows/workflow-template.md +31 -15
  50. package/dist/cli/invocation.js +279 -0
  51. package/dist/cli/parse-args.js +5 -90
  52. package/dist/cli/retired-commands.js +78 -0
  53. package/dist/cli/shared.js +158 -48
  54. package/dist/cli-node.mjs +2 -1
  55. package/dist/cli.js +747 -293
  56. package/dist/commands/agent/agent-dispatch.js +19 -18
  57. package/dist/commands/agent/agent-support.js +0 -24
  58. package/dist/commands/agent/contribute-cli.js +43 -97
  59. package/dist/commands/completions.js +80 -23
  60. package/dist/commands/config-cli.js +44 -281
  61. package/dist/commands/env/env-binding.js +13 -9
  62. package/dist/commands/env/env-cli.js +76 -159
  63. package/dist/commands/env/env.js +12 -163
  64. package/dist/commands/env/marker-path.js +6 -0
  65. package/dist/commands/env/secret-cli.js +45 -61
  66. package/dist/commands/env/secret.js +32 -62
  67. package/dist/commands/feedback-cli.js +179 -85
  68. package/dist/commands/health/accept-rate.js +58 -0
  69. package/dist/commands/health/advisories.js +7 -8
  70. package/dist/commands/health/checks.js +279 -94
  71. package/dist/commands/health/html-report.js +197 -578
  72. package/dist/commands/health/improve-metrics.js +277 -246
  73. package/dist/commands/health/llm-usage.js +19 -19
  74. package/dist/commands/health/md-report.js +16 -7
  75. package/dist/commands/health/metrics.js +67 -32
  76. package/dist/commands/health/renderers.js +47 -0
  77. package/dist/commands/health/report-view-model.js +508 -0
  78. package/dist/commands/health/stash-exposure.js +1 -1
  79. package/dist/commands/health/surfaces.js +16 -56
  80. package/dist/commands/health/task-runs.js +3 -67
  81. package/dist/{migrate-storage-node.mjs → commands/health/types-checks.js} +1 -5
  82. package/dist/commands/health/types-improve.js +29 -0
  83. package/dist/{output/text/save.js → commands/health/types-metrics.js} +1 -2
  84. package/dist/commands/health/types-result.js +7 -0
  85. package/dist/commands/health/types-runs.js +4 -0
  86. package/dist/commands/health/types-session-log.js +4 -0
  87. package/dist/commands/health/types-windows.js +4 -0
  88. package/dist/commands/health/types.js +26 -21
  89. package/dist/commands/health/windows.js +2 -3
  90. package/dist/commands/health.js +296 -167
  91. package/dist/commands/improve/anti-collapse.js +5 -5
  92. package/dist/commands/improve/autonomy-gate.js +68 -0
  93. package/dist/commands/improve/collapse-detector.js +65 -52
  94. package/dist/commands/improve/consolidate/chunking.js +9 -7
  95. package/dist/commands/improve/consolidate/eligibility.js +1 -23
  96. package/dist/commands/improve/consolidate/merge.js +4 -0
  97. package/dist/commands/improve/consolidate.js +454 -1354
  98. package/dist/commands/improve/content-hash.js +39 -0
  99. package/dist/commands/improve/distill/content-repair.js +4 -10
  100. package/dist/commands/improve/distill/promote-memory.js +89 -64
  101. package/dist/commands/improve/distill/quality-gate.js +118 -42
  102. package/dist/commands/improve/distill-guards.js +1 -1
  103. package/dist/commands/improve/distill-promotion-policy.js +33 -888
  104. package/dist/commands/improve/distill.js +607 -363
  105. package/dist/commands/improve/eligibility.js +165 -79
  106. package/dist/commands/improve/extract-cli.js +35 -126
  107. package/dist/commands/improve/extract-prompt.js +6 -35
  108. package/dist/commands/improve/extract.js +640 -391
  109. package/dist/commands/improve/feedback-valence.js +2 -12
  110. package/dist/commands/improve/improve-cli.js +134 -135
  111. package/dist/commands/improve/improve-result-file.js +30 -50
  112. package/dist/commands/improve/improve-run-types.js +4 -0
  113. package/dist/commands/improve/improve-strategies.js +135 -0
  114. package/dist/commands/improve/improve.js +904 -701
  115. package/dist/commands/improve/locks.js +64 -111
  116. package/dist/commands/improve/loop-stages.js +1110 -923
  117. package/dist/commands/improve/memory/derived-ref.js +124 -0
  118. package/dist/commands/improve/memory/memory-belief.js +79 -7
  119. package/dist/commands/improve/memory/memory-contradiction-detect.js +49 -52
  120. package/dist/commands/improve/memory/memory-improve.js +25 -37
  121. package/dist/commands/improve/outcome-loop.js +25 -88
  122. package/dist/commands/improve/preparation.js +1034 -813
  123. package/dist/commands/improve/proactive-maintenance.js +34 -9
  124. package/dist/commands/improve/proposal-envelope.js +31 -0
  125. package/dist/commands/improve/reflect.js +983 -794
  126. package/dist/commands/improve/run-context.js +119 -0
  127. package/dist/commands/improve/salience.js +24 -127
  128. package/dist/commands/improve/session-asset.js +7 -3
  129. package/dist/commands/improve/shared.js +14 -34
  130. package/dist/commands/improve/source-identity.js +28 -0
  131. package/dist/commands/improve/triage.js +20 -17
  132. package/dist/commands/lint/base-linter.js +340 -313
  133. package/dist/commands/lint/env-key-rules.js +31 -47
  134. package/dist/commands/lint/index.js +185 -30
  135. package/dist/commands/{events.js → log.js} +28 -38
  136. package/dist/commands/migrate-cli.js +54 -0
  137. package/dist/commands/migration-tool.js +55 -0
  138. package/dist/commands/observability-cli.js +70 -208
  139. package/dist/commands/proposal/diff-format.js +50 -0
  140. package/dist/commands/proposal/drain-policies.js +0 -6
  141. package/dist/commands/proposal/drain.js +91 -40
  142. package/dist/commands/proposal/proposal-cli.js +134 -132
  143. package/dist/commands/proposal/proposal-types.js +56 -0
  144. package/dist/commands/proposal/proposal.js +83 -65
  145. package/dist/commands/proposal/propose-cli.js +88 -0
  146. package/dist/commands/proposal/propose.js +105 -88
  147. package/dist/commands/proposal/repository.js +1303 -278
  148. package/dist/commands/proposal/validators/proposal-quality-validators.js +16 -6
  149. package/dist/commands/proposal/validators/proposal-validators.js +61 -12
  150. package/dist/commands/proposal/validators/proposals.js +6 -8
  151. package/dist/commands/read/curate.js +78 -73
  152. package/dist/commands/read/knowledge.js +510 -13
  153. package/dist/commands/read/registry-search.js +2 -2
  154. package/dist/commands/read/remember-cli.js +84 -15
  155. package/dist/commands/read/search-cli.js +203 -96
  156. package/dist/commands/read/search.js +126 -94
  157. package/dist/commands/read/show.js +226 -250
  158. package/dist/commands/registry-cli.js +34 -60
  159. package/dist/commands/remember.js +18 -57
  160. package/dist/commands/sources/add-cli.js +104 -49
  161. package/dist/commands/sources/bundle-cli.js +166 -0
  162. package/dist/commands/sources/bundle-config-ops.js +63 -0
  163. package/dist/commands/sources/info.js +27 -15
  164. package/dist/commands/sources/init.js +30 -40
  165. package/dist/commands/sources/installed-stashes.js +469 -172
  166. package/dist/commands/sources/schema-repair.js +10 -9
  167. package/dist/commands/sources/self-update.js +182 -121
  168. package/dist/commands/sources/source-add.js +169 -178
  169. package/dist/commands/sources/source-clone.js +144 -41
  170. package/dist/commands/sources/source-manage.js +94 -59
  171. package/dist/commands/sources/sources-cli.js +64 -205
  172. package/dist/commands/sources/stash-cli.js +91 -54
  173. package/dist/commands/sources/stash-skeleton.js +1 -1
  174. package/dist/commands/tasks/tasks-cli.js +106 -104
  175. package/dist/commands/tasks/tasks.js +445 -262
  176. package/dist/commands/workflow-cli.js +75 -228
  177. package/dist/core/action-contributors.js +1 -1
  178. package/dist/core/activation-policy.js +49 -0
  179. package/dist/core/adapter/adapters/agent-skills-adapter.js +181 -0
  180. package/dist/core/adapter/adapters/akm-adapter.js +528 -0
  181. package/dist/core/adapter/adapters/akm-lint.js +392 -0
  182. package/dist/core/adapter/adapters/akm-metadata.js +387 -0
  183. package/dist/core/adapter/adapters/akm-task-adapter.js +149 -0
  184. package/dist/core/adapter/adapters/akm-workflow-adapter.js +180 -0
  185. package/dist/core/adapter/adapters/claude-adapter.js +61 -0
  186. package/dist/core/adapter/adapters/dotenv-adapter.js +187 -0
  187. package/dist/core/adapter/adapters/generic-files-adapter.js +119 -0
  188. package/dist/core/adapter/adapters/index.js +80 -0
  189. package/dist/core/adapter/adapters/llm-wiki-adapter.js +419 -0
  190. package/dist/core/adapter/adapters/okf-adapter.js +391 -0
  191. package/dist/core/adapter/adapters/opencode-adapter.js +68 -0
  192. package/dist/core/adapter/adapters/shared.js +286 -0
  193. package/dist/core/adapter/adapters/tool-dir-shared.js +217 -0
  194. package/dist/core/adapter/adapters/website-snapshot-adapter.js +155 -0
  195. package/dist/core/adapter/bundle-adapter.js +4 -0
  196. package/dist/core/adapter/detect-adapter.js +17 -0
  197. package/dist/core/adapter/recognize-match.js +44 -0
  198. package/dist/core/adapter/registry.js +56 -0
  199. package/dist/core/adapter/types.js +4 -0
  200. package/dist/core/asset/akm-markdown.js +30 -0
  201. package/dist/core/asset/asset-placement.js +243 -0
  202. package/dist/core/asset/asset-ref.js +110 -79
  203. package/dist/core/asset/asset-serialize.js +20 -0
  204. package/dist/core/asset/frontmatter.js +28 -12
  205. package/dist/core/asset/markdown.js +40 -51
  206. package/dist/core/asset/resolve-ref.js +274 -0
  207. package/dist/core/asset/stash-meta.js +2 -2
  208. package/dist/core/bundle-id.js +51 -0
  209. package/dist/core/common.js +281 -86
  210. package/dist/core/config/config-io.js +42 -128
  211. package/dist/core/config/config-schema.js +233 -855
  212. package/dist/core/config/config-sources.js +162 -39
  213. package/dist/core/config/config-types.js +16 -11
  214. package/dist/core/config/config-version.js +29 -0
  215. package/dist/core/config/config-walker.js +126 -37
  216. package/dist/core/config/config.js +154 -331
  217. package/dist/core/config/deep-merge.js +41 -0
  218. package/dist/core/config/engine-semantics.js +28 -0
  219. package/dist/core/config/experimental.js +21 -0
  220. package/dist/core/config/schema/embedding.js +38 -0
  221. package/dist/core/config/schema/engines.js +116 -0
  222. package/dist/core/config/schema/experimental.js +47 -0
  223. package/dist/core/config/schema/feedback.js +31 -0
  224. package/dist/core/config/schema/improve-processes.js +389 -0
  225. package/dist/core/config/schema/improve.js +94 -0
  226. package/dist/core/config/schema/index-config.js +176 -0
  227. package/dist/core/config/schema/output.js +18 -0
  228. package/dist/core/config/schema/primitives.js +94 -0
  229. package/dist/core/config/schema/search.js +30 -0
  230. package/dist/core/config/schema/setup.js +18 -0
  231. package/dist/core/config/schema/sources-bundles.js +169 -0
  232. package/dist/core/config/schema/workflow.js +29 -0
  233. package/dist/core/env-secret-ref.js +155 -20
  234. package/dist/core/errors.js +17 -15
  235. package/dist/core/events-types.js +4 -0
  236. package/dist/core/events.js +46 -128
  237. package/dist/core/extra-params.js +62 -0
  238. package/dist/core/file-change.js +17 -0
  239. package/dist/core/file-lock.js +202 -57
  240. package/dist/core/fs-txn.js +392 -0
  241. package/dist/core/git-message.js +59 -0
  242. package/dist/core/improve-result.js +167 -0
  243. package/dist/core/lesson-lint.js +1 -17
  244. package/dist/core/logs-db.js +1 -1
  245. package/dist/core/maintenance-barrier.js +135 -0
  246. package/dist/core/migration-operation.js +44 -0
  247. package/dist/core/mutation-target.js +78 -0
  248. package/dist/core/paths.js +22 -25
  249. package/dist/core/platform.js +10 -0
  250. package/dist/core/recognition-util.js +128 -0
  251. package/dist/core/redaction.js +392 -0
  252. package/dist/core/standards/resolve-standards-context.js +36 -65
  253. package/dist/core/standards/resolve-stash-standards.js +2 -2
  254. package/dist/core/standards/resolve-type-conventions.js +5 -5
  255. package/dist/core/state/migrations.js +242 -11
  256. package/dist/core/state-db.js +98 -10
  257. package/dist/core/structured.js +1 -1
  258. package/dist/core/subprocess.js +303 -0
  259. package/dist/core/text-truncation.js +9 -5
  260. package/dist/core/time.js +20 -0
  261. package/dist/core/type-presentation.js +130 -0
  262. package/dist/core/warn.js +0 -3
  263. package/dist/core/write-source.js +834 -118
  264. package/dist/indexer/bundle-identity-guard.js +92 -0
  265. package/dist/indexer/db/graph-db.js +1 -25
  266. package/dist/indexer/db/llm-cache.js +1 -1
  267. package/dist/indexer/ensure-index.js +30 -9
  268. package/dist/indexer/graph/graph-boost.js +9 -30
  269. package/dist/indexer/graph/graph-extraction.js +41 -27
  270. package/dist/indexer/graph/graph-types.js +4 -0
  271. package/dist/indexer/index-writer-lock.js +93 -49
  272. package/dist/indexer/index-written-assets.js +100 -53
  273. package/dist/indexer/indexer.js +746 -329
  274. package/dist/indexer/init.js +18 -25
  275. package/dist/indexer/installations.js +142 -0
  276. package/dist/indexer/passes/dir-staleness.js +18 -10
  277. package/dist/indexer/passes/memory-inference.js +25 -15
  278. package/dist/indexer/passes/metadata.js +412 -243
  279. package/dist/indexer/scan/doc-to-entry.js +160 -0
  280. package/dist/indexer/scan/drain-dir.js +134 -0
  281. package/dist/indexer/search/db-search.js +292 -108
  282. package/dist/indexer/search/fts-query.js +64 -0
  283. package/dist/indexer/search/ranking-contributors.js +145 -25
  284. package/dist/indexer/search/ranking-types.js +4 -0
  285. package/dist/indexer/search/ranking.js +28 -71
  286. package/dist/indexer/search/search-attribution.js +67 -0
  287. package/dist/indexer/search/search-fields.js +18 -3
  288. package/dist/indexer/search/search-hit-enrichers.js +30 -40
  289. package/dist/indexer/search/search-source.js +157 -111
  290. package/dist/indexer/search/semantic-status.js +4 -1
  291. package/dist/indexer/usage/usage-events.js +10 -30
  292. package/dist/indexer/walk/file-context.js +3 -45
  293. package/dist/indexer/walk/matchers.js +42 -73
  294. package/dist/indexer/walk/path-resolver.js +11 -5
  295. package/dist/indexer/walk/walker.js +42 -14
  296. package/dist/integrations/agent/builder-shared.js +7 -0
  297. package/dist/integrations/agent/builders.js +5 -58
  298. package/dist/integrations/agent/config.js +3 -143
  299. package/dist/integrations/agent/detect.js +17 -2
  300. package/dist/integrations/agent/engine-resolution.js +231 -0
  301. package/dist/integrations/agent/index.js +1 -2
  302. package/dist/integrations/agent/model-aliases.js +8 -3
  303. package/dist/integrations/agent/profiles.js +6 -99
  304. package/dist/integrations/agent/prompts.js +46 -18
  305. package/dist/integrations/agent/runner-dispatch.js +78 -13
  306. package/dist/integrations/agent/runner.js +76 -208
  307. package/dist/integrations/agent/spawn.js +48 -279
  308. package/dist/integrations/harnesses/aider/agent-builder.js +9 -8
  309. package/dist/integrations/harnesses/aider/index.js +2 -12
  310. package/dist/integrations/harnesses/amazonq/agent-builder.js +10 -16
  311. package/dist/integrations/harnesses/amazonq/index.js +3 -17
  312. package/dist/integrations/harnesses/claude/agent-builder.js +2 -3
  313. package/dist/integrations/harnesses/claude/config-import.js +1 -3
  314. package/dist/integrations/harnesses/claude/index.js +1 -14
  315. package/dist/integrations/harnesses/claude/session-log.js +27 -75
  316. package/dist/integrations/harnesses/codex/agent-builder.js +8 -7
  317. package/dist/integrations/harnesses/codex/index.js +2 -13
  318. package/dist/integrations/harnesses/copilot/agent-builder.js +9 -9
  319. package/dist/integrations/harnesses/copilot/index.js +1 -13
  320. package/dist/integrations/harnesses/gemini/agent-builder.js +8 -9
  321. package/dist/integrations/harnesses/gemini/index.js +1 -13
  322. package/dist/integrations/harnesses/ids.js +24 -0
  323. package/dist/integrations/harnesses/index.js +31 -33
  324. package/dist/integrations/harnesses/opencode/agent-builder.js +23 -5
  325. package/dist/integrations/harnesses/opencode/config-import.js +1 -3
  326. package/dist/integrations/harnesses/opencode/index.js +1 -18
  327. package/dist/integrations/harnesses/opencode/session-log.js +67 -125
  328. package/dist/integrations/harnesses/opencode-sdk/harness.js +3 -17
  329. package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +274 -191
  330. package/dist/integrations/harnesses/openhands/agent-builder.js +12 -10
  331. package/dist/integrations/harnesses/openhands/index.js +2 -12
  332. package/dist/integrations/harnesses/pi/agent-builder.js +11 -18
  333. package/dist/integrations/harnesses/pi/index.js +3 -16
  334. package/dist/integrations/harnesses/shared.js +17 -0
  335. package/dist/integrations/harnesses/types.js +38 -34
  336. package/dist/integrations/lockfile.js +211 -24
  337. package/dist/integrations/session-logs/index.js +24 -40
  338. package/dist/integrations/session-logs/provider-base.js +113 -0
  339. package/dist/llm/client.js +182 -110
  340. package/dist/llm/embedders/deterministic.js +2 -2
  341. package/dist/llm/embedders/remote.js +21 -9
  342. package/dist/llm/feature-gate.js +17 -57
  343. package/dist/llm/graph-extract.js +12 -13
  344. package/dist/llm/index-passes.js +8 -42
  345. package/dist/llm/memory-infer.js +144 -1
  346. package/dist/llm/metadata-enhance.js +45 -30
  347. package/dist/llm/structured-call.js +16 -8
  348. package/dist/llm/usage-persist.js +30 -5
  349. package/dist/llm/usage-telemetry.js +59 -6
  350. package/dist/output/cli-hints.js +1 -2
  351. package/dist/output/command-registry.js +27 -0
  352. package/dist/output/context.js +22 -7
  353. package/dist/output/format-exempt.js +80 -0
  354. package/dist/output/generic-render.js +251 -0
  355. package/dist/output/html-render.js +11 -16
  356. package/dist/output/render-registry.js +57 -0
  357. package/dist/output/renderers.js +15 -281
  358. package/dist/output/shapes/curate.js +10 -1
  359. package/dist/output/shapes/events.js +12 -7
  360. package/dist/output/shapes/helpers.js +58 -84
  361. package/dist/output/shapes/passthrough.js +8 -40
  362. package/dist/output/shapes/proposal/producer.js +15 -7
  363. package/dist/output/shapes/registry.js +12 -6
  364. package/dist/output/shapes.js +0 -9
  365. package/dist/output/text/{init.js → bundle-create.js} +3 -1
  366. package/dist/output/text/bundle-show.js +7 -0
  367. package/dist/output/text/command-format.js +562 -0
  368. package/dist/output/text/env.js +1 -3
  369. package/dist/output/text/events.js +8 -7
  370. package/dist/output/text/helpers.js +15 -1375
  371. package/dist/output/text/proposal/producer.js +4 -2
  372. package/dist/output/text/proposal-format.js +202 -0
  373. package/dist/output/text/registry-commands.js +1 -2
  374. package/dist/output/text/registry.js +12 -6
  375. package/dist/output/text/show-directives.js +117 -0
  376. package/dist/output/text/show-format.js +103 -0
  377. package/dist/output/text/sync.js +5 -0
  378. package/dist/output/text/workflow-format.js +332 -0
  379. package/dist/output/text/workflow.js +1 -2
  380. package/dist/output/text.js +10 -19
  381. package/dist/registry/factory.js +4 -6
  382. package/dist/registry/origin-resolve.js +16 -27
  383. package/dist/registry/providers/skills-sh.js +3 -3
  384. package/dist/registry/providers/static-index.js +15 -25
  385. package/dist/registry/resolve.js +43 -94
  386. package/dist/registry/semver.js +43 -0
  387. package/dist/runtime.js +81 -12
  388. package/dist/scripts/akm-migrate.js +35529 -0
  389. package/dist/setup/detect.js +5 -7
  390. package/dist/setup/detected-engines.js +136 -0
  391. package/dist/setup/engine-config.js +100 -0
  392. package/dist/setup/registry-stash-loader.js +3 -3
  393. package/dist/setup/semantic-assets.js +12 -9
  394. package/dist/setup/setup.js +444 -208
  395. package/dist/setup/steps/connection-shared.js +120 -0
  396. package/dist/setup/steps/connection.js +108 -305
  397. package/dist/setup/steps/platforms.js +13 -12
  398. package/dist/setup/steps/semantic.js +15 -3
  399. package/dist/setup/steps/sources.js +21 -15
  400. package/dist/setup/steps/stashdir.js +6 -4
  401. package/dist/setup/steps/tasks.js +236 -119
  402. package/dist/setup/steps.js +3 -2
  403. package/dist/sources/freshness.js +39 -0
  404. package/dist/sources/provider-factory.js +11 -17
  405. package/dist/sources/providers/filesystem.js +2 -3
  406. package/dist/sources/providers/git-install.js +278 -34
  407. package/dist/sources/providers/git-provider.js +54 -56
  408. package/dist/sources/providers/git-stash.js +420 -91
  409. package/dist/sources/providers/git.js +2 -2
  410. package/dist/sources/providers/npm.js +16 -19
  411. package/dist/sources/providers/provider-utils.js +47 -22
  412. package/dist/sources/providers/sync-from-ref.js +3 -9
  413. package/dist/sources/providers/website.js +2 -2
  414. package/dist/sources/resolve.js +11 -10
  415. package/dist/sources/snapshot-fetchers/types.js +4 -0
  416. package/dist/sources/{website-ingest.js → snapshot-fetchers/website-ingest.js} +110 -41
  417. package/dist/storage/database.js +60 -4
  418. package/dist/storage/engines/sqlite-migrations.js +156 -5
  419. package/dist/storage/locations.js +1 -2
  420. package/dist/storage/repositories/canaries-repository.js +1 -1
  421. package/dist/storage/repositories/events-repository.js +51 -11
  422. package/dist/storage/repositories/improve-runs-repository.js +6 -32
  423. package/dist/storage/repositories/index-connection.js +79 -0
  424. package/dist/storage/repositories/index-db.js +4 -3
  425. package/dist/storage/repositories/index-entries-repository.js +863 -0
  426. package/dist/{indexer/db/entry-mapper.js → storage/repositories/index-entry-mapper.js} +19 -2
  427. package/dist/storage/repositories/index-entry-types.js +4 -0
  428. package/dist/storage/repositories/index-fts-repository.js +167 -0
  429. package/dist/storage/repositories/index-llm-cache-repository.js +108 -0
  430. package/dist/storage/repositories/index-meta-repository.js +49 -0
  431. package/dist/{indexer/db/schema.js → storage/repositories/index-schema.js} +226 -100
  432. package/dist/storage/repositories/index-sql.js +12 -0
  433. package/dist/storage/repositories/index-utility-repository.js +356 -0
  434. package/dist/storage/repositories/index-vec-repository.js +250 -0
  435. package/dist/storage/repositories/outcome-repository.js +119 -0
  436. package/dist/storage/repositories/proposals-repository.js +317 -75
  437. package/dist/storage/repositories/registry-cache.js +1 -1
  438. package/dist/storage/repositories/salience-repository.js +172 -0
  439. package/dist/storage/repositories/task-history-repository.js +110 -3
  440. package/dist/storage/repositories/workflow-runs-repository.js +68 -35
  441. package/dist/tasks/backends/cron.js +169 -46
  442. package/dist/tasks/backends/exec-utils.js +76 -3
  443. package/dist/tasks/backends/index.js +6 -9
  444. package/dist/tasks/backends/launchd.js +292 -55
  445. package/dist/tasks/backends/schtasks.js +557 -70
  446. package/dist/tasks/backends/types.js +4 -0
  447. package/dist/tasks/command-executable.js +93 -0
  448. package/dist/tasks/embedded.js +56 -38
  449. package/dist/tasks/parser.js +156 -64
  450. package/dist/tasks/resolve-akm-bin.js +144 -51
  451. package/dist/tasks/runner.js +377 -209
  452. package/dist/tasks/schedule.js +108 -19
  453. package/dist/tasks/scheduler-invocation.js +296 -0
  454. package/dist/tasks/schema.js +1 -1
  455. package/dist/tasks/task-id.js +35 -0
  456. package/dist/tasks/validator.js +30 -16
  457. package/dist/workflows/authoring/authoring.js +96 -148
  458. package/dist/workflows/authoring/scope-key.js +1 -1
  459. package/dist/workflows/cli.js +0 -20
  460. package/dist/workflows/concurrency-policy.js +15 -0
  461. package/dist/workflows/exec/brief.js +25 -59
  462. package/dist/workflows/exec/frozen-judge.js +47 -0
  463. package/dist/workflows/exec/native-executor.js +157 -94
  464. package/dist/workflows/exec/report.js +365 -200
  465. package/dist/workflows/exec/run-workflow.js +46 -40
  466. package/dist/workflows/exec/scheduler.js +12 -41
  467. package/dist/workflows/exec/step-work.js +239 -205
  468. package/dist/workflows/exec/workflow-engine-gate.js +67 -0
  469. package/dist/workflows/ir/compile.js +141 -283
  470. package/dist/workflows/ir/freeze.js +233 -0
  471. package/dist/workflows/ir/plan-hash.js +40 -5
  472. package/dist/workflows/ir/schema.js +537 -1
  473. package/dist/workflows/parser.js +878 -306
  474. package/dist/workflows/program/expressions.js +20 -208
  475. package/dist/workflows/program/schema.js +7 -10
  476. package/dist/workflows/renderer.js +99 -121
  477. package/dist/workflows/resource-limits.js +22 -0
  478. package/dist/workflows/runtime/checkin.js +1 -1
  479. package/dist/workflows/runtime/plan-classifier.js +131 -0
  480. package/dist/workflows/runtime/runs.js +200 -113
  481. package/dist/workflows/runtime/unit-checkin.js +1 -1
  482. package/dist/workflows/runtime/unit-phases.js +20 -0
  483. package/dist/workflows/runtime/workflow-asset-loader.js +235 -97
  484. package/dist/workflows/schema.js +1 -11
  485. package/dist/workflows/validate-summary.js +4 -26
  486. package/dist/workflows/validator.js +52 -30
  487. package/docs/README.md +42 -78
  488. package/docs/migration/README.md +8 -0
  489. package/docs/migration/release-notes/0.6.0.md +1 -1
  490. package/docs/migration/release-notes/0.7.0.md +9 -8
  491. package/docs/migration/release-notes/0.9.0.md +158 -14
  492. package/docs/migration/v0.7-to-v0.8.md +46 -47
  493. package/docs/migration/v0.8-to-v0.9.md +844 -0
  494. package/docs/reference/README.md +12 -0
  495. package/docs/reference/data-and-telemetry.md +333 -0
  496. package/package.json +21 -17
  497. package/schemas/akm-asset-envelope.json +93 -0
  498. package/schemas/akm-config.json +4636 -0
  499. package/schemas/akm-task.json +87 -0
  500. package/{dist/schemas → schemas}/akm-workflow.json +127 -82
  501. package/dist/akm-migrate-storage +0 -38
  502. package/dist/assets/help/help-accept.md +0 -12
  503. package/dist/assets/help/help-improve.md +0 -84
  504. package/dist/assets/help/help-proposals.md +0 -17
  505. package/dist/assets/help/help-propose.md +0 -17
  506. package/dist/assets/help/help-reject.md +0 -11
  507. package/dist/assets/profiles/frequent.json +0 -13
  508. package/dist/assets/profiles/recombine-only.json +0 -21
  509. package/dist/assets/profiles/reflect-distill.json +0 -30
  510. package/dist/assets/profiles/synthesize.json +0 -15
  511. package/dist/assets/prompts/procedural-system.md +0 -44
  512. package/dist/assets/prompts/recombine-system.md +0 -40
  513. package/dist/assets/prompts/staleness-detect-system.md +0 -6
  514. package/dist/assets/tasks/core/backup.yml +0 -4
  515. package/dist/assets/tasks/graph-refresh-weekly.yml +0 -10
  516. package/dist/assets/templates/html/default.html +0 -78
  517. package/dist/assets/templates/html/vendor/echarts.min.js +0 -45
  518. package/dist/assets/wiki/index-template.md +0 -12
  519. package/dist/assets/wiki/ingest-workflow-template.md +0 -83
  520. package/dist/assets/wiki/log-template.md +0 -8
  521. package/dist/assets/wiki/schema-template.md +0 -61
  522. package/dist/cli/config-migrate.js +0 -150
  523. package/dist/cli/config-validate.js +0 -39
  524. package/dist/commands/graph/graph-cli.js +0 -124
  525. package/dist/commands/graph/graph.js +0 -487
  526. package/dist/commands/improve/calibration.js +0 -161
  527. package/dist/commands/improve/dedup.js +0 -482
  528. package/dist/commands/improve/extract-watch.js +0 -140
  529. package/dist/commands/improve/hot-probation.js +0 -45
  530. package/dist/commands/improve/improve-auto-accept.js +0 -276
  531. package/dist/commands/improve/improve-profiles.js +0 -168
  532. package/dist/commands/improve/procedural.js +0 -398
  533. package/dist/commands/improve/recombine.js +0 -818
  534. package/dist/commands/improve/schema-similarity-gate.js +0 -168
  535. package/dist/commands/lint/agent-linter.js +0 -44
  536. package/dist/commands/lint/command-linter.js +0 -44
  537. package/dist/commands/lint/default-linter.js +0 -16
  538. package/dist/commands/lint/fact-linter.js +0 -39
  539. package/dist/commands/lint/knowledge-linter.js +0 -16
  540. package/dist/commands/lint/memory-linter.js +0 -61
  541. package/dist/commands/lint/registry.js +0 -41
  542. package/dist/commands/lint/skill-linter.js +0 -45
  543. package/dist/commands/lint/task-linter.js +0 -50
  544. package/dist/commands/lint/workflow-linter.js +0 -81
  545. package/dist/commands/proposal/legacy-import.js +0 -115
  546. package/dist/commands/sources/history.js +0 -196
  547. package/dist/commands/tasks/default-tasks.js +0 -186
  548. package/dist/commands/wiki-cli.js +0 -292
  549. package/dist/core/asset/asset-registry.js +0 -76
  550. package/dist/core/asset/asset-spec.js +0 -316
  551. package/dist/core/config/config-migration.js +0 -602
  552. package/dist/core/deep-merge.js +0 -38
  553. package/dist/core/eval/rank-metrics.js +0 -113
  554. package/dist/core/ripgrep/install.js +0 -163
  555. package/dist/core/ripgrep/resolve.js +0 -81
  556. package/dist/indexer/db/db.js +0 -1414
  557. package/dist/indexer/manifest.js +0 -170
  558. package/dist/indexer/passes/metadata-contributors.js +0 -31
  559. package/dist/indexer/usage/unmigrated-vaults-guard.js +0 -94
  560. package/dist/integrations/harnesses/opencode-sdk/index.js +0 -25
  561. package/dist/llm/call-ai.js +0 -62
  562. package/dist/llm/memory-infer-impl.js +0 -138
  563. package/dist/output/shapes/distill.js +0 -14
  564. package/dist/output/shapes/history.js +0 -11
  565. package/dist/output/text/distill.js +0 -6
  566. package/dist/output/text/enable-disable.js +0 -8
  567. package/dist/output/text/history.js +0 -6
  568. package/dist/output/text/wiki.js +0 -16
  569. package/dist/registry/build-index.js +0 -386
  570. package/dist/schemas/akm-config.json +0 -14225
  571. package/dist/scripts/migrate-storage.js +0 -13169
  572. package/dist/scripts/migrations/import-fs-improve-runs-to-db.js +0 -10169
  573. package/dist/scripts/migrations/v16-to-v17.js +0 -141
  574. package/dist/setup/legacy-config.js +0 -106
  575. package/dist/storage/repositories/consolidation-repository.js +0 -38
  576. package/dist/storage/repositories/recombine-repository.js +0 -213
  577. package/dist/wiki/wiki-templates.js +0 -15
  578. package/dist/wiki/wiki.js +0 -1012
  579. package/dist/workflows/authoring/workflow-program-template.yaml +0 -31
  580. package/dist/workflows/db.js +0 -350
  581. package/dist/workflows/exec/watch.js +0 -116
  582. package/dist/workflows/program/parser.js +0 -760
  583. package/dist/workflows/program/project.js +0 -105
  584. package/docs/data-and-telemetry.md +0 -227
  585. package/docs/migration/release-notes/0.9.0-beta.60.md +0 -19
  586. /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/registry.js +0 -0
  587. /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/youtube.js +0 -0
@@ -7,37 +7,37 @@
7
7
  * args/output shape are byte-identical. Handlers whose body is a plain
8
8
  * `runWithJsonErrors(...) + output(...)` are migrated to `defineJsonCommand`,
9
9
  * which emits the same JSON envelope (stdout/stderr/exit-code) as the inline
10
- * form. `workflow template` keeps a plain `defineCommand` because it writes the
11
- * template straight to stdout with no JSON envelope. The private helpers
12
- * `looksLikeWorkflowRunId` and `resolveWorkflowFilePath` move with the family.
10
+ * form.
11
+ *
12
+ * 0.9.0 CLI overhaul (S5): `workflow template` is dropped — `workflow create
13
+ * --print` prints the same content without writing. `workflow validate` is
14
+ * dropped — `akm lint --type workflows` covers structural validation.
15
+ * `workflow watch` is dropped — poll `akm log --since '@offset:<id>' --run
16
+ * <run-id>` instead. Workflows are markdown-only (workflow-format-
17
+ * unification) — `workflow create <name>.yaml` is a usage error.
13
18
  */
14
- import { defineCommand } from "citty";
19
+ import { getParsedInvocation } from "../cli/invocation.js";
15
20
  import { getStringArg } from "../cli/parse-args.js";
16
- import { defineJsonCommand, output, runWithJsonErrors } from "../cli/shared.js";
21
+ import { defineGroupCommand, defineJsonCommand, output } from "../cli/shared.js";
17
22
  import { assertFlatAssetName, combineCreatePath, normalizeCreateSubPath } from "../core/asset/asset-create.js";
18
- import { parseAssetRef } from "../core/asset/asset-ref.js";
19
23
  import { loadConfig } from "../core/config/config.js";
20
24
  import { NotFoundError, UsageError } from "../core/errors.js";
21
25
  import { akmIndex } from "../indexer/indexer.js";
22
- import { resolveSourceEntries } from "../indexer/search/search-source.js";
23
- import { hasBooleanFlag } from "../output/context.js";
24
- import { resolveSourcesForOrigin } from "../registry/origin-resolve.js";
25
- import { resolveAssetPath } from "../sources/resolve.js";
26
- import { createWorkflowAsset, formatWorkflowErrors, getWorkflowProgramTemplate, getWorkflowTemplate, validateWorkflowProgramSource, validateWorkflowSource, } from "../workflows/authoring/authoring.js";
27
- import { hasWorkflowSubcommand, parseWorkflowJsonObject, parseWorkflowStepState, WORKFLOW_STEP_STATES, } from "../workflows/cli.js";
28
- import { isWorkflowProgramPath } from "../workflows/program/project.js";
29
- import { abandonWorkflowRun, completeWorkflowStep, getNextWorkflowStep, getWorkflowStatus, listWorkflowRuns, resumeWorkflowRun, startWorkflowRun, } from "../workflows/runtime/runs.js";
26
+ import { assertWorkflowMarkdownName, createWorkflowAsset, getWorkflowTemplate } from "../workflows/authoring/authoring.js";
27
+ import { parseWorkflowJsonObject, parseWorkflowStepState, WORKFLOW_STEP_STATES } from "../workflows/cli.js";
28
+ import { requireWorkflowEngineEnabled } from "../workflows/exec/workflow-engine-gate.js";
29
+ import { abandonWorkflowRun, completeWorkflowStep, getNextWorkflowStep, getWorkflowStatus, hasWorkflowRun, listWorkflowRuns, resumeWorkflowRun, startWorkflowRun, } from "../workflows/runtime/runs.js";
30
30
  const workflowStartCommand = defineJsonCommand({
31
31
  meta: {
32
32
  name: "start",
33
33
  description: "Start a new workflow run in the current working scope",
34
34
  },
35
35
  args: {
36
- ref: { type: "positional", description: "Workflow ref (workflow:<name>)", required: true },
36
+ ref: { type: "positional", description: "Workflow ref (workflows/<name>)", required: true },
37
37
  params: { type: "string", description: "Workflow parameters as a JSON object" },
38
38
  force: {
39
39
  type: "boolean",
40
- description: "Allow a parallel run when an active run already exists in this scope (#485)",
40
+ description: "Allow a parallel run when an active run already exists in this scope",
41
41
  default: false,
42
42
  },
43
43
  },
@@ -59,45 +59,17 @@ const workflowNextCommand = defineJsonCommand({
59
59
  },
60
60
  async run({ args }) {
61
61
  // `--dry-run` is intentionally NOT a declared arg (so it stays out of
62
- // --help). The guard reads it straight from process.argv so existing
63
- // callers still get a clear, actionable error instead of a generic
64
- // "unknown flag" from citty.
65
- if (hasBooleanFlag(process.argv, "--dry-run")) {
62
+ // --help). The guard reads it straight from the invocation singleton so
63
+ // existing callers still get a clear, actionable error instead of a
64
+ // generic "unknown flag" from citty.
65
+ if (getParsedInvocation().hasFlag("--dry-run")) {
66
66
  throw new UsageError("`akm workflow next` does not support --dry-run. Remove the flag to start or resume a run.", "INVALID_FLAG_VALUE");
67
67
  }
68
68
  const parsedParams = args.params ? parseWorkflowJsonObject(args.params, "--params") : undefined;
69
- // If the target looks like a UUID-style run id (no `:` and matches the
70
- // run-id shape), short-circuit with a structured WORKFLOW_NOT_FOUND
71
- // error before parseAssetRef gets to throw an unhelpful ref-parse error.
72
- if (looksLikeWorkflowRunId(args.target)) {
73
- const { hasWorkflowRun } = await import("../workflows/runtime/runs.js");
74
- if (!(await hasWorkflowRun(args.target))) {
75
- throw new NotFoundError(`Workflow run "${args.target}" not found.`, "WORKFLOW_NOT_FOUND", "Run `akm workflow list --active` to see runs.");
76
- }
77
- }
78
69
  const result = await getNextWorkflowStep(args.target, parsedParams);
79
70
  output("workflow-next", result);
80
71
  },
81
72
  });
82
- /**
83
- * Heuristic: a workflow run id is a UUID-shaped or hex-id-shaped string with
84
- * no `:` separator (refs always contain a colon: `workflow:<name>` or
85
- * `<origin>//workflow:<name>`). When this matches we can give a much better
86
- * error than parseAssetRef's "Invalid asset type" failure.
87
- */
88
- function looksLikeWorkflowRunId(target) {
89
- if (target.includes(":"))
90
- return false;
91
- if (target.includes("/"))
92
- return false;
93
- // UUID v4-ish: 8-4-4-4-12 hex digits separated by dashes.
94
- if (/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(target))
95
- return true;
96
- // Bare hex/alphanumeric run ids of >=8 chars (covers shortened ids).
97
- if (/^[0-9a-z][0-9a-z_-]{7,}$/i.test(target) && /[0-9]/.test(target))
98
- return true;
99
- return false;
100
- }
101
73
  const workflowCompleteCommand = defineJsonCommand({
102
74
  meta: {
103
75
  name: "complete",
@@ -141,42 +113,37 @@ const workflowStatusCommand = defineJsonCommand({
141
113
  description: "Show full workflow run state for review or resume; workflow refs resolve within the current scope",
142
114
  },
143
115
  args: {
144
- target: { type: "positional", description: "Workflow run id or workflow ref (workflow:<name>)", required: true },
116
+ target: { type: "positional", description: "Workflow run id or workflow ref (workflows/<name>)", required: true },
145
117
  units: {
146
118
  type: "boolean",
147
119
  description: "Also list per-unit rows from the run journal (unit id, status, failure_reason, and any result/error " +
148
- "diagnostic text). Diagnostics only — step evidence stays deterministic and is unaffected (#22).",
120
+ "diagnostic text). Diagnostics only — step evidence stays deterministic and is unaffected.",
149
121
  default: false,
150
122
  },
151
123
  },
152
124
  async run({ args }) {
153
125
  const target = args.target;
154
126
  const includeUnits = args.units === true;
155
- // Check if target looks like a workflow ref
156
- const parsed = (() => {
157
- try {
158
- return parseAssetRef(target);
159
- }
160
- catch {
161
- return null;
162
- }
163
- })();
164
- if (parsed?.type === "workflow") {
165
- const ref = `${parsed.origin ? `${parsed.origin}//` : ""}workflow:${parsed.name}`;
166
- const { runs } = await listWorkflowRuns({ workflowRef: ref });
167
- if (runs.length === 0) {
168
- throw new NotFoundError(`No workflow runs found for ${ref}`, "WORKFLOW_NOT_FOUND");
169
- }
170
- const mostRecent = runs[0];
171
- if (!mostRecent)
172
- throw new NotFoundError(`No workflow runs found for ${ref}`, "WORKFLOW_NOT_FOUND");
173
- const result = await getWorkflowStatus(mostRecent.id, { includeUnits });
174
- output("workflow-status", result);
175
- }
176
- else {
127
+ if (await hasWorkflowRun(target)) {
177
128
  const result = await getWorkflowStatus(target, { includeUnits });
178
129
  output("workflow-status", result);
130
+ return;
179
131
  }
132
+ let runs;
133
+ try {
134
+ ({ runs } = await listWorkflowRuns({ workflowRef: target }));
135
+ }
136
+ catch (error) {
137
+ if (!target.includes(":") && !target.includes("/")) {
138
+ throw new NotFoundError(`Workflow run "${target}" not found.`, "WORKFLOW_NOT_FOUND");
139
+ }
140
+ throw error;
141
+ }
142
+ const mostRecent = runs[0];
143
+ if (!mostRecent)
144
+ throw new NotFoundError(`No workflow runs found for ${target}`, "WORKFLOW_NOT_FOUND");
145
+ const result = await getWorkflowStatus(mostRecent.id, { includeUnits });
146
+ output("workflow-status", result);
180
147
  },
181
148
  });
182
149
  const workflowListCommand = defineJsonCommand({
@@ -196,12 +163,12 @@ const workflowListCommand = defineJsonCommand({
196
163
  const workflowCreateCommand = defineJsonCommand({
197
164
  meta: {
198
165
  name: "create",
199
- description: "Create a workflow in the working stash (markdown document by default; a .yaml/.yml name writes a YAML program)",
166
+ description: "Create a workflow (markdown document) in the working bundle",
200
167
  },
201
168
  args: {
202
169
  name: {
203
170
  type: "positional",
204
- description: "Workflow name (flat, no '/'; use --path for a subdirectory). A .yaml/.yml suffix creates a YAML program.",
171
+ description: "Workflow name (flat, no '/'; use --path for a subdirectory).",
205
172
  required: true,
206
173
  },
207
174
  path: {
@@ -210,7 +177,7 @@ const workflowCreateCommand = defineJsonCommand({
210
177
  },
211
178
  from: {
212
179
  type: "string",
213
- description: "Import and validate content from an existing file (parsed per the destination extension)",
180
+ description: "Import and validate content from an existing file",
214
181
  },
215
182
  force: {
216
183
  type: "boolean",
@@ -222,6 +189,11 @@ const workflowCreateCommand = defineJsonCommand({
222
189
  description: "Explicitly replace an existing workflow with a fresh template (use with --force)",
223
190
  default: false,
224
191
  },
192
+ print: {
193
+ type: "boolean",
194
+ description: "Print the RAW template that would be written to stdout without creating anything — pipe it to a file as a starter document",
195
+ default: false,
196
+ },
225
197
  },
226
198
  async run({ args }) {
227
199
  // `name` is flat; subdirectory placement is `--path`'s job.
@@ -231,6 +203,14 @@ const workflowCreateCommand = defineJsonCommand({
231
203
  if (!namePattern.test(effectiveName)) {
232
204
  throw new UsageError("Workflow name must start with a lowercase letter or digit and contain only lowercase letters, digits, hyphens, dots, underscores, and slashes.");
233
205
  }
206
+ assertWorkflowMarkdownName(effectiveName);
207
+ if (args.print) {
208
+ // Raw document, not an envelope — the retired `workflow template` was
209
+ // format-exempt for the same reason: `--print > starter.md` must yield
210
+ // a usable starter file, not `{ok,template,kind}` JSON.
211
+ process.stdout.write(getWorkflowTemplate());
212
+ return;
213
+ }
234
214
  if (args.force && !args.from && !args.reset) {
235
215
  throw new UsageError("Refusing to overwrite with template: pass --from <file> to replace content, or --reset to explicitly replace with a fresh template.");
236
216
  }
@@ -246,117 +226,20 @@ const workflowCreateCommand = defineJsonCommand({
246
226
  output("workflow-create", { ok: true, ...result });
247
227
  },
248
228
  });
249
- const workflowTemplateCommand = defineCommand({
250
- meta: {
251
- name: "template",
252
- description: "Print a valid workflow template (markdown by default, --yaml for a YAML program)",
253
- },
254
- args: {
255
- yaml: {
256
- type: "boolean",
257
- description: "Print a minimal valid YAML workflow program instead of the markdown template",
258
- default: false,
259
- },
260
- },
261
- run({ args }) {
262
- process.stdout.write(args.yaml ? getWorkflowProgramTemplate() : getWorkflowTemplate());
263
- },
264
- });
265
- const workflowValidateCommand = defineJsonCommand({
266
- meta: {
267
- name: "validate",
268
- description: "Validate a workflow file or ref (markdown document or YAML program) and print any errors",
269
- },
270
- args: {
271
- target: {
272
- type: "positional",
273
- description: "Workflow ref (workflow:<name>) or filesystem path to a workflow .md/.yaml",
274
- required: true,
275
- },
276
- },
277
- async run({ args }) {
278
- const filePath = await resolveWorkflowFilePath(args.target);
279
- // YAML programs (redesign addendum, R1) validate through the program
280
- // parser AND compiler so expression/reference errors surface at lint
281
- // time; both error lists carry line numbers. Markdown is unchanged.
282
- if (isWorkflowProgramPath(filePath)) {
283
- const { result } = validateWorkflowProgramSource(filePath);
284
- if (!result.ok) {
285
- throw new UsageError(formatWorkflowErrors(filePath, result.errors));
286
- }
287
- // Non-fatal WARNINGS ride the envelope additively — `ok` stays true. The
288
- // text formatter renders them clearly marked for humans; the JSON key is
289
- // the machine channel. Empty array when the program is fully typed/declared.
290
- output("workflow-validate", {
291
- ok: true,
292
- path: filePath,
293
- format: "program",
294
- title: result.program.name,
295
- stepCount: result.program.steps.length,
296
- warnings: result.warnings.map((w) => ({ line: w.line, message: w.message })),
297
- });
298
- return;
299
- }
300
- const { parse } = validateWorkflowSource(filePath);
301
- if (parse.ok) {
302
- output("workflow-validate", {
303
- ok: true,
304
- path: filePath,
305
- title: parse.document.title,
306
- stepCount: parse.document.steps.length,
307
- });
308
- return;
309
- }
310
- throw new UsageError(formatWorkflowErrors(filePath, parse.errors));
311
- },
312
- });
313
- async function resolveWorkflowFilePath(target) {
314
- // A bare (`workflow:<name>`) OR origin-qualified (`<origin>//workflow:<name>`)
315
- // ref resolves through the source search, exactly like `workflow start` /
316
- // `status` / `next`. Anything else is treated as a filesystem path. Detecting
317
- // the origin-qualified form here (not just the bare prefix) keeps `validate`'s
318
- // ref contract in lockstep with the rest of the workflow command family — an
319
- // `extra//workflow:foo` ref validates the file that `extra//workflow:foo`
320
- // starts, rather than being mistaken for a relative path that does not exist.
321
- const looksLikeWorkflowRef = target.startsWith("workflow:") || target.includes("//workflow:");
322
- if (!looksLikeWorkflowRef)
323
- return target;
324
- const parsed = parseAssetRef(target);
325
- if (parsed.type !== "workflow") {
326
- throw new UsageError(`Expected a workflow ref (workflow:<name>), got "${target}".`);
327
- }
328
- const config = loadConfig();
329
- const allSources = resolveSourceEntries(undefined, config);
330
- const searchSources = resolveSourcesForOrigin(parsed.origin, allSources);
331
- for (const source of searchSources) {
332
- try {
333
- return await resolveAssetPath(source.path, "workflow", parsed.name);
334
- }
335
- catch {
336
- /* try next source */
337
- }
338
- }
339
- throw new UsageError(`Workflow not found for ref: workflow:${parsed.name}`);
340
- }
341
229
  const workflowRunCommand = defineJsonCommand({
342
230
  meta: {
343
231
  name: "run",
344
- description: "EXPERIMENTAL: execute a workflow's steps with the native engine — akm dispatches each step's units " +
345
- "(fan-out, schema output) to the configured runner and advances the run through the normal completion gates",
232
+ description: "EXPERIMENTAL, gated behind `experimental.workflowEngine`: execute a workflow's steps with the native " +
233
+ "engine — akm dispatches each step's units (fan-out, schema output) to the configured runner and advances " +
234
+ "the run through the normal completion gates",
346
235
  },
347
236
  args: {
348
237
  target: { type: "positional", description: "Workflow run id or workflow ref (auto-starts a run)", required: true },
349
238
  params: { type: "string", description: "Workflow parameters as a JSON object (only for auto-started runs)" },
350
239
  "max-steps": { type: "string", description: "Stop after executing this many steps" },
351
- "require-gates": {
352
- type: "boolean",
353
- description: "Treat every criteria-bearing completion gate as required: if no LLM judge is available, BLOCK the step " +
354
- "(for a human to resolve via `akm workflow resume`) instead of failing open. A per-step `gate.required: true` " +
355
- "in the workflow does the same on every surface; this is the run-wide override (#18).",
356
- default: false,
357
- },
358
240
  },
359
241
  async run({ args }) {
242
+ requireWorkflowEngineEnabled(loadConfig(), "run");
360
243
  const { runWorkflowSteps } = await import("../workflows/exec/run-workflow.js");
361
244
  const rawMaxSteps = getStringArg(args, "max-steps");
362
245
  let maxSteps;
@@ -370,7 +253,6 @@ const workflowRunCommand = defineJsonCommand({
370
253
  target: args.target,
371
254
  ...(args.params ? { params: parseWorkflowJsonObject(args.params, "--params") } : {}),
372
255
  ...(maxSteps !== undefined ? { maxSteps } : {}),
373
- ...(args["require-gates"] === true ? { requireGates: true } : {}),
374
256
  });
375
257
  output("workflow-run", result);
376
258
  },
@@ -378,9 +260,10 @@ const workflowRunCommand = defineJsonCommand({
378
260
  const workflowBriefCommand = defineJsonCommand({
379
261
  meta: {
380
262
  name: "brief",
381
- description: "EXPERIMENTAL: describe a run's active step as an executable work-list for ANY agent session (the " +
382
- "harness-neutral driver protocol) — read-only, takes no engine lease, mutates nothing; prints per-unit " +
383
- "instructions, output schema, env binding names, and the exact `akm workflow report` command lines",
263
+ description: "EXPERIMENTAL, gated behind `experimental.workflowEngine`: describe a run's active step as an executable " +
264
+ "work-list for ANY agent session (the harness-neutral driver protocol) — read-only, takes no engine lease, " +
265
+ "mutates nothing; prints per-unit instructions, output schema, env binding names, and the exact " +
266
+ "`akm workflow report` command lines",
384
267
  },
385
268
  args: {
386
269
  target: {
@@ -390,6 +273,7 @@ const workflowBriefCommand = defineJsonCommand({
390
273
  },
391
274
  },
392
275
  async run({ args }) {
276
+ requireWorkflowEngineEnabled(loadConfig(), "brief");
393
277
  const { buildWorkflowBrief } = await import("../workflows/exec/brief.js");
394
278
  const result = await buildWorkflowBrief(args.target);
395
279
  output("workflow-brief", result);
@@ -399,8 +283,9 @@ const WORKFLOW_REPORT_STATES = ["completed", "failed", "running"];
399
283
  const workflowReportCommand = defineJsonCommand({
400
284
  meta: {
401
285
  name: "report",
402
- description: "EXPERIMENTAL: report a unit's result back into a run (the mutating half of the harness-neutral driver " +
403
- "protocol) — ingested through the SAME shared step semantics the engine uses. --status running claims/" +
286
+ description: "EXPERIMENTAL, gated behind `experimental.workflowEngine`: report a unit's result back into a run (the " +
287
+ "mutating half of the harness-neutral driver protocol) — ingested through the SAME shared step semantics " +
288
+ "the engine uses. --status running claims/" +
404
289
  "heartbeats a unit; completed/failed records it and, when the step's work-list is fully terminal, runs the " +
405
290
  "engine's completion path (reducer, artifact + schema validation, gate). --settle (no --unit) advances a run " +
406
291
  "parked on a route-only/empty step. Refused while a live engine lease exists",
@@ -438,6 +323,7 @@ const workflowReportCommand = defineJsonCommand({
438
323
  },
439
324
  },
440
325
  async run({ args }) {
326
+ requireWorkflowEngineEnabled(loadConfig(), "report");
441
327
  // --settle: the unit-less verb that advances a run parked on a
442
328
  // non-dispatching step. Mutually exclusive with the per-unit report flags.
443
329
  if (args.settle === true) {
@@ -515,41 +401,6 @@ async function readStdin() {
515
401
  chunks.push(chunk);
516
402
  return Buffer.concat(chunks).toString("utf8");
517
403
  }
518
- const workflowWatchCommand = defineJsonCommand({
519
- meta: {
520
- name: "watch",
521
- description: "Print a run's workflow_* events (state.db events table) as NDJSON and exit; --stream polls in the " +
522
- "foreground until the run reaches a terminal status (no daemon)",
523
- },
524
- args: {
525
- runId: { type: "positional", description: "Workflow run id", required: true },
526
- stream: {
527
- type: "boolean",
528
- description: "Keep polling for new events until the run leaves 'active' (completed/failed/blocked)",
529
- default: false,
530
- },
531
- "interval-ms": { type: "string", description: "Poll interval in milliseconds for --stream (default: 1000)" },
532
- },
533
- async run({ args }) {
534
- const rawInterval = getStringArg(args, "interval-ms");
535
- let intervalMs;
536
- if (rawInterval !== undefined) {
537
- intervalMs = Number.parseInt(rawInterval, 10);
538
- if (!/^\d+$/.test(rawInterval) || intervalMs <= 0) {
539
- throw new UsageError(`--interval-ms must be a positive integer, got "${rawInterval}".`, "INVALID_FLAG_VALUE");
540
- }
541
- }
542
- const { watchWorkflowRun } = await import("../workflows/exec/watch.js");
543
- const result = await watchWorkflowRun({
544
- runId: args.runId,
545
- stream: args.stream === true,
546
- ...(intervalMs !== undefined ? { intervalMs } : {}),
547
- });
548
- // The event lines above are raw NDJSON on stdout; this trailing envelope
549
- // is the machine-readable command result (counts + terminal status).
550
- output("workflow-watch", { ok: true, ...result });
551
- },
552
- });
553
404
  const workflowAbandonCommand = defineJsonCommand({
554
405
  meta: {
555
406
  name: "abandon",
@@ -576,7 +427,7 @@ const workflowResumeCommand = defineJsonCommand({
576
427
  output("workflow-resume", result);
577
428
  },
578
429
  });
579
- export const workflowCommand = defineCommand({
430
+ export const workflowCommand = defineGroupCommand({
580
431
  meta: {
581
432
  name: "workflow",
582
433
  description: "Author, inspect, and execute step-by-step workflow assets",
@@ -588,20 +439,16 @@ export const workflowCommand = defineCommand({
588
439
  status: workflowStatusCommand,
589
440
  list: workflowListCommand,
590
441
  create: workflowCreateCommand,
591
- template: workflowTemplateCommand,
592
442
  resume: workflowResumeCommand,
593
443
  abandon: workflowAbandonCommand,
594
- validate: workflowValidateCommand,
595
444
  run: workflowRunCommand,
596
445
  brief: workflowBriefCommand,
597
446
  report: workflowReportCommand,
598
- watch: workflowWatchCommand,
599
- },
600
- run({ args }) {
601
- return runWithJsonErrors(async () => {
602
- if (hasWorkflowSubcommand(args))
603
- return;
604
- output("workflow-list", await listWorkflowRuns({ activeOnly: true }));
605
- });
606
447
  },
448
+ // No `defaultRun`: bare `akm workflow` is a usage error (exit 2), the
449
+ // canonical bare-group behavior — owner ruling 12. Run `akm workflow list
450
+ // --active` for what the bare form used to print. This group was previously
451
+ // hand-rolled on `defineCommand` with its own `hasWorkflowSubcommand` guard,
452
+ // which duplicated the subcommand names in a second hand-maintained set;
453
+ // `defineGroupCommand` derives the guard from `subCommands` directly.
607
454
  });
@@ -1,7 +1,7 @@
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
- import { defaultRendererRegistry } from "./asset/asset-registry.js";
4
+ import { defaultRendererRegistry } from "./type-presentation.js";
5
5
  function registryActionContributor(registry) {
6
6
  return {
7
7
  name: "registry-action-contributor",
@@ -0,0 +1,49 @@
1
+ // This Source Code Form is subject to the terms of the Mozilla Public
2
+ // License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
+ /**
5
+ * Decide whether injecting an env with the given dangerous keys is allowed,
6
+ * warned, or blocked. Third-party (registry-installed) stashes hard-block;
7
+ * first-party stashes warn. See rule 1 above.
8
+ *
9
+ * @param dangerousKeys The subset of injected keys flagged as process-hijacking
10
+ * (already filtered by the caller via `isDangerousEnvKey`).
11
+ * @param thirdParty `true` when the env's source is a third-party stash — i.e.
12
+ * its origin carries a `registryId`.
13
+ */
14
+ export function decideDangerousEnvInjection(input) {
15
+ if (input.dangerousKeys.length === 0)
16
+ return "allow";
17
+ return input.thirdParty ? "block" : "warn";
18
+ }
19
+ /**
20
+ * Decide the baseline install stance for a freshly-installed stash's
21
+ * dangerous-key scan. The interactive confirm / rollback UX is applied by the
22
+ * caller on top of the `"gate"` stance — this predicate only fixes the policy.
23
+ * See rule 2 above.
24
+ */
25
+ export function decideDangerousKeyInstall(input) {
26
+ if (!input.findingsPresent)
27
+ return "allow";
28
+ return input.allowInsecure ? "warn-allow" : "gate";
29
+ }
30
+ // ── Rule 3: task activation (tasks/runner.ts) ────────────────────────────────
31
+ /**
32
+ * Whether a scheduler-generated task invocation must be skipped because the
33
+ * task is not activated (its `enabled:` is false). Manual (non-scheduled) runs
34
+ * are always dispatched — installing a task grants nothing until enabled, but
35
+ * the operator may still run it by hand for catch-up / testing. See rule 3.
36
+ */
37
+ export function shouldSkipUnactivatedTask(input) {
38
+ return !input.enabled && input.scheduled;
39
+ }
40
+ // ── Rule 4: write activation (search-source.ts, installations.ts) ────────────
41
+ /**
42
+ * Whether a resolved source is write-activated. Only the primary stash and
43
+ * sources explicitly marked `writable: true` are writable; registry-cached
44
+ * (installed, read-only) sources are never written in place because
45
+ * `akm update` overwrites them. See rule 4 above.
46
+ */
47
+ export function isSourceWriteActivated(source) {
48
+ return source.writable === true;
49
+ }