akm-cli 0.9.0-rc.0 → 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 (598) hide show
  1. package/CHANGELOG.md +1283 -22
  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/prompts/workflow-unit-preamble.md +26 -0
  26. package/dist/assets/stash-skeleton/README.md +38 -10
  27. package/dist/assets/stash-skeleton/facts/conventions/assets/agent.md +8 -0
  28. package/dist/assets/stash-skeleton/facts/conventions/assets/command.md +8 -0
  29. package/dist/assets/stash-skeleton/facts/conventions/assets/fact.md +14 -1
  30. package/dist/assets/stash-skeleton/facts/conventions/assets/knowledge.md +13 -1
  31. package/dist/assets/stash-skeleton/facts/conventions/assets/lesson.md +9 -1
  32. package/dist/assets/stash-skeleton/facts/conventions/assets/memory.md +11 -0
  33. package/dist/assets/stash-skeleton/facts/conventions/assets/script.md +9 -0
  34. package/dist/assets/stash-skeleton/facts/conventions/assets/skill.md +9 -0
  35. package/dist/assets/stash-skeleton/facts/conventions/assets/workflow.md +8 -0
  36. package/dist/assets/stash-skeleton/facts/conventions/backlinks.md +100 -0
  37. package/dist/assets/stash-skeleton/facts/conventions/domains.md +64 -0
  38. package/dist/assets/stash-skeleton/facts/conventions/organization.md +136 -0
  39. package/dist/assets/tasks/core/extract.yml +3 -2
  40. package/dist/assets/tasks/core/improve.yml +2 -1
  41. package/dist/assets/tasks/core/index-refresh.yml +1 -0
  42. package/dist/assets/tasks/core/sync.yml +1 -0
  43. package/dist/assets/tasks/core/version-check.yml +2 -1
  44. package/dist/assets/tasks/improve/akm-graph-refresh-weekly.yml +5 -0
  45. package/dist/assets/tasks/improve/akm-improve-catchup.yml +8 -0
  46. package/dist/assets/tasks/improve/akm-improve-consolidate.yml +5 -0
  47. package/dist/assets/tasks/improve/akm-improve-frequent.yml +5 -0
  48. package/dist/assets/tasks/improve/akm-improve-nightly.yml +5 -0
  49. package/dist/assets/templates/html/health.html +5 -4
  50. package/dist/assets/workflows/workflow-template.md +31 -15
  51. package/dist/cli/invocation.js +279 -0
  52. package/dist/cli/parse-args.js +5 -90
  53. package/dist/cli/retired-commands.js +78 -0
  54. package/dist/cli/shared.js +158 -48
  55. package/dist/cli-node.mjs +2 -1
  56. package/dist/cli.js +747 -293
  57. package/dist/commands/agent/agent-dispatch.js +19 -18
  58. package/dist/commands/agent/agent-support.js +0 -24
  59. package/dist/commands/agent/contribute-cli.js +43 -97
  60. package/dist/commands/completions.js +80 -23
  61. package/dist/commands/config-cli.js +44 -281
  62. package/dist/commands/env/env-binding.js +99 -0
  63. package/dist/commands/env/env-cli.js +84 -224
  64. package/dist/commands/env/env.js +12 -163
  65. package/dist/commands/env/marker-path.js +6 -0
  66. package/dist/commands/env/secret-cli.js +45 -61
  67. package/dist/commands/env/secret.js +32 -62
  68. package/dist/commands/feedback-cli.js +179 -85
  69. package/dist/commands/health/accept-rate.js +58 -0
  70. package/dist/commands/health/advisories.js +7 -8
  71. package/dist/commands/health/checks.js +279 -94
  72. package/dist/commands/health/html-report.js +197 -578
  73. package/dist/commands/health/improve-metrics.js +277 -246
  74. package/dist/commands/health/llm-usage.js +19 -19
  75. package/dist/commands/health/md-report.js +16 -7
  76. package/dist/commands/health/metrics.js +67 -32
  77. package/dist/commands/health/renderers.js +47 -0
  78. package/dist/commands/health/report-view-model.js +508 -0
  79. package/dist/commands/health/stash-exposure.js +1 -1
  80. package/dist/commands/health/surfaces.js +16 -56
  81. package/dist/commands/health/task-runs.js +3 -67
  82. package/dist/{migrate-storage-node.mjs → commands/health/types-checks.js} +1 -5
  83. package/dist/commands/health/types-improve.js +29 -0
  84. package/dist/{output/text/save.js → commands/health/types-metrics.js} +1 -2
  85. package/dist/commands/health/types-result.js +7 -0
  86. package/dist/commands/health/types-runs.js +4 -0
  87. package/dist/commands/health/types-session-log.js +4 -0
  88. package/dist/commands/health/types-windows.js +4 -0
  89. package/dist/commands/health/types.js +26 -21
  90. package/dist/commands/health/windows.js +2 -3
  91. package/dist/commands/health.js +296 -167
  92. package/dist/commands/improve/anti-collapse.js +5 -5
  93. package/dist/commands/improve/autonomy-gate.js +68 -0
  94. package/dist/commands/improve/collapse-detector.js +65 -52
  95. package/dist/commands/improve/consolidate/chunking.js +9 -7
  96. package/dist/commands/improve/consolidate/eligibility.js +1 -23
  97. package/dist/commands/improve/consolidate/merge.js +4 -0
  98. package/dist/commands/improve/consolidate.js +454 -1354
  99. package/dist/commands/improve/content-hash.js +39 -0
  100. package/dist/commands/improve/distill/content-repair.js +4 -10
  101. package/dist/commands/improve/distill/promote-memory.js +89 -64
  102. package/dist/commands/improve/distill/quality-gate.js +118 -42
  103. package/dist/commands/improve/distill-guards.js +1 -1
  104. package/dist/commands/improve/distill-promotion-policy.js +33 -888
  105. package/dist/commands/improve/distill.js +607 -363
  106. package/dist/commands/improve/eligibility.js +165 -79
  107. package/dist/commands/improve/extract-cli.js +35 -126
  108. package/dist/commands/improve/extract-prompt.js +6 -35
  109. package/dist/commands/improve/extract.js +640 -391
  110. package/dist/commands/improve/feedback-valence.js +2 -12
  111. package/dist/commands/improve/improve-cli.js +134 -135
  112. package/dist/commands/improve/improve-result-file.js +30 -50
  113. package/dist/commands/improve/improve-run-types.js +4 -0
  114. package/dist/commands/improve/improve-strategies.js +135 -0
  115. package/dist/commands/improve/improve.js +904 -701
  116. package/dist/commands/improve/locks.js +64 -111
  117. package/dist/commands/improve/loop-stages.js +1110 -923
  118. package/dist/commands/improve/memory/derived-ref.js +124 -0
  119. package/dist/commands/improve/memory/memory-belief.js +79 -7
  120. package/dist/commands/improve/memory/memory-contradiction-detect.js +49 -52
  121. package/dist/commands/improve/memory/memory-improve.js +25 -37
  122. package/dist/commands/improve/outcome-loop.js +25 -88
  123. package/dist/commands/improve/preparation.js +1034 -813
  124. package/dist/commands/improve/proactive-maintenance.js +34 -9
  125. package/dist/commands/improve/proposal-envelope.js +31 -0
  126. package/dist/commands/improve/reflect.js +983 -794
  127. package/dist/commands/improve/run-context.js +119 -0
  128. package/dist/commands/improve/salience.js +24 -127
  129. package/dist/commands/improve/session-asset.js +7 -3
  130. package/dist/commands/improve/shared.js +14 -34
  131. package/dist/commands/improve/source-identity.js +28 -0
  132. package/dist/commands/improve/triage.js +20 -17
  133. package/dist/commands/lint/base-linter.js +340 -313
  134. package/dist/commands/lint/env-key-rules.js +31 -47
  135. package/dist/commands/lint/index.js +185 -30
  136. package/dist/commands/{events.js → log.js} +28 -38
  137. package/dist/commands/migrate-cli.js +54 -0
  138. package/dist/commands/migration-tool.js +55 -0
  139. package/dist/commands/observability-cli.js +70 -208
  140. package/dist/commands/proposal/diff-format.js +50 -0
  141. package/dist/commands/proposal/drain-policies.js +0 -6
  142. package/dist/commands/proposal/drain.js +91 -40
  143. package/dist/commands/proposal/proposal-cli.js +134 -132
  144. package/dist/commands/proposal/proposal-types.js +56 -0
  145. package/dist/commands/proposal/proposal.js +83 -65
  146. package/dist/commands/proposal/propose-cli.js +88 -0
  147. package/dist/commands/proposal/propose.js +105 -88
  148. package/dist/commands/proposal/repository.js +1303 -278
  149. package/dist/commands/proposal/validators/proposal-quality-validators.js +16 -6
  150. package/dist/commands/proposal/validators/proposal-validators.js +61 -12
  151. package/dist/commands/proposal/validators/proposals.js +6 -8
  152. package/dist/commands/read/curate.js +78 -73
  153. package/dist/commands/read/knowledge.js +510 -13
  154. package/dist/commands/read/registry-search.js +2 -2
  155. package/dist/commands/read/remember-cli.js +84 -15
  156. package/dist/commands/read/search-cli.js +203 -96
  157. package/dist/commands/read/search.js +126 -94
  158. package/dist/commands/read/show.js +226 -250
  159. package/dist/commands/registry-cli.js +34 -60
  160. package/dist/commands/remember.js +18 -57
  161. package/dist/commands/sources/add-cli.js +104 -49
  162. package/dist/commands/sources/bundle-cli.js +166 -0
  163. package/dist/commands/sources/bundle-config-ops.js +63 -0
  164. package/dist/commands/sources/info.js +27 -15
  165. package/dist/commands/sources/init.js +30 -40
  166. package/dist/commands/sources/installed-stashes.js +469 -172
  167. package/dist/commands/sources/migration-help.js +7 -4
  168. package/dist/commands/sources/schema-repair.js +10 -9
  169. package/dist/commands/sources/self-update.js +182 -121
  170. package/dist/commands/sources/source-add.js +169 -178
  171. package/dist/commands/sources/source-clone.js +144 -41
  172. package/dist/commands/sources/source-manage.js +94 -59
  173. package/dist/commands/sources/sources-cli.js +64 -205
  174. package/dist/commands/sources/stash-cli.js +91 -54
  175. package/dist/commands/sources/stash-skeleton.js +1 -1
  176. package/dist/commands/tasks/tasks-cli.js +106 -104
  177. package/dist/commands/tasks/tasks.js +445 -262
  178. package/dist/commands/workflow-cli.js +232 -121
  179. package/dist/core/action-contributors.js +1 -1
  180. package/dist/core/activation-policy.js +49 -0
  181. package/dist/core/adapter/adapters/agent-skills-adapter.js +181 -0
  182. package/dist/core/adapter/adapters/akm-adapter.js +528 -0
  183. package/dist/core/adapter/adapters/akm-lint.js +392 -0
  184. package/dist/core/adapter/adapters/akm-metadata.js +387 -0
  185. package/dist/core/adapter/adapters/akm-task-adapter.js +149 -0
  186. package/dist/core/adapter/adapters/akm-workflow-adapter.js +180 -0
  187. package/dist/core/adapter/adapters/claude-adapter.js +61 -0
  188. package/dist/core/adapter/adapters/dotenv-adapter.js +187 -0
  189. package/dist/core/adapter/adapters/generic-files-adapter.js +119 -0
  190. package/dist/core/adapter/adapters/index.js +80 -0
  191. package/dist/core/adapter/adapters/llm-wiki-adapter.js +419 -0
  192. package/dist/core/adapter/adapters/okf-adapter.js +391 -0
  193. package/dist/core/adapter/adapters/opencode-adapter.js +68 -0
  194. package/dist/core/adapter/adapters/shared.js +286 -0
  195. package/dist/core/adapter/adapters/tool-dir-shared.js +217 -0
  196. package/dist/core/adapter/adapters/website-snapshot-adapter.js +155 -0
  197. package/dist/core/adapter/bundle-adapter.js +4 -0
  198. package/dist/core/adapter/detect-adapter.js +17 -0
  199. package/dist/core/adapter/recognize-match.js +44 -0
  200. package/dist/core/adapter/registry.js +56 -0
  201. package/dist/core/adapter/types.js +4 -0
  202. package/dist/core/asset/akm-markdown.js +30 -0
  203. package/dist/core/asset/asset-placement.js +243 -0
  204. package/dist/core/asset/asset-ref.js +110 -79
  205. package/dist/core/asset/asset-serialize.js +20 -0
  206. package/dist/core/asset/frontmatter.js +28 -12
  207. package/dist/core/asset/markdown.js +40 -51
  208. package/dist/core/asset/resolve-ref.js +274 -0
  209. package/dist/core/asset/stash-meta.js +2 -2
  210. package/dist/core/bundle-id.js +51 -0
  211. package/dist/core/common.js +281 -86
  212. package/dist/core/config/config-io.js +42 -128
  213. package/dist/core/config/config-schema.js +233 -834
  214. package/dist/core/config/config-sources.js +162 -39
  215. package/dist/core/config/config-types.js +16 -11
  216. package/dist/core/config/config-version.js +29 -0
  217. package/dist/core/config/config-walker.js +126 -37
  218. package/dist/core/config/config.js +154 -331
  219. package/dist/core/config/deep-merge.js +41 -0
  220. package/dist/core/config/engine-semantics.js +28 -0
  221. package/dist/core/config/experimental.js +21 -0
  222. package/dist/core/config/schema/embedding.js +38 -0
  223. package/dist/core/config/schema/engines.js +116 -0
  224. package/dist/core/config/schema/experimental.js +47 -0
  225. package/dist/core/config/schema/feedback.js +31 -0
  226. package/dist/core/config/schema/improve-processes.js +389 -0
  227. package/dist/core/config/schema/improve.js +94 -0
  228. package/dist/core/config/schema/index-config.js +176 -0
  229. package/dist/core/config/schema/output.js +18 -0
  230. package/dist/core/config/schema/primitives.js +94 -0
  231. package/dist/core/config/schema/search.js +30 -0
  232. package/dist/core/config/schema/setup.js +18 -0
  233. package/dist/core/config/schema/sources-bundles.js +169 -0
  234. package/dist/core/config/schema/workflow.js +29 -0
  235. package/dist/core/env-secret-ref.js +155 -20
  236. package/dist/core/errors.js +17 -15
  237. package/dist/core/events-types.js +4 -0
  238. package/dist/core/events.js +46 -128
  239. package/dist/core/extra-params.js +62 -0
  240. package/dist/core/file-change.js +17 -0
  241. package/dist/core/file-lock.js +202 -57
  242. package/dist/core/fs-txn.js +392 -0
  243. package/dist/core/git-message.js +59 -0
  244. package/dist/core/improve-result.js +167 -0
  245. package/dist/core/json-schema.js +142 -0
  246. package/dist/core/lesson-lint.js +1 -17
  247. package/dist/core/logs-db.js +1 -1
  248. package/dist/core/maintenance-barrier.js +135 -0
  249. package/dist/core/migration-operation.js +44 -0
  250. package/dist/core/mutation-target.js +78 -0
  251. package/dist/core/paths.js +22 -25
  252. package/dist/core/platform.js +10 -0
  253. package/dist/core/recognition-util.js +128 -0
  254. package/dist/core/redaction.js +392 -0
  255. package/dist/core/standards/resolve-standards-context.js +36 -65
  256. package/dist/core/standards/resolve-stash-standards.js +2 -2
  257. package/dist/core/standards/resolve-type-conventions.js +5 -5
  258. package/dist/core/state/migrations.js +242 -11
  259. package/dist/core/state-db.js +98 -10
  260. package/dist/core/structured.js +1 -1
  261. package/dist/core/subprocess.js +303 -0
  262. package/dist/core/text-truncation.js +9 -5
  263. package/dist/core/time.js +20 -0
  264. package/dist/core/type-presentation.js +130 -0
  265. package/dist/core/warn.js +0 -3
  266. package/dist/core/write-source.js +834 -118
  267. package/dist/indexer/bundle-identity-guard.js +92 -0
  268. package/dist/indexer/db/graph-db.js +1 -25
  269. package/dist/indexer/db/llm-cache.js +1 -1
  270. package/dist/indexer/ensure-index.js +30 -9
  271. package/dist/indexer/graph/graph-boost.js +9 -30
  272. package/dist/indexer/graph/graph-extraction.js +41 -27
  273. package/dist/indexer/graph/graph-types.js +4 -0
  274. package/dist/indexer/index-writer-lock.js +93 -49
  275. package/dist/indexer/index-written-assets.js +100 -53
  276. package/dist/indexer/indexer.js +746 -329
  277. package/dist/indexer/init.js +18 -25
  278. package/dist/indexer/installations.js +142 -0
  279. package/dist/indexer/passes/dir-staleness.js +18 -10
  280. package/dist/indexer/passes/memory-inference.js +25 -15
  281. package/dist/indexer/passes/metadata.js +412 -243
  282. package/dist/indexer/scan/doc-to-entry.js +160 -0
  283. package/dist/indexer/scan/drain-dir.js +134 -0
  284. package/dist/indexer/search/db-search.js +292 -108
  285. package/dist/indexer/search/fts-query.js +64 -0
  286. package/dist/indexer/search/ranking-contributors.js +145 -25
  287. package/dist/indexer/search/ranking-types.js +4 -0
  288. package/dist/indexer/search/ranking.js +28 -71
  289. package/dist/indexer/search/search-attribution.js +67 -0
  290. package/dist/indexer/search/search-fields.js +18 -3
  291. package/dist/indexer/search/search-hit-enrichers.js +30 -40
  292. package/dist/indexer/search/search-source.js +157 -111
  293. package/dist/indexer/search/semantic-status.js +4 -1
  294. package/dist/indexer/usage/usage-events.js +10 -30
  295. package/dist/indexer/walk/file-context.js +3 -45
  296. package/dist/indexer/walk/matchers.js +42 -34
  297. package/dist/indexer/walk/path-resolver.js +11 -5
  298. package/dist/indexer/walk/walker.js +42 -14
  299. package/dist/integrations/agent/builder-shared.js +7 -0
  300. package/dist/integrations/agent/builders.js +5 -56
  301. package/dist/integrations/agent/config.js +3 -143
  302. package/dist/integrations/agent/detect.js +17 -2
  303. package/dist/integrations/agent/engine-resolution.js +231 -0
  304. package/dist/integrations/agent/index.js +1 -2
  305. package/dist/integrations/agent/model-aliases.js +16 -2
  306. package/dist/integrations/agent/profiles.js +36 -62
  307. package/dist/integrations/agent/prompts.js +46 -18
  308. package/dist/integrations/agent/runner-dispatch.js +93 -4
  309. package/dist/integrations/agent/runner.js +76 -208
  310. package/dist/integrations/agent/spawn.js +88 -196
  311. package/dist/integrations/harnesses/aider/agent-builder.js +114 -0
  312. package/dist/integrations/harnesses/aider/index.js +48 -0
  313. package/dist/integrations/harnesses/aider/result-extractor.js +53 -0
  314. package/dist/integrations/harnesses/amazonq/agent-builder.js +147 -0
  315. package/dist/integrations/harnesses/amazonq/index.js +45 -0
  316. package/dist/integrations/harnesses/amazonq/result-extractor.js +48 -0
  317. package/dist/integrations/harnesses/claude/agent-builder.js +46 -8
  318. package/dist/integrations/harnesses/claude/config-import.js +1 -3
  319. package/dist/integrations/harnesses/claude/index.js +24 -35
  320. package/dist/integrations/harnesses/claude/result-extractor.js +52 -0
  321. package/dist/integrations/harnesses/claude/session-log.js +27 -75
  322. package/dist/integrations/harnesses/codex/agent-builder.js +138 -0
  323. package/dist/integrations/harnesses/codex/index.js +52 -0
  324. package/dist/integrations/harnesses/codex/result-extractor.js +73 -0
  325. package/dist/integrations/harnesses/copilot/agent-builder.js +122 -0
  326. package/dist/integrations/harnesses/copilot/index.js +48 -0
  327. package/dist/integrations/harnesses/copilot/result-extractor.js +151 -0
  328. package/dist/integrations/harnesses/gemini/agent-builder.js +120 -0
  329. package/dist/integrations/harnesses/gemini/index.js +48 -0
  330. package/dist/integrations/harnesses/gemini/result-extractor.js +121 -0
  331. package/dist/integrations/harnesses/ids.js +24 -0
  332. package/dist/integrations/harnesses/index.js +54 -34
  333. package/dist/integrations/harnesses/opencode/agent-builder.js +23 -5
  334. package/dist/integrations/harnesses/opencode/config-import.js +1 -3
  335. package/dist/integrations/harnesses/opencode/index.js +14 -32
  336. package/dist/integrations/harnesses/opencode/session-log.js +67 -125
  337. package/dist/integrations/harnesses/opencode-sdk/harness.js +51 -0
  338. package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +681 -108
  339. package/dist/integrations/harnesses/openhands/agent-builder.js +128 -0
  340. package/dist/integrations/harnesses/openhands/index.js +48 -0
  341. package/dist/integrations/harnesses/openhands/result-extractor.js +103 -0
  342. package/dist/integrations/harnesses/pi/agent-builder.js +97 -0
  343. package/dist/integrations/harnesses/pi/index.js +45 -0
  344. package/dist/integrations/harnesses/pi/result-extractor.js +135 -0
  345. package/dist/integrations/harnesses/shared.js +17 -0
  346. package/dist/integrations/harnesses/types.js +43 -32
  347. package/dist/integrations/lockfile.js +211 -24
  348. package/dist/integrations/session-logs/index.js +36 -39
  349. package/dist/integrations/session-logs/provider-base.js +113 -0
  350. package/dist/llm/client.js +182 -110
  351. package/dist/llm/embedders/deterministic.js +2 -2
  352. package/dist/llm/embedders/remote.js +21 -9
  353. package/dist/llm/feature-gate.js +17 -57
  354. package/dist/llm/graph-extract.js +12 -13
  355. package/dist/llm/index-passes.js +8 -42
  356. package/dist/llm/memory-infer.js +144 -1
  357. package/dist/llm/metadata-enhance.js +45 -30
  358. package/dist/llm/structured-call.js +16 -8
  359. package/dist/llm/usage-persist.js +30 -5
  360. package/dist/llm/usage-telemetry.js +59 -6
  361. package/dist/output/cli-hints.js +1 -2
  362. package/dist/output/command-registry.js +27 -0
  363. package/dist/output/context.js +22 -7
  364. package/dist/output/format-exempt.js +80 -0
  365. package/dist/output/generic-render.js +251 -0
  366. package/dist/output/html-render.js +11 -16
  367. package/dist/output/render-registry.js +57 -0
  368. package/dist/output/renderers.js +14 -279
  369. package/dist/output/shapes/curate.js +10 -1
  370. package/dist/output/shapes/events.js +12 -7
  371. package/dist/output/shapes/helpers.js +58 -84
  372. package/dist/output/shapes/passthrough.js +11 -39
  373. package/dist/output/shapes/proposal/producer.js +15 -7
  374. package/dist/output/shapes/registry.js +12 -6
  375. package/dist/output/shapes.js +0 -9
  376. package/dist/output/text/{init.js → bundle-create.js} +3 -1
  377. package/dist/output/text/bundle-show.js +7 -0
  378. package/dist/output/text/command-format.js +562 -0
  379. package/dist/output/text/env.js +1 -3
  380. package/dist/output/text/events.js +8 -7
  381. package/dist/output/text/helpers.js +15 -1164
  382. package/dist/output/text/proposal/producer.js +4 -2
  383. package/dist/output/text/proposal-format.js +202 -0
  384. package/dist/output/text/registry-commands.js +1 -2
  385. package/dist/output/text/registry.js +12 -6
  386. package/dist/output/text/show-directives.js +117 -0
  387. package/dist/output/text/show-format.js +103 -0
  388. package/dist/output/text/sync.js +5 -0
  389. package/dist/output/text/workflow-format.js +332 -0
  390. package/dist/output/text/workflow.js +3 -2
  391. package/dist/output/text.js +10 -19
  392. package/dist/registry/factory.js +4 -6
  393. package/dist/registry/origin-resolve.js +16 -27
  394. package/dist/registry/providers/skills-sh.js +3 -3
  395. package/dist/registry/providers/static-index.js +15 -25
  396. package/dist/registry/resolve.js +43 -94
  397. package/dist/registry/semver.js +43 -0
  398. package/dist/runtime.js +81 -12
  399. package/dist/scripts/akm-migrate.js +35529 -0
  400. package/dist/setup/detect.js +5 -7
  401. package/dist/setup/detected-engines.js +136 -0
  402. package/dist/setup/engine-config.js +100 -0
  403. package/dist/setup/registry-stash-loader.js +3 -3
  404. package/dist/setup/semantic-assets.js +12 -9
  405. package/dist/setup/setup.js +444 -208
  406. package/dist/setup/steps/connection-shared.js +120 -0
  407. package/dist/setup/steps/connection.js +108 -305
  408. package/dist/setup/steps/platforms.js +13 -12
  409. package/dist/setup/steps/semantic.js +15 -3
  410. package/dist/setup/steps/sources.js +21 -15
  411. package/dist/setup/steps/stashdir.js +6 -4
  412. package/dist/setup/steps/tasks.js +236 -119
  413. package/dist/setup/steps.js +3 -2
  414. package/dist/sources/freshness.js +39 -0
  415. package/dist/sources/provider-factory.js +11 -17
  416. package/dist/sources/providers/filesystem.js +2 -3
  417. package/dist/sources/providers/git-install.js +278 -34
  418. package/dist/sources/providers/git-provider.js +54 -56
  419. package/dist/sources/providers/git-stash.js +420 -91
  420. package/dist/sources/providers/git.js +2 -2
  421. package/dist/sources/providers/npm.js +16 -19
  422. package/dist/sources/providers/provider-utils.js +47 -22
  423. package/dist/sources/providers/sync-from-ref.js +3 -9
  424. package/dist/sources/providers/website.js +2 -2
  425. package/dist/sources/resolve.js +11 -10
  426. package/dist/sources/snapshot-fetchers/types.js +4 -0
  427. package/dist/sources/{website-ingest.js → snapshot-fetchers/website-ingest.js} +110 -41
  428. package/dist/storage/database.js +60 -4
  429. package/dist/storage/engines/sqlite-migrations.js +156 -5
  430. package/dist/storage/locations.js +1 -2
  431. package/dist/storage/repositories/canaries-repository.js +1 -1
  432. package/dist/storage/repositories/events-repository.js +51 -11
  433. package/dist/storage/repositories/improve-runs-repository.js +6 -32
  434. package/dist/storage/repositories/index-connection.js +79 -0
  435. package/dist/storage/repositories/index-db.js +4 -3
  436. package/dist/storage/repositories/index-entries-repository.js +863 -0
  437. package/dist/{indexer/db/entry-mapper.js → storage/repositories/index-entry-mapper.js} +19 -2
  438. package/dist/storage/repositories/index-entry-types.js +4 -0
  439. package/dist/storage/repositories/index-fts-repository.js +167 -0
  440. package/dist/storage/repositories/index-llm-cache-repository.js +108 -0
  441. package/dist/storage/repositories/index-meta-repository.js +49 -0
  442. package/dist/{indexer/db/schema.js → storage/repositories/index-schema.js} +226 -100
  443. package/dist/storage/repositories/index-sql.js +12 -0
  444. package/dist/storage/repositories/index-utility-repository.js +356 -0
  445. package/dist/storage/repositories/index-vec-repository.js +250 -0
  446. package/dist/storage/repositories/outcome-repository.js +119 -0
  447. package/dist/storage/repositories/proposals-repository.js +317 -75
  448. package/dist/storage/repositories/registry-cache.js +1 -1
  449. package/dist/storage/repositories/salience-repository.js +172 -0
  450. package/dist/storage/repositories/task-history-repository.js +110 -3
  451. package/dist/storage/repositories/workflow-runs-repository.js +240 -19
  452. package/dist/tasks/backends/cron.js +169 -46
  453. package/dist/tasks/backends/exec-utils.js +76 -3
  454. package/dist/tasks/backends/index.js +6 -9
  455. package/dist/tasks/backends/launchd.js +292 -55
  456. package/dist/tasks/backends/schtasks.js +557 -70
  457. package/dist/tasks/backends/types.js +4 -0
  458. package/dist/tasks/command-executable.js +93 -0
  459. package/dist/tasks/embedded.js +56 -38
  460. package/dist/tasks/parser.js +156 -64
  461. package/dist/tasks/resolve-akm-bin.js +144 -51
  462. package/dist/tasks/runner.js +377 -209
  463. package/dist/tasks/schedule.js +108 -19
  464. package/dist/tasks/scheduler-invocation.js +296 -0
  465. package/dist/tasks/schema.js +1 -1
  466. package/dist/tasks/task-id.js +35 -0
  467. package/dist/tasks/validator.js +30 -16
  468. package/dist/text-import-hook.mjs +1 -1
  469. package/dist/workflows/authoring/authoring.js +104 -43
  470. package/dist/workflows/authoring/scope-key.js +1 -1
  471. package/dist/workflows/cli.js +0 -16
  472. package/dist/workflows/concurrency-policy.js +15 -0
  473. package/dist/workflows/exec/brief.js +450 -0
  474. package/dist/workflows/exec/frozen-judge.js +47 -0
  475. package/dist/workflows/exec/native-executor.js +1038 -0
  476. package/dist/workflows/exec/param-secrets.js +115 -0
  477. package/dist/workflows/exec/report.js +1460 -0
  478. package/dist/workflows/exec/run-workflow.js +602 -0
  479. package/dist/workflows/exec/scheduler.js +71 -0
  480. package/dist/workflows/exec/step-work.js +1190 -0
  481. package/dist/workflows/exec/unit-writer.js +23 -0
  482. package/dist/workflows/exec/workflow-engine-gate.js +67 -0
  483. package/dist/workflows/exec/worktree.js +171 -0
  484. package/dist/workflows/ir/compile.js +246 -0
  485. package/dist/workflows/ir/freeze.js +233 -0
  486. package/dist/workflows/ir/params.js +54 -0
  487. package/dist/workflows/ir/plan-hash.js +68 -0
  488. package/dist/workflows/ir/schema.js +540 -0
  489. package/dist/workflows/parser.js +878 -304
  490. package/dist/workflows/program/expressions.js +181 -0
  491. package/dist/workflows/program/schema.js +51 -0
  492. package/dist/workflows/renderer.js +100 -45
  493. package/dist/workflows/resource-limits.js +22 -0
  494. package/dist/workflows/runtime/agent-identity.js +59 -14
  495. package/dist/workflows/runtime/checkin.js +1 -1
  496. package/dist/workflows/runtime/plan-classifier.js +131 -0
  497. package/dist/workflows/runtime/runs.js +376 -119
  498. package/dist/workflows/runtime/unit-checkin.js +45 -0
  499. package/dist/workflows/runtime/unit-phases.js +20 -0
  500. package/dist/workflows/runtime/workflow-asset-loader.js +241 -40
  501. package/dist/workflows/schema.js +1 -11
  502. package/dist/workflows/validate-summary.js +2 -3
  503. package/dist/workflows/validator.js +52 -30
  504. package/docs/README.md +42 -78
  505. package/docs/migration/README.md +8 -0
  506. package/docs/migration/release-notes/0.6.0.md +1 -1
  507. package/docs/migration/release-notes/0.7.0.md +9 -8
  508. package/docs/migration/release-notes/0.9.0.md +158 -14
  509. package/docs/migration/v0.7-to-v0.8.md +46 -47
  510. package/docs/migration/v0.8-to-v0.9.md +844 -0
  511. package/docs/reference/README.md +12 -0
  512. package/docs/reference/data-and-telemetry.md +333 -0
  513. package/package.json +21 -17
  514. package/schemas/akm-asset-envelope.json +93 -0
  515. package/schemas/akm-config.json +4636 -0
  516. package/schemas/akm-task.json +87 -0
  517. package/schemas/akm-workflow.json +373 -0
  518. package/dist/akm-migrate-storage +0 -38
  519. package/dist/assets/help/help-accept.md +0 -12
  520. package/dist/assets/help/help-improve.md +0 -84
  521. package/dist/assets/help/help-proposals.md +0 -17
  522. package/dist/assets/help/help-propose.md +0 -17
  523. package/dist/assets/help/help-reject.md +0 -11
  524. package/dist/assets/profiles/frequent.json +0 -13
  525. package/dist/assets/profiles/recombine-only.json +0 -21
  526. package/dist/assets/profiles/reflect-distill.json +0 -30
  527. package/dist/assets/profiles/synthesize.json +0 -15
  528. package/dist/assets/prompts/procedural-system.md +0 -44
  529. package/dist/assets/prompts/recombine-system.md +0 -40
  530. package/dist/assets/prompts/staleness-detect-system.md +0 -6
  531. package/dist/assets/tasks/core/backup.yml +0 -4
  532. package/dist/assets/tasks/graph-refresh-weekly.yml +0 -10
  533. package/dist/assets/templates/html/default.html +0 -78
  534. package/dist/assets/templates/html/vendor/echarts.min.js +0 -45
  535. package/dist/assets/wiki/index-template.md +0 -12
  536. package/dist/assets/wiki/ingest-workflow-template.md +0 -83
  537. package/dist/assets/wiki/log-template.md +0 -8
  538. package/dist/assets/wiki/schema-template.md +0 -61
  539. package/dist/cli/config-migrate.js +0 -150
  540. package/dist/cli/config-validate.js +0 -39
  541. package/dist/commands/graph/graph-cli.js +0 -124
  542. package/dist/commands/graph/graph.js +0 -487
  543. package/dist/commands/improve/calibration.js +0 -161
  544. package/dist/commands/improve/dedup.js +0 -482
  545. package/dist/commands/improve/extract-watch.js +0 -140
  546. package/dist/commands/improve/hot-probation.js +0 -45
  547. package/dist/commands/improve/improve-auto-accept.js +0 -276
  548. package/dist/commands/improve/improve-profiles.js +0 -168
  549. package/dist/commands/improve/procedural.js +0 -398
  550. package/dist/commands/improve/recombine.js +0 -818
  551. package/dist/commands/improve/schema-similarity-gate.js +0 -168
  552. package/dist/commands/lint/agent-linter.js +0 -44
  553. package/dist/commands/lint/command-linter.js +0 -44
  554. package/dist/commands/lint/default-linter.js +0 -16
  555. package/dist/commands/lint/fact-linter.js +0 -39
  556. package/dist/commands/lint/knowledge-linter.js +0 -16
  557. package/dist/commands/lint/memory-linter.js +0 -61
  558. package/dist/commands/lint/registry.js +0 -41
  559. package/dist/commands/lint/skill-linter.js +0 -45
  560. package/dist/commands/lint/task-linter.js +0 -50
  561. package/dist/commands/lint/workflow-linter.js +0 -81
  562. package/dist/commands/proposal/legacy-import.js +0 -115
  563. package/dist/commands/sources/history.js +0 -196
  564. package/dist/commands/tasks/default-tasks.js +0 -186
  565. package/dist/commands/wiki-cli.js +0 -292
  566. package/dist/core/asset/asset-registry.js +0 -76
  567. package/dist/core/asset/asset-spec.js +0 -259
  568. package/dist/core/config/config-migration.js +0 -602
  569. package/dist/core/deep-merge.js +0 -38
  570. package/dist/core/eval/rank-metrics.js +0 -113
  571. package/dist/core/ripgrep/install.js +0 -163
  572. package/dist/core/ripgrep/resolve.js +0 -81
  573. package/dist/indexer/db/db.js +0 -1413
  574. package/dist/indexer/manifest.js +0 -170
  575. package/dist/indexer/passes/metadata-contributors.js +0 -31
  576. package/dist/indexer/usage/unmigrated-vaults-guard.js +0 -94
  577. package/dist/integrations/harnesses/opencode-sdk/index.js +0 -49
  578. package/dist/llm/call-ai.js +0 -62
  579. package/dist/llm/memory-infer-impl.js +0 -138
  580. package/dist/output/shapes/distill.js +0 -14
  581. package/dist/output/shapes/history.js +0 -11
  582. package/dist/output/text/distill.js +0 -6
  583. package/dist/output/text/enable-disable.js +0 -8
  584. package/dist/output/text/history.js +0 -6
  585. package/dist/output/text/wiki.js +0 -16
  586. package/dist/registry/build-index.js +0 -386
  587. package/dist/scripts/migrate-storage.js +0 -19108
  588. package/dist/scripts/migrations/import-fs-improve-runs-to-db.js +0 -9411
  589. package/dist/scripts/migrations/v16-to-v17.js +0 -141
  590. package/dist/setup/legacy-config.js +0 -106
  591. package/dist/storage/repositories/consolidation-repository.js +0 -38
  592. package/dist/storage/repositories/recombine-repository.js +0 -213
  593. package/dist/wiki/wiki-templates.js +0 -15
  594. package/dist/wiki/wiki.js +0 -1012
  595. package/dist/workflows/db.js +0 -215
  596. package/docs/data-and-telemetry.md +0 -226
  597. /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/registry.js +0 -0
  598. /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/youtube.js +0 -0
@@ -7,35 +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";
15
- import { defineJsonCommand, output, runWithJsonErrors } from "../cli/shared.js";
19
+ import { getParsedInvocation } from "../cli/invocation.js";
20
+ import { getStringArg } from "../cli/parse-args.js";
21
+ import { defineGroupCommand, defineJsonCommand, output } from "../cli/shared.js";
16
22
  import { assertFlatAssetName, combineCreatePath, normalizeCreateSubPath } from "../core/asset/asset-create.js";
17
- import { parseAssetRef } from "../core/asset/asset-ref.js";
18
23
  import { loadConfig } from "../core/config/config.js";
19
24
  import { NotFoundError, UsageError } from "../core/errors.js";
20
25
  import { akmIndex } from "../indexer/indexer.js";
21
- import { resolveSourceEntries } from "../indexer/search/search-source.js";
22
- import { hasBooleanFlag } from "../output/context.js";
23
- import { resolveSourcesForOrigin } from "../registry/origin-resolve.js";
24
- import { resolveAssetPath } from "../sources/resolve.js";
25
- import { createWorkflowAsset, formatWorkflowErrors, getWorkflowTemplate, validateWorkflowSource, } from "../workflows/authoring/authoring.js";
26
- import { hasWorkflowSubcommand, parseWorkflowJsonObject, parseWorkflowStepState, WORKFLOW_STEP_STATES, } from "../workflows/cli.js";
27
- 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";
28
30
  const workflowStartCommand = defineJsonCommand({
29
31
  meta: {
30
32
  name: "start",
31
33
  description: "Start a new workflow run in the current working scope",
32
34
  },
33
35
  args: {
34
- ref: { type: "positional", description: "Workflow ref (workflow:<name>)", required: true },
36
+ ref: { type: "positional", description: "Workflow ref (workflows/<name>)", required: true },
35
37
  params: { type: "string", description: "Workflow parameters as a JSON object" },
36
38
  force: {
37
39
  type: "boolean",
38
- 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",
39
41
  default: false,
40
42
  },
41
43
  },
@@ -57,45 +59,17 @@ const workflowNextCommand = defineJsonCommand({
57
59
  },
58
60
  async run({ args }) {
59
61
  // `--dry-run` is intentionally NOT a declared arg (so it stays out of
60
- // --help). The guard reads it straight from process.argv so existing
61
- // callers still get a clear, actionable error instead of a generic
62
- // "unknown flag" from citty.
63
- 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")) {
64
66
  throw new UsageError("`akm workflow next` does not support --dry-run. Remove the flag to start or resume a run.", "INVALID_FLAG_VALUE");
65
67
  }
66
68
  const parsedParams = args.params ? parseWorkflowJsonObject(args.params, "--params") : undefined;
67
- // If the target looks like a UUID-style run id (no `:` and matches the
68
- // run-id shape), short-circuit with a structured WORKFLOW_NOT_FOUND
69
- // error before parseAssetRef gets to throw an unhelpful ref-parse error.
70
- if (looksLikeWorkflowRunId(args.target)) {
71
- const { hasWorkflowRun } = await import("../workflows/runtime/runs.js");
72
- if (!(await hasWorkflowRun(args.target))) {
73
- throw new NotFoundError(`Workflow run "${args.target}" not found.`, "WORKFLOW_NOT_FOUND", "Run `akm workflow list --active` to see runs.");
74
- }
75
- }
76
69
  const result = await getNextWorkflowStep(args.target, parsedParams);
77
70
  output("workflow-next", result);
78
71
  },
79
72
  });
80
- /**
81
- * Heuristic: a workflow run id is a UUID-shaped or hex-id-shaped string with
82
- * no `:` separator (refs always contain a colon: `workflow:<name>` or
83
- * `<origin>//workflow:<name>`). When this matches we can give a much better
84
- * error than parseAssetRef's "Invalid asset type" failure.
85
- */
86
- function looksLikeWorkflowRunId(target) {
87
- if (target.includes(":"))
88
- return false;
89
- if (target.includes("/"))
90
- return false;
91
- // UUID v4-ish: 8-4-4-4-12 hex digits separated by dashes.
92
- if (/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(target))
93
- return true;
94
- // Bare hex/alphanumeric run ids of >=8 chars (covers shortened ids).
95
- if (/^[0-9a-z][0-9a-z_-]{7,}$/i.test(target) && /[0-9]/.test(target))
96
- return true;
97
- return false;
98
- }
99
73
  const workflowCompleteCommand = defineJsonCommand({
100
74
  meta: {
101
75
  name: "complete",
@@ -139,35 +113,37 @@ const workflowStatusCommand = defineJsonCommand({
139
113
  description: "Show full workflow run state for review or resume; workflow refs resolve within the current scope",
140
114
  },
141
115
  args: {
142
- 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 },
117
+ units: {
118
+ type: "boolean",
119
+ description: "Also list per-unit rows from the run journal (unit id, status, failure_reason, and any result/error " +
120
+ "diagnostic text). Diagnostics only — step evidence stays deterministic and is unaffected.",
121
+ default: false,
122
+ },
143
123
  },
144
124
  async run({ args }) {
145
125
  const target = args.target;
146
- // Check if target looks like a workflow ref
147
- const parsed = (() => {
148
- try {
149
- return parseAssetRef(target);
150
- }
151
- catch {
152
- return null;
153
- }
154
- })();
155
- if (parsed?.type === "workflow") {
156
- const ref = `${parsed.origin ? `${parsed.origin}//` : ""}workflow:${parsed.name}`;
157
- const { runs } = await listWorkflowRuns({ workflowRef: ref });
158
- if (runs.length === 0) {
159
- throw new NotFoundError(`No workflow runs found for ${ref}`, "WORKFLOW_NOT_FOUND");
160
- }
161
- const mostRecent = runs[0];
162
- if (!mostRecent)
163
- throw new NotFoundError(`No workflow runs found for ${ref}`, "WORKFLOW_NOT_FOUND");
164
- const result = await getWorkflowStatus(mostRecent.id);
126
+ const includeUnits = args.units === true;
127
+ if (await hasWorkflowRun(target)) {
128
+ const result = await getWorkflowStatus(target, { includeUnits });
165
129
  output("workflow-status", result);
130
+ return;
166
131
  }
167
- else {
168
- const result = await getWorkflowStatus(target);
169
- output("workflow-status", result);
132
+ let runs;
133
+ try {
134
+ ({ runs } = await listWorkflowRuns({ workflowRef: target }));
170
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);
171
147
  },
172
148
  });
173
149
  const workflowListCommand = defineJsonCommand({
@@ -187,19 +163,22 @@ const workflowListCommand = defineJsonCommand({
187
163
  const workflowCreateCommand = defineJsonCommand({
188
164
  meta: {
189
165
  name: "create",
190
- description: "Create a workflow markdown document in the working stash",
166
+ description: "Create a workflow (markdown document) in the working bundle",
191
167
  },
192
168
  args: {
193
169
  name: {
194
170
  type: "positional",
195
- description: "Workflow name (flat, no '/'; use --path for a subdirectory)",
171
+ description: "Workflow name (flat, no '/'; use --path for a subdirectory).",
196
172
  required: true,
197
173
  },
198
174
  path: {
199
175
  type: "string",
200
176
  description: "Relative subdirectory under workflows/ to place the workflow in (e.g. 'release'). The filename comes from the name.",
201
177
  },
202
- from: { type: "string", description: "Import and validate markdown from an existing file" },
178
+ from: {
179
+ type: "string",
180
+ description: "Import and validate content from an existing file",
181
+ },
203
182
  force: {
204
183
  type: "boolean",
205
184
  description: "Overwrite an existing workflow (requires --from or --reset)",
@@ -210,6 +189,11 @@ const workflowCreateCommand = defineJsonCommand({
210
189
  description: "Explicitly replace an existing workflow with a fresh template (use with --force)",
211
190
  default: false,
212
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
+ },
213
197
  },
214
198
  async run({ args }) {
215
199
  // `name` is flat; subdirectory placement is `--path`'s job.
@@ -219,6 +203,14 @@ const workflowCreateCommand = defineJsonCommand({
219
203
  if (!namePattern.test(effectiveName)) {
220
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.");
221
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
+ }
222
214
  if (args.force && !args.from && !args.reset) {
223
215
  throw new UsageError("Refusing to overwrite with template: pass --from <file> to replace content, or --reset to explicitly replace with a fresh template.");
224
216
  }
@@ -234,61 +226,180 @@ const workflowCreateCommand = defineJsonCommand({
234
226
  output("workflow-create", { ok: true, ...result });
235
227
  },
236
228
  });
237
- const workflowTemplateCommand = defineCommand({
229
+ const workflowRunCommand = defineJsonCommand({
238
230
  meta: {
239
- name: "template",
240
- description: "Print a valid workflow markdown template",
231
+ name: "run",
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",
241
235
  },
242
- run() {
243
- process.stdout.write(getWorkflowTemplate());
236
+ args: {
237
+ target: { type: "positional", description: "Workflow run id or workflow ref (auto-starts a run)", required: true },
238
+ params: { type: "string", description: "Workflow parameters as a JSON object (only for auto-started runs)" },
239
+ "max-steps": { type: "string", description: "Stop after executing this many steps" },
240
+ },
241
+ async run({ args }) {
242
+ requireWorkflowEngineEnabled(loadConfig(), "run");
243
+ const { runWorkflowSteps } = await import("../workflows/exec/run-workflow.js");
244
+ const rawMaxSteps = getStringArg(args, "max-steps");
245
+ let maxSteps;
246
+ if (rawMaxSteps !== undefined) {
247
+ maxSteps = Number.parseInt(rawMaxSteps, 10);
248
+ if (!/^\d+$/.test(rawMaxSteps) || maxSteps <= 0) {
249
+ throw new UsageError(`--max-steps must be a positive integer, got "${rawMaxSteps}".`, "INVALID_FLAG_VALUE");
250
+ }
251
+ }
252
+ const result = await runWorkflowSteps({
253
+ target: args.target,
254
+ ...(args.params ? { params: parseWorkflowJsonObject(args.params, "--params") } : {}),
255
+ ...(maxSteps !== undefined ? { maxSteps } : {}),
256
+ });
257
+ output("workflow-run", result);
244
258
  },
245
259
  });
246
- const workflowValidateCommand = defineJsonCommand({
260
+ const workflowBriefCommand = defineJsonCommand({
247
261
  meta: {
248
- name: "validate",
249
- description: "Validate a workflow markdown file or ref and print any errors",
262
+ name: "brief",
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",
250
267
  },
251
268
  args: {
252
269
  target: {
253
270
  type: "positional",
254
- description: "Workflow ref (workflow:<name>) or filesystem path to a workflow .md",
271
+ description: "Workflow run id (or a workflow ref with an active run)",
255
272
  required: true,
256
273
  },
257
274
  },
258
275
  async run({ args }) {
259
- const filePath = await resolveWorkflowFilePath(args.target);
260
- const { parse } = validateWorkflowSource(filePath);
261
- if (parse.ok) {
262
- output("workflow-validate", {
263
- ok: true,
264
- path: filePath,
265
- title: parse.document.title,
266
- stepCount: parse.document.steps.length,
276
+ requireWorkflowEngineEnabled(loadConfig(), "brief");
277
+ const { buildWorkflowBrief } = await import("../workflows/exec/brief.js");
278
+ const result = await buildWorkflowBrief(args.target);
279
+ output("workflow-brief", result);
280
+ },
281
+ });
282
+ const WORKFLOW_REPORT_STATES = ["completed", "failed", "running"];
283
+ const workflowReportCommand = defineJsonCommand({
284
+ meta: {
285
+ name: "report",
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/" +
289
+ "heartbeats a unit; completed/failed records it and, when the step's work-list is fully terminal, runs the " +
290
+ "engine's completion path (reducer, artifact + schema validation, gate). --settle (no --unit) advances a run " +
291
+ "parked on a route-only/empty step. Refused while a live engine lease exists",
292
+ },
293
+ args: {
294
+ target: {
295
+ type: "positional",
296
+ description: "Workflow run id (or a workflow ref with an active run)",
297
+ required: true,
298
+ },
299
+ unit: {
300
+ type: "string",
301
+ description: "Content-derived unit id from `akm workflow brief` (copy it verbatim). Omit with --settle.",
302
+ },
303
+ settle: {
304
+ type: "boolean",
305
+ description: "Advance/finalize a run whose active step has NO unit left to report: a non-dispatching step (params-based route, empty fan-out, all-unresolvable) OR a fully-terminal step still needing finalization (every unit ran but the gate never judged — e.g. after resuming a required-gate block). Runs the deterministic completion path. Mutually exclusive with --unit; refused when the step still has genuinely pending units",
306
+ default: false,
307
+ },
308
+ "expect-step": {
309
+ type: "string",
310
+ description: "Guard: the step id you briefed against. Refuses the report if the run's active step has since moved (from the `brief` report/settle command line)",
311
+ },
312
+ status: { type: "string", description: `Unit status: ${WORKFLOW_REPORT_STATES.join(", ")}` },
313
+ result: { type: "string", description: "Result payload (JSON for a schema unit, else text). completed only." },
314
+ "result-file": { type: "string", description: "Read the result payload from this file instead of --result/stdin" },
315
+ tokens: { type: "string", description: "Tokens spent on this unit (counts against a declared budget)" },
316
+ "session-id": { type: "string", description: "Harness-native session id revealed while executing the unit" },
317
+ "failure-reason": { type: "string", description: "Structured failure vocabulary for a --status failed report" },
318
+ note: { type: "string", description: "Short progress note for a --status running heartbeat (not persisted)" },
319
+ rerun: {
320
+ type: "boolean",
321
+ description: "Re-run an already-FAILED unit: record a NEW attempt (re-applies budget) instead of refusing a differing re-report",
322
+ default: false,
323
+ },
324
+ },
325
+ async run({ args }) {
326
+ requireWorkflowEngineEnabled(loadConfig(), "report");
327
+ // --settle: the unit-less verb that advances a run parked on a
328
+ // non-dispatching step. Mutually exclusive with the per-unit report flags.
329
+ if (args.settle === true) {
330
+ if (getStringArg(args, "unit") !== undefined || getStringArg(args, "status") !== undefined) {
331
+ throw new UsageError("--settle advances a route-only/empty step and takes no --unit or --status. Drop them, or report a " +
332
+ "specific unit with `--unit <id> --status <state>` instead.", "INVALID_FLAG_VALUE");
333
+ }
334
+ const { settleWorkflowSpine } = await import("../workflows/exec/report.js");
335
+ const result = await settleWorkflowSpine({
336
+ target: args.target,
337
+ ...(getStringArg(args, "expect-step") !== undefined ? { expectStep: getStringArg(args, "expect-step") } : {}),
267
338
  });
339
+ output("workflow-report", result);
268
340
  return;
269
341
  }
270
- throw new UsageError(formatWorkflowErrors(filePath, parse.errors));
271
- },
272
- });
273
- async function resolveWorkflowFilePath(target) {
274
- if (!target.startsWith("workflow:"))
275
- return target;
276
- const parsed = parseAssetRef(target);
277
- if (parsed.type !== "workflow") {
278
- throw new UsageError(`Expected a workflow ref (workflow:<name>), got "${target}".`);
279
- }
280
- const config = loadConfig();
281
- const allSources = resolveSourceEntries(undefined, config);
282
- const searchSources = resolveSourcesForOrigin(parsed.origin, allSources);
283
- for (const source of searchSources) {
284
- try {
285
- return await resolveAssetPath(source.path, "workflow", parsed.name);
342
+ const status = args.status;
343
+ if (!status) {
344
+ throw new UsageError("--status is required (completed | failed | running), or pass --settle to advance a non-dispatching step.", "MISSING_REQUIRED_ARGUMENT");
286
345
  }
287
- catch {
288
- /* try next source */
346
+ if (!WORKFLOW_REPORT_STATES.includes(status)) {
347
+ throw new UsageError(`Invalid --status "${status}". Expected one of: ${WORKFLOW_REPORT_STATES.join(", ")}.`, "INVALID_FLAG_VALUE");
289
348
  }
290
- }
291
- throw new UsageError(`Workflow not found for ref: workflow:${parsed.name}`);
349
+ const unitId = getStringArg(args, "unit");
350
+ if (!unitId) {
351
+ throw new UsageError("--unit is required (the content-derived unit id from `akm workflow brief`), or pass --settle for a route-only/empty step.", "MISSING_REQUIRED_ARGUMENT");
352
+ }
353
+ let tokens;
354
+ const rawTokens = getStringArg(args, "tokens");
355
+ if (rawTokens !== undefined) {
356
+ tokens = Number.parseInt(rawTokens, 10);
357
+ if (!/^\d+$/.test(rawTokens)) {
358
+ throw new UsageError(`--tokens must be a non-negative integer, got "${rawTokens}".`, "INVALID_FLAG_VALUE");
359
+ }
360
+ }
361
+ // Result payload precedence: --result, then --result-file, then stdin
362
+ // (completed/failed only; a running heartbeat carries no result).
363
+ let resultRaw;
364
+ if (status !== "running") {
365
+ const resultFile = getStringArg(args, "result-file");
366
+ if (args.result !== undefined && resultFile !== undefined) {
367
+ throw new UsageError("Pass at most one of --result or --result-file.", "INVALID_FLAG_VALUE");
368
+ }
369
+ if (args.result !== undefined) {
370
+ resultRaw = String(args.result);
371
+ }
372
+ else if (resultFile !== undefined) {
373
+ const fs = await import("node:fs");
374
+ resultRaw = fs.readFileSync(resultFile, "utf8");
375
+ }
376
+ else if (!process.stdin.isTTY) {
377
+ resultRaw = await readStdin();
378
+ }
379
+ }
380
+ const { reportWorkflowUnit } = await import("../workflows/exec/report.js");
381
+ const result = await reportWorkflowUnit({
382
+ target: args.target,
383
+ unitId,
384
+ status: status,
385
+ ...(getStringArg(args, "expect-step") !== undefined ? { expectStep: getStringArg(args, "expect-step") } : {}),
386
+ ...(resultRaw !== undefined ? { resultRaw } : {}),
387
+ ...(tokens !== undefined ? { tokens } : {}),
388
+ ...(args.rerun === true ? { rerun: true } : {}),
389
+ ...(getStringArg(args, "session-id") !== undefined ? { sessionId: getStringArg(args, "session-id") } : {}),
390
+ ...(getStringArg(args, "failure-reason") !== undefined
391
+ ? { failureReason: getStringArg(args, "failure-reason") }
392
+ : {}),
393
+ ...(getStringArg(args, "note") !== undefined ? { note: getStringArg(args, "note") } : {}),
394
+ });
395
+ output("workflow-report", result);
396
+ },
397
+ });
398
+ async function readStdin() {
399
+ const chunks = [];
400
+ for await (const chunk of process.stdin)
401
+ chunks.push(chunk);
402
+ return Buffer.concat(chunks).toString("utf8");
292
403
  }
293
404
  const workflowAbandonCommand = defineJsonCommand({
294
405
  meta: {
@@ -316,7 +427,7 @@ const workflowResumeCommand = defineJsonCommand({
316
427
  output("workflow-resume", result);
317
428
  },
318
429
  });
319
- export const workflowCommand = defineCommand({
430
+ export const workflowCommand = defineGroupCommand({
320
431
  meta: {
321
432
  name: "workflow",
322
433
  description: "Author, inspect, and execute step-by-step workflow assets",
@@ -328,16 +439,16 @@ export const workflowCommand = defineCommand({
328
439
  status: workflowStatusCommand,
329
440
  list: workflowListCommand,
330
441
  create: workflowCreateCommand,
331
- template: workflowTemplateCommand,
332
442
  resume: workflowResumeCommand,
333
443
  abandon: workflowAbandonCommand,
334
- validate: workflowValidateCommand,
335
- },
336
- run({ args }) {
337
- return runWithJsonErrors(async () => {
338
- if (hasWorkflowSubcommand(args))
339
- return;
340
- output("workflow-list", await listWorkflowRuns({ activeOnly: true }));
341
- });
342
- },
444
+ run: workflowRunCommand,
445
+ brief: workflowBriefCommand,
446
+ report: workflowReportCommand,
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.
343
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
+ }