akm-cli 0.9.1 → 0.9.2-alpha.2

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 (350) hide show
  1. package/CHANGELOG.md +103 -28
  2. package/README.md +3 -1
  3. package/SECURITY.md +1 -1
  4. package/STABILITY.md +1 -1
  5. package/dist/akm +2 -2
  6. package/dist/akm-migrate +2 -2
  7. package/dist/assets/hints/cli-hints-full.md +14 -9
  8. package/dist/assets/improve-strategies/proactive-maintenance.json +1 -1
  9. package/dist/assets/improve-strategies/reflect-distill.json +1 -1
  10. package/dist/assets/models.json +35 -0
  11. package/dist/assets/stash-skeleton/facts/conventions/backlinks.md +3 -4
  12. package/dist/assets/stash-skeleton/facts/conventions/organization.md +1 -3
  13. package/dist/assets/tasks/core/extract.yml +6 -5
  14. package/dist/assets/tasks/core/improve.yml +6 -5
  15. package/dist/assets/tasks/core/index-refresh.yml +6 -5
  16. package/dist/assets/tasks/core/sync.yml +6 -5
  17. package/dist/assets/tasks/core/version-check.yml +6 -5
  18. package/dist/assets/tasks/improve/akm-graph-refresh-weekly.yml +6 -5
  19. package/dist/assets/tasks/improve/akm-improve-catchup.yml +6 -5
  20. package/dist/assets/tasks/improve/akm-improve-consolidate.yml +6 -5
  21. package/dist/assets/tasks/improve/akm-improve-frequent.yml +6 -5
  22. package/dist/assets/tasks/improve/akm-improve-nightly.yml +6 -5
  23. package/dist/cli/confirm.js +2 -2
  24. package/dist/cli/parse-args.js +3 -24
  25. package/dist/cli/retired-commands.js +1 -1
  26. package/dist/cli/shared.js +2 -2
  27. package/dist/cli.js +11 -9
  28. package/dist/commands/agent/agent-dispatch.js +55 -89
  29. package/dist/commands/agent/contribute-cli.js +12 -45
  30. package/dist/commands/command/builtin-action.js +32 -0
  31. package/dist/commands/command/command-cli.js +99 -0
  32. package/dist/commands/command/command-execution.js +308 -0
  33. package/dist/commands/command/execution-source-loader.js +176 -0
  34. package/dist/commands/command/portable-template.js +60 -0
  35. package/dist/commands/config-cli.js +10 -4
  36. package/dist/commands/env/env.js +4 -2
  37. package/dist/commands/feedback-cli.js +1 -1
  38. package/dist/commands/health/checks.js +241 -29
  39. package/dist/commands/health/html-report.js +0 -14
  40. package/dist/commands/health/report-view-model.js +0 -1
  41. package/dist/commands/health/surfaces.js +6 -7
  42. package/dist/commands/health/types.js +0 -2
  43. package/dist/commands/health.js +63 -18
  44. package/dist/commands/improve/collapse-detector.js +5 -6
  45. package/dist/commands/improve/consolidate.js +251 -214
  46. package/dist/commands/improve/distill/promote-memory.js +71 -34
  47. package/dist/commands/improve/distill/quality-gate.js +17 -5
  48. package/dist/commands/improve/distill.js +232 -155
  49. package/dist/commands/improve/eligibility.js +112 -79
  50. package/dist/commands/improve/execution.js +57 -0
  51. package/dist/commands/improve/extract-cli.js +5 -5
  52. package/dist/commands/improve/extract-prompt.js +64 -22
  53. package/dist/commands/improve/extract.js +608 -360
  54. package/dist/commands/improve/improve-strategies.js +43 -14
  55. package/dist/commands/improve/improve.js +249 -29
  56. package/dist/commands/improve/loop-stages.js +11 -17
  57. package/dist/commands/improve/memory/memory-contradiction-detect.js +90 -66
  58. package/dist/commands/improve/outcome-loop.js +22 -38
  59. package/dist/commands/improve/planner.js +134 -0
  60. package/dist/commands/improve/preparation.js +730 -409
  61. package/dist/commands/improve/reflect.js +386 -223
  62. package/dist/commands/improve/run-context.js +3 -4
  63. package/dist/commands/improve/salience.js +6 -58
  64. package/dist/commands/improve/session-asset.js +12 -12
  65. package/dist/commands/lint/index.js +101 -29
  66. package/dist/commands/migrate-cli.js +11 -69
  67. package/dist/commands/migration-tool.js +6 -9
  68. package/dist/commands/models-cli.js +27 -0
  69. package/dist/commands/proposal/drain.js +258 -186
  70. package/dist/commands/proposal/proposal-cli.js +32 -10
  71. package/dist/commands/proposal/proposal.js +2 -5
  72. package/dist/commands/proposal/propose.js +192 -172
  73. package/dist/commands/proposal/repository.js +54 -91
  74. package/dist/commands/proposal/validators/proposal-validators.js +9 -7
  75. package/dist/commands/read/curate.js +53 -22
  76. package/dist/commands/read/registry-search.js +25 -9
  77. package/dist/commands/read/remember-cli.js +14 -2
  78. package/dist/commands/read/search.js +10 -4
  79. package/dist/commands/read/show.js +139 -153
  80. package/dist/commands/registry-cli.js +16 -7
  81. package/dist/commands/remember.js +33 -18
  82. package/dist/commands/sources/add-cli.js +19 -178
  83. package/dist/commands/sources/bundle-cli.js +15 -3
  84. package/dist/commands/sources/dangerous-env-audit.js +135 -0
  85. package/dist/commands/sources/info.js +2 -1
  86. package/dist/commands/sources/installed-stashes.js +901 -177
  87. package/dist/commands/sources/schema-repair.js +174 -95
  88. package/dist/commands/sources/self-update.js +30 -74
  89. package/dist/commands/sources/source-add.js +3 -5
  90. package/dist/commands/sources/sources-cli.js +2 -15
  91. package/dist/commands/sources/update-transaction.js +220 -0
  92. package/dist/commands/tasks/tasks-cli.js +3 -3
  93. package/dist/commands/tasks/tasks.js +736 -317
  94. package/dist/commands/workflow-cli.js +2 -2
  95. package/dist/core/adapter/adapters/agent-skills-adapter.js +3 -0
  96. package/dist/core/adapter/adapters/akm-adapter.js +85 -35
  97. package/dist/core/adapter/adapters/akm-lint.js +54 -39
  98. package/dist/core/adapter/adapters/akm-metadata.js +45 -45
  99. package/dist/core/adapter/adapters/akm-task-adapter.js +32 -49
  100. package/dist/core/adapter/adapters/akm-workflow-adapter.js +38 -23
  101. package/dist/core/adapter/adapters/dotenv-adapter.js +30 -1
  102. package/dist/core/adapter/adapters/generic-files-adapter.js +11 -0
  103. package/dist/core/adapter/adapters/index.js +0 -9
  104. package/dist/core/adapter/adapters/llm-wiki-adapter.js +4 -0
  105. package/dist/core/adapter/adapters/okf-adapter.js +4 -0
  106. package/dist/core/adapter/adapters/opencode-adapter.js +5 -8
  107. package/dist/core/adapter/adapters/tool-dir-shared.js +63 -6
  108. package/dist/core/adapter/adapters/website-snapshot-adapter.js +4 -0
  109. package/dist/core/adapter/execution-source.js +308 -0
  110. package/dist/core/adapter/recognize-match.js +36 -13
  111. package/dist/core/adapter/registry.js +0 -9
  112. package/dist/core/asset/stash-meta.js +94 -4
  113. package/dist/core/common.js +6 -11
  114. package/dist/core/config/config-io.js +3 -3
  115. package/dist/core/config/config-schema.js +18 -40
  116. package/dist/core/config/config-sources.js +11 -21
  117. package/dist/core/config/config-walker.js +31 -13
  118. package/dist/core/config/config.js +23 -26
  119. package/dist/core/config/schema/engines.js +8 -7
  120. package/dist/core/config/schema/improve-processes.js +29 -5
  121. package/dist/core/config/schema/index-config.js +0 -27
  122. package/dist/core/config/schema/primitives.js +1 -23
  123. package/dist/core/config/schema/sources-bundles.js +13 -16
  124. package/dist/core/errors.js +2 -0
  125. package/dist/core/events.js +68 -32
  126. package/dist/core/extra-params.js +1 -0
  127. package/dist/core/improve-result.js +315 -0
  128. package/dist/core/lesson-lint.js +0 -6
  129. package/dist/core/maintenance-barrier.js +4 -4
  130. package/dist/core/network-policy.js +152 -0
  131. package/dist/core/paths.js +1 -1
  132. package/dist/core/recognition-util.js +4 -4
  133. package/dist/core/registry-url.js +456 -0
  134. package/dist/core/state/migrations.js +161 -47
  135. package/dist/core/state-db.js +453 -80
  136. package/dist/core/system-error.js +32 -0
  137. package/dist/core/time.js +2 -12
  138. package/dist/core/write-source.js +0 -18
  139. package/dist/execution/directory-identity.js +52 -0
  140. package/dist/execution/executable-identity.js +107 -0
  141. package/dist/execution/guarded-source.js +398 -0
  142. package/dist/execution/json.js +95 -0
  143. package/dist/{commands/health/types-session-log.js → execution/limits.js} +2 -1
  144. package/dist/execution/record.js +55 -0
  145. package/dist/execution/resolved-request.js +730 -0
  146. package/dist/execution/source.js +320 -0
  147. package/dist/indexer/bundle-identity-guard.js +5 -4
  148. package/dist/indexer/db/graph-db.js +33 -0
  149. package/dist/indexer/graph/graph-boost.js +3 -4
  150. package/dist/indexer/graph/graph-extraction.js +562 -373
  151. package/dist/indexer/index-written-assets.js +78 -39
  152. package/dist/indexer/indexer.js +471 -432
  153. package/dist/indexer/installations.js +6 -0
  154. package/dist/indexer/lookup/adapter-concept-owner.js +283 -0
  155. package/dist/indexer/materialize-embeddings.js +155 -0
  156. package/dist/indexer/passes/memory-inference.js +227 -174
  157. package/dist/indexer/passes/metadata.js +263 -118
  158. package/dist/indexer/scan/doc-to-entry.js +7 -10
  159. package/dist/indexer/scan/drain-dir.js +51 -23
  160. package/dist/indexer/search/db-search.js +156 -50
  161. package/dist/indexer/search/fts-query.js +40 -40
  162. package/dist/indexer/search/ranking.js +36 -1
  163. package/dist/indexer/search/search-attribution.js +3 -1
  164. package/dist/indexer/search/search-fields.js +23 -14
  165. package/dist/indexer/search/search-hit-enrichers.js +1 -1
  166. package/dist/indexer/search/search-source.js +7 -16
  167. package/dist/indexer/search/semantic-status.js +10 -1
  168. package/dist/indexer/usage/show-usage.js +105 -0
  169. package/dist/indexer/usage/usage-events.js +7 -2
  170. package/dist/indexer/walk/matchers.js +40 -10
  171. package/dist/indexer/walk/path-resolver.js +5 -2
  172. package/dist/indexer/walk/walker.js +20 -2
  173. package/dist/integrations/agent/builder-shared.js +3 -6
  174. package/dist/integrations/agent/conversation-fallback.js +16 -0
  175. package/dist/integrations/agent/engine-resolution.js +87 -87
  176. package/dist/integrations/agent/execution-cascade.js +566 -0
  177. package/dist/integrations/agent/execution-definitions.js +211 -0
  178. package/dist/integrations/agent/execution-lowering.js +811 -0
  179. package/dist/integrations/agent/execution-preparation.js +67 -0
  180. package/dist/integrations/agent/index.js +0 -2
  181. package/dist/integrations/agent/inline-execution.js +74 -0
  182. package/dist/integrations/agent/model-map.js +515 -0
  183. package/dist/integrations/agent/persona-fallback.js +30 -0
  184. package/dist/integrations/agent/request-lowering.js +186 -0
  185. package/dist/integrations/agent/runner-dispatch.js +230 -37
  186. package/dist/integrations/agent/runner.js +12 -83
  187. package/dist/integrations/harnesses/aider/agent-builder.js +8 -0
  188. package/dist/integrations/harnesses/aider/index.js +0 -1
  189. package/dist/integrations/harnesses/amazonq/agent-builder.js +8 -0
  190. package/dist/integrations/harnesses/amazonq/index.js +0 -1
  191. package/dist/integrations/harnesses/claude/agent-builder.js +14 -1
  192. package/dist/integrations/harnesses/claude/index.js +1 -5
  193. package/dist/integrations/harnesses/claude/session-log.js +3 -33
  194. package/dist/integrations/harnesses/codex/agent-builder.js +8 -0
  195. package/dist/integrations/harnesses/codex/index.js +0 -1
  196. package/dist/integrations/harnesses/copilot/agent-builder.js +8 -0
  197. package/dist/integrations/harnesses/copilot/index.js +0 -1
  198. package/dist/integrations/harnesses/gemini/agent-builder.js +8 -0
  199. package/dist/integrations/harnesses/gemini/index.js +0 -1
  200. package/dist/integrations/harnesses/index.js +4 -44
  201. package/dist/integrations/harnesses/opencode/agent-builder.js +16 -9
  202. package/dist/integrations/harnesses/opencode/index.js +0 -2
  203. package/dist/integrations/harnesses/opencode/session-log.js +14 -204
  204. package/dist/integrations/harnesses/opencode-sdk/harness.js +12 -1
  205. package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +40 -42
  206. package/dist/integrations/harnesses/openhands/agent-builder.js +8 -0
  207. package/dist/integrations/harnesses/openhands/index.js +0 -1
  208. package/dist/integrations/harnesses/pi/agent-builder.js +8 -0
  209. package/dist/integrations/harnesses/pi/index.js +0 -1
  210. package/dist/integrations/harnesses/shared.js +0 -1
  211. package/dist/integrations/harnesses/types.js +1 -3
  212. package/dist/integrations/lockfile.js +82 -79
  213. package/dist/integrations/session-logs/index.js +6 -17
  214. package/dist/integrations/session-logs/provider-base.js +1 -29
  215. package/dist/llm/client.js +10 -5
  216. package/dist/llm/embedder.js +6 -7
  217. package/dist/llm/embedders/local.js +37 -88
  218. package/dist/llm/embedders/types.js +1 -1
  219. package/dist/llm/graph-extract.js +75 -50
  220. package/dist/llm/index-passes.js +43 -5
  221. package/dist/llm/memory-infer.js +8 -6
  222. package/dist/llm/metadata-enhance.js +5 -3
  223. package/dist/llm/structured-call.js +122 -25
  224. package/dist/output/format-exempt.js +1 -1
  225. package/dist/output/render-registry.js +0 -16
  226. package/dist/output/renderers.js +12 -7
  227. package/dist/output/shapes/curate.js +1 -0
  228. package/dist/output/shapes/helpers.js +10 -2
  229. package/dist/output/shapes/passthrough.js +2 -0
  230. package/dist/output/text/command-format.js +31 -33
  231. package/dist/output/text/health-format.js +1 -29
  232. package/dist/output/text/migrate.js +6 -56
  233. package/dist/output/text/proposal-format.js +16 -1
  234. package/dist/output/text/workflow-format.js +16 -0
  235. package/dist/registry/network.js +279 -0
  236. package/dist/registry/pinned-request-helper.js +247 -0
  237. package/dist/registry/pinned-transport.js +717 -0
  238. package/dist/registry/providers/skills-sh.js +18 -6
  239. package/dist/registry/providers/static-index.js +20 -7
  240. package/dist/registry/resolve.js +53 -28
  241. package/dist/scripts/akm-migrate-node.js +19334 -52269
  242. package/dist/scripts/akm-migrate.js +19270 -51612
  243. package/dist/setup/registry-stash-loader.js +64 -20
  244. package/dist/setup/semantic-assets.js +9 -34
  245. package/dist/setup/setup.js +12 -30
  246. package/dist/setup/source-identity.js +17 -0
  247. package/dist/setup/steps/sources.js +36 -15
  248. package/dist/setup/steps/tasks.js +39 -11
  249. package/dist/sources/providers/git-provider.js +3 -3
  250. package/dist/sources/providers/npm.js +2 -2
  251. package/dist/sources/providers/provider-utils.js +4 -3
  252. package/dist/sources/providers/website.js +11 -7
  253. package/dist/sources/snapshot-fetchers/host-guard.js +9 -136
  254. package/dist/sources/snapshot-fetchers/website-ingest.js +25 -109
  255. package/dist/sources/website-url.js +73 -0
  256. package/dist/storage/engines/sqlite-migrations.js +81 -26
  257. package/dist/storage/managed-db.js +27 -24
  258. package/dist/storage/repositories/events-repository.js +3 -0
  259. package/dist/storage/repositories/index-connection.js +42 -10
  260. package/dist/storage/repositories/index-entries-repository.js +203 -229
  261. package/dist/storage/repositories/index-entry-mapper.js +8 -12
  262. package/dist/storage/repositories/index-entry-schema.js +255 -0
  263. package/dist/storage/repositories/index-fts-repository.js +64 -71
  264. package/dist/storage/repositories/index-llm-cache-repository.js +8 -13
  265. package/dist/storage/repositories/index-meta-repository.js +0 -11
  266. package/dist/storage/repositories/index-schema.js +74 -350
  267. package/dist/storage/repositories/index-utility-repository.js +12 -17
  268. package/dist/storage/repositories/index-vec-repository.js +56 -7
  269. package/dist/storage/repositories/proposals-repository.js +4 -127
  270. package/dist/storage/repositories/registry-cache.js +2 -1
  271. package/dist/storage/repositories/task-history-repository.js +20 -40
  272. package/dist/storage/repositories/workflow-runs-repository.js +228 -129
  273. package/dist/storage/sqlite-read-snapshot.js +148 -0
  274. package/dist/tasks/backends/cron.js +170 -42
  275. package/dist/tasks/backends/index.js +1 -1
  276. package/dist/tasks/backends/launchd.js +787 -202
  277. package/dist/tasks/backends/schtasks.js +282 -83
  278. package/dist/tasks/embedded.js +7 -7
  279. package/dist/tasks/frozen-script.js +50 -0
  280. package/dist/tasks/resolve-akm-bin.js +5 -1
  281. package/dist/tasks/runner.js +239 -251
  282. package/dist/tasks/runtime-v3.js +281 -0
  283. package/dist/tasks/scheduler-binding.js +272 -0
  284. package/dist/tasks/scheduler-invocation.js +57 -43
  285. package/dist/tasks/scheduler-sync.js +654 -0
  286. package/dist/tasks/source-v3.js +752 -0
  287. package/dist/tasks/standalone-script-entry.js +5 -0
  288. package/dist/tasks/task-id.js +29 -0
  289. package/dist/workflows/authoring/authoring.js +15 -32
  290. package/dist/workflows/exec/dispatch-redaction.js +14 -8
  291. package/dist/workflows/exec/exec-unit.js +7 -28
  292. package/dist/workflows/exec/frozen-judge.js +57 -89
  293. package/dist/workflows/exec/lowering-notices.js +23 -0
  294. package/dist/workflows/exec/native-executor.js +301 -458
  295. package/dist/workflows/exec/param-secrets.js +4 -3
  296. package/dist/workflows/exec/run-workflow.js +26 -32
  297. package/dist/workflows/exec/step-work.js +105 -109
  298. package/dist/workflows/exec/unit-dispatch.js +103 -27
  299. package/dist/workflows/exec/unit-writer.js +3 -3
  300. package/dist/workflows/exec/worktree.js +2 -2
  301. package/dist/workflows/ir/compile.js +86 -72
  302. package/dist/workflows/ir/environment-v4.js +328 -0
  303. package/dist/workflows/ir/freeze-v4.js +122 -0
  304. package/dist/workflows/ir/plan-hash.js +13 -7
  305. package/dist/workflows/ir/schema-v4.js +525 -0
  306. package/dist/workflows/ir/schema.js +25 -284
  307. package/dist/workflows/ir/source-freeze-v4.js +506 -0
  308. package/dist/workflows/parser.js +27 -24
  309. package/dist/workflows/program/schema.js +1 -2
  310. package/dist/workflows/renderer.js +42 -29
  311. package/dist/workflows/resource-limits.js +4 -5
  312. package/dist/workflows/runtime/agent-identity.js +11 -13
  313. package/dist/workflows/runtime/plan-classifier.js +8 -8
  314. package/dist/workflows/runtime/runs.js +27 -43
  315. package/dist/workflows/runtime/workflow-asset-loader.js +45 -205
  316. package/dist/workflows/source-files.js +373 -0
  317. package/dist/workflows/source-ir/compile.js +196 -0
  318. package/dist/workflows/source-ir/github-yaml.js +577 -0
  319. package/dist/workflows/source-ir/ordering.js +38 -0
  320. package/dist/workflows/source-ir/program.js +50 -0
  321. package/dist/workflows/source-ir/result.js +26 -0
  322. package/dist/workflows/source-ir/schema.js +772 -0
  323. package/dist/workflows/source-ir/semantics.js +242 -0
  324. package/dist/workflows/source-ir/uses.js +14 -0
  325. package/docs/README.md +2 -0
  326. package/docs/migration/README.md +3 -1
  327. package/docs/migration/release-notes/0.9.2.md +55 -0
  328. package/docs/migration/release-notes/README.md +5 -0
  329. package/docs/migration/v0.8-to-v0.9.md +76 -1077
  330. package/docs/migration/v0.9.0-troubleshooting.md +104 -516
  331. package/docs/migration/v0.9.1-to-v0.9.2.md +150 -0
  332. package/docs/reference/README.md +1 -0
  333. package/docs/reference/cli.md +230 -98
  334. package/docs/reference/configuration.md +159 -36
  335. package/docs/reference/data-and-telemetry.md +19 -1
  336. package/docs/reference/supported-formats.md +23 -3
  337. package/docs/reference/tasks.md +182 -0
  338. package/docs/reference/workflow-schema.md +91 -40
  339. package/docs/reference/workflows.md +33 -6
  340. package/package.json +10 -6
  341. package/schemas/akm-config.json +372 -224
  342. package/schemas/akm-task.json +324 -80
  343. package/schemas/akm-workflow.json +6 -9
  344. package/dist/core/migration-operation.js +0 -75
  345. package/dist/integrations/agent/model-aliases.js +0 -74
  346. package/dist/tasks/parser.js +0 -380
  347. package/dist/tasks/schema.js +0 -123
  348. package/dist/tasks/validator.js +0 -80
  349. package/dist/workflows/ir/freeze.js +0 -320
  350. package/dist/workflows/runtime/document-cache.js +0 -13
package/CHANGELOG.md CHANGED
@@ -6,6 +6,98 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [0.9.2-alpha.2] - 2026-08-25
10
+
11
+ - TODO
12
+
13
+ ## [0.9.2-alpha.1] - 2026-08-24
14
+
15
+ ### Breaking changes & migration
16
+
17
+ - **Node.js 22 is no longer supported by the npm package.** `akm-cli` now
18
+ requires Node.js >= 24 to bootstrap its command. A working Bun >= 1.0 remains
19
+ optional and preferred for execution after that bootstrap; the standalone
20
+ binary remains runtime-free. Upgrade Node before installing or running the
21
+ npm package.
22
+ - The `inherit_env` option is a breaking removal: new durable-v4 workflow starts reject it.
23
+ Replace ambient whole-process inheritance with exact named environment bindings and
24
+ `exec.pass_env` names. Pre-v4 stored workflow plans are not executable in
25
+ 0.9.2; start a new run from current source.
26
+ - `improve.strategies.*.processes.triage.judgment` now accepts `true`/`false`
27
+ and honors `enabled` on object values; existing `{}` and configured objects
28
+ remain enabled. Unknown object keys are now rejected instead of ignored, so
29
+ correct typos such as `egnine`, `judgement`, or other unrecognized fields
30
+ before upgrading. Use `judgment: false` to disable the tier explicitly.
31
+
32
+ ### Added
33
+
34
+ - **WP0 — characterization and release contracts:** pinned direct-agent,
35
+ command, task, workflow-freeze, model-alias, and harness-lowering behavior;
36
+ added cross-entry-point equivalence fixtures and immutable release-surface
37
+ gates.
38
+ - **WP1 — shared execution contracts:** introduced adapter-rendered source
39
+ identity and one resolved-request representation carrying final content,
40
+ engine/model/inference selection, authorization, runtime settings, source
41
+ hashes, and structured lowering notices.
42
+ - **WP2 — layered model maps:** ship a versioned installed `models.json`, merge
43
+ an optional user overlay from the config directory, expand known aliases by
44
+ engine, pass unknown identifiers through exactly, and provide guarded model
45
+ map initialization.
46
+ - **WP3 — common cascade and authorization:** resolve far-to-near defaults once,
47
+ preserve explicit false/zero/empty values, authorize selected tools before
48
+ dispatch, and expose stable field-level provenance without resolved values.
49
+ - **WP4 — portable command execution:** added canonical
50
+ `akm command run <ref>`, implemented one-pass `$ARGUMENTS` substitution, and
51
+ reject unsupported native template constructs before dispatch. Stored
52
+ commands have one execution surface; `akm agent --command` is not retained.
53
+ - **WP6 — task v3:** added the strict shipped task schema, command/workflow/script
54
+ targets, closed shell and working-directory rules, portable schedules, and a
55
+ fail-closed task-v2 migrator with no-write preview, per-file status, backups,
56
+ validation, and blocked argv-array handling.
57
+ - **WP7 — peer workflow sources and durable v4:** compile Markdown and the
58
+ approved GitHub-shaped `.yml` subset through source IR v1; new runs atomically
59
+ persist immutable v4 targets, guarded source reads, symbolic environments,
60
+ and durable dispatch attempts. Pre-v4 stored plans are rejected rather than
61
+ maintaining a second runtime.
62
+ - **WP8 — release diagnostics:** added zero-write, secret-safe command dry-run
63
+ output, stderr-only verbose provenance, offline `selected-model-aliases` and
64
+ `configured-engines` health advisories, self-contained migration guidance,
65
+ and npm tar/install/link release gates.
66
+
67
+ ### Changed
68
+
69
+ - **WP5 — engine lowering convergence:** direct command/agent execution,
70
+ improve/proposal dispatch, tasks, and workflows now share the resolved-request
71
+ boundary and implementation-derived lowerers. Exact model and inference
72
+ settings reach registered harnesses; unsupported fields produce safe notices,
73
+ while provider capability rejection remains a runtime result.
74
+ - Scheduled workflow fires re-read the current peer source and create a fresh
75
+ durable-v4 freeze. Resume remains journaled replay, and crash recovery uses
76
+ at-least-once attempt semantics with stable reclaim identities.
77
+ - Task scheduler synchronization is transactional across supported adapters and
78
+ preserves exact ownership, rollback evidence, enabled state, parameters,
79
+ timeouts, redaction metadata, and resolver overrides.
80
+
81
+ ### Fixed
82
+
83
+ - Ordinary managed database opens no longer silently apply released migration
84
+ `018-drop-dead-lane-schema`, which drops retired tables and a column. Every
85
+ state migration now has an explicit safety classification; migration 002's
86
+ row-preserving table rebuild remains automatic, while migration 018 requires
87
+ a successful `akm upgrade` and a verified sibling SQLite snapshot created
88
+ immediately before its immutable SQL runs. The ledger recheck, WAL-inclusive
89
+ snapshot, and 018 transaction now share one writer-exclusion window; fresh
90
+ files and randomized backup paths are atomically reserved and inode-verified.
91
+ Pre-existing unversioned files—including an absent or empty migration
92
+ ledger—are rejected without writes by ordinary opens and snapshotted before
93
+ migration 001 by explicit upgrade. That snapshot, ledger initialization, and
94
+ migrations 001–002 share one writer-exclusion transaction, preventing an old
95
+ schema writer from landing data between the snapshot and the 002 rebuild.
96
+ Migration locks now reject phantom `BEGIN IMMEDIATE` results before running
97
+ SQL and fail clearly if the transaction disappears after a body. Snapshot
98
+ source and target handles are inode-bound, and failed reserved paths are
99
+ retained rather than removed by raced cleanup.
100
+
9
101
  ## [0.9.1] - 2026-08-18
10
102
 
11
103
  ### Fixed
@@ -1125,34 +1217,17 @@ See `docs/migration/v0.8-to-v0.9.md` and
1125
1217
  and a real domain asset always outranks the facts. That invariant is pinned
1126
1218
  by `tests/search-convention-fact-demotion.test.ts`, which becomes the
1127
1219
  regression guard if a demotion contributor is ever revisited.
1128
- - **Config-gated indexing of the self-situating body opening
1129
- `index.indexBodyOpening` (default `false`).** Body prose is not indexed
1130
- (the FTS `content` column carries only TOC headings and parameters), which
1131
- is why the stash conventions route orientation into
1132
- `description:`/`when_to_use:`. With the new flag enabled, the metadata pass
1133
- captures the first prose paragraph of each markdown asset body — skipping
1134
- headings (ATX and setext), fenced code blocks, thematic breaks, and a
1135
- leading nested frontmatter block (only when its content is actually
1136
- frontmatter-shaped: prose wrapped in decorative `---` lines is captured,
1137
- not discarded); capped at 280 chars with word-boundary truncation and a
1138
- trailing ellipsis into `entry.bodyOpening`, which folds into the
1139
- lowest-weight `content` FTS column (bm25 weight 1.0, so a name match always
1140
- outranks a body-opening-only match) and into the search/embedding text.
1141
- Secret and env files are never read for it, and session-kind memories
1142
- (`akm_memory_kind` in outer or nested inner frontmatter) are excluded —
1143
- their bodies are raw transcripts. Both indexing walks and write-path
1144
- indexing honor the flag (the metadata pass reads the user config directly).
1145
- With the flag absent or `false`, entries and search fields stay
1146
- byte-identical to before. **Costs of toggling (either direction):** indexed
1147
- text changes, so collapse-detector canary recall baselines shift — re-mint
1148
- via `akm improve canary --refresh` — and embeddings are NOT regenerated for
1149
- entries that already have one, while incremental runs re-extract only
1150
- changed files. Run `akm index --full` after toggling: it re-extracts every
1151
- entry and wipes embeddings so they rebuild from the new text; until then
1152
- `akm index` warns that the flag differs from the state the index was built
1153
- with. The conventions' `description:`/`when_to_use:` orientation routing
1154
- remains primary — this flag makes body openings additionally pay retrieval
1155
- rent, it does not replace structured metadata. See `docs/configuration.md`.
1220
+ - **One progressive lexical retrieval path and searchable Markdown prose.**
1221
+ FTS now tokenizes Unicode letters/numbers, deduplicates and caps the query,
1222
+ then runs strict AND, prefix-AND, and a single OR/prefix-OR recovery only
1223
+ after both conjunctive forms miss. Every stage keeps the existing BM25 field
1224
+ weights and downstream ranker; callers do not maintain stopword lists or
1225
+ parallel result collections. AKM-native Markdown contributes a normalized,
1226
+ 16,384-character body projection through the existing lowest-weight
1227
+ `content` field. Frontmatter, comments, fenced code, and link destinations
1228
+ are removed; secret/env values and raw session/checkpoint bodies never enter
1229
+ the projection. Structured fields remain first in the bounded embedding
1230
+ input, so exact names and metadata continue to dominate body-only matches.
1156
1231
  - **`akm mv <ref> <new-name>` — rename with inbound-xref rewrite and
1157
1232
  utility-history preservation (Experimental).** The stash conventions'
1158
1233
  forced-rename procedure ("grep and fix inbound xrefs in the same pass") was
package/README.md CHANGED
@@ -16,7 +16,7 @@ assistant, including [Claude Code](https://claude.ai/code),
16
16
 
17
17
  ## Install
18
18
 
19
- **Option 1 — npm package (recommended; requires [Node.js](https://nodejs.org) >= 22):**
19
+ **Option 1 — npm package (recommended; requires [Node.js](https://nodejs.org) >= 24):**
20
20
 
21
21
  ```sh
22
22
  npm install -g akm-cli
@@ -85,6 +85,8 @@ Full docs, CLI reference, and guides are available on [GitHub](https://github.co
85
85
  - [Getting Started](https://github.com/itlackey/akm/blob/main/docs/guides/getting-started.md)
86
86
  - [Supported Formats](https://github.com/itlackey/akm/blob/main/docs/reference/supported-formats.md)
87
87
  - [CLI Reference](https://github.com/itlackey/akm/blob/main/docs/reference/cli.md)
88
+ - [Task v3 Reference](https://github.com/itlackey/akm/blob/main/docs/reference/tasks.md)
89
+ - [0.9.2 Migration Guide](https://github.com/itlackey/akm/blob/main/docs/migration/v0.9.1-to-v0.9.2.md)
88
90
  - [Configuration](https://github.com/itlackey/akm/blob/main/docs/reference/configuration.md)
89
91
  - [Bundle Authoring Guide](https://github.com/itlackey/akm/blob/main/docs/guides/author-bundles.md)
90
92
  - [Registry](https://github.com/itlackey/akm/blob/main/docs/reference/registry.md)
package/SECURITY.md CHANGED
@@ -96,7 +96,7 @@ containing secrets or private notes.
96
96
 
97
97
  ## Known non-issues
98
98
 
99
- - **The `akm-cli` npm package requires Node.js >= 22 as its bootstrap.** A
99
+ - **The `akm-cli` npm package requires Node.js >= 24 as its bootstrap.** A
100
100
  working Bun >= 1.0 is preferred for execution when it is also on `PATH`; old,
101
101
  unusable, or absent Bun installations fall back to Node.js. Bun does not
102
102
  remove the package's Node.js requirement. Standalone binaries are
package/STABILITY.md CHANGED
@@ -218,7 +218,7 @@ enumeration of the whole `proposal` noun group.
218
218
  | `78` | Configuration error |
219
219
  - **Install scripts** — `install.sh` and `install.ps1` URLs; the `--prefix`
220
220
  / `AKM_INSTALL_DIR` environment override.
221
- - **Runtime** — the npm package requires Node.js >= 22 as its bootstrap and
221
+ - **Runtime** — the npm package requires Node.js >= 24 as its bootstrap and
222
222
  prefers a working Bun >= 1.0 for execution when both are available; old,
223
223
  unusable, or absent Bun installations fall back to Node.js. Standalone
224
224
  binaries are runtime-free.
package/dist/akm CHANGED
@@ -120,8 +120,8 @@ if (contextValid) {
120
120
 
121
121
  if (!process.versions.bun) {
122
122
  const [major = 0, minor = 0] = process.versions.node.split(".").map(Number);
123
- if (major < 22) {
124
- console.error("The akm-cli npm package requires Node.js >= 22 to bootstrap.");
123
+ if (major < 24) {
124
+ console.error("The akm-cli npm package requires Node.js >= 24 to bootstrap.");
125
125
  process.exit(1);
126
126
  }
127
127
  }
package/dist/akm-migrate CHANGED
@@ -8,8 +8,8 @@ import { fileURLToPath } from "node:url";
8
8
 
9
9
  if (!process.versions.bun) {
10
10
  const [major = 0, minor = 0] = process.versions.node.split(".").map(Number);
11
- if (major < 22) {
12
- console.error("The akm-cli npm package requires Node.js >= 22 to bootstrap.");
11
+ if (major < 24) {
12
+ console.error("The akm-cli npm package requires Node.js >= 24 to bootstrap.");
13
13
  process.exit(1);
14
14
  }
15
15
  }
@@ -92,7 +92,7 @@ akm import - --name scratch-notes < notes.md # Import stdin as a knowledge doc
92
92
  akm import https://example.com/docs/auth # Fetch one URL and import it as knowledge
93
93
  akm import ./doc.md --target my-other-bundle # Route import to a named writable bundle source
94
94
  akm workflow create ship-release # Create a workflow asset in the bundle
95
- akm lint --type workflows # Parse and compile every unified markdown workflow; list every error
95
+ akm lint --type workflows # Parse and compile every .md/.yml workflow source; list every error
96
96
  akm workflow run workflows/ship-release # Start or resume and execute the workflow
97
97
  akm feedback skills/code-review --positive # Record that an asset helped
98
98
  akm feedback agents/reviewer --negative --reason "wrong framework" # Record why an asset missed the mark
@@ -160,7 +160,9 @@ akm secret run secrets/deploy-token GITHUB_TOKEN -- gh release create v1.0.0 #
160
160
 
161
161
  ## Workflows
162
162
 
163
- Workflows live under `<bundle>/workflows/` as unified markdown assets.
163
+ Workflows live under `<bundle>/workflows/` as peer `.md` and `.yml` sources.
164
+ Both compile to the same source IR; see `docs/reference/workflow-schema.md` for
165
+ the bounded GitHub-shaped YAML subset.
164
166
 
165
167
  Ref-based workflow commands are scoped to the current project/worktree/directory,
166
168
  so one active run does not block unrelated directories from starting the same
@@ -269,6 +271,7 @@ akm bundle list --kind git # Filter by provider (files
269
271
  akm bundle remove <target> # Remove by id, ref, path, or name
270
272
  akm bundle update --all # Update all managed sources
271
273
  akm bundle update <target> --force # Force re-download
274
+ akm bundle update <target> --allow-insecure # Approve reviewed dangerous env keys
272
275
  ```
273
276
 
274
277
  ## Registries
@@ -336,7 +339,7 @@ akm proposal reject <id> --reason "..." # Archive with a reason
336
339
  akm proposal revert <id> # Restore the pre-promotion content
337
340
  akm proposal new <type> <name> --task "..." # Agent-author a NEW asset as a proposal
338
341
  akm proposal extract --auto # Mine native session files into proposals
339
- akm proposal extract --type claude-code # Restrict extraction to one harness
342
+ akm proposal extract --type claude # Restrict extraction to one harness
340
343
  ```
341
344
 
342
345
  The flat verbs `akm proposals` / `akm show proposal` / `akm accept` /
@@ -353,7 +356,7 @@ file plus one `sync` is a complete workflow.
353
356
 
354
357
  ```sh
355
358
  akm task add nightly-improve --schedule "@daily" --command "akm improve --strategy frequent"
356
- akm task add briefing --schedule "0 9 * * *" --prompt agents/briefer # Agent-target task
359
+ akm task add briefing --schedule "0 9 * * *" --prompt "Draft the morning briefing" # Inline command task
357
360
  akm task sync # Reconcile task files with the OS scheduler
358
361
  akm task sync --rebind # Also re-pin the scheduler's akm binary/spelling
359
362
  akm task doctor # Scheduler binding + runtime eligibility diagnosis
@@ -362,18 +365,20 @@ akm task run <id> # Run one task immediately (works
362
365
  akm search --type task # Enumerate task assets (there is no `task list`)
363
366
  ```
364
367
 
365
- To disable a task, set `enabled: false` in its YAML and run `akm task sync`
368
+ Task files use strict task v3 (`version: 3`). To disable one, set
369
+ `akm.enabled: false` and run `akm task sync`
366
370
  (the cron line stays, commented). To remove one, delete the YAML and run
367
- `akm task sync` — the scheduler entry is unbound. Per-task `timeoutMs` in
368
- the YAML may be `null` (disable the agent kill timer for long local-model
369
- runs) or a number of milliseconds overriding the selected engine invocation timeout.
371
+ `akm task sync` — the scheduler entry is unbound. Per-task `akm.timeout` may
372
+ be `null` (disable the invocation timer) or a duration/number overriding the
373
+ selected engine invocation timeout. Preview old task-v2 conversion with
374
+ `akm migrate apply --dry-run`.
370
375
 
371
376
  ## Agent Dispatch
372
377
 
373
378
  ```sh
374
379
  akm agent --prompt "summarize open proposals" # Dispatch the configured agent CLI
375
380
  akm agent agents/architect --prompt "..." # Embody a bundle agent asset (system prompt, model, tool policy)
376
- akm agent --workflow workflows/ship-release # Load the task from a workflow asset
381
+ akm command run commands/release # Canonical reusable-command dispatch
377
382
  akm agent --model sonnet --prompt "..." # Model override (aliases or exact IDs)
378
383
  ```
379
384
 
@@ -17,7 +17,7 @@
17
17
  "policy": "personal-stash",
18
18
  "maxAcceptsPerRun": 100,
19
19
  "maxDiffLines": 200,
20
- "judgment": {}
20
+ "judgment": true
21
21
  },
22
22
  "proactiveMaintenance": { "enabled": true, "dueDays": 30, "maxPerRun": 100 }
23
23
  },
@@ -22,7 +22,7 @@
22
22
  "policy": "personal-stash",
23
23
  "maxAcceptsPerRun": 15,
24
24
  "maxDiffLines": 200,
25
- "judgment": {}
25
+ "judgment": true
26
26
  },
27
27
  "proactiveMaintenance": { "enabled": false, "dueDays": 30, "maxPerRun": 15 }
28
28
  },
@@ -0,0 +1,35 @@
1
+ {
2
+ "version": 1,
3
+ "aliases": {
4
+ "fast": {
5
+ "claude": "claude-haiku-4-5-20251001",
6
+ "opencode": "opencode/claude-haiku-4-5",
7
+ "opencode-sdk": "anthropic/claude-haiku-4-5"
8
+ },
9
+ "balanced": {
10
+ "claude": "claude-sonnet-4-6",
11
+ "opencode": "opencode/claude-sonnet-4-6",
12
+ "opencode-sdk": "anthropic/claude-sonnet-4-6"
13
+ },
14
+ "reasoning": {
15
+ "claude": {
16
+ "model": "claude-opus-4-7",
17
+ "inference": {
18
+ "effort": "high"
19
+ }
20
+ },
21
+ "opencode": {
22
+ "model": "opencode/claude-opus-4-7",
23
+ "inference": {
24
+ "effort": "high"
25
+ }
26
+ },
27
+ "opencode-sdk": {
28
+ "model": "anthropic/claude-opus-4-7",
29
+ "inference": {
30
+ "effort": "high"
31
+ }
32
+ }
33
+ }
34
+ }
35
+ }
@@ -73,10 +73,9 @@ xrefs:
73
73
  ## Self-situating headers and canonical naming
74
74
 
75
75
  Put the one-line orientation in `description:` and the trigger conditions in
76
- `when_to_use:` — those are indexed fields; body prose is not indexed by
77
- default (only headings reach the index; the opt-in `index.indexBodyOpening`
78
- flag adds just the first body paragraph, at the lowest weight —
79
- `description:`/`when_to_use:` remain the primary orientation channel). Then
76
+ `when_to_use:` — those remain the higher-weight indexed fields. Bounded body
77
+ prose is indexed in the lowest-weight `content` field, so
78
+ `description:`/`when_to_use:` remain the primary orientation channel. Then
80
79
  open the body with a plain title plus a one-line
81
80
  orientation naming what it is, its scope/domain, and its key entities in
82
81
  canonical spelling (`Postgres`, `OAuth`, `TLS`, `Acme`) — the entity/relation
@@ -86,9 +86,7 @@ cross-project reuse.
86
86
  (`acme` vs `acme-corp`) so the prefix does not fragment. Keep the domain
87
87
  vocabulary in `facts/conventions/domains`.
88
88
  - **Off-axis facets go in `tags:`, not a bare field.** The indexed FTS fields are
89
- name, description, tags, hints, and content (headings onlybody prose is
90
- not indexed by default; the opt-in `index.indexBodyOpening` flag adds just
91
- the first body paragraph, at the lowest weight) — there is **no `project`
89
+ name, description, tags, hints, and bounded low-weight body content there is **no `project`
92
90
  field**, so `project: projectA` in
93
91
  frontmatter is invisible to search. Put the off-axis facet in `tags` instead
94
92
  (a project-scoped memory adds `tags: [auth]`; a domain-scoped asset genuinely
@@ -1,5 +1,6 @@
1
- version: 2
2
- schedule: "*/30 * * * *"
3
- command: akm proposal extract --auto
4
- enabled: true
5
- description: Opt-in all-harness session extraction every 30 min
1
+ version: 3
2
+ run: akm proposal extract --auto
3
+ akm:
4
+ schedule: "*/30 * * * *"
5
+ enabled: true
6
+ description: Opt-in all-harness session extraction every 30 min
@@ -1,5 +1,6 @@
1
- version: 2
2
- schedule: "0 2 * * *"
3
- command: akm improve
4
- enabled: true
5
- description: Run improve pipeline nightly
1
+ version: 3
2
+ run: akm improve
3
+ akm:
4
+ schedule: "0 2 * * *"
5
+ enabled: true
6
+ description: Run improve pipeline nightly
@@ -1,5 +1,6 @@
1
- version: 2
2
- schedule: "0 4 * * *"
3
- command: akm index
4
- enabled: true
5
- description: Nightly incremental index refresh
1
+ version: 3
2
+ run: akm index
3
+ akm:
4
+ schedule: "0 4 * * *"
5
+ enabled: true
6
+ description: Nightly incremental index refresh
@@ -1,5 +1,6 @@
1
- version: 2
2
- schedule: "*/15 * * * *"
3
- command: akm sync
4
- enabled: true
5
- description: Sync stash changes to git remote every 15 min
1
+ version: 3
2
+ run: akm sync
3
+ akm:
4
+ schedule: "*/15 * * * *"
5
+ enabled: true
6
+ description: Sync stash changes to git remote every 15 min
@@ -1,5 +1,6 @@
1
- version: 2
2
- schedule: "0 9 * * 1"
3
- command: akm upgrade --check
4
- enabled: true
5
- description: Weekly check for new akm releases
1
+ version: 3
2
+ run: akm upgrade --check
3
+ akm:
4
+ schedule: "0 9 * * 1"
5
+ enabled: true
6
+ description: Weekly check for new akm releases
@@ -1,5 +1,6 @@
1
- version: 2
2
- schedule: "10 3 * * 0"
3
- command: akm improve --strategy graph-refresh --skip-if-locked
4
- enabled: true
5
- description: Full-corpus graph rebuild (weekly Sunday 3:10am)
1
+ version: 3
2
+ run: akm improve --strategy graph-refresh --skip-if-locked
3
+ akm:
4
+ schedule: "10 3 * * 0"
5
+ enabled: true
6
+ description: Full-corpus graph rebuild (weekly Sunday 3:10am)
@@ -1,8 +1,9 @@
1
- version: 2
2
- schedule: "0 4 * * *"
3
- command: akm improve --strategy catchup --skip-if-locked
1
+ version: 3
2
+ run: akm improve --strategy catchup --skip-if-locked
3
+ akm:
4
+ schedule: "0 4 * * *"
4
5
  # Manual-recovery task: ships disabled (the retired registerDefaultTasks
5
6
  # marked it enableMode: "manual"). `akm task run` works while disabled;
6
7
  # opting into the schedule is `enabled: true` + `akm task sync`.
7
- enabled: false
8
- description: Manual recovery — consolidation + triage drain (run on demand via `akm task run akm-improve-catchup`)
8
+ enabled: false
9
+ description: Manual recovery — consolidation + triage drain (run on demand via `akm task run akm-improve-catchup`)
@@ -1,5 +1,6 @@
1
- version: 2
2
- schedule: "20 */4 * * *"
3
- command: akm improve --strategy consolidate --skip-if-locked
4
- enabled: true
5
- description: Consolidation-only pass (every 4h at :20)
1
+ version: 3
2
+ run: akm improve --strategy consolidate --skip-if-locked
3
+ akm:
4
+ schedule: "20 */4 * * *"
5
+ enabled: true
6
+ description: Consolidation-only pass (every 4h at :20)
@@ -1,5 +1,6 @@
1
- version: 2
2
- schedule: "40 * * * *"
3
- command: akm improve --strategy frequent --skip-if-locked
4
- enabled: true
5
- description: Frequent inference pass (hourly at :40; improve-stage extract off)
1
+ version: 3
2
+ run: akm improve --strategy frequent --skip-if-locked
3
+ akm:
4
+ schedule: "40 * * * *"
5
+ enabled: true
6
+ description: Frequent inference pass (hourly at :40; improve-stage extract off)
@@ -1,5 +1,6 @@
1
- version: 2
2
- schedule: "15 2 * * *"
3
- command: akm improve --strategy thorough --skip-if-locked
4
- enabled: true
5
- description: Full nightly quality sweep (daily 2:15am; suggested for server installs)
1
+ version: 3
2
+ run: akm improve --strategy thorough --skip-if-locked
3
+ akm:
4
+ schedule: "15 2 * * *"
5
+ enabled: true
6
+ description: Full nightly quality sweep (daily 2:15am; suggested for server installs)
@@ -32,8 +32,8 @@
32
32
  *
33
33
  * ## Safety exemptions
34
34
  *
35
- * `--quiet` NEVER suppresses the confirmation prompt it is safety-critical
36
- * output. The auto-migration banner is similarly exempt from `--quiet`.
35
+ * `--quiet` NEVER suppresses the confirmation prompt because it is
36
+ * safety-critical output.
37
37
  */
38
38
  import { UsageError } from "../core/errors.js";
39
39
  import * as p from "./clack.js";
@@ -45,9 +45,9 @@ export function parsePositiveIntFlag(raw, flagName = "--limit") {
45
45
  const trimmed = raw.trim();
46
46
  if (!trimmed)
47
47
  return undefined;
48
- // Strict digits, matching parseNonNegativeIntFlag below. parseInt stops at the
49
- // first non-digit, so "10x" silently became 10, "3.5" became 3, and
50
- // "5 apples" became 5 — accepted rather than rejected as invalid.
48
+ // Strict digits: parseInt stops at the first non-digit, so "10x" silently
49
+ // became 10, "3.5" became 3, and "5 apples" became 5 — accepted rather than
50
+ // rejected as invalid.
51
51
  if (!/^\d+$/.test(trimmed)) {
52
52
  throw new UsageError(`Invalid ${flagName} value: "${raw}". Must be a positive integer.`, "INVALID_FLAG_VALUE");
53
53
  }
@@ -57,27 +57,6 @@ export function parsePositiveIntFlag(raw, flagName = "--limit") {
57
57
  }
58
58
  return parsed;
59
59
  }
60
- /**
61
- * Parse a non-negative integer flag value (0 is allowed, unlike `parsePositiveIntFlag`).
62
- *
63
- * Returns `undefined` when `raw` is `undefined` or empty (flag not supplied).
64
- * Throws `UsageError` when the raw value is present but not a valid non-negative
65
- * integer (e.g. contains decimals, letters, or is negative).
66
- *
67
- * @param raw The raw string value (may be undefined).
68
- * @param flagName The flag name to include in the error message.
69
- */
70
- export function parseNonNegativeIntFlag(raw, flagName) {
71
- if (raw === undefined)
72
- return undefined;
73
- const trimmed = raw.trim();
74
- if (!trimmed)
75
- return undefined;
76
- if (!/^\d+$/.test(trimmed)) {
77
- throw new UsageError(`Invalid ${flagName} value: "${raw}". Must be a non-negative integer.`, "INVALID_FLAG_VALUE");
78
- }
79
- return parseInt(trimmed, 10);
80
- }
81
60
  // ── String flag parsing ──────────────────────────────────────────────────────
82
61
  /**
83
62
  * Extract a string value from a parsed citty argument object by key.
@@ -45,7 +45,7 @@ const RETIRED_COMMAND_HINTS = {
45
45
  mv: "`akm mv` was removed in 0.9 — move the file, then run `akm index` and `akm lint` (to carry ranking signal: `bun scripts/rekey-asset-ref.ts <old-ref> <new-ref>`).",
46
46
  // Pre-0.9 removals agents still trip over.
47
47
  wiki: "the `akm wiki` family was removed in 0.9 — wikis are ordinary knowledge assets; ingest with `akm import <url> --path <subdir>`.",
48
- backup: "`akm backup` was removed in 0.9 — backups belong to the standalone `akm-migrate backup` tool.",
48
+ backup: "`akm backup` was removed in 0.9 — stop writers and archive current config, data, state, and writable bundles with your normal backup tooling.",
49
49
  vault: "the `akm vault ...` family was removed in 0.9 — use `akm env list`/`akm env create` for a whole `.env` group, or `akm secret set <name>` for a single sensitive value.",
50
50
  // Group-scoped retirements.
51
51
  "env set": "`akm env set` was removed in 0.9 — edit the `.env` file directly; akm loads it as-is.",
@@ -172,8 +172,8 @@ export const GLOBAL_OUTPUT_ARGS = {
172
172
  type: "boolean",
173
173
  alias: "q",
174
174
  description: "Suppress non-essential stderr output (banners, spinners, progress info) (global flag). " +
175
- "Safety-critical output is never suppressed: errors, destructive-action confirmation prompts, " +
176
- "and auto-migration banners always appear regardless of --quiet.",
175
+ "Safety-critical output is never suppressed: errors and destructive-action confirmation prompts " +
176
+ "always appear regardless of --quiet.",
177
177
  default: false,
178
178
  },
179
179
  verbose: {