akm-cli 0.9.0-rc.8 → 0.9.0

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 (450) hide show
  1. package/CHANGELOG.md +1063 -44
  2. package/README.md +51 -25
  3. package/SECURITY.md +14 -1
  4. package/STABILITY.md +497 -0
  5. package/dist/akm +148 -35
  6. package/dist/{akm-migrate-storage → akm-migrate} +6 -9
  7. package/dist/assets/hints/cli-hints-full.md +223 -95
  8. package/dist/assets/hints/cli-hints-short.md +85 -22
  9. package/dist/assets/improve-strategies/default.json +1 -1
  10. package/dist/assets/improve-strategies/reflect-distill.json +1 -1
  11. package/dist/assets/prompts/memory-infer-user.md +2 -3
  12. package/dist/assets/stash-skeleton/README.md +6 -5
  13. package/dist/assets/stash-skeleton/facts/conventions/assets/agent.md +2 -0
  14. package/dist/assets/stash-skeleton/facts/conventions/assets/command.md +2 -0
  15. package/dist/assets/stash-skeleton/facts/conventions/assets/fact.md +2 -0
  16. package/dist/assets/stash-skeleton/facts/conventions/assets/knowledge.md +2 -0
  17. package/dist/assets/stash-skeleton/facts/conventions/assets/lesson.md +2 -0
  18. package/dist/assets/stash-skeleton/facts/conventions/assets/memory.md +2 -0
  19. package/dist/assets/stash-skeleton/facts/conventions/assets/script.md +2 -0
  20. package/dist/assets/stash-skeleton/facts/conventions/assets/skill.md +2 -0
  21. package/dist/assets/stash-skeleton/facts/conventions/assets/workflow.md +2 -0
  22. package/dist/assets/stash-skeleton/facts/conventions/backlinks.md +2 -0
  23. package/dist/assets/stash-skeleton/facts/conventions/domains.md +2 -0
  24. package/dist/assets/stash-skeleton/facts/conventions/organization.md +20 -9
  25. package/dist/assets/tasks/core/extract.yml +1 -1
  26. package/dist/assets/tasks/core/version-check.yml +1 -1
  27. package/dist/assets/tasks/improve/akm-graph-refresh-weekly.yml +5 -0
  28. package/dist/assets/tasks/improve/akm-improve-catchup.yml +8 -0
  29. package/dist/assets/tasks/improve/akm-improve-consolidate.yml +5 -0
  30. package/dist/assets/tasks/improve/akm-improve-frequent.yml +5 -0
  31. package/dist/assets/tasks/improve/akm-improve-nightly.yml +5 -0
  32. package/dist/assets/templates/html/health.html +1 -3
  33. package/dist/assets/workflows/workflow-template.md +32 -15
  34. package/dist/cli/invocation.js +40 -15
  35. package/dist/cli/parse-args.js +0 -22
  36. package/dist/cli/retired-commands.js +121 -0
  37. package/dist/cli/shared.js +154 -22
  38. package/dist/cli/unknown-flags.js +236 -0
  39. package/dist/cli-node.mjs +2 -1
  40. package/dist/cli.js +696 -258
  41. package/dist/commands/agent/agent-dispatch.js +14 -3
  42. package/dist/commands/agent/contribute-cli.js +73 -88
  43. package/dist/commands/completions.js +79 -22
  44. package/dist/commands/config-cli.js +17 -150
  45. package/dist/commands/env/env-cli.js +59 -143
  46. package/dist/commands/env/env.js +12 -163
  47. package/dist/commands/env/marker-path.js +6 -0
  48. package/dist/commands/env/secret-cli.js +36 -66
  49. package/dist/commands/env/secret.js +24 -57
  50. package/dist/commands/feedback-cli.js +141 -87
  51. package/dist/commands/health/accept-rate.js +58 -0
  52. package/dist/commands/health/advisories.js +3 -4
  53. package/dist/commands/health/checks.js +85 -23
  54. package/dist/commands/health/html-report.js +7 -10
  55. package/dist/commands/health/improve-metrics.js +25 -83
  56. package/dist/commands/health/md-report.js +5 -9
  57. package/dist/commands/health/metrics.js +62 -20
  58. package/dist/commands/health/renderers.js +47 -0
  59. package/dist/commands/health/report-view-model.js +4 -5
  60. package/dist/commands/health/stash-exposure.js +1 -1
  61. package/dist/commands/health/surfaces.js +3 -48
  62. package/dist/commands/health/task-runs.js +3 -67
  63. package/dist/commands/health/types-improve.js +7 -0
  64. package/dist/commands/health.js +99 -28
  65. package/dist/commands/improve/anti-collapse.js +2 -2
  66. package/dist/commands/improve/autonomy-gate.js +68 -0
  67. package/dist/commands/improve/collapse-detector.js +41 -40
  68. package/dist/commands/improve/consolidate/eligibility.js +1 -23
  69. package/dist/commands/improve/consolidate/merge.js +4 -0
  70. package/dist/commands/improve/consolidate.js +140 -1000
  71. package/dist/commands/improve/distill/promote-memory.js +12 -12
  72. package/dist/commands/improve/distill/quality-gate.js +6 -6
  73. package/dist/commands/improve/distill.js +58 -69
  74. package/dist/commands/improve/eligibility.js +105 -57
  75. package/dist/commands/improve/extract-cli.js +14 -133
  76. package/dist/commands/improve/improve-cli.js +98 -114
  77. package/dist/commands/improve/improve-result-file.js +1 -28
  78. package/dist/commands/improve/improve-strategies.js +8 -5
  79. package/dist/commands/improve/improve.js +128 -91
  80. package/dist/commands/improve/loop-stages.js +182 -20
  81. package/dist/commands/improve/memory/derived-ref.js +45 -43
  82. package/dist/commands/improve/memory/memory-belief.js +1 -1
  83. package/dist/commands/improve/memory/memory-contradiction-detect.js +4 -12
  84. package/dist/commands/improve/memory/memory-improve.js +6 -5
  85. package/dist/commands/improve/outcome-loop.js +22 -65
  86. package/dist/commands/improve/preparation.js +114 -123
  87. package/dist/commands/improve/proactive-maintenance.js +2 -5
  88. package/dist/commands/improve/reflect.js +56 -160
  89. package/dist/commands/improve/salience.js +11 -122
  90. package/dist/commands/improve/source-identity.js +10 -38
  91. package/dist/commands/lint/base-linter.js +20 -124
  92. package/dist/commands/lint/env-key-rules.js +31 -47
  93. package/dist/commands/lint/index.js +249 -43
  94. package/dist/commands/{events.js → log.js} +33 -38
  95. package/dist/commands/migrate-cli.js +92 -12
  96. package/dist/commands/migration-tool.js +46 -0
  97. package/dist/commands/observability-cli.js +70 -209
  98. package/dist/commands/proposal/drain.js +101 -29
  99. package/dist/commands/proposal/proposal-cli.js +76 -48
  100. package/dist/commands/proposal/proposal.js +54 -18
  101. package/dist/commands/proposal/propose-cli.js +88 -0
  102. package/dist/commands/proposal/propose.js +23 -15
  103. package/dist/commands/proposal/repository.js +701 -278
  104. package/dist/commands/proposal/validators/proposal-quality-validators.js +2 -8
  105. package/dist/commands/proposal/validators/proposal-validators.js +55 -7
  106. package/dist/commands/proposal/validators/proposals.js +4 -7
  107. package/dist/commands/read/curate.js +34 -53
  108. package/dist/commands/read/knowledge.js +150 -95
  109. package/dist/commands/read/registry-search.js +2 -2
  110. package/dist/commands/read/remember-cli.js +42 -15
  111. package/dist/commands/read/search-cli.js +180 -78
  112. package/dist/commands/read/search.js +58 -43
  113. package/dist/commands/read/show.js +197 -141
  114. package/dist/commands/registry-cli.js +12 -51
  115. package/dist/commands/remember.js +14 -57
  116. package/dist/commands/sources/add-cli.js +100 -31
  117. package/dist/commands/sources/bundle-cli.js +166 -0
  118. package/dist/commands/sources/bundle-config-ops.js +7 -2
  119. package/dist/commands/sources/info.js +18 -5
  120. package/dist/commands/sources/init.js +12 -12
  121. package/dist/commands/sources/installed-stashes.js +382 -98
  122. package/dist/commands/sources/schema-repair.js +3 -2
  123. package/dist/commands/sources/self-update.js +131 -38
  124. package/dist/commands/sources/source-add.js +72 -17
  125. package/dist/commands/sources/source-clone.js +129 -45
  126. package/dist/commands/sources/source-manage.js +43 -23
  127. package/dist/commands/sources/sources-cli.js +57 -208
  128. package/dist/commands/sources/stash-cli.js +46 -53
  129. package/dist/commands/tasks/tasks-cli.js +91 -97
  130. package/dist/commands/tasks/tasks.js +276 -421
  131. package/dist/commands/workflow-cli.js +175 -450
  132. package/dist/core/adapter/adapters/akm-adapter.js +47 -28
  133. package/dist/core/adapter/adapters/akm-lint.js +42 -27
  134. package/dist/core/adapter/adapters/akm-metadata.js +15 -44
  135. package/dist/core/adapter/adapters/akm-task-adapter.js +15 -13
  136. package/dist/core/adapter/adapters/akm-workflow-adapter.js +55 -71
  137. package/dist/core/adapter/adapters/dotenv-adapter.js +1 -1
  138. package/dist/core/adapter/adapters/generic-files-adapter.js +2 -0
  139. package/dist/core/adapter/adapters/index.js +6 -6
  140. package/dist/core/adapter/adapters/llm-wiki-adapter.js +14 -8
  141. package/dist/core/adapter/adapters/okf-adapter.js +187 -19
  142. package/dist/core/adapter/adapters/shared.js +3 -19
  143. package/dist/core/adapter/adapters/tool-dir-shared.js +8 -3
  144. package/dist/core/adapter/adapters/website-snapshot-adapter.js +1 -0
  145. package/dist/core/adapter/detect-adapter.js +17 -0
  146. package/dist/core/adapter/recognize-match.js +6 -4
  147. package/dist/core/adapter/validate-context.js +214 -0
  148. package/dist/core/asset/akm-markdown.js +63 -0
  149. package/dist/core/asset/asset-placement.js +20 -6
  150. package/dist/core/asset/asset-ref.js +11 -9
  151. package/dist/core/asset/frontmatter-lint.js +30 -0
  152. package/dist/core/asset/frontmatter.js +37 -9
  153. package/dist/core/asset/markdown.js +40 -51
  154. package/dist/core/asset/resolve-ref.js +89 -18
  155. package/dist/core/asset/stash-meta.js +1 -1
  156. package/dist/core/bundle-id.js +51 -0
  157. package/dist/core/common.js +152 -38
  158. package/dist/core/config/config-io.js +12 -1
  159. package/dist/core/config/config-schema.js +35 -8
  160. package/dist/core/config/config-sources.js +55 -11
  161. package/dist/core/config/config-walker.js +25 -9
  162. package/dist/core/config/config.js +9 -48
  163. package/dist/core/config/experimental.js +21 -0
  164. package/dist/core/config/schema/embedding.js +5 -1
  165. package/dist/core/config/schema/experimental.js +30 -0
  166. package/dist/core/config/schema/improve-processes.js +0 -6
  167. package/dist/core/config/schema/improve.js +21 -3
  168. package/dist/core/config/schema/index-config.js +8 -15
  169. package/dist/core/config/schema/output.js +4 -1
  170. package/dist/core/config/schema/setup.js +9 -18
  171. package/dist/core/config/schema/sources-bundles.js +49 -33
  172. package/dist/core/config/schema/workflow.js +3 -3
  173. package/dist/core/env-secret-ref.js +76 -46
  174. package/dist/core/errors.js +18 -12
  175. package/dist/core/events.js +46 -128
  176. package/dist/core/file-change.js +6 -5
  177. package/dist/core/fs-txn.js +83 -7
  178. package/dist/core/git-message.js +2 -2
  179. package/dist/core/improve-result.js +1 -100
  180. package/dist/core/lesson-lint.js +1 -17
  181. package/dist/core/logs-db.js +2 -1
  182. package/dist/core/migration-operation.js +16 -0
  183. package/dist/core/mutation-target.js +78 -0
  184. package/dist/core/parse.js +4 -1
  185. package/dist/core/paths.js +17 -20
  186. package/dist/core/recognition-util.js +12 -14
  187. package/dist/core/redaction.js +34 -0
  188. package/dist/core/standards/resolve-standards-context.js +2 -14
  189. package/dist/core/standards/resolve-stash-standards.js +2 -2
  190. package/dist/core/standards/resolve-type-conventions.js +2 -2
  191. package/dist/core/state/migrations.js +41 -18
  192. package/dist/core/state-db.js +5 -14
  193. package/dist/core/structured.js +1 -1
  194. package/dist/core/subprocess.js +6 -4
  195. package/dist/core/text-truncation.js +9 -5
  196. package/dist/core/type-presentation.js +3 -3
  197. package/dist/core/warn.js +0 -3
  198. package/dist/core/write-source.js +771 -95
  199. package/dist/indexer/bundle-identity-guard.js +3 -2
  200. package/dist/indexer/db/graph-db.js +0 -24
  201. package/dist/indexer/ensure-index.js +1 -0
  202. package/dist/indexer/graph/graph-boost.js +9 -34
  203. package/dist/indexer/graph/graph-extraction.js +8 -5
  204. package/dist/indexer/index-writer-lock.js +53 -17
  205. package/dist/indexer/index-written-assets.js +16 -22
  206. package/dist/indexer/indexer.js +497 -239
  207. package/dist/indexer/installations.js +14 -96
  208. package/dist/indexer/passes/dir-staleness.js +16 -9
  209. package/dist/indexer/passes/memory-inference.js +11 -9
  210. package/dist/indexer/passes/metadata.js +113 -47
  211. package/dist/indexer/scan/doc-to-entry.js +38 -1
  212. package/dist/indexer/scan/drain-dir.js +13 -23
  213. package/dist/indexer/search/db-search.js +99 -54
  214. package/dist/indexer/search/fts-query.js +47 -24
  215. package/dist/indexer/search/ranking-contributors.js +42 -20
  216. package/dist/indexer/search/ranking.js +18 -99
  217. package/dist/indexer/search/search-fields.js +7 -2
  218. package/dist/indexer/search/search-source.js +82 -93
  219. package/dist/indexer/usage/usage-events.js +0 -89
  220. package/dist/indexer/walk/file-context.js +2 -1
  221. package/dist/indexer/walk/matchers.js +30 -43
  222. package/dist/indexer/walk/path-resolver.js +7 -2
  223. package/dist/indexer/walk/walker.js +38 -12
  224. package/dist/integrations/agent/builders.js +0 -6
  225. package/dist/integrations/agent/config.js +2 -2
  226. package/dist/integrations/agent/detect.js +49 -19
  227. package/dist/integrations/agent/engine-fallback.js +76 -0
  228. package/dist/integrations/agent/profiles.js +14 -0
  229. package/dist/integrations/agent/prompts.js +12 -8
  230. package/dist/integrations/agent/runner-dispatch.js +4 -2
  231. package/dist/integrations/agent/runner.js +0 -1
  232. package/dist/integrations/agent/spawn.js +5 -6
  233. package/dist/integrations/github.js +1 -1
  234. package/dist/integrations/harnesses/aider/agent-builder.js +6 -4
  235. package/dist/integrations/harnesses/amazonq/agent-builder.js +7 -4
  236. package/dist/integrations/harnesses/claude/session-log.js +0 -10
  237. package/dist/integrations/harnesses/codex/agent-builder.js +5 -2
  238. package/dist/integrations/harnesses/copilot/agent-builder.js +5 -3
  239. package/dist/integrations/harnesses/gemini/agent-builder.js +5 -3
  240. package/dist/integrations/harnesses/index.js +3 -7
  241. package/dist/integrations/harnesses/opencode/agent-builder.js +21 -2
  242. package/dist/integrations/harnesses/opencode/session-log.js +0 -15
  243. package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +13 -4
  244. package/dist/integrations/harnesses/openhands/agent-builder.js +9 -6
  245. package/dist/integrations/harnesses/pi/agent-builder.js +6 -4
  246. package/dist/integrations/lockfile.js +101 -6
  247. package/dist/integrations/session-logs/index.js +3 -28
  248. package/dist/llm/client.js +136 -100
  249. package/dist/llm/embedders/remote.js +13 -5
  250. package/dist/llm/feature-gate.js +4 -12
  251. package/dist/llm/graph-extract.js +5 -11
  252. package/dist/llm/memory-infer.js +144 -1
  253. package/dist/llm/metadata-enhance.js +5 -7
  254. package/dist/llm/structured-call.js +1 -1
  255. package/dist/llm/usage-persist.js +26 -5
  256. package/dist/llm/usage-telemetry.js +25 -2
  257. package/dist/output/cli-hints.js +1 -2
  258. package/dist/output/context.js +22 -7
  259. package/dist/output/format-exempt.js +80 -0
  260. package/dist/output/generic-render.js +259 -0
  261. package/dist/output/render-registry.js +57 -0
  262. package/dist/output/renderers.js +14 -36
  263. package/dist/output/shapes/curate.js +10 -1
  264. package/dist/output/shapes/events.js +12 -7
  265. package/dist/output/shapes/helpers.js +56 -83
  266. package/dist/output/shapes/migrate.js +8 -0
  267. package/dist/output/shapes/passthrough.js +7 -41
  268. package/dist/output/shapes/proposal/producer.js +15 -7
  269. package/dist/output/shapes.js +2 -9
  270. package/dist/output/text/{init.js → bundle-create.js} +3 -1
  271. package/dist/output/text/bundle-show.js +7 -0
  272. package/dist/output/text/command-format.js +164 -96
  273. package/dist/output/text/env.js +1 -3
  274. package/dist/output/text/events.js +8 -7
  275. package/dist/output/text/health-format.js +103 -0
  276. package/dist/output/text/health.js +7 -0
  277. package/dist/output/text/helpers.js +10 -8
  278. package/dist/output/text/lint-format.js +43 -0
  279. package/dist/output/text/{save.js → lint.js} +2 -2
  280. package/dist/output/text/migrate.js +88 -0
  281. package/dist/output/text/proposal/producer.js +4 -2
  282. package/dist/output/text/proposal-format.js +44 -72
  283. package/dist/output/text/registry-commands.js +1 -2
  284. package/dist/output/text/show-directives.js +15 -7
  285. package/dist/output/text/status-list.js +32 -0
  286. package/dist/output/text/sync.js +5 -0
  287. package/dist/output/text/workflow-format.js +24 -203
  288. package/dist/output/text/workflow.js +1 -7
  289. package/dist/output/text.js +16 -17
  290. package/dist/registry/factory.js +4 -6
  291. package/dist/registry/origin-resolve.js +16 -27
  292. package/dist/registry/providers/skills-sh.js +3 -3
  293. package/dist/registry/providers/static-index.js +13 -23
  294. package/dist/registry/resolve.js +42 -7
  295. package/dist/registry/semver.js +34 -84
  296. package/dist/runtime.js +2 -23
  297. package/dist/scripts/akm-migrate-node.js +60290 -0
  298. package/dist/scripts/akm-migrate.js +59628 -0
  299. package/dist/setup/detect.js +42 -15
  300. package/dist/setup/registry-stash-loader.js +2 -2
  301. package/dist/setup/setup.js +236 -136
  302. package/dist/setup/steps/connection.js +7 -9
  303. package/dist/setup/steps/platforms.js +9 -9
  304. package/dist/setup/steps/semantic.js +15 -3
  305. package/dist/setup/steps/sources.js +12 -13
  306. package/dist/setup/steps/stashdir.js +2 -3
  307. package/dist/setup/steps/tasks.js +237 -120
  308. package/dist/sources/freshness.js +1 -1
  309. package/dist/sources/provider-factory.js +11 -17
  310. package/dist/sources/providers/filesystem.js +2 -3
  311. package/dist/sources/providers/git-install.js +278 -34
  312. package/dist/sources/providers/git-provider.js +25 -23
  313. package/dist/sources/providers/git-stash.js +395 -106
  314. package/dist/sources/providers/git.js +2 -2
  315. package/dist/sources/providers/npm.js +16 -19
  316. package/dist/sources/providers/provider-utils.js +7 -4
  317. package/dist/sources/providers/sync-from-ref.js +3 -9
  318. package/dist/sources/providers/website.js +6 -1
  319. package/dist/sources/resolve.js +6 -5
  320. package/dist/sources/snapshot-fetchers/bluesky.js +146 -0
  321. package/dist/sources/snapshot-fetchers/content-extract.js +566 -0
  322. package/dist/sources/snapshot-fetchers/fetcher-util.js +41 -0
  323. package/dist/sources/snapshot-fetchers/github.js +100 -0
  324. package/dist/sources/snapshot-fetchers/host-guard.js +291 -0
  325. package/dist/sources/snapshot-fetchers/registry.js +17 -1
  326. package/dist/sources/snapshot-fetchers/robots.js +348 -0
  327. package/dist/sources/snapshot-fetchers/rss.js +282 -0
  328. package/dist/sources/snapshot-fetchers/secret-seam.js +42 -0
  329. package/dist/sources/snapshot-fetchers/website-ingest.js +566 -268
  330. package/dist/sources/snapshot-fetchers/x.js +910 -0
  331. package/dist/storage/database.js +7 -0
  332. package/dist/storage/engines/sqlite-migrations.js +23 -111
  333. package/dist/storage/managed-db.js +2 -2
  334. package/dist/storage/repositories/canaries-repository.js +1 -1
  335. package/dist/storage/repositories/events-repository.js +27 -11
  336. package/dist/storage/repositories/improve-runs-repository.js +6 -12
  337. package/dist/storage/repositories/index-connection.js +17 -6
  338. package/dist/storage/repositories/index-entries-repository.js +151 -240
  339. package/dist/storage/repositories/index-entry-mapper.js +15 -11
  340. package/dist/storage/repositories/index-fts-repository.js +5 -2
  341. package/dist/storage/repositories/index-llm-cache-repository.js +0 -1
  342. package/dist/storage/repositories/index-meta-repository.js +2 -3
  343. package/dist/storage/repositories/index-schema.js +10 -25
  344. package/dist/storage/repositories/index-utility-repository.js +15 -28
  345. package/dist/storage/repositories/index-vec-repository.js +6 -1
  346. package/dist/storage/repositories/outcome-repository.js +119 -0
  347. package/dist/storage/repositories/proposals-repository.js +296 -59
  348. package/dist/storage/repositories/registry-cache.js +19 -0
  349. package/dist/storage/repositories/salience-repository.js +172 -0
  350. package/dist/storage/repositories/task-history-repository.js +15 -13
  351. package/dist/storage/repositories/workflow-runs-repository.js +52 -40
  352. package/dist/tasks/backends/cron.js +105 -15
  353. package/dist/tasks/backends/index.js +1 -1
  354. package/dist/tasks/backends/launchd.js +85 -38
  355. package/dist/tasks/backends/schtasks.js +135 -15
  356. package/dist/tasks/embedded.js +56 -40
  357. package/dist/tasks/parser.js +7 -157
  358. package/dist/tasks/resolve-akm-bin.js +137 -59
  359. package/dist/tasks/runner.js +79 -42
  360. package/dist/tasks/scheduler-invocation.js +220 -10
  361. package/dist/tasks/schema.js +24 -1
  362. package/dist/tasks/task-id.js +1 -3
  363. package/dist/tasks/validator.js +20 -6
  364. package/dist/workflows/authoring/authoring.js +94 -143
  365. package/dist/workflows/authoring/scope-key.js +1 -1
  366. package/dist/workflows/exec/frozen-judge.js +28 -2
  367. package/dist/workflows/exec/native-executor.js +77 -57
  368. package/dist/workflows/exec/param-secrets.js +9 -9
  369. package/dist/workflows/exec/run-workflow.js +133 -79
  370. package/dist/workflows/exec/step-work.js +219 -346
  371. package/dist/{migrate-storage-node.mjs → workflows/exec/unit-dispatch.js} +1 -5
  372. package/dist/workflows/ir/compile.js +141 -270
  373. package/dist/workflows/ir/freeze.js +40 -30
  374. package/dist/workflows/ir/params.js +135 -11
  375. package/dist/workflows/ir/plan-hash.js +1 -1
  376. package/dist/workflows/ir/schema.js +25 -26
  377. package/dist/workflows/parser.js +872 -307
  378. package/dist/workflows/program/expressions.js +20 -208
  379. package/dist/workflows/program/schema.js +7 -10
  380. package/dist/workflows/renderer.js +95 -68
  381. package/dist/workflows/resource-limits.js +2 -0
  382. package/dist/workflows/runtime/checkin.js +3 -3
  383. package/dist/workflows/runtime/plan-classifier.js +16 -75
  384. package/dist/workflows/runtime/runs.js +186 -127
  385. package/dist/workflows/runtime/unit-checkin.js +1 -1
  386. package/dist/workflows/runtime/unit-phases.js +2 -2
  387. package/dist/workflows/runtime/workflow-asset-loader.js +232 -83
  388. package/dist/workflows/schema.js +1 -11
  389. package/dist/workflows/validate-summary.js +30 -36
  390. package/dist/workflows/validator.js +21 -62
  391. package/docs/README.md +68 -0
  392. package/docs/migration/README.md +8 -0
  393. package/docs/migration/release-notes/0.7.0.md +11 -11
  394. package/docs/migration/release-notes/0.9.0.md +208 -27
  395. package/docs/migration/v0.7-to-v0.8.md +46 -47
  396. package/docs/migration/v0.8-to-v0.9.md +564 -208
  397. package/docs/migration/v0.9.0-troubleshooting.md +561 -0
  398. package/docs/reference/README.md +12 -0
  399. package/docs/reference/cli.md +2253 -0
  400. package/docs/reference/configuration.md +358 -0
  401. package/docs/reference/data-and-telemetry.md +105 -42
  402. package/docs/reference/workflows.md +647 -0
  403. package/package.json +22 -11
  404. package/schemas/akm-asset-envelope.json +93 -0
  405. package/schemas/akm-config.json +81 -128
  406. package/schemas/akm-workflow.json +74 -73
  407. package/dist/assets/tasks/core/backup.yml +0 -5
  408. package/dist/assets/tasks/graph-refresh-weekly.yml +0 -10
  409. package/dist/cli/config-migrate.js +0 -1806
  410. package/dist/cli/config-validate.js +0 -41
  411. package/dist/commands/backup-cli.js +0 -56
  412. package/dist/commands/bundle/bundle-cli.js +0 -68
  413. package/dist/commands/bundle/bundle.js +0 -219
  414. package/dist/commands/graph/graph-cli.js +0 -124
  415. package/dist/commands/graph/graph.js +0 -489
  416. package/dist/commands/improve/extract-watch.js +0 -140
  417. package/dist/commands/mv-cli.js +0 -1221
  418. package/dist/commands/sources/history.js +0 -201
  419. package/dist/commands/tasks/default-tasks.js +0 -186
  420. package/dist/core/migration-backup.js +0 -1234
  421. package/dist/indexer/usage/unmigrated-vaults-guard.js +0 -95
  422. package/dist/llm/memory-infer-impl.js +0 -138
  423. package/dist/migrate/legacy/config-source-migration.js +0 -223
  424. package/dist/migrate/legacy/content-migration.js +0 -305
  425. package/dist/migrate/legacy/legacy-layout.js +0 -779
  426. package/dist/migrate/legacy/legacy-paths.js +0 -25
  427. package/dist/migrate/legacy/legacy-stash-json.js +0 -72
  428. package/dist/migrate/legacy/proposal-fs-import.js +0 -168
  429. package/dist/migrate/legacy/task-target-ref-migration.js +0 -272
  430. package/dist/migrate/legacy/three-db-cutover.js +0 -841
  431. package/dist/migrate/legacy/workflow-migrations-bodies.js +0 -52
  432. package/dist/migrate/legacy/workflow-migrations-frozen.js +0 -21
  433. package/dist/migrate/legacy-ref-grammar.js +0 -214
  434. package/dist/output/shapes/distill.js +0 -14
  435. package/dist/output/shapes/history.js +0 -11
  436. package/dist/output/text/distill.js +0 -6
  437. package/dist/output/text/enable-disable.js +0 -8
  438. package/dist/output/text/history.js +0 -6
  439. package/dist/registry/build-index.js +0 -382
  440. package/dist/schemas/akm-config.json +0 -4704
  441. package/dist/schemas/akm-task.json +0 -87
  442. package/dist/schemas/akm-workflow.json +0 -372
  443. package/dist/scripts/migrate-storage.js +0 -3816
  444. package/dist/workflows/authoring/workflow-program-template.yaml +0 -31
  445. package/dist/workflows/cli.js +0 -53
  446. package/dist/workflows/exec/brief.js +0 -481
  447. package/dist/workflows/exec/report.js +0 -1460
  448. package/dist/workflows/exec/watch.js +0 -116
  449. package/dist/workflows/program/parser.js +0 -813
  450. package/dist/workflows/program/project.js +0 -104
@@ -128,6 +128,13 @@ function bunOptions(opts) {
128
128
  out.readonly = opts.readonly;
129
129
  if (opts.create !== undefined)
130
130
  out.create = opts.create;
131
+ // bun:sqlite reads a partial options object as the full set of open flags:
132
+ // with neither `readonly` nor `readwrite` set the handle carries no access
133
+ // mode and every statement fails with SQLITE_MISUSE ("bad parameter or
134
+ // other API misuse"). Default to writable, matching the driver's no-options
135
+ // open and better-sqlite3's semantics.
136
+ if (!out.readonly)
137
+ out.readwrite = true;
131
138
  return out;
132
139
  }
133
140
  let bunSqliteModule;
@@ -1,115 +1,47 @@
1
1
  // This Source Code Form is subject to the terms of the Mozilla Public
2
2
  // License, v. 2.0. If a copy of the MPL was not distributed with this
3
3
  // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
- /**
5
- * Shared SQLite migration engine.
6
- *
7
- * state.db (`src/core/state-db.ts`) evolves its schema through this idempotent,
8
- * transaction-per-migration runner backed by a `schema_migrations` ledger. The
9
- * migrator's frozen pre-cutover workflow-schema roll
10
- * (`src/migrate/legacy/workflow-migrations-bodies.ts`, driven by
11
- * `config-migrate.ts`) reuses the SAME runner. The `bootstrap` hook — a one-line
12
- * pre-versioning back-fill — is now unused by live callers (the pre-cutover
13
- * workflow.db that once needed it fails closed at migrate time).
14
- *
15
- * This module factors that runner out once. Each caller supplies only its own
16
- * `MIGRATIONS` array (plus, historically, an optional `bootstrap` hook).
17
- *
18
- * Migration-safety contract:
19
- * - `id` is permanent and must never be reused.
20
- * - `up` must be idempotent (use IF NOT EXISTS, INSERT OR IGNORE, etc.).
21
- * - `up` must not DROP any table that holds durable (non-regenerable) data.
22
- * - `up` must not RENAME or change the type of an existing column.
23
- * - To add a column: use `ALTER TABLE … ADD COLUMN … DEFAULT …`.
24
- * - Applied IDs must be an exact ordered prefix of the registry.
25
- * - Released migration bodies are sealed by SHA-256 in the same ledger.
26
- */
27
- import crypto from "node:crypto";
28
- export function migrationChecksum(migration) {
29
- return crypto.createHash("sha256").update(migration.id).update("\0").update(migration.up).digest("hex");
4
+ export function assertMigrationRegistry(migrations) {
5
+ const seen = new Set();
6
+ for (const migration of migrations) {
7
+ if (seen.has(migration.id))
8
+ throw new Error(`Migration registry contains duplicate ID ${migration.id}.`);
9
+ seen.add(migration.id);
10
+ }
30
11
  }
31
12
  function migrationsTableExists(db) {
32
13
  return !!db.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'schema_migrations'").get();
33
14
  }
34
- function ledgerHasChecksum(db) {
35
- return db.prepare("PRAGMA table_info(schema_migrations)").all().some((column) => column.name === "checksum");
36
- }
37
- /**
38
- * Core ledger inspection against the expected ordered `{ id, checksum }`
39
- * registry. Both {@link inspectMigrationLedger} (bodies → checksums) and
40
- * {@link inspectSealedMigrationLedger} (frozen pre-computed checksums) route
41
- * here so the two entry points can never diverge.
42
- */
43
- function inspectLedgerAgainst(db, expected) {
44
- const registryIds = expected.map((entry) => entry.id);
45
- if (new Set(registryIds).size !== registryIds.length) {
46
- return {
47
- status: "inconsistent",
48
- migrationIds: [],
49
- checksums: [],
50
- detail: "migration registry contains duplicate IDs",
51
- };
52
- }
15
+ /** Inspect the database's applied IDs against the exact ordered registry prefix. */
16
+ function inspectLedgerAgainst(db, registryIds) {
53
17
  if (!migrationsTableExists(db))
54
- return { status: registryIds.length === 0 ? "current" : "old", migrationIds: [], checksums: [] };
55
- const hasChecksum = ledgerHasChecksum(db);
56
- const rows = db
57
- .prepare(`SELECT id${hasChecksum ? ", checksum" : ""} FROM schema_migrations ORDER BY rowid`)
58
- .all();
18
+ return { status: registryIds.length === 0 ? "current" : "old", migrationIds: [] };
19
+ const rows = db.prepare("SELECT id FROM schema_migrations ORDER BY rowid").all();
59
20
  const migrationIds = rows.map((row) => row.id);
60
- const checksums = rows.map((row) => row.checksum ?? null);
61
- for (let index = 0; index < rows.length; index += 1) {
62
- const entry = expected[index];
63
- const row = rows[index];
64
- if (!entry) {
65
- return { status: "newer", migrationIds, checksums, detail: `unknown migration ID ${row.id}` };
21
+ for (const [index, row] of rows.entries()) {
22
+ const expectedId = registryIds[index];
23
+ if (!expectedId) {
24
+ return { status: "newer", migrationIds, detail: `unknown migration ID ${row.id}` };
66
25
  }
67
- if (row.id !== entry.id) {
26
+ if (row.id !== expectedId) {
68
27
  const knownLater = registryIds.includes(row.id);
69
28
  return {
70
29
  status: knownLater ? "inconsistent" : "newer",
71
30
  migrationIds,
72
- checksums,
73
31
  detail: knownLater
74
32
  ? `migration ledger is not an exact ordered prefix at position ${index + 1}`
75
33
  : `unknown migration ID ${row.id}`,
76
34
  };
77
35
  }
78
- if (row.checksum && row.checksum !== entry.checksum) {
79
- return {
80
- status: "inconsistent",
81
- migrationIds,
82
- checksums,
83
- detail: `migration ${row.id} checksum does not match the released migration body`,
84
- };
85
- }
86
- }
87
- const missingChecksum = checksums.indexOf(null);
88
- if (missingChecksum >= 0) {
89
- return {
90
- status: "old",
91
- migrationIds,
92
- checksums,
93
- detail: `migration ${migrationIds[missingChecksum]} has not been sealed with a checksum`,
94
- };
95
36
  }
96
37
  return {
97
- status: rows.length === expected.length ? "current" : "old",
38
+ status: rows.length === registryIds.length ? "current" : "old",
98
39
  migrationIds,
99
- checksums,
100
40
  };
101
41
  }
102
42
  export function inspectMigrationLedger(db, migrations) {
103
- return inspectLedgerAgainst(db, migrations.map((migration) => ({ id: migration.id, checksum: migrationChecksum(migration) })));
104
- }
105
- /**
106
- * Ledger inspection against a FROZEN `{ id, checksum }` copy of a migration
107
- * array whose live source is gone (plan §3.3 item 1). Behaviourally identical
108
- * to {@link inspectMigrationLedger} — the checksums are simply pre-computed
109
- * rather than derived from `up` bodies.
110
- */
111
- export function inspectSealedMigrationLedger(db, sealed) {
112
- return inspectLedgerAgainst(db, sealed);
43
+ assertMigrationRegistry(migrations);
44
+ return inspectLedgerAgainst(db, migrations.map((migration) => migration.id));
113
45
  }
114
46
  export function assertMigrationLedger(db, migrations) {
115
47
  const state = inspectMigrationLedger(db, migrations);
@@ -136,12 +68,9 @@ export function ensureMigrationsTable(db) {
136
68
  db.exec(`
137
69
  CREATE TABLE IF NOT EXISTS schema_migrations (
138
70
  id TEXT PRIMARY KEY,
139
- applied_at TEXT NOT NULL DEFAULT (datetime('now')),
140
- checksum TEXT
71
+ applied_at TEXT NOT NULL DEFAULT (datetime('now'))
141
72
  );
142
73
  `);
143
- if (!ledgerHasChecksum(db))
144
- db.exec("ALTER TABLE schema_migrations ADD COLUMN checksum TEXT");
145
74
  }
146
75
  /**
147
76
  * Apply every pending migration, one transaction per migration.
@@ -154,9 +83,10 @@ export function ensureMigrationsTable(db) {
154
83
  *
155
84
  * @param db The open SQLite database.
156
85
  * @param migrations The module's ordered, append-only migration list.
157
- * @param opts Optional `bootstrap` hook (see {@link RunMigrationsOptions}).
86
+ * @param opts Migration execution options.
158
87
  */
159
88
  export function runMigrations(db, migrations, opts) {
89
+ assertMigrationRegistry(migrations);
160
90
  if (opts?.applyPending === false) {
161
91
  assertMigrationLedger(db, migrations);
162
92
  return;
@@ -164,24 +94,6 @@ export function runMigrations(db, migrations, opts) {
164
94
  if (migrationsTableExists(db))
165
95
  assertMigrationLedger(db, migrations);
166
96
  ensureMigrationsTable(db);
167
- opts?.bootstrap?.(db);
168
- const ledger = assertMigrationLedger(db, migrations);
169
- db.transaction(() => {
170
- const update = db.prepare("UPDATE schema_migrations SET checksum = ? WHERE id = ? AND checksum IS NULL");
171
- for (let index = 0; index < ledger.migrationIds.length; index += 1) {
172
- update.run(migrationChecksum(migrations[index]), ledger.migrationIds[index]);
173
- }
174
- if (opts?.generationMarker) {
175
- db.exec(`
176
- CREATE TABLE IF NOT EXISTS akm_migration_generation (
177
- singleton INTEGER PRIMARY KEY CHECK (singleton = 1),
178
- operation_id TEXT NOT NULL,
179
- phase TEXT NOT NULL
180
- )
181
- `);
182
- db.prepare("INSERT INTO akm_migration_generation(singleton, operation_id, phase) VALUES (1, ?, ?) ON CONFLICT(singleton) DO UPDATE SET operation_id=excluded.operation_id, phase=excluded.phase").run(opts.generationMarker.operationId, opts.generationMarker.phase);
183
- }
184
- })();
185
97
  const appliedRows = db.prepare("SELECT id FROM schema_migrations ORDER BY rowid").all();
186
98
  const applied = new Set(appliedRows.map((r) => r.id));
187
99
  for (const migration of migrations) {
@@ -190,7 +102,7 @@ export function runMigrations(db, migrations, opts) {
190
102
  opts?.beforeMigration?.(migration);
191
103
  db.transaction(() => {
192
104
  db.exec(migration.up);
193
- db.prepare("INSERT INTO schema_migrations (id, checksum) VALUES (?, ?)").run(migration.id, migrationChecksum(migration));
105
+ db.prepare("INSERT INTO schema_migrations (id) VALUES (?)").run(migration.id);
194
106
  })();
195
107
  }
196
108
  }
@@ -29,10 +29,10 @@ import { applyStandardPragmas } from "./sqlite-pragmas.js";
29
29
  */
30
30
  export function openManagedDatabase(spec) {
31
31
  const dir = path.dirname(spec.path);
32
- if (!fs.existsSync(dir)) {
32
+ if (spec.create !== false && !fs.existsSync(dir)) {
33
33
  fs.mkdirSync(dir, { recursive: true });
34
34
  }
35
- const db = openDatabase(spec.path);
35
+ const db = spec.create === false ? openDatabase(spec.path, { create: false }) : openDatabase(spec.path);
36
36
  applyStandardPragmas(db, spec.pragmas ?? { dataDir: dir });
37
37
  spec.init?.(db);
38
38
  return db;
@@ -45,7 +45,7 @@ export function listActiveCanarySetIds(db) {
45
45
  /**
46
46
  * Deactivate every canary row in a set. Rows are RETAINED (active = 0) so
47
47
  * historical improve_cycle_metrics rows keyed on the old canary_set_id stay
48
- * interpretable; only `akm improve canary --refresh` calls this.
48
+ * interpretable; only `bun scripts/refresh-canary-set.ts --refresh` calls this.
49
49
  */
50
50
  export function deactivateCanarySet(db, canarySetId) {
51
51
  const result = db
@@ -38,12 +38,7 @@ export function eventRowToEnvelope(row) {
38
38
  */
39
39
  export function insertEvent(db, input) {
40
40
  try {
41
- const result = db
42
- .prepare(`INSERT INTO events (event_type, ts, ref, metadata_json)
43
- VALUES (?, ?, ?, ?)
44
- RETURNING id`)
45
- .get(input.eventType, input.ts, input.ref ?? null, JSON.stringify(input.metadata ?? {}));
46
- return result?.id;
41
+ return insertEventStrict(db, input);
47
42
  }
48
43
  catch (err) {
49
44
  const message = err instanceof Error ? err.message : String(err);
@@ -51,6 +46,17 @@ export function insertEvent(db, input) {
51
46
  return undefined;
52
47
  }
53
48
  }
49
+ /** Insert an event without best-effort error swallowing for transaction-coupled mutations. */
50
+ export function insertEventStrict(db, input) {
51
+ const result = db
52
+ .prepare(`INSERT INTO events (event_type, ts, ref, metadata_json)
53
+ VALUES (?, ?, ?, ?)
54
+ RETURNING id`)
55
+ .get(input.eventType, input.ts, input.ref ?? null, JSON.stringify(input.metadata ?? {}));
56
+ if (!result)
57
+ throw new Error(`Failed to persist ${input.eventType} event.`);
58
+ return result.id;
59
+ }
54
60
  /** Strict idempotent event insert for durable mutation journals. */
55
61
  export function insertEventOnce(db, input) {
56
62
  const rows = db
@@ -77,10 +83,15 @@ export function insertEventOnce(db, input) {
77
83
  }
78
84
  /**
79
85
  * Read events from the database matching the filter. Returns events in
80
- * ascending id order so consumers can process them in emission order.
86
+ * ascending id order so consumers can process them in emission order —
87
+ * true even when `options.limit` selects the most-recent page (see
88
+ * {@link ReadStateEventsOptions.limit}).
81
89
  *
82
90
  * The returned `nextId` is the maximum id seen (or `sinceId` when no rows
83
- * match), suitable as the next `sinceId` cursor value.
91
+ * match), suitable as the next `sinceId` cursor value. This is unaffected by
92
+ * `limit`: it is always the id of the last row actually returned, which —
93
+ * because a `limit` page is the MOST RECENT matching rows — is the same
94
+ * value an unbounded read of the same filter would have produced.
84
95
  */
85
96
  export function readStateEvents(db, options = {}) {
86
97
  const conditions = [];
@@ -102,10 +113,15 @@ export function readStateEvents(db, options = {}) {
102
113
  params.push(options.ref);
103
114
  }
104
115
  const where = conditions.length > 0 ? `WHERE ${conditions.join(" AND ")}` : "";
116
+ const hasLimit = options.limit !== undefined && options.limit > 0;
117
+ const orderAndLimit = hasLimit ? "ORDER BY id DESC LIMIT ?" : "ORDER BY id ASC";
118
+ const queryParams = hasLimit ? [...params, options.limit] : params;
105
119
  const rows = db
106
- .prepare(`SELECT id, event_type, ts, ref, metadata_json FROM events ${where} ORDER BY id ASC`)
107
- .all(...params);
108
- const events = rows.map(eventRowToEnvelope);
120
+ .prepare(`SELECT id, event_type, ts, ref, metadata_json FROM events ${where} ${orderAndLimit}`)
121
+ .all(...queryParams);
122
+ // A DESC-ordered LIMIT page comes back newest-first; reverse it so the
123
+ // returned array is always ascending by id, matching the unbounded path.
124
+ const events = (hasLimit ? rows.slice().reverse() : rows).map(eventRowToEnvelope);
109
125
  const nextId = events.length > 0 ? events[events.length - 1].id : (options.sinceId ?? 0);
110
126
  return { events, nextId };
111
127
  }
@@ -41,19 +41,13 @@ export function computeImproveRunMetrics(result) {
41
41
  case "noop":
42
42
  break;
43
43
  }
44
- // Legacy: pre-gate action results may carry autoAccepted: true (reflect path).
45
- const r = action.result;
46
- if (r && r.autoAccepted === true)
47
- autoAcceptedCount++;
48
44
  }
49
45
  // Add gate-promoted count from the unified PostPhaseAutoAcceptGate (all phases).
50
46
  autoAcceptedCount += result.gateAutoAcceptedCount ?? 0;
51
47
  // C1 (13-bus-factor): distill-skipped rows are folded into the bounded
52
48
  // `distillSkipped` aggregate and no longer live in `actions`. Add the
53
49
  // aggregate total to the skipped + total-actions counters so metrics_json
54
- // reports the same numbers as before the fold. (Legacy rows that still carry
55
- // per-ref distill-skipped in `actions` have no aggregate, so they are counted
56
- // by the classify loop above — never double-counted.)
50
+ // keeps aggregate metrics aligned with the logical action count.
57
51
  const distillSkippedTotal = result.distillSkipped?.total ?? 0;
58
52
  skippedCount += distillSkippedTotal;
59
53
  return {
@@ -83,10 +77,10 @@ export function recordImproveRun(db, input) {
83
77
  const metricsObj = input.metrics ?? computeImproveRunMetrics(input.result);
84
78
  db.prepare(`
85
79
  INSERT INTO improve_runs
86
- (id, started_at, completed_at, stash_dir, dry_run, profile, strategy,
80
+ (id, started_at, completed_at, stash_dir, dry_run, strategy,
87
81
  scope_mode, scope_value, guidance, ok, result_json, metrics_json, metadata_json)
88
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
89
- `).run(input.id, input.startedAt, input.completedAt, input.stashDir, input.dryRun ? 1 : 0, input.legacyProfile ?? null, input.strategy ?? null, input.scopeMode, input.scopeValue, input.guidance, input.ok ? 1 : 0, JSON.stringify(input.result), JSON.stringify(metricsObj), JSON.stringify(input.metadata ?? {}));
82
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
83
+ `).run(input.id, input.startedAt, input.completedAt, input.stashDir, input.dryRun ? 1 : 0, input.strategy, input.scopeMode, input.scopeValue, input.guidance, input.ok ? 1 : 0, JSON.stringify(input.result), JSON.stringify(metricsObj), JSON.stringify(input.metadata ?? {}));
90
84
  }
91
85
  /**
92
86
  * Read real (non-dry-run) improve_runs rows whose `started_at` falls in the
@@ -104,8 +98,8 @@ export function recordImproveRun(db, input) {
104
98
  */
105
99
  export function queryImproveRuns(db, since, until) {
106
100
  const sql = until
107
- ? "SELECT id, started_at, completed_at, ok, scope_mode, scope_value, profile AS legacyProfile, strategy, result_json FROM improve_runs WHERE started_at >= ? AND started_at < ? AND dry_run = 0 ORDER BY started_at DESC"
108
- : "SELECT id, started_at, completed_at, ok, scope_mode, scope_value, profile AS legacyProfile, strategy, result_json FROM improve_runs WHERE started_at >= ? AND dry_run = 0 ORDER BY started_at DESC";
101
+ ? "SELECT id, started_at, completed_at, ok, scope_mode, scope_value, strategy, result_json FROM improve_runs WHERE started_at >= ? AND started_at < ? AND dry_run = 0 ORDER BY started_at DESC"
102
+ : "SELECT id, started_at, completed_at, ok, scope_mode, scope_value, strategy, result_json FROM improve_runs WHERE started_at >= ? AND dry_run = 0 ORDER BY started_at DESC";
109
103
  return (until ? db.prepare(sql).all(since, until) : db.prepare(sql).all(since));
110
104
  }
111
105
  /**
@@ -5,11 +5,10 @@
5
5
  * `index.db` connection lifecycle for the storage layer.
6
6
  *
7
7
  * Opens/closes the index database, arming the sqlite-vec extension and (for the
8
- * managed open path) running `ensureSchema`. Extracted verbatim from
9
- * `src/indexer/db/db.ts` (WI-5a); it now lives BELOW the indexer, so the storage
10
- * loan helpers (`index-db.ts`, `registry-cache.ts`) import their opener from a
11
- * sibling here instead of reaching up into the indexer — inverting the old
12
- * storage→indexer arrow.
8
+ * managed open path) running `ensureSchema`. This module lives BELOW the
9
+ * indexer, so the storage loan helpers (`index-db.ts`, `registry-cache.ts`)
10
+ * import their opener from a sibling here instead of reaching up into the
11
+ * indexer — inverting the old storage→indexer arrow.
13
12
  */
14
13
  import fs from "node:fs";
15
14
  import { createRequire } from "node:module";
@@ -63,7 +62,19 @@ export function openExistingDatabase(dbPath) {
63
62
  // Existing-DB callers must not mutate schema or embedding metadata on open,
64
63
  // but some paths still need write access to usage_events and other tables —
65
64
  // so init only loads the vec extension, it does not run ensureSchema.
66
- return openManagedDatabase({ path: dbPath ?? getDbPath(), init: loadVecExtension });
65
+ //
66
+ // "Existing" is load-bearing: a missing file throws instead of being
67
+ // created. Create-on-open used to leave a schema-less index.db behind (a
68
+ // fire-and-forget telemetry read was enough), which every later opener then
69
+ // saw as an existing-but-broken index ("no such table: entries") — the
70
+ // curate→proposal file-order failure pinned by
71
+ // tests/storage/open-existing-database-no-create.test.ts. `create: false`
72
+ // below is the race-free backstop for this pre-check.
73
+ const resolvedPath = dbPath ?? getDbPath();
74
+ if (!fs.existsSync(resolvedPath)) {
75
+ throw new Error(`Index database not found at ${resolvedPath}. Run 'akm index' to build it.`);
76
+ }
77
+ return openManagedDatabase({ path: resolvedPath, init: loadVecExtension, create: false });
67
78
  }
68
79
  /**
69
80
  * Open an existing index for queries without creating directories, a database