akm-cli 0.9.0-rc.4 → 0.9.0-rc.6

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 (438) hide show
  1. package/CHANGELOG.md +122 -26
  2. package/README.md +7 -7
  3. package/SECURITY.md +11 -10
  4. package/dist/akm +2 -2
  5. package/dist/akm-migrate-storage +2 -2
  6. package/dist/assets/hints/cli-hints-full.md +60 -73
  7. package/dist/assets/hints/cli-hints-short.md +8 -12
  8. package/dist/assets/improve-strategies/default.json +5 -7
  9. package/dist/assets/improve-strategies/frequent.json +2 -2
  10. package/dist/assets/improve-strategies/proactive-maintenance.json +2 -2
  11. package/dist/assets/improve-strategies/quick.json +1 -1
  12. package/dist/assets/improve-strategies/reflect-distill.json +3 -3
  13. package/dist/assets/improve-strategies/thorough.json +1 -1
  14. package/dist/assets/prompts/consolidate-system.md +5 -5
  15. package/dist/assets/prompts/extract-session.md +2 -6
  16. package/dist/assets/prompts/reflect-llm-framed-contract.md +11 -0
  17. package/dist/assets/prompts/reflect-llm-schema-contract.md +3 -0
  18. package/dist/assets/prompts/reflect-output-repair.md +3 -0
  19. package/dist/assets/stash-skeleton/README.md +10 -11
  20. package/dist/assets/stash-skeleton/facts/conventions/assets/agent.md +1 -1
  21. package/dist/assets/stash-skeleton/facts/conventions/assets/fact.md +1 -1
  22. package/dist/assets/stash-skeleton/facts/conventions/assets/knowledge.md +1 -1
  23. package/dist/assets/stash-skeleton/facts/conventions/assets/lesson.md +2 -2
  24. package/dist/assets/stash-skeleton/facts/conventions/assets/memory.md +2 -2
  25. package/dist/assets/stash-skeleton/facts/conventions/assets/script.md +1 -1
  26. package/dist/assets/stash-skeleton/facts/conventions/assets/skill.md +2 -2
  27. package/dist/assets/stash-skeleton/facts/conventions/assets/workflow.md +1 -1
  28. package/dist/assets/stash-skeleton/facts/conventions/backlinks.md +18 -18
  29. package/dist/assets/stash-skeleton/facts/conventions/domains.md +8 -9
  30. package/dist/assets/stash-skeleton/facts/conventions/organization.md +13 -15
  31. package/dist/assets/tasks/core/extract.yml +2 -2
  32. package/dist/assets/tasks/core/improve.yml +1 -1
  33. package/dist/assets/templates/html/health.html +2 -3
  34. package/dist/cli/config-migrate.js +1328 -101
  35. package/dist/cli/invocation.js +255 -0
  36. package/dist/cli/parse-args.js +20 -83
  37. package/dist/cli/shared.js +15 -37
  38. package/dist/cli.js +18 -49
  39. package/dist/commands/agent/agent-dispatch.js +2 -2
  40. package/dist/commands/agent/contribute-cli.js +5 -4
  41. package/dist/commands/bundle/bundle-cli.js +68 -0
  42. package/dist/commands/bundle/bundle.js +219 -0
  43. package/dist/commands/completions.js +2 -2
  44. package/dist/commands/config-cli.js +6 -3
  45. package/dist/commands/env/env-binding.js +13 -9
  46. package/dist/commands/env/env-cli.js +49 -48
  47. package/dist/commands/env/secret-cli.js +24 -10
  48. package/dist/commands/events.js +2 -2
  49. package/dist/commands/feedback-cli.js +59 -33
  50. package/dist/commands/graph/graph.js +6 -4
  51. package/dist/commands/health/advisories.js +4 -4
  52. package/dist/commands/health/html-report.js +190 -593
  53. package/dist/commands/health/improve-metrics.js +240 -188
  54. package/dist/commands/health/metrics.js +9 -17
  55. package/dist/commands/health/report-view-model.js +509 -0
  56. package/dist/commands/health/surfaces.js +6 -3
  57. package/dist/commands/health/types-checks.js +4 -0
  58. package/dist/commands/health/types-improve.js +22 -0
  59. package/dist/commands/health/types-metrics.js +4 -0
  60. package/dist/commands/health/types-result.js +7 -0
  61. package/dist/commands/health/types-runs.js +4 -0
  62. package/dist/commands/health/types-session-log.js +4 -0
  63. package/dist/commands/health/types-windows.js +4 -0
  64. package/dist/commands/health/types.js +26 -21
  65. package/dist/commands/health/windows.js +1 -2
  66. package/dist/commands/health.js +219 -161
  67. package/dist/commands/improve/collapse-detector.js +25 -14
  68. package/dist/commands/improve/consolidate/chunking.js +7 -5
  69. package/dist/commands/improve/consolidate.js +640 -740
  70. package/dist/commands/improve/content-hash.js +39 -0
  71. package/dist/commands/improve/distill/content-repair.js +4 -10
  72. package/dist/commands/improve/distill/promote-memory.js +79 -49
  73. package/dist/commands/improve/distill/quality-gate.js +113 -35
  74. package/dist/commands/improve/distill-promotion-policy.js +24 -885
  75. package/dist/commands/improve/distill.js +565 -337
  76. package/dist/commands/improve/eligibility.js +75 -36
  77. package/dist/commands/improve/extract-cli.js +6 -6
  78. package/dist/commands/improve/extract-prompt.js +5 -34
  79. package/dist/commands/improve/extract.js +526 -357
  80. package/dist/commands/improve/feedback-valence.js +2 -12
  81. package/dist/commands/improve/improve-cli.js +11 -20
  82. package/dist/commands/improve/improve-result-file.js +7 -6
  83. package/dist/commands/improve/improve-run-types.js +4 -0
  84. package/dist/commands/improve/improve-strategies.js +3 -9
  85. package/dist/commands/improve/improve.js +822 -727
  86. package/dist/commands/improve/locks.js +27 -95
  87. package/dist/commands/improve/loop-stages.js +941 -963
  88. package/dist/commands/improve/memory/derived-ref.js +122 -0
  89. package/dist/commands/improve/memory/memory-contradiction-detect.js +35 -38
  90. package/dist/commands/improve/memory/memory-improve.js +24 -37
  91. package/dist/commands/improve/outcome-loop.js +13 -33
  92. package/dist/commands/improve/preparation.js +889 -691
  93. package/dist/commands/improve/proactive-maintenance.js +37 -9
  94. package/dist/commands/improve/proposal-envelope.js +31 -0
  95. package/dist/commands/improve/reflect.js +974 -588
  96. package/dist/commands/improve/run-context.js +119 -0
  97. package/dist/commands/improve/salience.js +8 -4
  98. package/dist/commands/improve/session-asset.js +7 -3
  99. package/dist/commands/improve/shared.js +14 -40
  100. package/dist/commands/improve/source-identity.js +39 -26
  101. package/dist/commands/improve/triage.js +20 -17
  102. package/dist/commands/lint/base-linter.js +288 -295
  103. package/dist/commands/lint/index.js +132 -19
  104. package/dist/commands/mv-cli.js +257 -234
  105. package/dist/commands/observability-cli.js +2 -1
  106. package/dist/commands/proposal/diff-format.js +50 -0
  107. package/dist/commands/proposal/drain-policies.js +0 -6
  108. package/dist/commands/proposal/drain.js +17 -16
  109. package/dist/commands/proposal/proposal-cli.js +40 -77
  110. package/dist/commands/proposal/proposal-types.js +56 -0
  111. package/dist/commands/proposal/proposal.js +39 -1
  112. package/dist/commands/proposal/propose.js +41 -19
  113. package/dist/commands/proposal/repository.js +566 -486
  114. package/dist/commands/proposal/validators/proposal-quality-validators.js +22 -6
  115. package/dist/commands/proposal/validators/proposal-validators.js +6 -5
  116. package/dist/commands/proposal/validators/proposals.js +5 -4
  117. package/dist/commands/read/curate.js +50 -28
  118. package/dist/commands/read/knowledge.js +25 -16
  119. package/dist/commands/read/remember-cli.js +12 -4
  120. package/dist/commands/read/search-cli.js +33 -33
  121. package/dist/commands/read/search.js +68 -55
  122. package/dist/commands/read/show.js +54 -135
  123. package/dist/commands/remember.js +7 -5
  124. package/dist/commands/sources/add-cli.js +10 -24
  125. package/dist/commands/sources/bundle-config-ops.js +58 -0
  126. package/dist/commands/sources/history.js +13 -8
  127. package/dist/commands/sources/info.js +10 -11
  128. package/dist/commands/sources/init.js +12 -21
  129. package/dist/commands/sources/installed-stashes.js +151 -138
  130. package/dist/commands/sources/schema-repair.js +5 -3
  131. package/dist/commands/sources/self-update.js +9 -7
  132. package/dist/commands/sources/source-add.js +116 -154
  133. package/dist/commands/sources/source-clone.js +33 -14
  134. package/dist/commands/sources/source-manage.js +43 -32
  135. package/dist/commands/sources/sources-cli.js +12 -7
  136. package/dist/commands/sources/stash-cli.js +12 -5
  137. package/dist/commands/sources/stash-skeleton.js +1 -1
  138. package/dist/commands/tasks/default-tasks.js +13 -13
  139. package/dist/commands/tasks/tasks-cli.js +3 -3
  140. package/dist/commands/tasks/tasks.js +71 -31
  141. package/dist/commands/workflow-cli.js +22 -26
  142. package/dist/core/action-contributors.js +1 -1
  143. package/dist/core/activation-policy.js +49 -0
  144. package/dist/core/adapter/adapters/agent-skills-adapter.js +181 -0
  145. package/dist/core/adapter/adapters/akm-adapter.js +509 -0
  146. package/dist/core/adapter/adapters/akm-lint.js +381 -0
  147. package/dist/core/adapter/adapters/akm-metadata.js +416 -0
  148. package/dist/core/adapter/adapters/akm-task-adapter.js +150 -0
  149. package/dist/core/adapter/adapters/akm-workflow-adapter.js +196 -0
  150. package/dist/core/adapter/adapters/claude-adapter.js +61 -0
  151. package/dist/core/adapter/adapters/dotenv-adapter.js +187 -0
  152. package/dist/core/adapter/adapters/generic-files-adapter.js +117 -0
  153. package/dist/core/adapter/adapters/index.js +80 -0
  154. package/dist/core/adapter/adapters/llm-wiki-adapter.js +413 -0
  155. package/dist/core/adapter/adapters/okf-adapter.js +223 -0
  156. package/dist/core/adapter/adapters/opencode-adapter.js +68 -0
  157. package/dist/core/adapter/adapters/shared.js +286 -0
  158. package/dist/core/adapter/adapters/tool-dir-shared.js +212 -0
  159. package/dist/core/adapter/adapters/website-snapshot-adapter.js +154 -0
  160. package/dist/core/adapter/bundle-adapter.js +4 -0
  161. package/dist/core/adapter/recognize-match.js +42 -0
  162. package/dist/core/adapter/registry.js +56 -0
  163. package/dist/core/adapter/types.js +4 -0
  164. package/dist/core/asset/asset-placement.js +229 -0
  165. package/dist/core/asset/asset-ref.js +107 -78
  166. package/dist/core/asset/asset-serialize.js +20 -0
  167. package/dist/core/asset/frontmatter.js +1 -1
  168. package/dist/core/asset/resolve-ref.js +223 -0
  169. package/dist/core/asset/stash-meta.js +1 -1
  170. package/dist/core/common.js +141 -49
  171. package/dist/core/config/config-io.js +0 -108
  172. package/dist/core/config/config-schema.js +94 -1039
  173. package/dist/core/config/config-sources.js +115 -36
  174. package/dist/core/config/config-types.js +16 -11
  175. package/dist/core/config/config-walker.js +4 -2
  176. package/dist/core/config/config.js +21 -26
  177. package/dist/core/config/engine-semantics.js +0 -4
  178. package/dist/core/config/schema/embedding.js +38 -0
  179. package/dist/core/config/schema/engines.js +116 -0
  180. package/dist/core/config/schema/feedback.js +31 -0
  181. package/dist/core/config/schema/improve-processes.js +395 -0
  182. package/dist/core/config/schema/improve.js +76 -0
  183. package/dist/core/config/schema/index-config.js +183 -0
  184. package/dist/core/config/schema/output.js +15 -0
  185. package/dist/core/config/schema/primitives.js +94 -0
  186. package/dist/core/config/schema/search.js +30 -0
  187. package/dist/core/config/schema/setup.js +27 -0
  188. package/dist/core/config/schema/sources-bundles.js +164 -0
  189. package/dist/core/config/schema/workflow.js +29 -0
  190. package/dist/core/env-secret-ref.js +113 -8
  191. package/dist/core/errors.js +1 -1
  192. package/dist/core/events-types.js +4 -0
  193. package/dist/core/extra-params.js +1 -0
  194. package/dist/core/file-change.js +16 -0
  195. package/dist/core/fs-txn.js +316 -0
  196. package/dist/core/git-message.js +59 -0
  197. package/dist/core/improve-result.js +9 -1
  198. package/dist/core/logs-db.js +1 -1
  199. package/dist/core/maintenance-barrier.js +16 -0
  200. package/dist/core/migration-backup.js +332 -160
  201. package/dist/core/paths.js +3 -6
  202. package/dist/core/platform.js +10 -0
  203. package/dist/core/recognition-util.js +130 -0
  204. package/dist/core/redaction.js +2 -2
  205. package/dist/core/standards/resolve-standards-context.js +47 -64
  206. package/dist/core/standards/resolve-type-conventions.js +3 -3
  207. package/dist/core/state/migrations.js +201 -8
  208. package/dist/core/state-db.js +38 -2
  209. package/dist/core/subprocess.js +303 -0
  210. package/dist/core/time.js +20 -0
  211. package/dist/core/type-presentation.js +130 -0
  212. package/dist/core/write-source.js +39 -67
  213. package/dist/indexer/bundle-identity-guard.js +91 -0
  214. package/dist/indexer/db/graph-db.js +1 -1
  215. package/dist/indexer/db/llm-cache.js +1 -1
  216. package/dist/indexer/ensure-index.js +29 -9
  217. package/dist/indexer/graph/graph-boost.js +28 -24
  218. package/dist/indexer/graph/graph-extraction.js +5 -6
  219. package/dist/indexer/graph/graph-types.js +4 -0
  220. package/dist/indexer/index-written-assets.js +44 -17
  221. package/dist/indexer/indexer.js +289 -153
  222. package/dist/indexer/init.js +18 -25
  223. package/dist/indexer/installations.js +224 -0
  224. package/dist/indexer/passes/dir-staleness.js +2 -1
  225. package/dist/indexer/passes/memory-inference.js +8 -4
  226. package/dist/indexer/passes/metadata.js +96 -243
  227. package/dist/indexer/scan/doc-to-entry.js +123 -0
  228. package/dist/indexer/scan/drain-dir.js +144 -0
  229. package/dist/indexer/search/db-search.js +171 -99
  230. package/dist/indexer/search/fts-query.js +1 -1
  231. package/dist/indexer/search/ranking-contributors.js +57 -7
  232. package/dist/indexer/search/ranking-types.js +4 -0
  233. package/dist/indexer/search/ranking.js +31 -6
  234. package/dist/indexer/search/search-attribution.js +67 -0
  235. package/dist/indexer/search/search-hit-enrichers.js +30 -40
  236. package/dist/indexer/search/search-source.js +109 -52
  237. package/dist/indexer/search/semantic-status.js +4 -1
  238. package/dist/indexer/usage/unmigrated-vaults-guard.js +2 -1
  239. package/dist/indexer/usage/usage-events.js +72 -9
  240. package/dist/indexer/walk/file-context.js +1 -44
  241. package/dist/indexer/walk/matchers.js +16 -32
  242. package/dist/indexer/walk/path-resolver.js +6 -5
  243. package/dist/indexer/walk/walker.js +4 -2
  244. package/dist/integrations/agent/engine-resolution.js +22 -0
  245. package/dist/integrations/agent/model-aliases.js +1 -1
  246. package/dist/integrations/agent/prompts.js +35 -11
  247. package/dist/integrations/agent/spawn.js +41 -270
  248. package/dist/integrations/harnesses/aider/agent-builder.js +2 -2
  249. package/dist/integrations/harnesses/aider/index.js +2 -11
  250. package/dist/integrations/harnesses/amazonq/agent-builder.js +1 -9
  251. package/dist/integrations/harnesses/amazonq/index.js +3 -16
  252. package/dist/integrations/harnesses/claude/config-import.js +1 -3
  253. package/dist/integrations/harnesses/claude/index.js +1 -12
  254. package/dist/integrations/harnesses/claude/session-log.js +27 -65
  255. package/dist/integrations/harnesses/codex/agent-builder.js +1 -2
  256. package/dist/integrations/harnesses/codex/index.js +2 -12
  257. package/dist/integrations/harnesses/copilot/agent-builder.js +2 -3
  258. package/dist/integrations/harnesses/copilot/index.js +1 -12
  259. package/dist/integrations/harnesses/gemini/agent-builder.js +1 -3
  260. package/dist/integrations/harnesses/gemini/index.js +1 -12
  261. package/dist/integrations/harnesses/ids.js +24 -0
  262. package/dist/integrations/harnesses/index.js +27 -2
  263. package/dist/integrations/harnesses/opencode/config-import.js +1 -3
  264. package/dist/integrations/harnesses/opencode/index.js +1 -12
  265. package/dist/integrations/harnesses/opencode/session-log.js +67 -110
  266. package/dist/integrations/harnesses/opencode-sdk/harness.js +2 -11
  267. package/dist/integrations/harnesses/openhands/agent-builder.js +3 -3
  268. package/dist/integrations/harnesses/openhands/index.js +2 -11
  269. package/dist/integrations/harnesses/pi/agent-builder.js +3 -11
  270. package/dist/integrations/harnesses/pi/index.js +3 -15
  271. package/dist/integrations/harnesses/shared.js +17 -0
  272. package/dist/integrations/harnesses/types.js +37 -2
  273. package/dist/integrations/lockfile.js +36 -0
  274. package/dist/integrations/session-logs/index.js +21 -12
  275. package/dist/integrations/session-logs/provider-base.js +113 -0
  276. package/dist/llm/client.js +7 -5
  277. package/dist/llm/embedders/deterministic.js +2 -2
  278. package/dist/llm/embedders/remote.js +8 -4
  279. package/dist/llm/graph-extract.js +7 -2
  280. package/dist/llm/metadata-enhance.js +43 -26
  281. package/dist/llm/structured-call.js +15 -7
  282. package/dist/migrate/legacy/config-source-migration.js +223 -0
  283. package/dist/migrate/legacy/content-migration.js +305 -0
  284. package/dist/migrate/legacy/legacy-layout.js +779 -0
  285. package/dist/migrate/legacy/legacy-paths.js +25 -0
  286. package/dist/migrate/legacy/legacy-stash-json.js +72 -0
  287. package/dist/migrate/legacy/proposal-fs-import.js +168 -0
  288. package/dist/migrate/legacy/task-target-ref-migration.js +272 -0
  289. package/dist/migrate/legacy/three-db-cutover.js +840 -0
  290. package/dist/migrate/legacy/workflow-migrations-bodies.js +52 -0
  291. package/dist/migrate/legacy/workflow-migrations-frozen.js +21 -0
  292. package/dist/migrate/legacy-ref-grammar.js +209 -0
  293. package/dist/output/command-registry.js +27 -0
  294. package/dist/output/html-render.js +11 -16
  295. package/dist/output/renderers.js +32 -276
  296. package/dist/output/shapes/passthrough.js +3 -9
  297. package/dist/output/shapes/registry.js +12 -6
  298. package/dist/output/text/command-format.js +547 -0
  299. package/dist/output/text/helpers.js +15 -1377
  300. package/dist/output/text/proposal-format.js +230 -0
  301. package/dist/output/text/registry.js +12 -6
  302. package/dist/output/text/show-directives.js +107 -0
  303. package/dist/output/text/show-format.js +103 -0
  304. package/dist/output/text/workflow-format.js +345 -0
  305. package/dist/output/text.js +1 -3
  306. package/dist/registry/build-index.js +13 -17
  307. package/dist/registry/providers/static-index.js +2 -2
  308. package/dist/registry/resolve.js +4 -90
  309. package/dist/registry/semver.js +93 -0
  310. package/dist/runtime.js +90 -0
  311. package/dist/schemas/akm-config.json +2956 -14890
  312. package/dist/schemas/akm-task.json +2 -2
  313. package/dist/schemas/akm-workflow.json +2 -2
  314. package/dist/scripts/migrate-storage.js +2312 -19642
  315. package/dist/setup/detect.js +5 -7
  316. package/dist/setup/engine-config.js +2 -1
  317. package/dist/setup/registry-stash-loader.js +1 -1
  318. package/dist/setup/semantic-assets.js +12 -9
  319. package/dist/setup/setup.js +109 -39
  320. package/dist/setup/steps/connection-shared.js +120 -0
  321. package/dist/setup/steps/connection.js +50 -274
  322. package/dist/setup/steps/platforms.js +1 -0
  323. package/dist/setup/steps/sources.js +13 -6
  324. package/dist/setup/steps/stashdir.js +5 -2
  325. package/dist/sources/freshness.js +39 -0
  326. package/dist/sources/providers/git-provider.js +29 -33
  327. package/dist/sources/providers/git-stash.js +10 -5
  328. package/dist/sources/providers/provider-utils.js +40 -18
  329. package/dist/sources/providers/website.js +1 -1
  330. package/dist/sources/resolve.js +5 -5
  331. package/dist/sources/snapshot-fetchers/types.js +4 -0
  332. package/dist/sources/{website-ingest.js → snapshot-fetchers/website-ingest.js} +105 -39
  333. package/dist/storage/database.js +47 -3
  334. package/dist/storage/engines/sqlite-migrations.js +34 -16
  335. package/dist/storage/locations.js +1 -2
  336. package/dist/storage/repositories/improve-runs-repository.js +0 -20
  337. package/dist/storage/repositories/index-connection.js +80 -0
  338. package/dist/storage/repositories/index-db.js +4 -3
  339. package/dist/storage/repositories/index-entries-repository.js +952 -0
  340. package/dist/{indexer/db/entry-mapper.js → storage/repositories/index-entry-mapper.js} +15 -2
  341. package/dist/storage/repositories/index-entry-types.js +4 -0
  342. package/dist/storage/repositories/index-fts-repository.js +164 -0
  343. package/dist/storage/repositories/index-llm-cache-repository.js +109 -0
  344. package/dist/storage/repositories/index-meta-repository.js +50 -0
  345. package/dist/{indexer/db/schema.js → storage/repositories/index-schema.js} +241 -100
  346. package/dist/storage/repositories/index-sql.js +12 -0
  347. package/dist/storage/repositories/index-utility-repository.js +369 -0
  348. package/dist/storage/repositories/index-vec-repository.js +245 -0
  349. package/dist/storage/repositories/proposals-repository.js +41 -50
  350. package/dist/storage/repositories/registry-cache.js +1 -1
  351. package/dist/storage/repositories/workflow-runs-repository.js +17 -11
  352. package/dist/tasks/backends/cron.js +5 -5
  353. package/dist/tasks/backends/exec-utils.js +21 -0
  354. package/dist/tasks/backends/index.js +6 -9
  355. package/dist/tasks/backends/launchd.js +16 -17
  356. package/dist/tasks/backends/schtasks.js +33 -41
  357. package/dist/tasks/backends/types.js +4 -0
  358. package/dist/tasks/parser.js +25 -5
  359. package/dist/tasks/runner.js +33 -39
  360. package/dist/tasks/validator.js +5 -6
  361. package/dist/workflows/authoring/authoring.js +8 -11
  362. package/dist/workflows/exec/brief.js +10 -7
  363. package/dist/workflows/exec/report.js +261 -156
  364. package/dist/workflows/exec/run-workflow.js +2 -1
  365. package/dist/workflows/exec/step-work.js +3 -9
  366. package/dist/workflows/program/parser.js +4 -60
  367. package/dist/workflows/renderer.js +11 -60
  368. package/dist/workflows/runtime/checkin.js +1 -1
  369. package/dist/workflows/runtime/plan-classifier.js +7 -4
  370. package/dist/workflows/runtime/runs.js +11 -10
  371. package/dist/workflows/runtime/unit-checkin.js +1 -1
  372. package/dist/workflows/runtime/unit-phases.js +20 -0
  373. package/dist/workflows/runtime/workflow-asset-loader.js +27 -16
  374. package/dist/workflows/validate-summary.js +2 -2
  375. package/dist/workflows/validator.js +18 -2
  376. package/docs/migration/release-notes/0.9.0.md +45 -3
  377. package/docs/migration/v0.8-to-v0.9.md +466 -262
  378. package/docs/{data-and-telemetry.md → reference/data-and-telemetry.md} +61 -17
  379. package/package.json +10 -9
  380. package/schemas/akm-config.json +2956 -14890
  381. package/schemas/akm-task.json +2 -2
  382. package/schemas/akm-workflow.json +2 -2
  383. package/dist/assets/help/help-accept.md +0 -12
  384. package/dist/assets/help/help-improve.md +0 -84
  385. package/dist/assets/help/help-proposals.md +0 -17
  386. package/dist/assets/help/help-propose.md +0 -17
  387. package/dist/assets/help/help-reject.md +0 -11
  388. package/dist/assets/improve-strategies/recombine-only.json +0 -23
  389. package/dist/assets/improve-strategies/synthesize.json +0 -17
  390. package/dist/assets/prompts/procedural-system.md +0 -44
  391. package/dist/assets/prompts/recombine-system.md +0 -40
  392. package/dist/assets/prompts/staleness-detect-system.md +0 -6
  393. package/dist/assets/templates/html/default.html +0 -78
  394. package/dist/assets/templates/html/vendor/echarts.min.js +0 -45
  395. package/dist/assets/wiki/index-template.md +0 -12
  396. package/dist/assets/wiki/ingest-workflow-template.md +0 -83
  397. package/dist/assets/wiki/log-template.md +0 -8
  398. package/dist/assets/wiki/schema-template.md +0 -61
  399. package/dist/commands/improve/calibration.js +0 -161
  400. package/dist/commands/improve/dedup.js +0 -482
  401. package/dist/commands/improve/hot-probation.js +0 -45
  402. package/dist/commands/improve/improve-auto-accept.js +0 -262
  403. package/dist/commands/improve/procedural.js +0 -403
  404. package/dist/commands/improve/recombine.js +0 -843
  405. package/dist/commands/improve/schema-similarity-gate.js +0 -168
  406. package/dist/commands/lint/agent-linter.js +0 -44
  407. package/dist/commands/lint/command-linter.js +0 -44
  408. package/dist/commands/lint/default-linter.js +0 -16
  409. package/dist/commands/lint/fact-linter.js +0 -39
  410. package/dist/commands/lint/knowledge-linter.js +0 -16
  411. package/dist/commands/lint/memory-linter.js +0 -61
  412. package/dist/commands/lint/registry.js +0 -41
  413. package/dist/commands/lint/skill-linter.js +0 -45
  414. package/dist/commands/lint/task-linter.js +0 -50
  415. package/dist/commands/lint/workflow-linter.js +0 -81
  416. package/dist/commands/proposal/legacy-import.js +0 -115
  417. package/dist/commands/wiki-cli.js +0 -291
  418. package/dist/core/asset/asset-registry.js +0 -76
  419. package/dist/core/asset/asset-spec.js +0 -316
  420. package/dist/core/eval/rank-metrics.js +0 -113
  421. package/dist/core/ripgrep/install.js +0 -163
  422. package/dist/core/ripgrep/resolve.js +0 -81
  423. package/dist/indexer/db/db.js +0 -1585
  424. package/dist/indexer/manifest.js +0 -170
  425. package/dist/indexer/passes/metadata-contributors.js +0 -31
  426. package/dist/integrations/harnesses/opencode-sdk/index.js +0 -25
  427. package/dist/output/text/wiki.js +0 -16
  428. package/dist/scripts/migrations/import-fs-improve-runs-to-db.js +0 -18228
  429. package/dist/scripts/migrations/v16-to-v17.js +0 -141
  430. package/dist/storage/repositories/consolidation-repository.js +0 -38
  431. package/dist/storage/repositories/recombine-repository.js +0 -213
  432. package/dist/wiki/wiki-templates.js +0 -15
  433. package/dist/wiki/wiki.js +0 -1013
  434. package/dist/workflows/db.js +0 -413
  435. package/docs/README.md +0 -103
  436. package/docs/migration/release-notes/0.9.0-beta.60.md +0 -19
  437. /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/registry.js +0 -0
  438. /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/youtube.js +0 -0
@@ -2,19 +2,30 @@
2
2
  // License, v. 2.0. If a copy of the MPL was not distributed with this
3
3
  // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
4
  /**
5
- * Shared `entries`-row projection + mapper, extracted from indexer/db/db.ts.
5
+ * Shared `entries`-row projection + mapper for the `index.db` storage repos.
6
6
  *
7
7
  * Centralizes the one canonical `entries` SELECT column list and the
8
8
  * JSON-parse-guarded row → {@link DbIndexedEntry} mapping that several queries
9
9
  * used to reimplement. Corrupt `entry_json` rows are skipped (warn once) rather
10
10
  * than crashing the caller.
11
+ *
12
+ * Relocated from `src/indexer/db/entry-mapper.ts` (WI-5a): it now imports the
13
+ * shared shapes from the leaf types module rather than from `db.ts`, so it no
14
+ * longer participates in the indexer-db import cycle.
11
15
  */
12
16
  import { warn } from "../../core/warn.js";
13
17
  /**
14
18
  * Canonical column list for reading a full indexed entry from the `entries`
15
19
  * table, in the order {@link rowToIndexedEntry} expects.
20
+ *
21
+ * Chunk-5 flip (Checkpoint A): the durable identity columns `concept_id` and
22
+ * `bundle_id` are surfaced here so the state.db salience/outcome dual-read arms
23
+ * can build the fully-qualified `<bundle>//<concept-id>` new-grammar key from a
24
+ * mapped entry with ZERO extra queries (they are the last two columns and both
25
+ * nullable — a NULL-provenance write-back straggler simply yields `undefined`,
26
+ * and the reader falls through to its inline legacy `type:name` arm).
16
27
  */
17
- export const ENTRY_COLUMNS = "id, entry_key, dir_path, file_path, stash_dir, entry_json, search_text";
28
+ export const ENTRY_COLUMNS = "id, entry_key, dir_path, file_path, stash_dir, entry_json, search_text, concept_id, bundle_id";
18
29
  /**
19
30
  * Map one raw `entries` row to a {@link DbIndexedEntry}, parsing `entry_json`.
20
31
  * Returns `null` (and warns, tagged with `context`) when the JSON is corrupt so
@@ -37,5 +48,7 @@ export function rowToIndexedEntry(row, context) {
37
48
  stashDir: row.stash_dir,
38
49
  entry,
39
50
  searchText: row.search_text,
51
+ conceptId: row.concept_id ?? undefined,
52
+ bundleId: row.bundle_id ?? undefined,
40
53
  };
41
54
  }
@@ -0,0 +1,4 @@
1
+ // This Source Code Form is subject to the terms of the Mozilla Public
2
+ // License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
+ export {};
@@ -0,0 +1,164 @@
1
+ // This Source Code Form is subject to the terms of the Mozilla Public
2
+ // License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
+ /**
5
+ * `index.db` FTS5 search + rebuild repository.
6
+ *
7
+ * Owns the `entries_fts` full-text query path and the incremental/full FTS
8
+ * rebuild. Extracted verbatim from `src/indexer/db/db.ts` (WI-5a).
9
+ */
10
+ import { warn } from "../../core/warn.js";
11
+ import { buildPrefixQuery, sanitizeFtsQuery } from "../../indexer/search/fts-query.js";
12
+ import { buildSearchFields } from "../../indexer/search/search-fields.js";
13
+ import { SQLITE_CHUNK_SIZE } from "./index-sql.js";
14
+ export function searchFts(db, query, limit, entryType, excludeTypes) {
15
+ const ftsQuery = sanitizeFtsQuery(query);
16
+ if (!ftsQuery)
17
+ return [];
18
+ // Try the exact AND query first
19
+ const exactResults = runFtsQuery(db, ftsQuery, limit, entryType, excludeTypes);
20
+ if (exactResults.length > 0)
21
+ return exactResults;
22
+ // Exact match returned zero results — try prefix fallback.
23
+ // Append FTS5 `*` suffix to each token that is >= 3 characters long.
24
+ // Short tokens (1-2 chars) are excluded from prefix expansion because
25
+ // they produce too many false positives.
26
+ const prefixQuery = buildPrefixQuery(ftsQuery);
27
+ if (!prefixQuery)
28
+ return [];
29
+ return runFtsQuery(db, prefixQuery, limit, entryType, excludeTypes);
30
+ }
31
+ function runFtsQuery(db, ftsQuery, limit, entryType, excludeTypes) {
32
+ // #627 — exclude-type clause. Only applies on the untyped ('any') path; an
33
+ // explicit include filter (entryType) already narrows to a single type, so
34
+ // exclusion is redundant there. An empty list skips the clause entirely
35
+ // (never emit `NOT IN ()`, which is a SQL error / always-false).
36
+ const excludes = excludeTypes && excludeTypes.length > 0 ? excludeTypes : [];
37
+ // The typed and untyped paths differ ONLY by one WHERE clause (an entry_type
38
+ // equality vs. an optional NOT IN exclusion) and their param order — the
39
+ // SELECT/JOIN/ORDER/LIMIT is shared, so build it once. Join on integer
40
+ // entry_id directly (no CAST; we store integer). bm25() per-column weights:
41
+ // entry_id(0), name(10), description(5), tags(3), hints(2), content(1).
42
+ let filterClause;
43
+ let params;
44
+ if (entryType && entryType !== "any") {
45
+ filterClause = "AND e.entry_type = ?";
46
+ params = [ftsQuery, entryType, limit];
47
+ }
48
+ else {
49
+ filterClause = excludes.length > 0 ? `AND e.entry_type NOT IN (${excludes.map(() => "?").join(", ")})` : "";
50
+ // Param order: MATCH, then the NOT IN values, then LIMIT.
51
+ params = [ftsQuery, ...excludes, limit];
52
+ }
53
+ const sql = `
54
+ SELECT e.id, e.file_path AS filePath, e.entry_json, e.search_text AS searchText,
55
+ e.item_ref AS itemRef,
56
+ bm25(entries_fts, 0, 10.0, 5.0, 3.0, 2.0, 1.0) AS bm25Score
57
+ FROM entries_fts f
58
+ JOIN entries e ON e.id = f.entry_id
59
+ WHERE entries_fts MATCH ?
60
+ ${filterClause}
61
+ ORDER BY bm25Score, e.id ASC
62
+ LIMIT ?
63
+ `;
64
+ try {
65
+ const rows = db.prepare(sql).all(...params);
66
+ // Guard against corrupt JSON — skip the row rather than crashing
67
+ const results = [];
68
+ for (const row of rows) {
69
+ let entry;
70
+ try {
71
+ entry = JSON.parse(row.entry_json);
72
+ }
73
+ catch {
74
+ warn(`[db] searchFts: skipping entry id=${row.id} — corrupt entry_json`);
75
+ continue;
76
+ }
77
+ results.push({
78
+ id: row.id,
79
+ filePath: row.filePath,
80
+ entry,
81
+ searchText: row.searchText,
82
+ bm25Score: row.bm25Score,
83
+ itemRef: row.itemRef,
84
+ });
85
+ }
86
+ return results;
87
+ }
88
+ catch (err) {
89
+ warn("[db] runFtsQuery failed:", err instanceof Error ? err.message : String(err));
90
+ return [];
91
+ }
92
+ }
93
+ /**
94
+ * Rebuild the FTS5 search index.
95
+ *
96
+ * `incremental` (default `false`): when true, only rebuild rows that
97
+ * `upsertEntry` marked dirty since the last `rebuildFts` call. The full path
98
+ * (default) wipes `entries_fts` and re-inserts every row from `entries` —
99
+ * appropriate for `akm index --full` and version-upgrade rebuilds.
100
+ *
101
+ * Both paths are wrapped in a single transaction so the FTS table is never
102
+ * left in a half-rebuilt state.
103
+ *
104
+ * Skipped corrupt-JSON rows are aggregated into one warning instead of
105
+ * spamming stderr per-entry.
106
+ */
107
+ export function rebuildFts(db, options) {
108
+ const incremental = options?.incremental === true;
109
+ db.transaction(() => {
110
+ let rows;
111
+ if (incremental) {
112
+ // Read the dirty queue and join against entries to get the JSON.
113
+ // Then drop the matching rows from entries_fts so the INSERT below
114
+ // doesn't double-up. The dirty list is drained at the end.
115
+ rows = db
116
+ .prepare(`SELECT e.id AS id, e.entry_json AS entry_json
117
+ FROM entries_fts_dirty d
118
+ JOIN entries e ON e.id = d.entry_id`)
119
+ .all();
120
+ if (rows.length === 0)
121
+ return;
122
+ const ids = rows.map((r) => r.id);
123
+ // Delete only the dirty FTS rows — chunk to stay under
124
+ // SQLITE_MAX_VARIABLE_NUMBER on large dirty queues.
125
+ for (let i = 0; i < ids.length; i += SQLITE_CHUNK_SIZE) {
126
+ const chunk = ids.slice(i, i + SQLITE_CHUNK_SIZE);
127
+ const placeholders = chunk.map(() => "?").join(",");
128
+ db.prepare(`DELETE FROM entries_fts WHERE entry_id IN (${placeholders})`).run(...chunk);
129
+ }
130
+ }
131
+ else {
132
+ // Full path: wipe and re-read every row.
133
+ db.exec("DELETE FROM entries_fts");
134
+ rows = db.prepare("SELECT id, entry_json FROM entries").all();
135
+ }
136
+ const insertStmt = db.prepare("INSERT INTO entries_fts (entry_id, name, description, tags, hints, content) VALUES (?, ?, ?, ?, ?, ?)");
137
+ let skipped = 0;
138
+ for (const row of rows) {
139
+ let entry;
140
+ let fields;
141
+ try {
142
+ entry = JSON.parse(row.entry_json);
143
+ fields = buildSearchFields(entry);
144
+ }
145
+ catch {
146
+ skipped++;
147
+ continue;
148
+ }
149
+ insertStmt.run(row.id, fields.name, fields.description, fields.tags, fields.hints, fields.content);
150
+ }
151
+ if (skipped > 0) {
152
+ warn(`[db] rebuildFts: skipped ${skipped} entr${skipped === 1 ? "y" : "ies"} with invalid entry_json`);
153
+ }
154
+ // Always drain the dirty queue — both paths converge here. The
155
+ // incremental path drains it because we just consumed every dirty row;
156
+ // the full path drains it because a full rebuild covers everything the
157
+ // dirty list tracks. The table is guaranteed to exist (created by
158
+ // ensureSchema()).
159
+ //
160
+ // BUG-L1: previously the if/else arms ran identical statements — the
161
+ // duplication has been collapsed.
162
+ db.exec("DELETE FROM entries_fts_dirty");
163
+ })();
164
+ }
@@ -0,0 +1,109 @@
1
+ // This Source Code Form is subject to the terms of the Mozilla Public
2
+ // License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
+ /**
5
+ * `index.db` LLM enrichment-cache repository.
6
+ *
7
+ * Owns the raw SQL for `llm_enrichment_cache` — the body-hash-keyed cache that
8
+ * lets `akm index --enrich` skip the LLM call when a file's body is unchanged.
9
+ * Extracted verbatim from `src/indexer/db/db.ts` (WI-5a).
10
+ */
11
+ import { bestEffort } from "../../core/best-effort.js";
12
+ import { sha256Hex } from "../../runtime.js";
13
+ import { SQLITE_CHUNK_SIZE } from "./index-sql.js";
14
+ /**
15
+ * Look up a cached LLM result for the given asset_ref.
16
+ *
17
+ * Returns `undefined` when no entry exists OR when the stored body_hash
18
+ * doesn't match `currentBodyHash` (body has changed since the result was
19
+ * cached). In both cases the caller should invoke the LLM and write a new
20
+ * cache entry.
21
+ */
22
+ export function getLlmCacheEntry(db, assetRef, currentBodyHash, cacheVariant = "") {
23
+ const row = db
24
+ .prepare("SELECT asset_ref, cache_variant, body_hash, result_json, updated_at FROM llm_enrichment_cache WHERE asset_ref = ? AND cache_variant = ?")
25
+ .get(assetRef, cacheVariant);
26
+ if (!row)
27
+ return undefined;
28
+ // Hash mismatch → body changed, treat as cache miss.
29
+ if (row.body_hash !== currentBodyHash)
30
+ return undefined;
31
+ return {
32
+ assetRef: row.asset_ref,
33
+ cacheVariant: row.cache_variant,
34
+ bodyHash: row.body_hash,
35
+ resultJson: row.result_json,
36
+ updatedAt: row.updated_at,
37
+ };
38
+ }
39
+ /**
40
+ * Batched variant of {@link getLlmCacheEntry}. Fetches every cache row whose
41
+ * `asset_ref` is in `refs` with a single `IN (...)` query (chunked to respect
42
+ * SQLITE_MAX_VARIABLE_NUMBER), returning a `Map<assetRef, LlmCacheEntry>`.
43
+ *
44
+ * Unlike `getLlmCacheEntry`, this does NOT filter by body hash — callers must
45
+ * compare `entry.bodyHash` against the current body hash themselves. This lets
46
+ * the batch path issue one DB query per chunk instead of one per file.
47
+ */
48
+ export function getLlmCacheEntriesByRefs(db, refs, cacheVariant = "") {
49
+ const result = new Map();
50
+ if (refs.length === 0)
51
+ return result;
52
+ for (let i = 0; i < refs.length; i += SQLITE_CHUNK_SIZE) {
53
+ const chunk = refs.slice(i, i + SQLITE_CHUNK_SIZE);
54
+ const placeholders = chunk.map(() => "?").join(", ");
55
+ const rows = db
56
+ .prepare(`SELECT asset_ref, cache_variant, body_hash, result_json, updated_at FROM llm_enrichment_cache
57
+ WHERE cache_variant = ? AND asset_ref IN (${placeholders})`)
58
+ .all(cacheVariant, ...chunk);
59
+ for (const row of rows) {
60
+ result.set(row.asset_ref, {
61
+ assetRef: row.asset_ref,
62
+ cacheVariant: row.cache_variant,
63
+ bodyHash: row.body_hash,
64
+ resultJson: row.result_json,
65
+ updatedAt: row.updated_at,
66
+ });
67
+ }
68
+ }
69
+ return result;
70
+ }
71
+ /**
72
+ * Insert or update a cached LLM result for the given asset_ref.
73
+ */
74
+ export function upsertLlmCacheEntry(db, assetRef, bodyHash, resultJson, cacheVariant = "") {
75
+ db.prepare(`INSERT INTO llm_enrichment_cache (asset_ref, cache_variant, body_hash, result_json, updated_at)
76
+ VALUES (?, ?, ?, ?, ?)
77
+ ON CONFLICT(asset_ref, cache_variant) DO UPDATE SET
78
+ body_hash = excluded.body_hash,
79
+ result_json = excluded.result_json,
80
+ updated_at = excluded.updated_at`).run(assetRef, cacheVariant, bodyHash, resultJson, Date.now());
81
+ }
82
+ /**
83
+ * Delete LLM cache entries whose asset_ref is no longer present in the
84
+ * `entries` table. Should be called during the cleanup phase of each index
85
+ * run to prevent the cache from growing unboundedly as assets are removed.
86
+ *
87
+ * The join uses a LIKE match against the entries `file_path` column because
88
+ * graph/memory cache refs are absolute file paths, while enrichment cache
89
+ * refs are entry_key strings — we preserve any entry that still has a
90
+ * corresponding row in either the entries table (by entry_key) or that
91
+ * matches a live file_path.
92
+ */
93
+ export function clearStaleCacheEntries(db) {
94
+ bestEffort(() => {
95
+ db.exec(`
96
+ DELETE FROM llm_enrichment_cache
97
+ WHERE asset_ref NOT IN (SELECT file_path FROM entries)
98
+ AND asset_ref NOT IN (SELECT entry_key FROM entries)
99
+ `);
100
+ }, "llm_enrichment_cache may not exist in very old DBs opened without ensureSchema");
101
+ }
102
+ /**
103
+ * Compute a stable SHA-256 hex digest of a UTF-8 string. Used as the body_hash
104
+ * key in `llm_enrichment_cache`. Routed through the runtime boundary so the
105
+ * SQLite layer stays free of direct runtime-specific references.
106
+ */
107
+ export function computeBodyHash(body) {
108
+ return sha256Hex(body);
109
+ }
@@ -0,0 +1,50 @@
1
+ // This Source Code Form is subject to the terms of the Mozilla Public
2
+ // License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
+ /**
5
+ * `index.db` meta + per-directory index-state repository.
6
+ *
7
+ * Owns the raw SQL for `index_meta` (the key/value stamp table) and
8
+ * `index_dir_state` (incremental-index bookkeeping). Extracted verbatim from
9
+ * `src/indexer/db/db.ts` (WI-5a) so the storage layer, not the indexer god-file,
10
+ * owns these primitives.
11
+ */
12
+ import path from "node:path";
13
+ // ── Meta helpers ────────────────────────────────────────────────────────────
14
+ export function getMeta(db, key) {
15
+ const row = db.prepare("SELECT value FROM index_meta WHERE key = ?").get(key);
16
+ return row?.value;
17
+ }
18
+ export function setMeta(db, key, value) {
19
+ db.prepare("INSERT OR REPLACE INTO index_meta (key, value) VALUES (?, ?)").run(key, value);
20
+ }
21
+ // ── Per-directory index state ───────────────────────────────────────────────
22
+ export function getIndexDirState(db, dirPath) {
23
+ const row = db
24
+ .prepare("SELECT dir_path, file_set_hash, file_mtime_max_ms, reason, updated_at FROM index_dir_state WHERE dir_path = ?")
25
+ .get(dirPath);
26
+ if (!row)
27
+ return undefined;
28
+ return {
29
+ dirPath: row.dir_path,
30
+ fileSetHash: row.file_set_hash,
31
+ fileMtimeMaxMs: row.file_mtime_max_ms,
32
+ reason: row.reason,
33
+ updatedAt: row.updated_at,
34
+ };
35
+ }
36
+ export function upsertIndexDirState(db, state) {
37
+ db.prepare(`INSERT INTO index_dir_state (dir_path, file_set_hash, file_mtime_max_ms, reason, updated_at)
38
+ VALUES (?, ?, ?, ?, ?)
39
+ ON CONFLICT(dir_path) DO UPDATE SET
40
+ file_set_hash = excluded.file_set_hash,
41
+ file_mtime_max_ms = excluded.file_mtime_max_ms,
42
+ reason = excluded.reason,
43
+ updated_at = excluded.updated_at`).run(state.dirPath, state.fileSetHash, state.fileMtimeMaxMs, state.reason, new Date().toISOString());
44
+ }
45
+ export function deleteIndexDirState(db, dirPath) {
46
+ db.prepare("DELETE FROM index_dir_state WHERE dir_path = ?").run(dirPath);
47
+ }
48
+ export function deleteIndexDirStatesByStashDir(db, stashDir) {
49
+ db.prepare("DELETE FROM index_dir_state WHERE dir_path = ? OR dir_path LIKE ?").run(stashDir, `${stashDir}${path.sep}%`);
50
+ }