akm-cli 0.8.7 → 0.8.14

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 (324) hide show
  1. package/CHANGELOG.md +428 -0
  2. package/dist/assets/help/help-proposals.md +1 -2
  3. package/dist/assets/hints/cli-hints-full.md +34 -19
  4. package/dist/assets/hints/cli-hints-short.md +1 -1
  5. package/dist/assets/profiles/catchup.json +13 -0
  6. package/dist/assets/profiles/consolidate.json +13 -0
  7. package/dist/assets/profiles/frequent.json +13 -0
  8. package/dist/assets/tasks/core/backup.yml +4 -0
  9. package/dist/assets/tasks/core/extract.yml +4 -0
  10. package/dist/assets/tasks/core/improve.yml +4 -0
  11. package/dist/assets/tasks/core/index-refresh.yml +4 -0
  12. package/dist/assets/tasks/core/sync.yml +4 -0
  13. package/dist/assets/tasks/core/update-stashes.yml +4 -0
  14. package/dist/assets/tasks/core/version-check.yml +4 -0
  15. package/dist/assets/templates/html/default.html +78 -0
  16. package/dist/assets/templates/html/health.html +560 -0
  17. package/dist/assets/templates/html/vendor/echarts.min.js +45 -0
  18. package/dist/cli/config-migrate.js +6 -6
  19. package/dist/cli/config-validate.js +4 -4
  20. package/dist/cli/confirm.js +3 -3
  21. package/dist/cli/parse-args.js +1 -1
  22. package/dist/cli/shared.js +72 -19
  23. package/dist/cli-node.mjs +26 -0
  24. package/dist/cli.js +206 -3866
  25. package/dist/commands/{agent-dispatch.js → agent/agent-dispatch.js} +6 -6
  26. package/dist/commands/{agent-support.js → agent/agent-support.js} +2 -2
  27. package/dist/commands/agent/contribute-cli.js +200 -0
  28. package/dist/commands/completions.js +1 -1
  29. package/dist/commands/config-cli.js +230 -3
  30. package/dist/commands/db-cli.js +2 -2
  31. package/dist/commands/env/env-cli.js +529 -0
  32. package/dist/commands/env/env.js +410 -0
  33. package/dist/commands/env/secret-cli.js +259 -0
  34. package/dist/commands/{secret.js → env/secret.js} +6 -47
  35. package/dist/commands/events.js +4 -4
  36. package/dist/commands/feedback-cli.js +18 -34
  37. package/dist/commands/graph/graph-cli.js +132 -0
  38. package/dist/commands/{graph.js → graph/graph.js} +22 -16
  39. package/dist/commands/health/checks.js +279 -0
  40. package/dist/commands/health/html-report.js +448 -0
  41. package/dist/commands/health.js +189 -266
  42. package/dist/commands/{consolidate.js → improve/consolidate.js} +48 -36
  43. package/dist/commands/{distill-promotion-policy.js → improve/distill-promotion-policy.js} +3 -3
  44. package/dist/commands/{distill.js → improve/distill.js} +39 -18
  45. package/dist/commands/{eval-cases.js → improve/eval-cases.js} +1 -1
  46. package/dist/commands/{extract-cli.js → improve/extract-cli.js} +4 -4
  47. package/dist/commands/{extract-prompt.js → improve/extract-prompt.js} +2 -2
  48. package/dist/commands/{extract.js → improve/extract.js} +221 -26
  49. package/dist/commands/{improve-auto-accept.js → improve/improve-auto-accept.js} +30 -4
  50. package/dist/commands/{improve-cli.js → improve/improve-cli.js} +44 -22
  51. package/dist/commands/{improve-profiles.js → improve/improve-profiles.js} +13 -7
  52. package/dist/commands/{improve-result-file.js → improve/improve-result-file.js} +1 -1
  53. package/dist/commands/{improve.js → improve/improve.js} +672 -292
  54. package/dist/{core → commands/improve/memory}/memory-belief.js +2 -2
  55. package/dist/{core → commands/improve/memory}/memory-contradiction-detect.js +5 -5
  56. package/dist/{core → commands/improve/memory}/memory-improve.js +4 -4
  57. package/dist/commands/improve/reflect-noise.js +0 -0
  58. package/dist/commands/{reflect.js → improve/reflect.js} +58 -28
  59. package/dist/commands/improve/session-asset.js +248 -0
  60. package/dist/commands/lint/agent-linter.js +1 -1
  61. package/dist/commands/lint/base-linter.js +55 -37
  62. package/dist/commands/lint/command-linter.js +1 -1
  63. package/dist/commands/lint/default-linter.js +1 -1
  64. package/dist/commands/lint/env-key-rules.js +1 -1
  65. package/dist/commands/lint/index.js +19 -25
  66. package/dist/commands/lint/knowledge-linter.js +1 -1
  67. package/dist/commands/lint/memory-linter.js +1 -1
  68. package/dist/commands/lint/registry.js +8 -8
  69. package/dist/commands/lint/skill-linter.js +1 -1
  70. package/dist/commands/lint/task-linter.js +1 -1
  71. package/dist/commands/lint/workflow-linter.js +1 -1
  72. package/dist/commands/lint.js +1 -1
  73. package/dist/commands/observability-cli.js +244 -0
  74. package/dist/commands/proposal/drain-policies.js +3 -3
  75. package/dist/commands/proposal/drain.js +87 -15
  76. package/dist/commands/proposal/proposal-cli.js +490 -0
  77. package/dist/commands/{proposal.js → proposal/proposal.js} +17 -6
  78. package/dist/commands/{propose.js → proposal/propose.js} +11 -11
  79. package/dist/{core → commands/proposal/validators}/proposal-quality-validators.js +8 -3
  80. package/dist/{core → commands/proposal/validators}/proposal-validators.js +5 -5
  81. package/dist/{core → commands/proposal/validators}/proposals.js +374 -345
  82. package/dist/commands/{curate.js → read/curate.js} +7 -7
  83. package/dist/commands/{knowledge.js → read/knowledge.js} +22 -9
  84. package/dist/commands/{registry-search.js → read/registry-search.js} +5 -5
  85. package/dist/commands/{remember-cli.js → read/remember-cli.js} +15 -7
  86. package/dist/commands/read/search-cli.js +207 -0
  87. package/dist/commands/{search.js → read/search.js} +22 -27
  88. package/dist/commands/{show.js → read/show.js} +31 -45
  89. package/dist/commands/registry-cli.js +8 -8
  90. package/dist/commands/remember.js +14 -10
  91. package/dist/commands/sources/add-cli.js +293 -0
  92. package/dist/commands/{history.js → sources/history.js} +27 -25
  93. package/dist/commands/{info.js → sources/info.js} +6 -6
  94. package/dist/commands/{init.js → sources/init.js} +6 -6
  95. package/dist/commands/{installed-stashes.js → sources/installed-stashes.js} +12 -12
  96. package/dist/commands/{migration-help.js → sources/migration-help.js} +3 -2
  97. package/dist/commands/{schema-repair.js → sources/schema-repair.js} +8 -8
  98. package/dist/commands/{self-update.js → sources/self-update.js} +10 -9
  99. package/dist/commands/{source-add.js → sources/source-add.js} +10 -10
  100. package/dist/commands/{source-clone.js → sources/source-clone.js} +7 -7
  101. package/dist/commands/{source-manage.js → sources/source-manage.js} +4 -4
  102. package/dist/commands/sources/sources-cli.js +305 -0
  103. package/dist/commands/sources/stash-cli.js +219 -0
  104. package/dist/commands/{stash-skeleton.js → sources/stash-skeleton.js} +2 -1
  105. package/dist/commands/tasks/default-tasks.js +173 -0
  106. package/dist/commands/tasks/tasks-cli.js +210 -0
  107. package/dist/commands/{tasks.js → tasks/tasks.js} +14 -14
  108. package/dist/commands/wiki-cli.js +307 -0
  109. package/dist/commands/workflow-cli.js +329 -0
  110. package/dist/core/action-contributors.js +1 -1
  111. package/dist/core/assert.js +40 -0
  112. package/dist/core/asset/asset-create.js +54 -0
  113. package/dist/core/{asset-ref.js → asset/asset-ref.js} +21 -4
  114. package/dist/core/{asset-registry.js → asset/asset-registry.js} +3 -3
  115. package/dist/core/{asset-spec.js → asset/asset-spec.js} +17 -31
  116. package/dist/core/{markdown.js → asset/markdown.js} +1 -1
  117. package/dist/core/{stash-meta.js → asset/stash-meta.js} +1 -1
  118. package/dist/core/best-effort.js +64 -0
  119. package/dist/core/common.js +32 -18
  120. package/dist/core/{config-io.js → config/config-io.js} +29 -19
  121. package/dist/core/{config-migration.js → config/config-migration.js} +11 -9
  122. package/dist/core/{config-schema.js → config/config-schema.js} +50 -7
  123. package/dist/core/config/config-types.js +16 -0
  124. package/dist/core/{config-walker.js → config/config-walker.js} +2 -2
  125. package/dist/core/{config.js → config/config.js} +10 -8
  126. package/dist/core/env-secret-ref.js +90 -0
  127. package/dist/core/errors.js +13 -3
  128. package/dist/core/events.js +27 -4
  129. package/dist/core/file-lock.js +1 -1
  130. package/dist/core/improve-types.js +48 -0
  131. package/dist/core/lesson-lint.js +2 -2
  132. package/dist/core/logs-db.js +304 -0
  133. package/dist/core/paths.js +2 -2
  134. package/dist/core/ripgrep/install.js +2 -2
  135. package/dist/core/ripgrep/resolve.js +2 -2
  136. package/dist/core/state-db.js +195 -60
  137. package/dist/core/text-truncation.js +148 -0
  138. package/dist/core/time.js +1 -1
  139. package/dist/core/write-source.js +98 -85
  140. package/dist/indexer/{db-backup.js → db/db-backup.js} +9 -24
  141. package/dist/indexer/{db.js → db/db.js} +128 -118
  142. package/dist/indexer/{graph-db.js → db/graph-db.js} +9 -4
  143. package/dist/indexer/{llm-cache.js → db/llm-cache.js} +15 -12
  144. package/dist/indexer/ensure-index.js +4 -4
  145. package/dist/indexer/{graph-boost.js → graph/graph-boost.js} +1 -1
  146. package/dist/indexer/{graph-extraction.js → graph/graph-extraction.js} +55 -13
  147. package/dist/indexer/indexer.js +37 -30
  148. package/dist/indexer/init.js +54 -0
  149. package/dist/indexer/manifest.js +10 -10
  150. package/dist/indexer/{memory-inference.js → passes/memory-inference.js} +141 -33
  151. package/dist/indexer/{metadata-contributors.js → passes/metadata-contributors.js} +10 -8
  152. package/dist/indexer/{metadata.js → passes/metadata.js} +15 -19
  153. package/dist/indexer/{staleness-detect.js → passes/staleness-detect.js} +53 -12
  154. package/dist/indexer/{db-search.js → search/db-search.js} +28 -16
  155. package/dist/indexer/{ranking-contributors.js → search/ranking-contributors.js} +1 -1
  156. package/dist/indexer/{ranking.js → search/ranking.js} +2 -2
  157. package/dist/indexer/{search-hit-enrichers.js → search/search-hit-enrichers.js} +3 -3
  158. package/dist/indexer/{search-source.js → search/search-source.js} +8 -8
  159. package/dist/indexer/{semantic-status.js → search/semantic-status.js} +3 -3
  160. package/dist/indexer/usage/unmigrated-vaults-guard.js +94 -0
  161. package/dist/indexer/{usage-events.js → usage/usage-events.js} +32 -0
  162. package/dist/indexer/{file-context.js → walk/file-context.js} +10 -15
  163. package/dist/indexer/{matchers.js → walk/matchers.js} +13 -9
  164. package/dist/indexer/{path-resolver.js → walk/path-resolver.js} +6 -6
  165. package/dist/indexer/{project-context.js → walk/project-context.js} +1 -1
  166. package/dist/indexer/{walker.js → walk/walker.js} +4 -3
  167. package/dist/integrations/agent/builder-shared.js +39 -0
  168. package/dist/integrations/agent/builders.js +14 -81
  169. package/dist/integrations/agent/config.js +6 -4
  170. package/dist/integrations/agent/detect.js +1 -1
  171. package/dist/integrations/agent/index.js +23 -8
  172. package/dist/integrations/agent/prompts.js +2 -3
  173. package/dist/integrations/agent/runner.js +22 -3
  174. package/dist/integrations/agent/spawn.js +9 -10
  175. package/dist/integrations/harnesses/claude/agent-builder.js +48 -0
  176. package/dist/integrations/harnesses/claude/config-import.js +70 -0
  177. package/dist/integrations/harnesses/claude/index.js +64 -0
  178. package/dist/integrations/{session-logs/providers/claude-code.js → harnesses/claude/session-log.js} +32 -5
  179. package/dist/integrations/harnesses/index.js +144 -0
  180. package/dist/integrations/harnesses/opencode/agent-builder.js +43 -0
  181. package/dist/integrations/harnesses/opencode/config-import.js +82 -0
  182. package/dist/integrations/harnesses/opencode/index.js +59 -0
  183. package/dist/integrations/{session-logs/providers/opencode.js → harnesses/opencode/session-log.js} +1 -1
  184. package/dist/integrations/harnesses/opencode-sdk/index.js +49 -0
  185. package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +234 -0
  186. package/dist/integrations/harnesses/types.js +43 -0
  187. package/dist/integrations/lockfile.js +7 -16
  188. package/dist/integrations/session-logs/index.js +82 -9
  189. package/dist/llm/call-ai.js +4 -4
  190. package/dist/llm/client.js +146 -6
  191. package/dist/llm/embedder.js +6 -6
  192. package/dist/llm/embedders/local.js +9 -22
  193. package/dist/llm/embedders/remote.js +2 -2
  194. package/dist/llm/embedders/types.js +1 -1
  195. package/dist/llm/graph-extract.js +31 -12
  196. package/dist/llm/index-passes.js +1 -1
  197. package/dist/llm/memory-infer.js +12 -5
  198. package/dist/llm/metadata-enhance.js +2 -2
  199. package/dist/llm/usage-persist.js +77 -0
  200. package/dist/llm/usage-telemetry.js +103 -0
  201. package/dist/output/context.js +9 -46
  202. package/dist/output/html-render.js +73 -0
  203. package/dist/output/renderers.js +88 -58
  204. package/dist/output/shapes/curate.js +7 -3
  205. package/dist/output/shapes/distill.js +7 -3
  206. package/dist/output/shapes/env-list.js +18 -16
  207. package/dist/output/shapes/events.js +5 -4
  208. package/dist/output/shapes/helpers.js +19 -5
  209. package/dist/output/shapes/history.js +7 -3
  210. package/dist/output/shapes/passthrough.js +8 -11
  211. package/dist/output/shapes/{proposal-accept.js → proposal/accept.js} +7 -3
  212. package/dist/output/shapes/{proposal-diff.js → proposal/diff.js} +7 -3
  213. package/dist/output/shapes/{proposal-list.js → proposal/list.js} +7 -3
  214. package/dist/output/shapes/{proposal-producer.js → proposal/producer.js} +5 -4
  215. package/dist/output/shapes/{proposal-reject.js → proposal/reject.js} +7 -3
  216. package/dist/output/shapes/{proposal-show.js → proposal/show.js} +7 -3
  217. package/dist/output/shapes/registry-search.js +7 -3
  218. package/dist/output/shapes/registry.js +12 -0
  219. package/dist/output/shapes/search.js +7 -3
  220. package/dist/output/shapes/secret-list.js +18 -16
  221. package/dist/output/shapes/show.js +7 -3
  222. package/dist/output/shapes.js +55 -30
  223. package/dist/output/text/add.js +2 -3
  224. package/dist/output/text/clone.js +2 -3
  225. package/dist/output/text/config.js +2 -3
  226. package/dist/output/text/curate.js +4 -3
  227. package/dist/output/text/distill.js +2 -3
  228. package/dist/output/text/enable-disable.js +5 -4
  229. package/dist/output/text/env.js +13 -0
  230. package/dist/output/text/events.js +5 -4
  231. package/dist/output/text/feedback.js +4 -3
  232. package/dist/output/text/helpers.js +123 -40
  233. package/dist/output/text/history.js +2 -3
  234. package/dist/output/text/import.js +2 -3
  235. package/dist/output/text/index.js +2 -3
  236. package/dist/output/text/info.js +2 -3
  237. package/dist/output/text/init.js +2 -3
  238. package/dist/output/text/list.js +2 -3
  239. package/dist/output/text/proposal/producer.js +9 -0
  240. package/dist/output/text/proposal/proposal.js +13 -0
  241. package/dist/output/text/registry-commands.js +8 -7
  242. package/dist/output/text/registry.js +12 -0
  243. package/dist/output/text/remember.js +4 -3
  244. package/dist/output/text/remove.js +2 -3
  245. package/dist/output/text/save.js +2 -3
  246. package/dist/output/text/search.js +4 -3
  247. package/dist/output/text/show.js +4 -3
  248. package/dist/output/text/update.js +2 -3
  249. package/dist/output/text/upgrade.js +2 -3
  250. package/dist/output/text/wiki.js +12 -11
  251. package/dist/output/text/workflow.js +12 -10
  252. package/dist/output/text.js +66 -32
  253. package/dist/registry/build-index.js +11 -10
  254. package/dist/registry/factory.js +1 -1
  255. package/dist/registry/origin-resolve.js +1 -1
  256. package/dist/registry/providers/index.js +2 -2
  257. package/dist/registry/providers/skills-sh.js +91 -72
  258. package/dist/registry/providers/static-index.js +75 -52
  259. package/dist/registry/resolve.js +3 -3
  260. package/dist/runtime.js +242 -0
  261. package/dist/scripts/migrate-storage.js +1654 -683
  262. package/dist/scripts/migrations/import-fs-improve-runs-to-db.js +254 -168
  263. package/dist/setup/detect.js +311 -9
  264. package/dist/setup/harness-config-import.js +6 -120
  265. package/dist/setup/setup.js +454 -43
  266. package/dist/sources/include.js +1 -1
  267. package/dist/sources/provider-factory.js +2 -2
  268. package/dist/sources/providers/filesystem.js +3 -3
  269. package/dist/sources/providers/git.js +9 -9
  270. package/dist/sources/providers/index.js +4 -4
  271. package/dist/sources/providers/npm.js +6 -6
  272. package/dist/sources/providers/provider-utils.js +13 -20
  273. package/dist/sources/providers/sync-from-ref.js +5 -5
  274. package/dist/sources/providers/tar-utils.js +2 -2
  275. package/dist/sources/providers/website.js +2 -2
  276. package/dist/sources/resolve.js +5 -5
  277. package/dist/sources/website-ingest.js +5 -5
  278. package/dist/storage/database.js +102 -0
  279. package/dist/storage/engines/sqlite-migrations.js +42 -0
  280. package/dist/storage/locations.js +25 -0
  281. package/dist/storage/repositories/index-db.js +43 -0
  282. package/dist/storage/repositories/workflow-runs-repository.js +141 -0
  283. package/dist/tasks/backends/cron.js +4 -4
  284. package/dist/tasks/backends/exec-utils.js +32 -0
  285. package/dist/tasks/backends/index.js +3 -3
  286. package/dist/tasks/backends/launchd.js +7 -14
  287. package/dist/tasks/backends/schtasks.js +7 -16
  288. package/dist/tasks/embedded.js +71 -0
  289. package/dist/tasks/parser.js +2 -2
  290. package/dist/tasks/resolveAkmBin.js +1 -1
  291. package/dist/tasks/runner.js +127 -31
  292. package/dist/tasks/schedule.js +1 -1
  293. package/dist/tasks/validator.js +7 -7
  294. package/dist/text-import-hook.mjs +51 -0
  295. package/dist/version.js +2 -1
  296. package/dist/wiki/wiki.js +7 -7
  297. package/dist/workflows/{authoring.js → authoring/authoring.js} +6 -6
  298. package/dist/workflows/{scope-key.js → authoring/scope-key.js} +1 -1
  299. package/dist/workflows/cli.js +1 -1
  300. package/dist/workflows/db.js +54 -32
  301. package/dist/workflows/parser.js +4 -4
  302. package/dist/workflows/renderer.js +5 -5
  303. package/dist/workflows/runtime/agent-identity.js +56 -0
  304. package/dist/workflows/runtime/checkin.js +57 -0
  305. package/dist/workflows/{runs.js → runtime/runs.js} +197 -101
  306. package/dist/workflows/validate-summary.js +82 -0
  307. package/docs/README.md +1 -1
  308. package/docs/data-and-telemetry.md +6 -6
  309. package/package.json +17 -8
  310. package/dist/commands/add-cli.js +0 -279
  311. package/dist/commands/env.js +0 -213
  312. package/dist/integrations/agent/sdk-runner.js +0 -126
  313. package/dist/output/shapes/vault-list.js +0 -19
  314. package/dist/output/text/proposal-producer.js +0 -8
  315. package/dist/output/text/proposal.js +0 -12
  316. package/dist/output/text/vault.js +0 -16
  317. /package/dist/core/{asset-serialize.js → asset/asset-serialize.js} +0 -0
  318. /package/dist/core/{frontmatter.js → asset/frontmatter.js} +0 -0
  319. /package/dist/core/{config-sources.js → config/config-sources.js} +0 -0
  320. /package/dist/indexer/{graph-dedup.js → graph/graph-dedup.js} +0 -0
  321. /package/dist/{core/config-types.js → indexer/passes/pass-context.js} +0 -0
  322. /package/dist/indexer/{search-fields.js → search/search-fields.js} +0 -0
  323. /package/dist/indexer/{index-context.js → walk/index-context.js} +0 -0
  324. /package/dist/workflows/{document-cache.js → runtime/document-cache.js} +0 -0
package/CHANGELOG.md CHANGED
@@ -4,6 +4,434 @@ All notable changes to this project will be documented in this file.
4
4
 
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
6
6
 
7
+ ## [Unreleased]
8
+
9
+ ## [0.9.0-beta.3] - 2026-06-12
10
+
11
+ Stabilization batch closing the remaining 0.9.0 milestone: DB-locking and
12
+ improve-pipeline perf backports, extract/reflect gate fixes, SQLite-first
13
+ proposal and log storage, `--format html` output, and per-stage LLM telemetry.
14
+
15
+ ### Added
16
+
17
+ - **`--format html` output with per-command templates** (#582). `akm health
18
+ --format html` renders the full interactive health report (ECharts inlined by
19
+ default, or via CDN with `AKM_ECHARTS=cdn`); every other command falls back to
20
+ a dark-mode default template that pretty-prints its JSON. A global `--output
21
+ <path>` flag writes the rendered HTML to a file instead of stdout. Token
22
+ replacement only — no template engine. The standalone health-report skill is
23
+ now folded into core.
24
+ - **Per-stage LLM telemetry** (#576). Every `chatCompletion` call now records
25
+ tokens (prompt/completion/total/reasoning), wall-time, model, and
26
+ finish_reason as an `llm_usage` event, attributed to the pipeline stage via an
27
+ ambient `AsyncLocalStorage` context (`withLlmStage`) set once per phase — no
28
+ `stage` parameter threaded through call sites. `akm health` exposes per-stage
29
+ token and time aggregates. Telemetry is best-effort and can never fail a run;
30
+ capture is forward-only.
31
+ - **Per-proposal gate decision + confidence** (#577). When a proposal passes
32
+ through the auto-accept/triage gate, its outcome (`auto-accepted` /
33
+ `deferred` / `auto-rejected`), reason, confidence, measured value, and the
34
+ thresholds in effect are persisted on the proposal (in the SQLite metadata).
35
+ `akm proposal show`/`list` surface them with reconstructable comparisons
36
+ (e.g. `0.72 < 0.90`), so tooling can explain *why* each proposal is pending
37
+ instead of relying on a run-level aggregate. Forward-only; legacy proposals
38
+ render `unknown`.
39
+
40
+ ### Fixed
41
+
42
+ - **`SQLITE_BUSY` / "database is locked" under concurrent runs** (#584, #585,
43
+ #589). `busy_timeout` raised from 5 s to 30 s on every SQLite open path
44
+ (index.db and state.db); the improve maintenance pass now closes its index.db
45
+ handle before each reindex (which opens its own writer to the same WAL file);
46
+ and the post-loop purge reuses the long-lived events connection instead of
47
+ opening a second state.db writer. Together these eliminate all observed
48
+ lock failures from overlapping cron improve runs. (Backports of 0.8.8.)
49
+ - **Extract gate ignored the active profile's `extract.enabled: false`** (#593,
50
+ #594). The session-extraction gate hardcoded the `default` profile, so a
51
+ non-default profile (e.g. a quick pass) ran extract anyway — 300–600 s of
52
+ redundant work per run when a dedicated extract task also exists. The gate
53
+ now resolves `extract` against the active improve profile. (Backport of
54
+ 0.8.11.)
55
+ - **Memory inference burned LLM calls on already-derived parents** (#588). The
56
+ primary pass now checks for the `<parent>.derived.md` child on disk *before*
57
+ the LLM/cache call, and opportunistically marks the parent processed so it
58
+ never re-pends. Previously ~55 % of the inference budget was spent
59
+ rediscovering children that already existed.
60
+ - **Reflect no longer queues empty-diff or cosmetic-only proposals** (#580).
61
+ A deterministic, LLM-free noise gate diffs each candidate against the current
62
+ asset; byte-identical edits are dropped and changes that are pure formatting
63
+ (whitespace reflow, hard-wrap changes, code-fence language hints, YAML scalar
64
+ re-folding) are suppressed, each recorded via summary events so suppression
65
+ rates are visible in `akm health`.
66
+
67
+ ### Added
68
+
69
+ - **`minContentChars` pre-LLM extract gate** (#595, #596). Sessions whose raw
70
+ size is below `profiles.improve.<name>.processes.extract.minContentChars`
71
+ (default 10 — only truly empty sessions/journal files) skip the extract LLM
72
+ call entirely. Gates on raw input size, not post-noise-filter size.
73
+ (Backports of 0.8.12–0.8.14.)
74
+ - **Structured logs database** (#579). Task and run log lines now land in a
75
+ dedicated `logs.db` (WAL, 30 s busy_timeout) keyed by task, run, stream, and
76
+ time, with retention/purge wired into the existing purge pass and `ATTACH`
77
+ support for joining log lines to `state.db` rows (e.g. a failed
78
+ `task_history` row to its log output). The scattered-log audit and per-source
79
+ keep/move/drop decisions are documented in `docs/technical/logs-audit.md`.
80
+
81
+ ### Changed
82
+
83
+ - **Proposals are now stored canonically in SQLite** (#578). The previously
84
+ bypassed `proposals` table in state.db is the single source of truth; all
85
+ proposal commands (`list`/`show`/`diff`/`accept`/`reject`/`revert`/`drain`),
86
+ the improve auto-accept gate, and health metrics read and write it through
87
+ one storage layer. Pending file-based proposals are imported on first read;
88
+ `akm proposal *` UX is unchanged. Design and migration notes live in
89
+ `docs/technical/proposal-storage.md`.
90
+ - **Improve planning no longer does per-ref DB lookups or per-ref skip events**
91
+ (#591, #592). Eligible refs carry a pre-resolved `filePath`, removing a
92
+ serial async lookup per ref (~500 s on 9 k-ref stashes), and the
93
+ profile-filtered skip loop emits one summary event with a count instead of
94
+ thousands of rows. (Backports of 0.8.9–0.8.10.)
95
+
96
+ ## [0.9.0-beta.2] - 2026-06-09
97
+
98
+ ### Fixed
99
+
100
+ - **Consolidation starved merge recall; the memory pool grew unbounded.** Commit
101
+ `633ece41` made the `incrementalSince` narrowing unconditional, so every
102
+ consolidation run only judged memories changed since the last run plus their
103
+ immediate vector-neighbors. Stale-but-unmerged duplicate clusters were never
104
+ re-examined, so the eligible pool grew monotonically and never shrank, and
105
+ contradiction detection (which rides on the consolidation pass) went dark.
106
+ Consolidation only runs on the nightly default-profile pass (`quick`/`frequent`
107
+ disable it), so a full-pool sweep is correct and affordable; the override is
108
+ removed. `lastConsolidateTs` still gates whether the pass runs. (Forward-port
109
+ of the 0.8.5 fix.)
110
+ - **`akm tasks sync` ignored schedule changes** — forward-ported from 0.8.4.
111
+ Sync classified any task already present in the OS scheduler as "unchanged"
112
+ without comparing its installed entry, so editing a task's `schedule:` in the
113
+ `.yml` never reached the crontab; the same gap affected `tasks enable`/`disable`
114
+ (toggled the comment, re-enabling a stale schedule). Sync now compares the
115
+ backend's installed signature against the signature the current definition
116
+ renders to and reinstalls on drift (new `updated[]` field); `enable`/`disable`
117
+ reinstall from the current `.yml`. The cron backend gains `expectedSignature()`
118
+ and a per-entry signature on `list()`; other backends fall back to an
119
+ idempotent reinstall.
120
+
121
+ ### Added
122
+
123
+ - **`akm improve --skip-if-locked`** — forward-ported from 0.8.4. When another
124
+ improve run already holds the lock, the run logs and exits 0 with a no-op
125
+ result (`skipped.reason: "lock-held"`) instead of failing with the "already
126
+ running" config error (exit 78). Intended for high-frequency scheduled runs
127
+ (e.g. an every-30-min `quick` pass) that overlap a longer run. Default off.
128
+
129
+ ### Removed
130
+
131
+ - **`akm config edit`** — the interactive menu-based editor was removed. A
132
+ prompt-driven drill-down was clunkier than just editing the file. Edit the
133
+ config directly (the path is shown by `akm config path`), use
134
+ `akm config set/get/unset` for scripted changes, and `akm config validate` to
135
+ check it.
136
+
137
+ ## [0.9.0-beta.1] - 2026-06-08
138
+
139
+ ### Fixed
140
+
141
+ - **`improve.lock` leaked on signal death (cron timeout)** — forward-ported from
142
+ 0.8.3. The improve SIGTERM/SIGINT/SIGHUP handler calls `process.exit()`, which
143
+ skips `finally` blocks, so the `finally` releasing `improve.lock` never ran and
144
+ every timed-out cron run leaked the lock. It is now released from a
145
+ `process.on("exit", …)` handler registered at acquire time, via a new
146
+ ownership-checked `releaseLockIfOwned(path, pid)`.
147
+ - **`quick` profile was not quick** — forward-ported from 0.8.3. It did not
148
+ disable the default-ON session-`extract` process, so a `quick` run processed
149
+ the entire session backlog (~40 min). `quick` now sets
150
+ `processes.extract.enabled: false`.
151
+ - **`akm-eval` smoke suite adapted to the 0.9.0 CLI** (CI/tooling only). The
152
+ eval harness called `akm search --detail agent`, but 0.9.0 moved the
153
+ agent/summary projections to `--shape`; it now uses `--shape agent`.
154
+ Additionally, the improve-run history readers (`listRecentImproveRunIds` /
155
+ `resolveImproveRunId`) treated a missing `state.db` as an error rather than
156
+ "no runs", which broke the read-only smoke + replay-determinism gates on a
157
+ fresh checkout; a missing `state.db` is now handled as an empty history.
158
+
159
+ ## [0.9.0-beta.0] - 2026-06-08
160
+
161
+ ### Added
162
+
163
+ - **Cross-runtime: akm now runs on Node.js (≥ 20) in addition to Bun** (#560,
164
+ #465). A two-file runtime boundary (`src/storage/database.ts` owns SQLite via
165
+ `bun:sqlite` on Bun / `better-sqlite3` on Node; `src/runtime.ts` owns every
166
+ `Bun.*` API) contains all runtime-specific code, enforced by a lint guard so it
167
+ cannot leak back out. A CI `node-smoke` matrix runs the built CLI under Node
168
+ 20 and 22. **Minimum Node is 20** — the prompts dependency (`@clack/core`) uses
169
+ `node:util.styleText`, added in Node 20.12; Node 18 is EOL and unsupported.
170
+ Bun remains the primary/default runtime.
171
+ - **`session` asset type — agent sessions are now searchable** (#561). The
172
+ `extract` pass, after distilling memory proposals from a session, additionally
173
+ writes the session itself as a first-class `session` asset
174
+ (`sessions/<harness>/<id>.md`) with an LLM-generated `## Summary` /
175
+ `## Key topics` body plus `harness` / `session_id` / `started_at` / `ended_at`
176
+ / `project` / `log_path` / `access` frontmatter. Sessions become discoverable
177
+ via `akm search --type session` and `akm curate`, and the `access` + `log_path`
178
+ fields tell any agent how to open the raw session log. The behaviour is
179
+ ADDITIVE, FAIL-OPEN, and config-gated via
180
+ `profiles.improve.default.processes.extract.indexSessions` (default on when an
181
+ LLM is configured; set `false` for byte-identical legacy extract behaviour) and
182
+ `…extract.minSessionDuration` (default 5 minutes). Session assets are not
183
+ graph-extracted. No new LLM call is made when no provider is configured.
184
+
185
+ - **`akm env set` / `akm env unset` — single-key `.env` management.** `akm env
186
+ set <ref> <KEY>` sets/updates one key (value from stdin by default, or
187
+ `--from-env <VAR>` / `--from-file <path>` — never argv, never echoed); `akm env
188
+ unset <ref> <KEY...>` removes one or more keys. Both do a minimal edit that
189
+ preserves existing comments and key order, and use `dotenv` as the
190
+ serialisation oracle: a value is only written if `dotenv.parse` reads it back
191
+ exactly, and the whole edit is re-verified so no sibling key is disturbed. This
192
+ reintroduces key-level management (the deprecated `vault set`/`vault unset`
193
+ pointed here); `akm env remove` still removes the whole file.
194
+
195
+ - **`--path` for subdirectory asset creation** (#503) — a consistent `--path
196
+ <relative-dir>` flag across the asset-creating command surface: `akm remember`,
197
+ `akm import`, `akm propose`, `akm workflow create`, `akm env create`, and
198
+ `akm secret set`. `--path` is a directory applied rooted at the asset's type
199
+ directory (e.g. `akm remember "buy milk" --path personal --name grocery-list`
200
+ → `memories/personal/grocery-list.md`; `akm workflow create ship --path
201
+ release` → `workflows/release/ship.md`). The filename/name still comes from the
202
+ `--name`/name positional (or, for `remember`/`import`, the content/source slug).
203
+ The explicit name is now a **flat** name everywhere: a `/` in it is rejected
204
+ with guidance to use `--path`. System-derived names (e.g. a URL-path-derived
205
+ knowledge name from `akm import <url>`) may still nest. Shared semantics live in
206
+ `src/core/asset-create.ts`. (Replaces #503's earlier nested-`--name` approach.)
207
+ - **Workflow runs record agent harness + session identity** — `akm workflow start`
208
+ now persists the agent harness (e.g. `claude-code`, `opencode`) and the
209
+ platform-native session id that owns each run. Identity is resolved best-effort
210
+ from the environment (`AKM_AGENT_HARNESS` / `AKM_SESSION_ID`, falling back to the
211
+ harness-native session env var) or can be passed explicitly to `startWorkflowRun`.
212
+ Stored via additive migration `002-add-agent-identity` and surfaced on
213
+ `WorkflowRunSummary.agentHarness` / `.agentSessionId`. This is the first concrete,
214
+ scoped slice toward workflow session monitoring (#501).
215
+ - **Workflow agent check-in + step-summary validation** (#506) — workflow runs now
216
+ use a file-signal / command-loop check-in model (no resident background thread, per
217
+ the ADR in `docs/technical/workflow-agent-checkin-adr.md`). `akm workflow start`
218
+ arms a durable check-in timestamp; `akm workflow complete --summary` now **requires**
219
+ a per-step summary and runs it through an LLM completion-criteria validation gate —
220
+ on failure the step stays pending and structured corrective feedback is returned
221
+ (`workflow-complete-rejected`). A pure `evaluateCheckin` surfaces a strong `continue`
222
+ directive through `getNextWorkflowStep` when an active run looks stalled. Migration
223
+ `002` adds `agent_harness`, `agent_session_id`, `checkin_armed_at` on
224
+ `workflow_runs` and `summary` on `workflow_run_steps`.
225
+ - **Default improve profiles + scheduled task set** (#552) — three new bundled
226
+ profiles in `src/assets/profiles/` — `frequent` (extract + inference; distill /
227
+ consolidate excluded), `consolidate` (consolidation-only), and `catchup` (manual
228
+ recovery: consolidate + triage drain) — alongside the existing `default` / `quick` /
229
+ `thorough` / `memory-focus` / `graph-refresh`. `akm setup` and the new `akm tasks
230
+ init` register a multi-cadence task set **idempotently**: `akm-improve-frequent`
231
+ (60 min), `akm-improve-consolidate` (4 h), `akm-improve-nightly` (`thorough`, daily
232
+ 2 am, server-gated), `akm-improve-catchup` (registered but unscheduled), and
233
+ `akm-graph-refresh-weekly` (Sun 3 am). Registration is CI-aware (skips when
234
+ `CI=true`) and asks a single "Is this a server install?" prompt to gate the nightly
235
+ task (default yes on Linux-without-battery, no on macOS/laptop).
236
+
237
+ ### Design notes
238
+
239
+ - **#501 narrowed; superseded by #506 for the monitoring design.** Issue #501
240
+ ("Add background thread for workflow command session monitoring and agent
241
+ prompting") was an epic. Per #506's stated preference to avoid always-on
242
+ background threads/daemons, the background-thread requirement is **not**
243
+ implemented here. #501 is narrowed to the one tractable, prerequisite sub-feature
244
+ — persisting harness + session identity on each workflow run — which any future
245
+ monitor needs regardless of design. The session-monitoring/agent-steering loop is
246
+ deferred to #506 and requires a separately approved design.
247
+
248
+ ### Changed
249
+
250
+ - **`improve`: consolidation runs before extract + smarter pool-delta gate**
251
+ (#551). The consolidation phase now runs **before** the session-extract pass
252
+ in the improve pipeline. Extract auto-accept writes new memory `.md` files on
253
+ every run, which previously made the consolidation pool-delta gate
254
+ (`memoryUpdatedAfterLastConsolidate`) fire unconditionally — consolidation
255
+ never skipped and wastefully re-judged freshly-promoted single-source
256
+ memories with no merge/contradiction candidates yet. Running consolidation
257
+ first means it only ever sees memories from **prior** runs; current-run
258
+ extract promotions are not on disk yet. The pool-delta gate is additionally
259
+ narrowed: a memory whose only mtime bump since the last consolidate came from
260
+ its **own** auto-accept promotion (tracked via the `promoted` event's
261
+ `assetPath`) is excluded from the "work to do" check, so adjacent-run
262
+ promotions get a full improve cycle to settle before consolidation considers
263
+ them. When the gate now correctly skips, the existing
264
+ `improve_skipped` / `consolidation_no_memory_updates` event is emitted so
265
+ health reflects it. No event-shape changes; emitted-event order changes only
266
+ because consolidation moved earlier.
267
+
268
+ - **Unified git commit model — single batch-at-boundary commit** (#507). Writing
269
+ or deleting an asset on a git-backed source no longer commits (and optionally
270
+ pushes) **per asset**. `writeAssetToSource` / `deleteAssetFromSource` now
271
+ perform a plain filesystem write/unlink for every kind, and git-backed targets
272
+ are committed **once** at the operation boundary (`akm remember --target`,
273
+ proposal accept/revert, consolidate) as a single complete commit — `git add -A`
274
+ stages `.akm/` state + sibling assets together — pushed under the same
275
+ `writable + remote` gate as `akm save`/`akm sync`. This removes the noisy,
276
+ incomplete per-asset commits (~25 per improve run) and leaves no dirty
277
+ working-tree residue.
278
+
279
+ - **`improve/consolidate`: `minPoolSize` guard** (#553). Consolidation now skips
280
+ itself when the eligible memory pool is below `processes.consolidate.minPoolSize`
281
+ (default **500**), emitting a `consolidation_skipped` event with
282
+ `reason: pool_below_min_size` and making **zero** LLM calls — so the always-enabled
283
+ consolidate task self-activates only once a stash is large enough to have real
284
+ merge/contradiction candidates. `minPoolSize: 0` disables the guard. The skip
285
+ surfaces in `akm health` improve output. The bundled `consolidate` profile sets
286
+ `500`, `catchup` sets `0`.
287
+
288
+ - **`improve/extract`: `minNewSessions` gate** (#554). The extract phase now counts
289
+ in-window, not-yet-seen candidate sessions **before** any LLM call and skips the
290
+ pass (emitting `extract_skipped` / `reason: below_min_new_sessions`, visible in
291
+ `akm health`) when the count is below `processes.extract.minNewSessions`. The
292
+ in-code default is **0 (disabled)**, so existing profiles keep always-run behaviour;
293
+ only the new `frequent` profile opts in with `3`. This removes the ~22% of improve
294
+ runs that previously ran the full `ensureIndex` + extract pipeline for zero new
295
+ sessions.
296
+
297
+ ### Deprecated
298
+
299
+ - **`options.pushOnCommit`** (#507). The per-asset push-on-commit knob is retired.
300
+ Existing configs still parse — its push intent is mapped onto the batch push
301
+ gate and a one-time deprecation warning is emitted when the option is
302
+ encountered. Remove it and rely on `writable: true` + a configured remote.
303
+
304
+ ### Fixed
305
+
306
+ - **Memory inference re-queued `hot` parents forever** (#550). `markParentProcessed`
307
+ was only called when a derived child was newly written; when the child already
308
+ existed (`written = 0`), the parent never got `inferenceProcessed: true` and was
309
+ re-queued on every `akm improve` run (~37 wasted LLM calls/run on one production
310
+ stash). The child-exists path now marks the parent done (a genuine write failure
311
+ still leaves it unmarked for retry), while `skippedChildExists` accounting is
312
+ unchanged.
313
+ - **Auto-accept rejected truncated LLM descriptions** (#556). ~9.3% of proposals
314
+ failed auto-accept validation because the LLM cut the description mid-clause (ending
315
+ in `to`/`for`/`and`/a comma/etc.) or lost a YAML continuation line. A deterministic
316
+ post-generation repair pass (`repairTruncatedDescription` in
317
+ `src/core/text-truncation.ts`) now trims the truncated fragment to the last complete
318
+ clause or swaps in the first complete sentence from the body — never fabricating
319
+ text — wired into the extract and distill proposal-write paths before validation.
320
+ Already-valid descriptions pass through byte-identical. (Plus a one-line prompt
321
+ tightening requiring a complete sentence.)
322
+ - **Semantic index verification stuck on stashes with vault entries** (#502).
323
+ Verification compared the stored embedding count against the *full* entry count, but
324
+ the embedding phase intentionally excludes vault rows — so any index with vault
325
+ entries reported `embeddingCount < totalEntries` forever and stayed in
326
+ semantic-blocked / verification-failed state. A new `getEmbeddableEntryCount`
327
+ (`entry_type != 'vault'`) now feeds the zero-entry short-circuit, the readiness gate,
328
+ the "Semantic search ready (X/Y)" message, and the persisted `entryCount`; a
329
+ genuinely missing embedding on an embeddable entry still reports `ok:false`.
330
+
331
+ ### Internal
332
+
333
+ - **#490 architecture refactor.** Decomposed `src/cli.ts` from **4,589 → 620 LOC**
334
+ across 16 per-family command modules under `src/commands/*-cli.ts` (adopting a
335
+ `defineJsonCommand` factory for byte-identical JSON envelopes); converted `akm
336
+ health` checks to an ordered `HealthCheck` registry; and turned the
337
+ `migrate-storage` bin's 54 hand-rolled `recordStep` sites into a `MigrationStep`
338
+ registry with 3 recursive copy helpers unified into one `copyTree`. Shipped as
339
+ serialized local merges with a zero-behaviour-change contract (byte-identical CLI
340
+ surface + JSON envelopes), each gated and reviewed; the secret-migrating
341
+ `migrate-storage` change is pinned by a sha256 + file-mode fixture-stash
342
+ differential test.
343
+
344
+ ## [0.8.14] - 2026-06-11
345
+
346
+ ### Fixed
347
+
348
+ - **`akm extract` minContentChars default lowered from 500 to 10.** The 500-char
349
+ threshold used inputCount (raw session size) but analysis showed 209 of 218
350
+ candidate-producing sessions had inputCount < 500 — tiny agent sessions (22–368
351
+ chars) regularly yield 1–5 candidates. The only reliably skippable sessions are
352
+ empty ones (0 chars, journal files). Default lowered to 10 to catch only
353
+ truly empty sessions while preserving all signal-bearing content. Closes #597.
354
+
355
+ ## [0.8.13] - 2026-06-11
356
+
357
+ ### Fixed
358
+
359
+ - **`akm extract` minContentChars gate filtered all sessions.** The threshold was
360
+ checked against `filtered.stats.outputCount` (post-noise-filter chars), but the
361
+ pre-filter strips so much boilerplate that even signal-bearing sessions end up
362
+ below 500 chars of output. All 75 sessions in the first post-deploy run were
363
+ filtered, dropping candidates from 4–13 to 0. Fix: gate on `inputCount` (raw
364
+ session size) instead — a session with < 500 raw chars has nothing worth
365
+ extracting regardless of what the pre-filter produces. Closes #596.
366
+
367
+ ## [0.8.12] - 2026-06-11
368
+
369
+ ### Fixed
370
+
371
+ - **`akm extract` calling the LLM for noise sessions that never yield candidates.**
372
+ 96% of processed sessions (72/75 measured) produced zero candidates, consuming
373
+ ~330 s of LLM time per run. The pre-filter had no minimum content threshold —
374
+ sessions as short as 50 chars were sent to the LLM regardless. A new
375
+ `minContentChars` gate (default 500) skips the LLM call when post-filter
376
+ content falls below threshold, cutting extract LLM calls by ~95% on typical
377
+ stashes. Configurable via `profiles.improve.<name>.processes.extract.minContentChars`.
378
+ Closes #595.
379
+
380
+ ## [0.8.11] - 2026-06-11
381
+
382
+ ### Fixed
383
+
384
+ - **`akm improve --profile <name>` ignored profile's `extract.enabled: false` setting.**
385
+ The session-extraction gate in the preparation stage called
386
+ `isLlmFeatureEnabled(config, "session_extraction")`, which hardcodes a lookup
387
+ against `profiles.improve.default.processes.extract.enabled`. Any non-default
388
+ profile that set `extract.enabled: false` (e.g. `quick-shredder`) was silently
389
+ ignored, causing the extract pass to run regardless. The fix adds a
390
+ `resolveProcessEnabled("extract", improveProfile)` check so the active
391
+ resolved profile gates the pass correctly. Closes #593.
392
+
393
+ ## [0.8.10] - 2026-06-11
394
+
395
+ ### Fixed
396
+
397
+ - **`akm improve` taking 8–10 minutes per run due to O(n) DB writes for
398
+ profile-filtered refs.** When a profile disables reflect and distill for
399
+ certain asset types, `collectEligibleRefs` marks those refs as
400
+ `profile_filtered_all_passes`. The caller then emitted one `improve_skipped`
401
+ event per ref — a sequential DB write for each. On a ~9 000-ref stash this
402
+ was ~500 s of SQLite writes before any consolidation or memory inference
403
+ began. The fix collapses the per-ref loop into a single summary event
404
+ carrying a `count` field, eliminating ~9 000 sequential writes per run.
405
+ Closes #590.
406
+
407
+ ## [0.8.9] - 2026-06-11
408
+
409
+ ### Fixed
410
+
411
+ - **`akm improve` validation pass was O(n) in stash size, causing ~510 s overhead
412
+ on large stashes.** For every indexed ref, the preparation phase called
413
+ `findAssetFilePath()` — an async round-trip to the index DB followed by a
414
+ filesystem probe — serially inside a `for…await` loop. With ~9 000 indexed
415
+ refs at ~55 ms each, this loop consumed the entire 600–900 s run budget before
416
+ any reflect, triage, or memory-inference work began. The fix threads
417
+ `filePath` from the planning stage (`collectEligibleRefs`) through
418
+ `ImproveEligibleRef` so the validation pass and the disk-existence guard can
419
+ use the pre-resolved path directly. The async lookup is retained only as a
420
+ fallback for refs that enter via a narrow scope (e.g. `--scope ref:foo`).
421
+ Closes #587.
422
+
423
+ ## [0.8.8] - 2026-06-11
424
+
425
+ ### Fixed
426
+
427
+ - **SQLite `SQLITE_BUSY` errors under concurrent improve runs.** `busy_timeout`
428
+ was set to 5 000 ms in all three database open paths (`openDatabase`,
429
+ `openExistingDatabase`, `openStateDatabase`). Under a busy cron schedule — or
430
+ when a reindex triggered by memory inference ran concurrently with an event
431
+ write — the 5 s window was routinely exhausted, producing "database is locked"
432
+ failures. Raised to 30 000 ms across all three paths so transient lock
433
+ contention is retried for up to 30 s before surfacing as an error.
434
+
7
435
  ## [0.8.7] - 2026-06-09
8
436
 
9
437
  ### Fixed
@@ -4,8 +4,7 @@ Usage:
4
4
  Description:
5
5
  List proposal queue entries.
6
6
 
7
- (`akm proposals` is a deprecated alias for `akm proposal list`; it warns on
8
- stderr and is removed in 0.9.0.)
7
+ (The flat `akm proposals` alias was removed in 0.9.0 — use `akm proposal list`.)
9
8
 
10
9
  Options:
11
10
  --status <status> Filter by pending, accepted, or rejected
@@ -22,7 +22,6 @@ akm search "<query>" --detail full # Include scores, paths, timing
22
22
  | `--format` | `json`, `jsonl`, `text`, `yaml` | `json` |
23
23
  | `--detail` | `brief`, `normal`, `full` | `brief` |
24
24
  | `--shape` | `human`, `agent`, `summary` (`summary` only on `show`) | `human` |
25
- | `--for-agent` | boolean (deprecated — use `--shape agent`) | `false` |
26
25
 
27
26
  ## Curate
28
27
 
@@ -59,7 +58,8 @@ akm show knowledge:my-doc # Show content (local or remote)
59
58
  | knowledge | `content` (with view modes: `full`, `toc`, `frontmatter`, `section`, `lines`) |
60
59
  | workflow | `workflowTitle`, `workflowParameters`, `steps` |
61
60
  | memory | `content` (recalled context) |
62
- | vault | `keys`, `comments` |
61
+ | env | `keys`, `comments` (key names + comments only — values never returned) |
62
+ | secret | `name` only (the whole file is the value — never returned) |
63
63
  | wiki | `content` (same view modes as knowledge). For any wiki task, run `akm wiki list`. To ingest sources, `akm wiki ingest <name>` dispatches the configured agent (defaults.agent or `--profile`) to execute the ingest workflow. |
64
64
 
65
65
  ## Capture Knowledge While You Work
@@ -78,7 +78,7 @@ akm workflow next workflow:ship-release # Start or resume the next workfl
78
78
  akm feedback skill:code-review --positive # Record that an asset helped
79
79
  akm feedback agent:reviewer --negative # Record that an asset missed the mark
80
80
  akm feedback memory:deployment-notes --positive # Works for memories too
81
- akm feedback vault:prod --positive # Records vault feedback without surfacing values
81
+ akm feedback env:prod --positive # Records env feedback without surfacing values
82
82
  ```
83
83
 
84
84
  Use `akm feedback` whenever an asset materially helps or fails so future search
@@ -119,20 +119,37 @@ page create/update, log entry, lint, reindex.** Wiki pages are also addressable
119
119
  `schema.md`, `index.md`, and `log.md` are not indexed and do not appear in
120
120
  search results. No `--llm` anywhere — akm never reasons about page content.
121
121
 
122
- ## Vaults
122
+ ## Env files
123
123
 
124
- Encrypted-at-rest key/value stores for secrets. Each vault is a `.env`-format
125
- file at `<stashDir>/vaults/<name>.env`.
124
+ A group of related CONFIGURATION for an app/service in one `.env` file at
125
+ `<stashDir>/env/<name>.env`, sourced/injected wholesale. Key names + comments
126
+ are discoverable; values stay on disk and never reach stdout or the index. akm
127
+ does not edit entries — you edit the file with your own editor and akm loads it.
126
128
 
127
129
  ```sh
128
- akm vault create prod # Create a new vault
129
- akm vault set prod DB_URL postgres://... # Set a key (or KEY=VALUE combined form)
130
- akm vault set prod DB_URL=postgres://... # Combined KEY=VALUE form also works
131
- akm vault unset prod DB_URL # Remove a key
132
- akm vault list # List all vaults across all stashes with key names
133
- akm vault path vault:prod # Print the vault file path for shell loading
134
- akm vault run vault:prod -- env # Run one command with all vault vars injected
135
- akm vault run vault:prod/DB_URL -- printenv DB_URL # Inject one key for one command
130
+ akm env create prod # Create an empty env file
131
+ akm env create prod --from-file ./.env # Ingest an existing .env
132
+ akm env list # List all env files across stashes with key names
133
+ akm show env:prod # Inspect key names + comments (never values)
134
+ akm env run env:prod -- ./deploy.sh # Run a command with the whole .env injected (the safe path)
135
+ akm env run env:prod -- $SHELL # Open an interactive shell with values injected
136
+ akm env export env:prod --out ./env.sh # Write a sourceable script to a file (mode 0600)
137
+ akm env path env:prod --quiet # Print the raw file path (for Docker `_FILE` / `--env-file`)
138
+ akm env remove env:prod # Delete the env file
139
+ ```
140
+
141
+ ## Secrets
142
+
143
+ A single sensitive value used on its own for authentication (a token, key, or
144
+ cert) — one file = one value at `<stashDir>/secrets/<name>`. The ENTIRE file is
145
+ the value; only the name is ever surfaced.
146
+
147
+ ```sh
148
+ printf '%s' "$TOKEN" | akm secret set secret:deploy-token # Store a single value
149
+ akm secret list # List secrets (names only)
150
+ akm secret path secret:deploy-token # Print the file path (Docker `_FILE`)
151
+ akm secret run secret:deploy-token GITHUB_TOKEN -- gh release create v1.0.0 # Inject into one env var
152
+ akm secret remove secret:deploy-token # Delete the secret
136
153
  ```
137
154
 
138
155
  ## Workflows
@@ -171,8 +188,7 @@ When `--dest` is provided, `akm init` is not required first.
171
188
  ## Sync
172
189
 
173
190
  Commit local changes in a git-backed stash. Behaviour adapts automatically.
174
- (`akm save` is the deprecated 0.7 spelling it still works but warns; removed
175
- in 0.9.0.)
191
+ (`akm save` was the pre-0.8 spelling; it was removed in 0.9.0 — use `akm sync`.)
176
192
 
177
193
  - **No `.git` directory** — no-op (silent skip)
178
194
  - **Git repo, no remote** — stage and commit only (the default stash always falls here)
@@ -279,8 +295,8 @@ akm proposal revert <id> # Restore the pre-promot
279
295
  ```
280
296
 
281
297
  The flat verbs `akm proposals` / `akm show proposal` / `akm accept` /
282
- `akm reject` / `akm diff` / `akm revert` still work as deprecated aliases
283
- (warn on stderr; removed in 0.9.0).
298
+ `akm reject` / `akm diff` / `akm revert` were removed in 0.9.0 — use the
299
+ `akm proposal <verb>` forms above.
284
300
 
285
301
  Per-task `timeoutMs`: task markdown frontmatter may set `timeoutMs: null` to
286
302
  disable the agent kill timer for long-running local-model tasks, or a number
@@ -300,6 +316,5 @@ All commands accept `--format`, `--detail`, and `--shape` flags:
300
316
  - `--shape human` (default) — standard projection
301
317
  - `--shape agent` — agent-optimized output: strips non-actionable fields
302
318
  - `--shape summary` — metadata only (no content/template/prompt), under 200 tokens; only valid on `akm show`
303
- - `--for-agent` — deprecated alias for `--shape agent` (removed 0.9.0)
304
319
 
305
320
  Run `akm -h` or `akm <command> -h` for per-command help.
@@ -58,7 +58,7 @@ akm registry search "<query>" # Search all registries
58
58
  | knowledge | A reference doc (use `toc` or `section "..."` to navigate) |
59
59
  | workflow | Parsed steps plus workflow-specific execution commands |
60
60
  | memory | Recalled context (read the content for background information) |
61
- | env | A `.env` file of related CONFIGURATION (many vars; sensitive or not — all protected); key names only. Inject with `akm env run <ref> -- <cmd>` (the agent-safe path — values stay on disk). `vault` is the deprecated alias. |
61
+ | env | A `.env` file of related CONFIGURATION (many vars; sensitive or not — all protected); key names only. Inject with `akm env run <ref> -- <cmd>` (the agent-safe path — values stay on disk). |
62
62
  | secret | A single sensitive value for AUTHENTICATION (token, key, cert); name only. Use `akm secret path` / `akm secret run`. |
63
63
  | wiki | A page in a multi-wiki knowledge base. For any wiki task, start with `akm wiki list`. To ingest sources, run `akm wiki ingest <name>` — it dispatches the configured agent profile to execute the ingest workflow against the wiki's `raw/` directory. Run `akm wiki -h` for the full surface. |
64
64
 
@@ -0,0 +1,13 @@
1
+ {
2
+ "description": "Manual catch-up — consolidation + triage drain with no interval minimum.",
3
+ "processes": {
4
+ "reflect": { "enabled": false },
5
+ "distill": { "enabled": false },
6
+ "consolidate": { "enabled": true, "allowedTypes": ["memory"], "maxChunkSize": 50, "minPoolSize": 0 },
7
+ "memoryInference": { "enabled": false },
8
+ "graphExtraction": { "enabled": false },
9
+ "extract": { "enabled": false },
10
+ "triage": { "enabled": true, "applyMode": "queue", "policy": "personal-stash", "maxAcceptsPerRun": 100 }
11
+ },
12
+ "sync": { "enabled": true, "push": true }
13
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "description": "Consolidation-only pass — merges, deduplicates, and prunes memories every 4h.",
3
+ "processes": {
4
+ "reflect": { "enabled": false },
5
+ "distill": { "enabled": false },
6
+ "consolidate": { "enabled": true, "allowedTypes": ["memory"], "maxChunkSize": 25, "minPoolSize": 500 },
7
+ "memoryInference": { "enabled": false },
8
+ "graphExtraction": { "enabled": false },
9
+ "extract": { "enabled": false },
10
+ "triage": { "enabled": false }
11
+ },
12
+ "sync": { "enabled": true, "push": true }
13
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "description": "Frequent extract + inference pass — sessions, memory inference, graph, reflect.",
3
+ "processes": {
4
+ "reflect": { "enabled": true },
5
+ "distill": { "enabled": false },
6
+ "consolidate": { "enabled": false },
7
+ "memoryInference": { "enabled": true },
8
+ "graphExtraction": { "enabled": true },
9
+ "extract": { "enabled": true, "minNewSessions": 3 },
10
+ "triage": { "enabled": false }
11
+ },
12
+ "sync": { "enabled": true, "push": true }
13
+ }
@@ -0,0 +1,4 @@
1
+ schedule: "0 3 * * 0"
2
+ command: akm db backups
3
+ enabled: true
4
+ description: Weekly config/DB backup
@@ -0,0 +1,4 @@
1
+ schedule: "*/30 * * * *"
2
+ command: akm extract
3
+ enabled: true
4
+ description: Extract insights from session files every 30 min
@@ -0,0 +1,4 @@
1
+ schedule: "0 2 * * *"
2
+ command: akm improve --auto-accept safe
3
+ enabled: true
4
+ description: Run improve pipeline nightly
@@ -0,0 +1,4 @@
1
+ schedule: "0 4 * * *"
2
+ command: akm index
3
+ enabled: true
4
+ description: Nightly incremental index refresh
@@ -0,0 +1,4 @@
1
+ schedule: "*/15 * * * *"
2
+ command: akm sync
3
+ enabled: true
4
+ description: Sync stash changes to git remote every 15 min
@@ -0,0 +1,4 @@
1
+ schedule: "0 1 * * *"
2
+ command: akm update
3
+ enabled: true
4
+ description: Pull latest changes for all managed stash sources
@@ -0,0 +1,4 @@
1
+ schedule: "0 9 * * 1"
2
+ command: akm info --check-version
3
+ enabled: true
4
+ description: Weekly check for new akm releases