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
@@ -2,9 +2,9 @@
2
2
  // License, v. 2.0. If a copy of the MPL was not distributed with this
3
3
  // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
4
  /**
5
- * `akm agent <profile> [--prompt <text>] [--command <ref>] [--workflow <ref>] [args...]`
5
+ * `akm agent [--engine <name>] [--prompt <text>] [--command <ref>] [--workflow <ref>] [args...]`
6
6
  *
7
- * Dispatch an agent by named profile, optionally injecting a prompt from
7
+ * Dispatch an agent by named engine, optionally injecting a prompt from
8
8
  * inline text, a stash command: asset, or a stash workflow: asset.
9
9
  *
10
10
  * When none of --prompt, --command, or --workflow are given, the agent is
@@ -14,11 +14,10 @@
14
14
  * filled from the extra positional args in order.
15
15
  */
16
16
  import fs from "node:fs";
17
- import { parseAssetRef } from "../../core/asset/asset-ref.js";
17
+ import { parseRefInput } from "../../core/asset/resolve-ref.js";
18
18
  import { NotFoundError, UsageError } from "../../core/errors.js";
19
- import { requireAgentProfile } from "../../integrations/agent/config.js";
20
- import { runAgent } from "../../integrations/agent/spawn.js";
21
- import { runOpencodeSdk } from "../../integrations/harnesses/opencode-sdk/index.js";
19
+ import { resolveEngine } from "../../integrations/agent/engine-resolution.js";
20
+ import { executeRunner } from "../../integrations/agent/runner-dispatch.js";
22
21
  /**
23
22
  * Fill `{{0}}`, `{{1}}`, ... placeholders in `template` with the
24
23
  * corresponding entries in `args`. Any placeholder index that exceeds the
@@ -40,7 +39,7 @@ function fillPlaceholders(template, args) {
40
39
  async function resolveAssetBody(ref) {
41
40
  let parsed;
42
41
  try {
43
- parsed = parseAssetRef(ref);
42
+ parsed = parseRefInput(ref);
44
43
  }
45
44
  catch (err) {
46
45
  throw new UsageError(`Invalid asset ref "${ref}": ${err instanceof Error ? err.message : String(err)}`, "INVALID_FLAG_VALUE");
@@ -59,12 +58,16 @@ async function resolveAssetBody(ref) {
59
58
  }
60
59
  }
61
60
  export async function akmAgentDispatch(options) {
62
- if (!options.profileName?.trim()) {
63
- throw new UsageError("agent: <profile> is required.", "MISSING_REQUIRED_ARGUMENT");
61
+ if (!options.agentConfig)
62
+ throw new UsageError("agent requires a valid config with an agent engine.", "MISSING_REQUIRED_ARGUMENT");
63
+ const engineName = options.engine ?? options.agentConfig.defaults?.engine;
64
+ if (!engineName)
65
+ throw new UsageError("agent requires --engine or defaults.engine.", "MISSING_REQUIRED_ARGUMENT");
66
+ const runner = resolveEngine(engineName, options.agentConfig);
67
+ if (runner.kind === "llm") {
68
+ throw new UsageError(`Engine "${engineName}" is an LLM engine; akm agent requires an agent engine.`, "INVALID_FLAG_VALUE");
64
69
  }
65
- // Resolve the profile — throws ConfigError with an actionable hint when
66
- // agent config is absent or the profile is not found.
67
- const profile = requireAgentProfile(options.agentConfig, options.profileName.trim());
70
+ const profile = runner.profile;
68
71
  // Resolve the prompt text from whichever source was provided.
69
72
  let prompt;
70
73
  if (options.commandRef) {
@@ -79,7 +82,7 @@ export async function akmAgentDispatch(options) {
79
82
  prompt = options.prompt;
80
83
  }
81
84
  // When prompt is undefined, the agent is launched interactively.
82
- const stdio = prompt === undefined && profile.sdkMode !== true ? "interactive" : profile.stdio;
85
+ const stdio = prompt === undefined && runner.kind !== "sdk" ? "interactive" : profile.stdio;
83
86
  // Build the final dispatch request: merge the caller-supplied dispatch with
84
87
  // the resolved prompt so the builder has all context in one place.
85
88
  const dispatchRequest = options.dispatch
@@ -93,14 +96,12 @@ export async function akmAgentDispatch(options) {
93
96
  ...(options.cwd ? { cwd: options.cwd } : {}),
94
97
  ...(dispatchRequest !== undefined ? { dispatch: dispatchRequest } : {}),
95
98
  };
96
- const result = profile.sdkMode
97
- ? await runOpencodeSdk(profile, prompt ?? "", runOptions, options.llmConfig)
98
- : await runAgent(profile, prompt, runOptions);
99
+ const result = await executeRunner(runner, prompt ?? "", runOptions);
99
100
  return {
100
- schemaVersion: 1,
101
+ schemaVersion: 2,
101
102
  ok: result.ok,
102
103
  shape: "agent-result",
103
- profileName: profile.name,
104
+ engine: engineName,
104
105
  exitCode: result.exitCode,
105
106
  stdout: result.stdout ?? "",
106
107
  stderr: result.stderr ?? "",
@@ -1,30 +1,6 @@
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 { loadConfig } from "../../core/config/config.js";
5
- import { requireAgentProfile, } from "../../integrations/agent/index.js";
6
- // ── Config helpers ───────────────────────────────────────────────────────────
7
- /**
8
- * Load the loaded AkmConfig from disk.
9
- *
10
- * After 0.8.0, the legacy `agent` top-level block was removed — the agent
11
- * profile data now lives on the unified `AkmConfig` (via `profiles.agent` and
12
- * `defaults.agent`). This helper remains for source-compat with callers that
13
- * still expect an "AgentConfig"; it now returns the loaded `AkmConfig`.
14
- */
15
- export function loadAgentConfigFromDisk() {
16
- return loadConfig();
17
- }
18
- /**
19
- * Resolve the agent profile for a command's options.
20
- * Prefers an injected `agentProfile` (test seam) over the on-disk config.
21
- */
22
- export function resolveAgentProfile(options) {
23
- if (options.agentProfile)
24
- return options.agentProfile;
25
- const agent = options.agentConfig ?? loadAgentConfigFromDisk();
26
- return requireAgentProfile(agent, options.profile);
27
- }
28
4
  // ── Failure helpers ──────────────────────────────────────────────────────────
29
5
  /**
30
6
  * Base failure envelope shared by all agent command failures.
@@ -2,55 +2,48 @@
2
2
  // License, v. 2.0. If a copy of the MPL was not distributed with this
3
3
  // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
4
  /**
5
- * Contribution command cluster (`akm agent`, `akm lint`, `akm propose`) —
6
- * the asset authoring / validation / proposal-creation verbs. Extracted
7
- * verbatim from src/cli.ts (WS6) so the God Module shrinks; the
8
- * `main.subCommands.{agent,lint,propose}` keys and every command's args /
9
- * output shape stay byte-identical.
5
+ * Contribution command cluster (`akm agent`, `akm lint`) — the asset
6
+ * authoring / validation verbs. Extracted verbatim from src/cli.ts (WS6) so
7
+ * the God Module shrinks; the `main.subCommands.{agent,lint}` keys and every
8
+ * command's args / output shape stay byte-identical.
10
9
  *
11
- * These three handlers each branch on the result and call `process.exit`
12
- * conditionally (exit 1 on a failed dispatch / proposal, or on
13
- * `--fail-on-flagged` lint findings), so they keep the inline
14
- * `runWithJsonErrors` form rather than migrating to `defineJsonCommand`
15
- * (which is reserved for plain runWithJsonErrors+output handlers).
10
+ * These handlers branch on the result and set a non-zero `process.exitCode`
11
+ * conditionally (exit 1 on a failed dispatch, or on `--fail-on-flagged` lint
12
+ * findings) rather than emitting through the thrown-error path, so they keep
13
+ * the inline `runWithJsonErrors` form rather than migrating to
14
+ * `defineJsonCommand` (which is reserved for plain runWithJsonErrors+output
15
+ * handlers). `process.exitCode` (not `process.exit()`) so the process still
16
+ * exits via natural event-loop drain rather than skipping pending cleanup —
17
+ * see R-067 / F4.
16
18
  *
17
- * NOTE on `propose` vs `proposal`: the proposal MANAGEMENT family
18
- * (list/show/accept/reject/…) lives in src/commands/proposal-cli.ts. The
19
- * `propose` (create) verb here is the asset-authoring entry point and shares
20
- * no private helper with that module — its path/name helpers come from the
21
- * shared src/core/asset-create.ts module, imported below.
19
+ * NOTE: the asset-authoring `propose` verb (formerly here) moved to
20
+ * `akm proposal new` (0.9 CLI overhaul, S8) — see
21
+ * src/commands/proposal/propose-cli.ts.
22
22
  */
23
- import fs from "node:fs";
24
- import path from "node:path";
25
23
  import { defineCommand } from "citty";
26
24
  import { getStringArg, parsePositiveIntFlag } from "../../cli/parse-args.js";
27
- import { EXIT_CODES, output, runWithJsonErrors } from "../../cli/shared.js";
28
- import { assertFlatAssetName, combineCreatePath, normalizeCreateSubPath } from "../../core/asset/asset-create.js";
25
+ import { EXIT_CODES, GLOBAL_OUTPUT_ARGS, output, runWithJsonErrors } from "../../cli/shared.js";
29
26
  import { loadConfig } from "../../core/config/config.js";
30
- import { UsageError } from "../../core/errors.js";
27
+ import { resolveUsageEventSource } from "../../indexer/usage/usage-events.js";
31
28
  import { akmLint } from "../lint/index.js";
32
- import { akmPropose } from "../proposal/propose.js";
33
29
  import { akmAgentDispatch } from "./agent-dispatch.js";
34
30
  const EXIT_GENERAL = EXIT_CODES.GENERAL;
35
31
  export const agentCommand = defineCommand({
36
32
  meta: {
37
33
  name: "agent",
38
- description: "Dispatch an agent CLI (opencode, claude, …) with an optional agent asset that provides the system prompt, model, and tool policy. Use <agent-ref> to embody a stash agent, --model to override the model, and --prompt/--command/--workflow to provide the task.",
34
+ description: "Dispatch an agent CLI (opencode, claude, …) with an optional agent asset that provides the system prompt, model, and tool policy. Use <agent-ref> to embody a bundle agent, --model to override the model, and --prompt/--command/--workflow to provide the task.",
39
35
  },
40
36
  args: {
41
- profile: {
42
- type: "positional",
43
- description: "Agent profile / platform to use (opencode, claude, …)",
44
- required: false,
45
- },
37
+ ...GLOBAL_OUTPUT_ARGS,
46
38
  "agent-ref": {
47
39
  type: "positional",
48
- description: "Optional agent asset ref (e.g. agent:code-reviewer). Loads system prompt, model, and tool policy from the stash asset.",
40
+ description: "Optional agent asset ref (e.g. agents/code-reviewer). Loads system prompt, model, and tool policy from the bundle asset.",
49
41
  required: false,
50
42
  },
51
43
  prompt: { type: "string", description: "Task prompt to pass to the agent" },
52
- command: { type: "string", description: "Load prompt from a command: asset" },
53
- workflow: { type: "string", description: "Load prompt from a workflow: asset" },
44
+ engine: { type: "string", description: "Agent engine to use (default: defaults.engine)" },
45
+ command: { type: "string", description: "Load prompt from a command asset" },
46
+ workflow: { type: "string", description: "Load prompt from a workflow asset" },
54
47
  model: {
55
48
  type: "string",
56
49
  description: "Model override — accepts aliases (opus, sonnet, haiku) or exact platform model IDs. Overrides the model specified in the agent asset.",
@@ -63,13 +56,8 @@ export const agentCommand = defineCommand({
63
56
  },
64
57
  async run({ args }) {
65
58
  await runWithJsonErrors(async () => {
66
- if (!args.profile) {
67
- throw new UsageError("Usage: akm agent <profile> [<agent-ref>] [--prompt <text>] [--model <model>]", "MISSING_REQUIRED_ARGUMENT", "Provide the agent profile name. Available profiles are listed in profiles.agent.");
68
- }
69
59
  const timeoutMs = parsePositiveIntFlag(args["timeout-ms"], "--timeout-ms");
70
60
  const config = loadConfig();
71
- const { getDefaultLlmConfig } = await import("../../core/config/config.js");
72
- // After 0.8.0 the agent block IS the loaded AkmConfig.
73
61
  const agentConfig = config;
74
62
  // Resolve agent asset ref → extract system prompt, model, and tool policy.
75
63
  const agentRef = getStringArg(args, "agent-ref");
@@ -78,7 +66,7 @@ export const agentCommand = defineCommand({
78
66
  let assetTools;
79
67
  if (agentRef) {
80
68
  const { akmShowUnified } = await import("../read/show.js");
81
- const asset = await akmShowUnified({ ref: agentRef, detail: "full" });
69
+ const asset = await akmShowUnified({ ref: agentRef, detail: "full", eventSource: resolveUsageEventSource() });
82
70
  systemPrompt = typeof asset.content === "string" ? asset.content : undefined;
83
71
  assetModel = typeof asset.modelHint === "string" ? asset.modelHint : undefined;
84
72
  assetTools = asset.toolPolicy;
@@ -95,12 +83,11 @@ export const agentCommand = defineCommand({
95
83
  // platform-specific flags beyond the profile's base args).
96
84
  const hasDispatchContent = !!(promptText ?? commandRef ?? workflowRef ?? systemPrompt ?? model ?? assetTools);
97
85
  const result = await akmAgentDispatch({
98
- profileName: String(args.profile),
86
+ engine: getStringArg(args, "engine"),
99
87
  prompt: promptText,
100
88
  commandRef,
101
89
  workflowRef,
102
90
  agentConfig,
103
- llmConfig: getDefaultLlmConfig(config),
104
91
  ...(hasDispatchContent
105
92
  ? {
106
93
  dispatch: {
@@ -117,7 +104,16 @@ export const agentCommand = defineCommand({
117
104
  });
118
105
  output("agent-result", result);
119
106
  if (!result.ok) {
120
- process.exit(EXIT_GENERAL);
107
+ // R-067-style fix: this used to call `process.exit(EXIT_GENERAL)`
108
+ // directly, which terminates synchronously and skips any pending
109
+ // `finally`/cleanup up the call stack (including the dispatched
110
+ // agent process' own bookkeeping). `output()` has already run above,
111
+ // so there is nothing left in this handler that depends on
112
+ // terminating immediately — `process.exitCode` + `return` (this is
113
+ // the last statement anyway) lets the process exit naturally once
114
+ // the event loop drains.
115
+ process.exitCode = EXIT_GENERAL;
116
+ return;
121
117
  }
122
118
  });
123
119
  },
@@ -125,16 +121,22 @@ export const agentCommand = defineCommand({
125
121
  export const lintCommand = defineCommand({
126
122
  meta: {
127
123
  name: "lint",
128
- description: "Scan stash .md files for structural issues (unquoted colons, missing updated field, orphaned stubs, placeholder stubs, missing name/type, stale paths). Use --fix to auto-fix Tier 1 issues. Exits 0 on success regardless of findings; use --fail-on-flagged for CI fail-on-finding behavior.",
124
+ description: "Scan bundle .md files for structural issues (unquoted colons, missing updated field, orphaned stubs, placeholder stubs, missing name/type, stale paths, broken refs in body text and in refs/xrefs/supersededBy/contradictedBy frontmatter). Use --fix to auto-fix Tier 1 issues. Exits 0 on success regardless of findings; use --fail-on-flagged for CI fail-on-finding behavior.",
129
125
  },
130
126
  args: {
127
+ // R-051: `lint` is a raw `defineCommand` (not `defineJsonCommand`), so it
128
+ // does not get `GLOBAL_OUTPUT_ARGS` for free. `--format`/`--detail`/
129
+ // `--shape`/`--output` already parsed correctly here (this command has no
130
+ // positional for a stray value to fall into), so this is purely a
131
+ // `--help` visibility / consistency fix, not a behavior change.
132
+ ...GLOBAL_OUTPUT_ARGS,
131
133
  fix: {
132
134
  type: "boolean",
133
135
  alias: "auto-fix",
134
136
  description: "Apply auto-fixes in place (alias: --auto-fix)",
135
137
  default: false,
136
138
  },
137
- dir: { type: "string", description: "Override stash root directory (default: from config)" },
139
+ dir: { type: "string", description: "Override bundle root directory (default: from config)" },
138
140
  "fail-on-flagged": {
139
141
  type: "boolean",
140
142
  description: "Exit non-zero when summary.flagged > 0 (CI-friendly). Default: exit 0 regardless of findings.",
@@ -161,59 +163,3 @@ export const lintCommand = defineCommand({
161
163
  });
162
164
  },
163
165
  });
164
- export const proposeCommand = defineCommand({
165
- meta: {
166
- name: "propose",
167
- description: "Ask the configured agent CLI to author a brand-new asset and queue it as a proposal",
168
- },
169
- args: {
170
- // Optional in citty so run() is invoked when omitted; we re-validate
171
- // below to surface a structured UsageError (exit 2) instead of citty's
172
- // default help-banner exit-0.
173
- type: { type: "positional", description: "Asset type (skill, command, knowledge, lesson, ...)", required: false },
174
- name: {
175
- type: "positional",
176
- description: "Asset name (flat, no '/'; use --path for a subdirectory)",
177
- required: false,
178
- },
179
- path: {
180
- type: "string",
181
- description: "Relative subdirectory under the type dir to place the proposed asset in (e.g. 'release'). The filename comes from the name.",
182
- },
183
- task: { type: "string", description: "Task description for the agent (what should the asset do?)" },
184
- file: { type: "string", description: "Read the task or prompt text from a UTF-8 file" },
185
- profile: { type: "string", description: "Override the agent profile (defaults to agent.default)" },
186
- "timeout-ms": { type: "string", description: "Override the agent CLI timeout in milliseconds" },
187
- },
188
- async run({ args }) {
189
- await runWithJsonErrors(async () => {
190
- // citty silently shows help and exits 0 when required positionals are
191
- // omitted. Re-validate explicitly so the exit code is 2 (USAGE) and a
192
- // structured JSON error reaches scripted callers.
193
- const taskFromFlag = typeof args.task === "string" ? args.task : undefined;
194
- const fileFromFlag = typeof args.file === "string" ? args.file : undefined;
195
- if (!args.type || !args.name || (!taskFromFlag && !fileFromFlag)) {
196
- throw new UsageError("Usage: akm propose <type> <name> (--task '<task>' | --file <path>).", "MISSING_REQUIRED_ARGUMENT", "Provide the asset type, name, and exactly one of --task or --file.");
197
- }
198
- if (taskFromFlag && fileFromFlag) {
199
- throw new UsageError("Pass exactly one of --task or --file.", "INVALID_FLAG_VALUE");
200
- }
201
- // `name` is flat; subdirectory placement is `--path`'s job.
202
- assertFlatAssetName(String(args.name));
203
- const proposedName = combineCreatePath(normalizeCreateSubPath(getStringArg(args, "path")), String(args.name));
204
- const taskText = fileFromFlag ? fs.readFileSync(path.resolve(fileFromFlag), "utf8") : (taskFromFlag ?? "");
205
- const timeoutMs = parsePositiveIntFlag(args["timeout-ms"], "--timeout-ms");
206
- const result = await akmPropose({
207
- type: String(args.type),
208
- name: proposedName,
209
- task: taskText,
210
- profile: getStringArg(args, "profile"),
211
- ...(timeoutMs !== undefined ? { timeoutMs } : {}),
212
- });
213
- output("propose", result);
214
- if (result.ok === false) {
215
- process.exit(EXIT_GENERAL);
216
- }
217
- });
218
- },
219
- });
@@ -4,33 +4,73 @@
4
4
  import fs from "node:fs";
5
5
  import os from "node:os";
6
6
  import path from "node:path";
7
- import { getAssetTypes } from "../core/asset/asset-spec.js";
8
- // ── Known flag values ────────────────────────────────────────────────────────
7
+ import { placementTypes } from "../core/asset/asset-placement.js";
9
8
  const FLAG_VALUES = {
10
- "--format": ["json", "text", "yaml", "jsonl"],
11
- "--detail": ["brief", "normal", "full", "summary"],
12
- "--type": () => [...getAssetTypes(), "any"],
13
- "--source": ["stash", "registry", "both"],
14
- "--shell": ["bash"],
9
+ "--format": [{ values: ["json", "jsonl", "yaml", "text", "md", "html"] }],
10
+ "--detail": [{ values: ["brief", "normal", "full"] }],
11
+ "--shape": [{ values: ["human", "agent", "summary"] }],
12
+ "--type": [{ values: () => [...placementTypes(), "any"] }],
13
+ "--shell": [{ values: ["bash"] }],
14
+ "--from": [{ paths: ["akm search", "akm curate"], values: ["local", "registry", "all"] }],
15
15
  };
16
+ function resolveRuleValues(rule) {
17
+ return typeof rule.values === "function" ? rule.values() : rule.values;
18
+ }
19
+ /**
20
+ * Build the `${prev}`-case body for one flag. When the flag has no
21
+ * path-scoped rules, every command shares one value set (unchanged from
22
+ * before R-052a). When it does (currently only `--from`), nest a
23
+ * `${cmd_path}` match inside the flag's case so the suggestion depends on
24
+ * which command is being completed — with a `*)` fallback to any
25
+ * unscoped/global rule declared alongside the scoped ones, or no suggestion
26
+ * at all when every rule for that flag is scoped.
27
+ */
28
+ function buildFlagValueCaseBody(rules) {
29
+ const scoped = rules.filter((rule) => rule.paths && rule.paths.length > 0);
30
+ const global = rules.find((rule) => !rule.paths || rule.paths.length === 0);
31
+ if (scoped.length === 0) {
32
+ return ` COMPREPLY=( $(compgen -W "${resolveRuleValues(global).join(" ")}" -- "\${cur}") )`;
33
+ }
34
+ const branches = scoped
35
+ .map((rule) => ` ${rule.paths.map((p) => `"${p}"`).join("|")})
36
+ COMPREPLY=( $(compgen -W "${resolveRuleValues(rule).join(" ")}" -- "\${cur}") )
37
+ ;;`)
38
+ .join("\n");
39
+ const fallback = global
40
+ ? ` *)
41
+ COMPREPLY=( $(compgen -W "${resolveRuleValues(global).join(" ")}" -- "\${cur}") )
42
+ ;;`
43
+ : "";
44
+ return ` case "\${cmd_path}" in
45
+ ${branches}
46
+ ${fallback}
47
+ esac`;
48
+ }
16
49
  function walkCommandTree(cmd, parentPath = "") {
17
50
  const name = cmd.meta?.name ?? "";
18
51
  const currentPath = parentPath ? `${parentPath} ${name}` : name;
19
52
  const result = [];
20
- const subcommands = Object.keys(cmd.subCommands ?? {});
53
+ // `meta.hidden` (e.g. `migrate`, S11) is excluded from completion the same
54
+ // way citty's own `renderUsage` excludes it from a rendered COMMANDS list —
55
+ // a hidden command still runs, it just isn't suggested.
56
+ const visibleSubEntries = Object.entries((cmd.subCommands ?? {})).filter(([, sub]) => !sub.meta?.hidden);
57
+ const subcommands = visibleSubEntries.map(([key]) => key);
21
58
  const flags = [];
59
+ const valueFlags = [];
22
60
  if (cmd.args) {
23
61
  for (const [flagName, arg] of Object.entries(cmd.args)) {
24
62
  if (arg.type === "positional")
25
63
  continue;
26
64
  flags.push(`--${flagName}`);
65
+ if (arg.type === "boolean" && arg.default === true)
66
+ flags.push(`--no-${flagName}`);
67
+ if (arg.type !== "boolean")
68
+ valueFlags.push(`--${flagName}`);
27
69
  }
28
70
  }
29
- result.push({ path: currentPath, subcommands, flags });
30
- if (cmd.subCommands) {
31
- for (const sub of Object.values(cmd.subCommands)) {
32
- result.push(...walkCommandTree(sub, currentPath));
33
- }
71
+ result.push({ path: currentPath, subcommands, flags, valueFlags });
72
+ for (const [, sub] of visibleSubEntries) {
73
+ result.push(...walkCommandTree(sub, currentPath));
34
74
  }
35
75
  return result;
36
76
  }
@@ -41,6 +81,7 @@ export function generateBashCompletions(cmd) {
41
81
  // Collect global flags from root command
42
82
  const rootInfo = commands.find((c) => c.path === rootName);
43
83
  const globalFlags = rootInfo?.flags ?? [];
84
+ const valueFlags = [...new Set(commands.flatMap((info) => info.valueFlags))];
44
85
  // Build the case blocks for subcommand completion
45
86
  const caseBlocks = [];
46
87
  for (const info of commands) {
@@ -61,10 +102,9 @@ export function generateBashCompletions(cmd) {
61
102
  }
62
103
  // Build flag-value completion cases
63
104
  const valueCases = [];
64
- for (const [flag, valuesOrFn] of Object.entries(FLAG_VALUES)) {
65
- const values = typeof valuesOrFn === "function" ? valuesOrFn() : valuesOrFn;
105
+ for (const [flag, rules] of Object.entries(FLAG_VALUES)) {
66
106
  valueCases.push(` ${flag})
67
- COMPREPLY=( $(compgen -W "${values.join(" ")}" -- "\${cur}") )
107
+ ${buildFlagValueCaseBody(rules)}
68
108
  return 0
69
109
  ;;`);
70
110
  }
@@ -83,20 +123,37 @@ _${rootName}() {
83
123
  cword=\${COMP_CWORD}
84
124
  fi
85
125
 
86
- # Complete flag values
87
- case "\${prev}" in
88
- ${valueCases.join("\n")}
89
- esac
90
-
91
- # Build the command path from COMP_WORDS
126
+ # Build the command path from recognized subcommand transitions only. Positional
127
+ # arguments and option values cannot extend the path, so completion remains
128
+ # command-aware after either one.
92
129
  local cmd_path="${rootName}"
130
+ local skip_value=0
93
131
  for (( i=1; i < cword; i++ )); do
132
+ if (( skip_value )); then
133
+ skip_value=0
134
+ continue
135
+ fi
94
136
  case "\${words[i]}" in
137
+ --) break ;;
138
+ --*=*) continue ;;
139
+ ${valueFlags.join("|")}) skip_value=1; continue ;;
95
140
  -*) continue ;;
96
- *) cmd_path="\${cmd_path} \${words[i]}" ;;
141
+ *)
142
+ case "\${cmd_path}:\${words[i]}" in
143
+ ${commands
144
+ .filter((info) => info.subcommands.length > 0)
145
+ .flatMap((info) => info.subcommands.map((subcommand) => ` "${info.path}:${subcommand}") cmd_path="${info.path} ${subcommand}" ;;`))
146
+ .join("\n")}
147
+ esac
148
+ ;;
97
149
  esac
98
150
  done
99
151
 
152
+ # Complete flag values
153
+ case "\${prev}" in
154
+ ${valueCases.join("\n")}
155
+ esac
156
+
100
157
  # Complete based on current command path
101
158
  case "\${cmd_path}" in
102
159
  ${caseBlocks.join("\n")}