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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (587) hide show
  1. package/CHANGELOG.md +1190 -52
  2. package/README.md +62 -37
  3. package/SECURITY.md +46 -31
  4. package/dist/akm +162 -38
  5. package/dist/akm-migrate +44 -0
  6. package/dist/assets/backends/schtasks-template.xml +2 -1
  7. package/dist/assets/hints/cli-hints-full.md +268 -118
  8. package/dist/assets/hints/cli-hints-short.md +87 -24
  9. package/dist/assets/{profiles → improve-strategies}/catchup.json +3 -1
  10. package/dist/assets/{profiles → improve-strategies}/consolidate.json +3 -1
  11. package/dist/assets/{profiles → improve-strategies}/default.json +6 -7
  12. package/dist/assets/improve-strategies/frequent.json +15 -0
  13. package/dist/assets/{profiles → improve-strategies}/graph-refresh.json +4 -2
  14. package/dist/assets/{profiles → improve-strategies}/memory-focus.json +4 -1
  15. package/dist/assets/{profiles → improve-strategies}/proactive-maintenance.json +5 -5
  16. package/dist/assets/{profiles → improve-strategies}/quick.json +4 -2
  17. package/dist/assets/improve-strategies/reflect-distill.json +30 -0
  18. package/dist/assets/{profiles → improve-strategies}/thorough.json +1 -1
  19. package/dist/assets/prompts/consolidate-system.md +5 -5
  20. package/dist/assets/prompts/extract-session.md +2 -6
  21. package/dist/assets/prompts/memory-infer-user.md +2 -3
  22. package/dist/assets/prompts/reflect-llm-framed-contract.md +11 -0
  23. package/dist/assets/prompts/reflect-llm-schema-contract.md +3 -0
  24. package/dist/assets/prompts/reflect-output-repair.md +3 -0
  25. package/dist/assets/stash-skeleton/README.md +38 -10
  26. package/dist/assets/stash-skeleton/facts/conventions/assets/agent.md +8 -0
  27. package/dist/assets/stash-skeleton/facts/conventions/assets/command.md +8 -0
  28. package/dist/assets/stash-skeleton/facts/conventions/assets/fact.md +14 -1
  29. package/dist/assets/stash-skeleton/facts/conventions/assets/knowledge.md +13 -1
  30. package/dist/assets/stash-skeleton/facts/conventions/assets/lesson.md +9 -1
  31. package/dist/assets/stash-skeleton/facts/conventions/assets/memory.md +11 -0
  32. package/dist/assets/stash-skeleton/facts/conventions/assets/script.md +9 -0
  33. package/dist/assets/stash-skeleton/facts/conventions/assets/skill.md +9 -0
  34. package/dist/assets/stash-skeleton/facts/conventions/assets/workflow.md +8 -0
  35. package/dist/assets/stash-skeleton/facts/conventions/backlinks.md +100 -0
  36. package/dist/assets/stash-skeleton/facts/conventions/domains.md +64 -0
  37. package/dist/assets/stash-skeleton/facts/conventions/organization.md +136 -0
  38. package/dist/assets/tasks/core/extract.yml +3 -2
  39. package/dist/assets/tasks/core/improve.yml +2 -1
  40. package/dist/assets/tasks/core/index-refresh.yml +1 -0
  41. package/dist/assets/tasks/core/sync.yml +1 -0
  42. package/dist/assets/tasks/core/version-check.yml +2 -1
  43. package/dist/assets/tasks/improve/akm-graph-refresh-weekly.yml +5 -0
  44. package/dist/assets/tasks/improve/akm-improve-catchup.yml +8 -0
  45. package/dist/assets/tasks/improve/akm-improve-consolidate.yml +5 -0
  46. package/dist/assets/tasks/improve/akm-improve-frequent.yml +5 -0
  47. package/dist/assets/tasks/improve/akm-improve-nightly.yml +5 -0
  48. package/dist/assets/templates/html/health.html +5 -4
  49. package/dist/assets/workflows/workflow-template.md +31 -15
  50. package/dist/cli/invocation.js +279 -0
  51. package/dist/cli/parse-args.js +5 -90
  52. package/dist/cli/retired-commands.js +78 -0
  53. package/dist/cli/shared.js +158 -48
  54. package/dist/cli-node.mjs +2 -1
  55. package/dist/cli.js +747 -293
  56. package/dist/commands/agent/agent-dispatch.js +19 -18
  57. package/dist/commands/agent/agent-support.js +0 -24
  58. package/dist/commands/agent/contribute-cli.js +43 -97
  59. package/dist/commands/completions.js +80 -23
  60. package/dist/commands/config-cli.js +44 -281
  61. package/dist/commands/env/env-binding.js +13 -9
  62. package/dist/commands/env/env-cli.js +76 -159
  63. package/dist/commands/env/env.js +12 -163
  64. package/dist/commands/env/marker-path.js +6 -0
  65. package/dist/commands/env/secret-cli.js +45 -61
  66. package/dist/commands/env/secret.js +32 -62
  67. package/dist/commands/feedback-cli.js +179 -85
  68. package/dist/commands/health/accept-rate.js +58 -0
  69. package/dist/commands/health/advisories.js +7 -8
  70. package/dist/commands/health/checks.js +279 -94
  71. package/dist/commands/health/html-report.js +197 -578
  72. package/dist/commands/health/improve-metrics.js +277 -246
  73. package/dist/commands/health/llm-usage.js +19 -19
  74. package/dist/commands/health/md-report.js +16 -7
  75. package/dist/commands/health/metrics.js +67 -32
  76. package/dist/commands/health/renderers.js +47 -0
  77. package/dist/commands/health/report-view-model.js +508 -0
  78. package/dist/commands/health/stash-exposure.js +1 -1
  79. package/dist/commands/health/surfaces.js +16 -56
  80. package/dist/commands/health/task-runs.js +3 -67
  81. package/dist/{migrate-storage-node.mjs → commands/health/types-checks.js} +1 -5
  82. package/dist/commands/health/types-improve.js +29 -0
  83. package/dist/{output/text/save.js → commands/health/types-metrics.js} +1 -2
  84. package/dist/commands/health/types-result.js +7 -0
  85. package/dist/commands/health/types-runs.js +4 -0
  86. package/dist/commands/health/types-session-log.js +4 -0
  87. package/dist/commands/health/types-windows.js +4 -0
  88. package/dist/commands/health/types.js +26 -21
  89. package/dist/commands/health/windows.js +2 -3
  90. package/dist/commands/health.js +296 -167
  91. package/dist/commands/improve/anti-collapse.js +5 -5
  92. package/dist/commands/improve/autonomy-gate.js +68 -0
  93. package/dist/commands/improve/collapse-detector.js +65 -52
  94. package/dist/commands/improve/consolidate/chunking.js +9 -7
  95. package/dist/commands/improve/consolidate/eligibility.js +1 -23
  96. package/dist/commands/improve/consolidate/merge.js +4 -0
  97. package/dist/commands/improve/consolidate.js +454 -1354
  98. package/dist/commands/improve/content-hash.js +39 -0
  99. package/dist/commands/improve/distill/content-repair.js +4 -10
  100. package/dist/commands/improve/distill/promote-memory.js +89 -64
  101. package/dist/commands/improve/distill/quality-gate.js +118 -42
  102. package/dist/commands/improve/distill-guards.js +1 -1
  103. package/dist/commands/improve/distill-promotion-policy.js +33 -888
  104. package/dist/commands/improve/distill.js +607 -363
  105. package/dist/commands/improve/eligibility.js +165 -79
  106. package/dist/commands/improve/extract-cli.js +35 -126
  107. package/dist/commands/improve/extract-prompt.js +6 -35
  108. package/dist/commands/improve/extract.js +640 -391
  109. package/dist/commands/improve/feedback-valence.js +2 -12
  110. package/dist/commands/improve/improve-cli.js +134 -135
  111. package/dist/commands/improve/improve-result-file.js +30 -50
  112. package/dist/commands/improve/improve-run-types.js +4 -0
  113. package/dist/commands/improve/improve-strategies.js +135 -0
  114. package/dist/commands/improve/improve.js +904 -701
  115. package/dist/commands/improve/locks.js +64 -111
  116. package/dist/commands/improve/loop-stages.js +1110 -923
  117. package/dist/commands/improve/memory/derived-ref.js +124 -0
  118. package/dist/commands/improve/memory/memory-belief.js +79 -7
  119. package/dist/commands/improve/memory/memory-contradiction-detect.js +49 -52
  120. package/dist/commands/improve/memory/memory-improve.js +25 -37
  121. package/dist/commands/improve/outcome-loop.js +25 -88
  122. package/dist/commands/improve/preparation.js +1034 -813
  123. package/dist/commands/improve/proactive-maintenance.js +34 -9
  124. package/dist/commands/improve/proposal-envelope.js +31 -0
  125. package/dist/commands/improve/reflect.js +983 -794
  126. package/dist/commands/improve/run-context.js +119 -0
  127. package/dist/commands/improve/salience.js +24 -127
  128. package/dist/commands/improve/session-asset.js +7 -3
  129. package/dist/commands/improve/shared.js +14 -34
  130. package/dist/commands/improve/source-identity.js +28 -0
  131. package/dist/commands/improve/triage.js +20 -17
  132. package/dist/commands/lint/base-linter.js +340 -313
  133. package/dist/commands/lint/env-key-rules.js +31 -47
  134. package/dist/commands/lint/index.js +185 -30
  135. package/dist/commands/{events.js → log.js} +28 -38
  136. package/dist/commands/migrate-cli.js +54 -0
  137. package/dist/commands/migration-tool.js +55 -0
  138. package/dist/commands/observability-cli.js +70 -208
  139. package/dist/commands/proposal/diff-format.js +50 -0
  140. package/dist/commands/proposal/drain-policies.js +0 -6
  141. package/dist/commands/proposal/drain.js +91 -40
  142. package/dist/commands/proposal/proposal-cli.js +134 -132
  143. package/dist/commands/proposal/proposal-types.js +56 -0
  144. package/dist/commands/proposal/proposal.js +83 -65
  145. package/dist/commands/proposal/propose-cli.js +88 -0
  146. package/dist/commands/proposal/propose.js +105 -88
  147. package/dist/commands/proposal/repository.js +1303 -278
  148. package/dist/commands/proposal/validators/proposal-quality-validators.js +16 -6
  149. package/dist/commands/proposal/validators/proposal-validators.js +61 -12
  150. package/dist/commands/proposal/validators/proposals.js +6 -8
  151. package/dist/commands/read/curate.js +78 -73
  152. package/dist/commands/read/knowledge.js +510 -13
  153. package/dist/commands/read/registry-search.js +2 -2
  154. package/dist/commands/read/remember-cli.js +84 -15
  155. package/dist/commands/read/search-cli.js +203 -96
  156. package/dist/commands/read/search.js +126 -94
  157. package/dist/commands/read/show.js +226 -250
  158. package/dist/commands/registry-cli.js +34 -60
  159. package/dist/commands/remember.js +18 -57
  160. package/dist/commands/sources/add-cli.js +104 -49
  161. package/dist/commands/sources/bundle-cli.js +166 -0
  162. package/dist/commands/sources/bundle-config-ops.js +63 -0
  163. package/dist/commands/sources/info.js +27 -15
  164. package/dist/commands/sources/init.js +30 -40
  165. package/dist/commands/sources/installed-stashes.js +469 -172
  166. package/dist/commands/sources/schema-repair.js +10 -9
  167. package/dist/commands/sources/self-update.js +182 -121
  168. package/dist/commands/sources/source-add.js +169 -178
  169. package/dist/commands/sources/source-clone.js +144 -41
  170. package/dist/commands/sources/source-manage.js +94 -59
  171. package/dist/commands/sources/sources-cli.js +64 -205
  172. package/dist/commands/sources/stash-cli.js +91 -54
  173. package/dist/commands/sources/stash-skeleton.js +1 -1
  174. package/dist/commands/tasks/tasks-cli.js +106 -104
  175. package/dist/commands/tasks/tasks.js +445 -262
  176. package/dist/commands/workflow-cli.js +75 -228
  177. package/dist/core/action-contributors.js +1 -1
  178. package/dist/core/activation-policy.js +49 -0
  179. package/dist/core/adapter/adapters/agent-skills-adapter.js +181 -0
  180. package/dist/core/adapter/adapters/akm-adapter.js +528 -0
  181. package/dist/core/adapter/adapters/akm-lint.js +392 -0
  182. package/dist/core/adapter/adapters/akm-metadata.js +387 -0
  183. package/dist/core/adapter/adapters/akm-task-adapter.js +149 -0
  184. package/dist/core/adapter/adapters/akm-workflow-adapter.js +180 -0
  185. package/dist/core/adapter/adapters/claude-adapter.js +61 -0
  186. package/dist/core/adapter/adapters/dotenv-adapter.js +187 -0
  187. package/dist/core/adapter/adapters/generic-files-adapter.js +119 -0
  188. package/dist/core/adapter/adapters/index.js +80 -0
  189. package/dist/core/adapter/adapters/llm-wiki-adapter.js +419 -0
  190. package/dist/core/adapter/adapters/okf-adapter.js +391 -0
  191. package/dist/core/adapter/adapters/opencode-adapter.js +68 -0
  192. package/dist/core/adapter/adapters/shared.js +286 -0
  193. package/dist/core/adapter/adapters/tool-dir-shared.js +217 -0
  194. package/dist/core/adapter/adapters/website-snapshot-adapter.js +155 -0
  195. package/dist/core/adapter/bundle-adapter.js +4 -0
  196. package/dist/core/adapter/detect-adapter.js +17 -0
  197. package/dist/core/adapter/recognize-match.js +44 -0
  198. package/dist/core/adapter/registry.js +56 -0
  199. package/dist/core/adapter/types.js +4 -0
  200. package/dist/core/asset/akm-markdown.js +30 -0
  201. package/dist/core/asset/asset-placement.js +243 -0
  202. package/dist/core/asset/asset-ref.js +110 -79
  203. package/dist/core/asset/asset-serialize.js +20 -0
  204. package/dist/core/asset/frontmatter.js +28 -12
  205. package/dist/core/asset/markdown.js +40 -51
  206. package/dist/core/asset/resolve-ref.js +274 -0
  207. package/dist/core/asset/stash-meta.js +2 -2
  208. package/dist/core/bundle-id.js +51 -0
  209. package/dist/core/common.js +281 -86
  210. package/dist/core/config/config-io.js +42 -128
  211. package/dist/core/config/config-schema.js +233 -855
  212. package/dist/core/config/config-sources.js +162 -39
  213. package/dist/core/config/config-types.js +16 -11
  214. package/dist/core/config/config-version.js +29 -0
  215. package/dist/core/config/config-walker.js +126 -37
  216. package/dist/core/config/config.js +154 -331
  217. package/dist/core/config/deep-merge.js +41 -0
  218. package/dist/core/config/engine-semantics.js +28 -0
  219. package/dist/core/config/experimental.js +21 -0
  220. package/dist/core/config/schema/embedding.js +38 -0
  221. package/dist/core/config/schema/engines.js +116 -0
  222. package/dist/core/config/schema/experimental.js +47 -0
  223. package/dist/core/config/schema/feedback.js +31 -0
  224. package/dist/core/config/schema/improve-processes.js +389 -0
  225. package/dist/core/config/schema/improve.js +94 -0
  226. package/dist/core/config/schema/index-config.js +176 -0
  227. package/dist/core/config/schema/output.js +18 -0
  228. package/dist/core/config/schema/primitives.js +94 -0
  229. package/dist/core/config/schema/search.js +30 -0
  230. package/dist/core/config/schema/setup.js +18 -0
  231. package/dist/core/config/schema/sources-bundles.js +169 -0
  232. package/dist/core/config/schema/workflow.js +29 -0
  233. package/dist/core/env-secret-ref.js +155 -20
  234. package/dist/core/errors.js +17 -15
  235. package/dist/core/events-types.js +4 -0
  236. package/dist/core/events.js +46 -128
  237. package/dist/core/extra-params.js +62 -0
  238. package/dist/core/file-change.js +17 -0
  239. package/dist/core/file-lock.js +202 -57
  240. package/dist/core/fs-txn.js +392 -0
  241. package/dist/core/git-message.js +59 -0
  242. package/dist/core/improve-result.js +167 -0
  243. package/dist/core/lesson-lint.js +1 -17
  244. package/dist/core/logs-db.js +1 -1
  245. package/dist/core/maintenance-barrier.js +135 -0
  246. package/dist/core/migration-operation.js +44 -0
  247. package/dist/core/mutation-target.js +78 -0
  248. package/dist/core/paths.js +22 -25
  249. package/dist/core/platform.js +10 -0
  250. package/dist/core/recognition-util.js +128 -0
  251. package/dist/core/redaction.js +392 -0
  252. package/dist/core/standards/resolve-standards-context.js +36 -65
  253. package/dist/core/standards/resolve-stash-standards.js +2 -2
  254. package/dist/core/standards/resolve-type-conventions.js +5 -5
  255. package/dist/core/state/migrations.js +242 -11
  256. package/dist/core/state-db.js +98 -10
  257. package/dist/core/structured.js +1 -1
  258. package/dist/core/subprocess.js +303 -0
  259. package/dist/core/text-truncation.js +9 -5
  260. package/dist/core/time.js +20 -0
  261. package/dist/core/type-presentation.js +130 -0
  262. package/dist/core/warn.js +0 -3
  263. package/dist/core/write-source.js +834 -118
  264. package/dist/indexer/bundle-identity-guard.js +92 -0
  265. package/dist/indexer/db/graph-db.js +1 -25
  266. package/dist/indexer/db/llm-cache.js +1 -1
  267. package/dist/indexer/ensure-index.js +30 -9
  268. package/dist/indexer/graph/graph-boost.js +9 -30
  269. package/dist/indexer/graph/graph-extraction.js +41 -27
  270. package/dist/indexer/graph/graph-types.js +4 -0
  271. package/dist/indexer/index-writer-lock.js +93 -49
  272. package/dist/indexer/index-written-assets.js +100 -53
  273. package/dist/indexer/indexer.js +746 -329
  274. package/dist/indexer/init.js +18 -25
  275. package/dist/indexer/installations.js +142 -0
  276. package/dist/indexer/passes/dir-staleness.js +18 -10
  277. package/dist/indexer/passes/memory-inference.js +25 -15
  278. package/dist/indexer/passes/metadata.js +412 -243
  279. package/dist/indexer/scan/doc-to-entry.js +160 -0
  280. package/dist/indexer/scan/drain-dir.js +134 -0
  281. package/dist/indexer/search/db-search.js +292 -108
  282. package/dist/indexer/search/fts-query.js +64 -0
  283. package/dist/indexer/search/ranking-contributors.js +145 -25
  284. package/dist/indexer/search/ranking-types.js +4 -0
  285. package/dist/indexer/search/ranking.js +28 -71
  286. package/dist/indexer/search/search-attribution.js +67 -0
  287. package/dist/indexer/search/search-fields.js +18 -3
  288. package/dist/indexer/search/search-hit-enrichers.js +30 -40
  289. package/dist/indexer/search/search-source.js +157 -111
  290. package/dist/indexer/search/semantic-status.js +4 -1
  291. package/dist/indexer/usage/usage-events.js +10 -30
  292. package/dist/indexer/walk/file-context.js +3 -45
  293. package/dist/indexer/walk/matchers.js +42 -73
  294. package/dist/indexer/walk/path-resolver.js +11 -5
  295. package/dist/indexer/walk/walker.js +42 -14
  296. package/dist/integrations/agent/builder-shared.js +7 -0
  297. package/dist/integrations/agent/builders.js +5 -58
  298. package/dist/integrations/agent/config.js +3 -143
  299. package/dist/integrations/agent/detect.js +17 -2
  300. package/dist/integrations/agent/engine-resolution.js +231 -0
  301. package/dist/integrations/agent/index.js +1 -2
  302. package/dist/integrations/agent/model-aliases.js +8 -3
  303. package/dist/integrations/agent/profiles.js +6 -99
  304. package/dist/integrations/agent/prompts.js +46 -18
  305. package/dist/integrations/agent/runner-dispatch.js +78 -13
  306. package/dist/integrations/agent/runner.js +76 -208
  307. package/dist/integrations/agent/spawn.js +48 -279
  308. package/dist/integrations/harnesses/aider/agent-builder.js +9 -8
  309. package/dist/integrations/harnesses/aider/index.js +2 -12
  310. package/dist/integrations/harnesses/amazonq/agent-builder.js +10 -16
  311. package/dist/integrations/harnesses/amazonq/index.js +3 -17
  312. package/dist/integrations/harnesses/claude/agent-builder.js +2 -3
  313. package/dist/integrations/harnesses/claude/config-import.js +1 -3
  314. package/dist/integrations/harnesses/claude/index.js +1 -14
  315. package/dist/integrations/harnesses/claude/session-log.js +27 -75
  316. package/dist/integrations/harnesses/codex/agent-builder.js +8 -7
  317. package/dist/integrations/harnesses/codex/index.js +2 -13
  318. package/dist/integrations/harnesses/copilot/agent-builder.js +9 -9
  319. package/dist/integrations/harnesses/copilot/index.js +1 -13
  320. package/dist/integrations/harnesses/gemini/agent-builder.js +8 -9
  321. package/dist/integrations/harnesses/gemini/index.js +1 -13
  322. package/dist/integrations/harnesses/ids.js +24 -0
  323. package/dist/integrations/harnesses/index.js +31 -33
  324. package/dist/integrations/harnesses/opencode/agent-builder.js +23 -5
  325. package/dist/integrations/harnesses/opencode/config-import.js +1 -3
  326. package/dist/integrations/harnesses/opencode/index.js +1 -18
  327. package/dist/integrations/harnesses/opencode/session-log.js +67 -125
  328. package/dist/integrations/harnesses/opencode-sdk/harness.js +3 -17
  329. package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +274 -191
  330. package/dist/integrations/harnesses/openhands/agent-builder.js +12 -10
  331. package/dist/integrations/harnesses/openhands/index.js +2 -12
  332. package/dist/integrations/harnesses/pi/agent-builder.js +11 -18
  333. package/dist/integrations/harnesses/pi/index.js +3 -16
  334. package/dist/integrations/harnesses/shared.js +17 -0
  335. package/dist/integrations/harnesses/types.js +38 -34
  336. package/dist/integrations/lockfile.js +211 -24
  337. package/dist/integrations/session-logs/index.js +24 -40
  338. package/dist/integrations/session-logs/provider-base.js +113 -0
  339. package/dist/llm/client.js +182 -110
  340. package/dist/llm/embedders/deterministic.js +2 -2
  341. package/dist/llm/embedders/remote.js +21 -9
  342. package/dist/llm/feature-gate.js +17 -57
  343. package/dist/llm/graph-extract.js +12 -13
  344. package/dist/llm/index-passes.js +8 -42
  345. package/dist/llm/memory-infer.js +144 -1
  346. package/dist/llm/metadata-enhance.js +45 -30
  347. package/dist/llm/structured-call.js +16 -8
  348. package/dist/llm/usage-persist.js +30 -5
  349. package/dist/llm/usage-telemetry.js +59 -6
  350. package/dist/output/cli-hints.js +1 -2
  351. package/dist/output/command-registry.js +27 -0
  352. package/dist/output/context.js +22 -7
  353. package/dist/output/format-exempt.js +80 -0
  354. package/dist/output/generic-render.js +251 -0
  355. package/dist/output/html-render.js +11 -16
  356. package/dist/output/render-registry.js +57 -0
  357. package/dist/output/renderers.js +15 -281
  358. package/dist/output/shapes/curate.js +10 -1
  359. package/dist/output/shapes/events.js +12 -7
  360. package/dist/output/shapes/helpers.js +58 -84
  361. package/dist/output/shapes/passthrough.js +8 -40
  362. package/dist/output/shapes/proposal/producer.js +15 -7
  363. package/dist/output/shapes/registry.js +12 -6
  364. package/dist/output/shapes.js +0 -9
  365. package/dist/output/text/{init.js → bundle-create.js} +3 -1
  366. package/dist/output/text/bundle-show.js +7 -0
  367. package/dist/output/text/command-format.js +562 -0
  368. package/dist/output/text/env.js +1 -3
  369. package/dist/output/text/events.js +8 -7
  370. package/dist/output/text/helpers.js +15 -1375
  371. package/dist/output/text/proposal/producer.js +4 -2
  372. package/dist/output/text/proposal-format.js +202 -0
  373. package/dist/output/text/registry-commands.js +1 -2
  374. package/dist/output/text/registry.js +12 -6
  375. package/dist/output/text/show-directives.js +117 -0
  376. package/dist/output/text/show-format.js +103 -0
  377. package/dist/output/text/sync.js +5 -0
  378. package/dist/output/text/workflow-format.js +332 -0
  379. package/dist/output/text/workflow.js +1 -2
  380. package/dist/output/text.js +10 -19
  381. package/dist/registry/factory.js +4 -6
  382. package/dist/registry/origin-resolve.js +16 -27
  383. package/dist/registry/providers/skills-sh.js +3 -3
  384. package/dist/registry/providers/static-index.js +15 -25
  385. package/dist/registry/resolve.js +43 -94
  386. package/dist/registry/semver.js +43 -0
  387. package/dist/runtime.js +81 -12
  388. package/dist/scripts/akm-migrate.js +35529 -0
  389. package/dist/setup/detect.js +5 -7
  390. package/dist/setup/detected-engines.js +136 -0
  391. package/dist/setup/engine-config.js +100 -0
  392. package/dist/setup/registry-stash-loader.js +3 -3
  393. package/dist/setup/semantic-assets.js +12 -9
  394. package/dist/setup/setup.js +444 -208
  395. package/dist/setup/steps/connection-shared.js +120 -0
  396. package/dist/setup/steps/connection.js +108 -305
  397. package/dist/setup/steps/platforms.js +13 -12
  398. package/dist/setup/steps/semantic.js +15 -3
  399. package/dist/setup/steps/sources.js +21 -15
  400. package/dist/setup/steps/stashdir.js +6 -4
  401. package/dist/setup/steps/tasks.js +236 -119
  402. package/dist/setup/steps.js +3 -2
  403. package/dist/sources/freshness.js +39 -0
  404. package/dist/sources/provider-factory.js +11 -17
  405. package/dist/sources/providers/filesystem.js +2 -3
  406. package/dist/sources/providers/git-install.js +278 -34
  407. package/dist/sources/providers/git-provider.js +54 -56
  408. package/dist/sources/providers/git-stash.js +420 -91
  409. package/dist/sources/providers/git.js +2 -2
  410. package/dist/sources/providers/npm.js +16 -19
  411. package/dist/sources/providers/provider-utils.js +47 -22
  412. package/dist/sources/providers/sync-from-ref.js +3 -9
  413. package/dist/sources/providers/website.js +2 -2
  414. package/dist/sources/resolve.js +11 -10
  415. package/dist/sources/snapshot-fetchers/types.js +4 -0
  416. package/dist/sources/{website-ingest.js → snapshot-fetchers/website-ingest.js} +110 -41
  417. package/dist/storage/database.js +60 -4
  418. package/dist/storage/engines/sqlite-migrations.js +156 -5
  419. package/dist/storage/locations.js +1 -2
  420. package/dist/storage/repositories/canaries-repository.js +1 -1
  421. package/dist/storage/repositories/events-repository.js +51 -11
  422. package/dist/storage/repositories/improve-runs-repository.js +6 -32
  423. package/dist/storage/repositories/index-connection.js +79 -0
  424. package/dist/storage/repositories/index-db.js +4 -3
  425. package/dist/storage/repositories/index-entries-repository.js +863 -0
  426. package/dist/{indexer/db/entry-mapper.js → storage/repositories/index-entry-mapper.js} +19 -2
  427. package/dist/storage/repositories/index-entry-types.js +4 -0
  428. package/dist/storage/repositories/index-fts-repository.js +167 -0
  429. package/dist/storage/repositories/index-llm-cache-repository.js +108 -0
  430. package/dist/storage/repositories/index-meta-repository.js +49 -0
  431. package/dist/{indexer/db/schema.js → storage/repositories/index-schema.js} +226 -100
  432. package/dist/storage/repositories/index-sql.js +12 -0
  433. package/dist/storage/repositories/index-utility-repository.js +356 -0
  434. package/dist/storage/repositories/index-vec-repository.js +250 -0
  435. package/dist/storage/repositories/outcome-repository.js +119 -0
  436. package/dist/storage/repositories/proposals-repository.js +317 -75
  437. package/dist/storage/repositories/registry-cache.js +1 -1
  438. package/dist/storage/repositories/salience-repository.js +172 -0
  439. package/dist/storage/repositories/task-history-repository.js +110 -3
  440. package/dist/storage/repositories/workflow-runs-repository.js +68 -35
  441. package/dist/tasks/backends/cron.js +169 -46
  442. package/dist/tasks/backends/exec-utils.js +76 -3
  443. package/dist/tasks/backends/index.js +6 -9
  444. package/dist/tasks/backends/launchd.js +292 -55
  445. package/dist/tasks/backends/schtasks.js +557 -70
  446. package/dist/tasks/backends/types.js +4 -0
  447. package/dist/tasks/command-executable.js +93 -0
  448. package/dist/tasks/embedded.js +56 -38
  449. package/dist/tasks/parser.js +156 -64
  450. package/dist/tasks/resolve-akm-bin.js +144 -51
  451. package/dist/tasks/runner.js +377 -209
  452. package/dist/tasks/schedule.js +108 -19
  453. package/dist/tasks/scheduler-invocation.js +296 -0
  454. package/dist/tasks/schema.js +1 -1
  455. package/dist/tasks/task-id.js +35 -0
  456. package/dist/tasks/validator.js +30 -16
  457. package/dist/workflows/authoring/authoring.js +96 -148
  458. package/dist/workflows/authoring/scope-key.js +1 -1
  459. package/dist/workflows/cli.js +0 -20
  460. package/dist/workflows/concurrency-policy.js +15 -0
  461. package/dist/workflows/exec/brief.js +25 -59
  462. package/dist/workflows/exec/frozen-judge.js +47 -0
  463. package/dist/workflows/exec/native-executor.js +157 -94
  464. package/dist/workflows/exec/report.js +365 -200
  465. package/dist/workflows/exec/run-workflow.js +46 -40
  466. package/dist/workflows/exec/scheduler.js +12 -41
  467. package/dist/workflows/exec/step-work.js +239 -205
  468. package/dist/workflows/exec/workflow-engine-gate.js +67 -0
  469. package/dist/workflows/ir/compile.js +141 -283
  470. package/dist/workflows/ir/freeze.js +233 -0
  471. package/dist/workflows/ir/plan-hash.js +40 -5
  472. package/dist/workflows/ir/schema.js +537 -1
  473. package/dist/workflows/parser.js +878 -306
  474. package/dist/workflows/program/expressions.js +20 -208
  475. package/dist/workflows/program/schema.js +7 -10
  476. package/dist/workflows/renderer.js +99 -121
  477. package/dist/workflows/resource-limits.js +22 -0
  478. package/dist/workflows/runtime/checkin.js +1 -1
  479. package/dist/workflows/runtime/plan-classifier.js +131 -0
  480. package/dist/workflows/runtime/runs.js +200 -113
  481. package/dist/workflows/runtime/unit-checkin.js +1 -1
  482. package/dist/workflows/runtime/unit-phases.js +20 -0
  483. package/dist/workflows/runtime/workflow-asset-loader.js +235 -97
  484. package/dist/workflows/schema.js +1 -11
  485. package/dist/workflows/validate-summary.js +4 -26
  486. package/dist/workflows/validator.js +52 -30
  487. package/docs/README.md +42 -78
  488. package/docs/migration/README.md +8 -0
  489. package/docs/migration/release-notes/0.6.0.md +1 -1
  490. package/docs/migration/release-notes/0.7.0.md +9 -8
  491. package/docs/migration/release-notes/0.9.0.md +158 -14
  492. package/docs/migration/v0.7-to-v0.8.md +46 -47
  493. package/docs/migration/v0.8-to-v0.9.md +844 -0
  494. package/docs/reference/README.md +12 -0
  495. package/docs/reference/data-and-telemetry.md +333 -0
  496. package/package.json +21 -17
  497. package/schemas/akm-asset-envelope.json +93 -0
  498. package/schemas/akm-config.json +4636 -0
  499. package/schemas/akm-task.json +87 -0
  500. package/{dist/schemas → schemas}/akm-workflow.json +127 -82
  501. package/dist/akm-migrate-storage +0 -38
  502. package/dist/assets/help/help-accept.md +0 -12
  503. package/dist/assets/help/help-improve.md +0 -84
  504. package/dist/assets/help/help-proposals.md +0 -17
  505. package/dist/assets/help/help-propose.md +0 -17
  506. package/dist/assets/help/help-reject.md +0 -11
  507. package/dist/assets/profiles/frequent.json +0 -13
  508. package/dist/assets/profiles/recombine-only.json +0 -21
  509. package/dist/assets/profiles/reflect-distill.json +0 -30
  510. package/dist/assets/profiles/synthesize.json +0 -15
  511. package/dist/assets/prompts/procedural-system.md +0 -44
  512. package/dist/assets/prompts/recombine-system.md +0 -40
  513. package/dist/assets/prompts/staleness-detect-system.md +0 -6
  514. package/dist/assets/tasks/core/backup.yml +0 -4
  515. package/dist/assets/tasks/graph-refresh-weekly.yml +0 -10
  516. package/dist/assets/templates/html/default.html +0 -78
  517. package/dist/assets/templates/html/vendor/echarts.min.js +0 -45
  518. package/dist/assets/wiki/index-template.md +0 -12
  519. package/dist/assets/wiki/ingest-workflow-template.md +0 -83
  520. package/dist/assets/wiki/log-template.md +0 -8
  521. package/dist/assets/wiki/schema-template.md +0 -61
  522. package/dist/cli/config-migrate.js +0 -150
  523. package/dist/cli/config-validate.js +0 -39
  524. package/dist/commands/graph/graph-cli.js +0 -124
  525. package/dist/commands/graph/graph.js +0 -487
  526. package/dist/commands/improve/calibration.js +0 -161
  527. package/dist/commands/improve/dedup.js +0 -482
  528. package/dist/commands/improve/extract-watch.js +0 -140
  529. package/dist/commands/improve/hot-probation.js +0 -45
  530. package/dist/commands/improve/improve-auto-accept.js +0 -276
  531. package/dist/commands/improve/improve-profiles.js +0 -168
  532. package/dist/commands/improve/procedural.js +0 -398
  533. package/dist/commands/improve/recombine.js +0 -818
  534. package/dist/commands/improve/schema-similarity-gate.js +0 -168
  535. package/dist/commands/lint/agent-linter.js +0 -44
  536. package/dist/commands/lint/command-linter.js +0 -44
  537. package/dist/commands/lint/default-linter.js +0 -16
  538. package/dist/commands/lint/fact-linter.js +0 -39
  539. package/dist/commands/lint/knowledge-linter.js +0 -16
  540. package/dist/commands/lint/memory-linter.js +0 -61
  541. package/dist/commands/lint/registry.js +0 -41
  542. package/dist/commands/lint/skill-linter.js +0 -45
  543. package/dist/commands/lint/task-linter.js +0 -50
  544. package/dist/commands/lint/workflow-linter.js +0 -81
  545. package/dist/commands/proposal/legacy-import.js +0 -115
  546. package/dist/commands/sources/history.js +0 -196
  547. package/dist/commands/tasks/default-tasks.js +0 -186
  548. package/dist/commands/wiki-cli.js +0 -292
  549. package/dist/core/asset/asset-registry.js +0 -76
  550. package/dist/core/asset/asset-spec.js +0 -316
  551. package/dist/core/config/config-migration.js +0 -602
  552. package/dist/core/deep-merge.js +0 -38
  553. package/dist/core/eval/rank-metrics.js +0 -113
  554. package/dist/core/ripgrep/install.js +0 -163
  555. package/dist/core/ripgrep/resolve.js +0 -81
  556. package/dist/indexer/db/db.js +0 -1414
  557. package/dist/indexer/manifest.js +0 -170
  558. package/dist/indexer/passes/metadata-contributors.js +0 -31
  559. package/dist/indexer/usage/unmigrated-vaults-guard.js +0 -94
  560. package/dist/integrations/harnesses/opencode-sdk/index.js +0 -25
  561. package/dist/llm/call-ai.js +0 -62
  562. package/dist/llm/memory-infer-impl.js +0 -138
  563. package/dist/output/shapes/distill.js +0 -14
  564. package/dist/output/shapes/history.js +0 -11
  565. package/dist/output/text/distill.js +0 -6
  566. package/dist/output/text/enable-disable.js +0 -8
  567. package/dist/output/text/history.js +0 -6
  568. package/dist/output/text/wiki.js +0 -16
  569. package/dist/registry/build-index.js +0 -386
  570. package/dist/schemas/akm-config.json +0 -14225
  571. package/dist/scripts/migrate-storage.js +0 -13169
  572. package/dist/scripts/migrations/import-fs-improve-runs-to-db.js +0 -10169
  573. package/dist/scripts/migrations/v16-to-v17.js +0 -141
  574. package/dist/setup/legacy-config.js +0 -106
  575. package/dist/storage/repositories/consolidation-repository.js +0 -38
  576. package/dist/storage/repositories/recombine-repository.js +0 -213
  577. package/dist/wiki/wiki-templates.js +0 -15
  578. package/dist/wiki/wiki.js +0 -1012
  579. package/dist/workflows/authoring/workflow-program-template.yaml +0 -31
  580. package/dist/workflows/db.js +0 -350
  581. package/dist/workflows/exec/watch.js +0 -116
  582. package/dist/workflows/program/parser.js +0 -760
  583. package/dist/workflows/program/project.js +0 -105
  584. package/docs/data-and-telemetry.md +0 -227
  585. package/docs/migration/release-notes/0.9.0-beta.60.md +0 -19
  586. /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/registry.js +0 -0
  587. /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/youtube.js +0 -0
@@ -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")}