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
@@ -86,6 +86,7 @@ export function warnOnBundleRenameDrift(config = loadConfig()) {
86
86
  `Configured bundle(s) with no indexed content: ${configuredMissingFromIndex.map((id) => `"${id}"`).join(", ")}; ` +
87
87
  `indexed content under unconfigured bundle id(s): ${indexedNotConfigured.map((id) => `"${id}"`).join(", ")}. ` +
88
88
  "This is the signature of a hand-renamed bundle id (spec §11.5). AKM will NOT silently re-mint fresh state " +
89
- "under the new id. If you renamed a bundle, rekey it atomically via the bundle-rename command instead of " +
90
- "editing the config key directly — otherwise the old index/state rows are stranded.");
89
+ "under the new id. There is no rekey command in 0.9.0: either restore the previous bundle id in config.json " +
90
+ "to reattach the existing rows, or keep the new id and run `akm index --full` to re-mint under it, accepting " +
91
+ "that learned state (utility, salience, outcomes, usage history) keyed to the old id is left behind.");
91
92
  }
@@ -215,13 +215,6 @@ export function drainExtractionQueue(db, stashRoot, limit) {
215
215
  return [];
216
216
  }
217
217
  }
218
- /**
219
- * Scoped loader — only the graph_meta row for a stash. Used by callers that
220
- * only need summary numbers (e.g. `akm graph summary`).
221
- */
222
- export function loadGraphMetaOnly(stashPath, db) {
223
- return loadStoredGraphMeta(stashPath, db);
224
- }
225
218
  /**
226
219
  * Scoped loader — graph_files rows without entities/relations. Used for
227
220
  * orphan detection and entity overview commands.
@@ -256,23 +249,6 @@ export function loadGraphFilesOnly(stashPath, db) {
256
249
  return [];
257
250
  }
258
251
  }
259
- /**
260
- * Scoped loader — entities for a single file, keyed on the #624-P1 composite
261
- * (stash_root, file_path, body_hash). Used by per-asset show/curate lookups.
262
- */
263
- export function loadGraphEntitiesByPath(db, stashRoot, filePath, bodyHash) {
264
- try {
265
- const rows = db
266
- .prepare(`SELECT entity FROM graph_file_entities
267
- WHERE stash_root = ? AND file_path = ? AND body_hash = ?
268
- ORDER BY entity_order`)
269
- .all(stashRoot, filePath, bodyHash);
270
- return rows.map((r) => r.entity);
271
- }
272
- catch {
273
- return [];
274
- }
275
- }
276
252
  export function loadStoredGraphMeta(stashPath, db) {
277
253
  try {
278
254
  return withReadableGraphDb(db, (readDb) => {
@@ -185,6 +185,7 @@ async function runInlineReindex(stashDir, options = {}) {
185
185
  const { akmIndex } = await import("./indexer.js");
186
186
  await akmIndex({
187
187
  stashDir,
188
+ implicit: true,
188
189
  ...(options.signal ? { signal: options.signal } : {}),
189
190
  ...(options.hydrateSources === false ? { hydrateSources: false } : {}),
190
191
  });
@@ -249,12 +249,9 @@ export function collectGraphRelatedHit(context, filePath) {
249
249
  * NOT entries.id — so candidates are identified by file_path (the unique index
250
250
  * idx_graph_files_path guarantees one graph_files row per path).
251
251
  *
252
- * The returned `ref` field carries the CANONICAL asset ref resolved from the
253
- * durable identity columns (`entries.concept_id`, the bundle-less tail of
254
- * `item_ref`) when the file is indexed — NOT re-derived from the legacy
255
- * `entry_key`. Callers should fall back to formatting `path` when `ref` is
256
- * undefined (graph row with no matching entries row, or a NULL-provenance
257
- * write-back straggler healed on the next full index).
252
+ * The returned `ref` field carries the canonical indexed `concept_id`, never a
253
+ * value re-derived from presentation fields or `entry_key`. It is undefined
254
+ * when the graph row has no matching entry with current indexed provenance.
258
255
  */
259
256
  export function listRelatedPathsForFile(stashRoot, filePath, limit = 5, db) {
260
257
  if (!db) {
@@ -345,25 +342,17 @@ export function listRelatedPathsForFile(stashRoot, filePath, limit = 5, db) {
345
342
  relationCountByPath.set(row.file_path, (relationCountByPath.get(row.file_path) ?? 0) + 1);
346
343
  }
347
344
  }
348
- // Ref lookup via the CANONICAL stored identity (spec §3.3): `item_ref` is THE
349
- // durable ref (`<bundle>//<conceptId>`) and `concept_id` is its bundle-less
350
- // tail — the exact spelling displayRef emits for a default-bundle item. This
351
- // related list is always scoped to ONE stash root (every row shares a bundle),
352
- // so the user-facing ref is that short conceptId. Resolve by (concept_id /
353
- // item_ref, file_path) DIRECTLY — no entry_key→`type:name` string surgery.
354
- // A NULL-provenance write-back straggler (item_ref/concept_id still NULL)
355
- // simply carries no ref; the caller falls back to the path and the next full
356
- // index heals the row.
345
+ // This related list is scoped to one source root, so the user-facing ref is
346
+ // the indexed bundle-less conceptId.
357
347
  const refByPath = new Map();
358
348
  try {
359
349
  const entryRows = db
360
- .prepare(`SELECT file_path, concept_id, item_ref FROM entries
361
- WHERE file_path IN (${placeholders}) AND stash_dir = ?`)
350
+ .prepare(`SELECT file_path, concept_id FROM entries
351
+ WHERE file_path IN (${placeholders}) AND stash_dir = ?
352
+ AND item_ref IS NOT NULL AND concept_id IS NOT NULL`)
362
353
  .all(...candidatePaths, stashRoot);
363
354
  for (const row of entryRows) {
364
- const ref = row.concept_id ?? conceptIdFromItemRef(row.item_ref);
365
- if (ref)
366
- refByPath.set(row.file_path, ref);
355
+ refByPath.set(row.file_path, row.concept_id);
367
356
  }
368
357
  }
369
358
  catch {
@@ -382,20 +371,6 @@ export function listRelatedPathsForFile(stashRoot, filePath, limit = 5, db) {
382
371
  };
383
372
  });
384
373
  }
385
- /**
386
- * The bundle-less conceptId tail of a canonical `item_ref`
387
- * (`<bundle>//<conceptId>`), or `null` when the ref is absent. The graph-related
388
- * ref is scoped to a single stash root, so the short conceptId is the
389
- * user-facing spelling (matching displayRef's default-bundle output). The reader
390
- * prefers the stored `concept_id` column; this derives the same value from
391
- * `item_ref` when only that column is populated.
392
- */
393
- function conceptIdFromItemRef(itemRef) {
394
- if (!itemRef)
395
- return null;
396
- const boundary = itemRef.indexOf("//");
397
- return boundary >= 0 ? itemRef.slice(boundary + 2) : itemRef;
398
- }
399
374
  /**
400
375
  * Load and normalize graph data from SQLite once, then reuse it across all
401
376
  * per-entry boost lookups in the current query.
@@ -8,7 +8,7 @@
8
8
  * configured LLM to extract entities and relations from each one, and
9
9
  * persists the result to stash-local SQLite graph tables keyed by stash root.
10
10
  * The artifact is consumed by the search
11
- * pipeline (see `src/indexer/graph-boost.ts`) as a single boost component
11
+ * pipeline (see `src/indexer/graph/graph-boost.ts`) as a single boost component
12
12
  * inside the existing FTS5+boosts loop — there is NO second SearchHit
13
13
  * scorer and no parallel ranking track.
14
14
  *
@@ -31,8 +31,11 @@
31
31
  * - LLM access is exclusively via `resolveIndexPassLLM("graph", config)`.
32
32
  * - The graph rows are an indexer artifact, NOT a user-visible
33
33
  * asset. It does not have an asset ref, does not appear in search
34
- * hits, and is not addressable via `akm show`. Direct `fs.writeFile`
35
- * is therefore the correct primitive — `writeAssetToSource` is
34
+ * hits, and is not addressable via `akm show`. The persisted artifact
35
+ * lives in indexer-owned SQLite tables (`replaceStoredGraph` /
36
+ * `loadStoredGraphSnapshot` in `../db/graph-db.ts`), NOT as a file on
37
+ * disk (R-065 #3 — this comment previously described a retired
38
+ * `fs.writeFile`-based storage layout) — `writeAssetToSource` is
36
39
  * reserved for asset writes (CLAUDE.md / spec §10 step 5).
37
40
  */
38
41
  import fs from "node:fs";
@@ -470,8 +473,8 @@ export async function runGraphExtractionPass(ctx) {
470
473
  reportProgress(candidate.absPath, result);
471
474
  return result;
472
475
  },
473
- // Default concurrency of 4 for cloud APIs. Set `llm.concurrency: 1`
474
- // in config.json for local model servers (LM Studio, Ollama).
476
+ // Caller-set connection concurrency or 1: `resolveLlmEngineUse` does
477
+ // not forward `engines.<name>.concurrency`, so config cannot raise this.
475
478
  llmConfig.concurrency ?? 1);
476
479
  }
477
480
  else {
@@ -41,6 +41,24 @@ function createLease(lockPath, ownership) {
41
41
  },
42
42
  };
43
43
  }
44
+ function tryAcquireIndexWriterLease(lockPath, purpose) {
45
+ while (true) {
46
+ const releaseBarrier = tryAcquireMaintenanceBarrier();
47
+ if (!releaseBarrier)
48
+ return undefined;
49
+ try {
50
+ const ownership = tryAcquireLockSync(lockPath, buildPayload(purpose));
51
+ if (ownership)
52
+ return createLease(lockPath, ownership);
53
+ const probe = probeLock(lockPath, { staleAfterMs: INDEX_WRITER_LOCK_STALE_AFTER_MS });
54
+ if (probe.state !== "stale" || !reclaimStaleLock(lockPath, probe))
55
+ return undefined;
56
+ }
57
+ finally {
58
+ releaseBarrier();
59
+ }
60
+ }
61
+ }
44
62
  export async function acquireIndexWriterLease(options) {
45
63
  const mode = options.mode ?? "wait";
46
64
  const lockPath = getIndexWriterLockPath();
@@ -50,23 +68,10 @@ export async function acquireIndexWriterLease(options) {
50
68
  let lastWaitNoticeMs = 0;
51
69
  while (true) {
52
70
  throwIfAborted(options.signal);
53
- const releaseBarrier = tryAcquireMaintenanceBarrier();
54
- if (releaseBarrier) {
55
- try {
56
- const ownership = tryAcquireLockSync(lockPath, buildPayload(options.purpose));
57
- if (ownership) {
58
- options.onAcquired?.({ waitedMs: Date.now() - startedAt });
59
- return createLease(lockPath, ownership);
60
- }
61
- const probe = probeLock(lockPath, { staleAfterMs: INDEX_WRITER_LOCK_STALE_AFTER_MS });
62
- if (probe.state === "stale") {
63
- if (reclaimStaleLock(lockPath, probe))
64
- continue;
65
- }
66
- }
67
- finally {
68
- releaseBarrier();
69
- }
71
+ const lease = tryAcquireIndexWriterLease(lockPath, options.purpose);
72
+ if (lease) {
73
+ options.onAcquired?.({ waitedMs: Date.now() - startedAt });
74
+ return lease;
70
75
  }
71
76
  if (mode === "try")
72
77
  return undefined;
@@ -109,6 +114,37 @@ export async function withIndexWriterLease(options, run) {
109
114
  export function withAssetMutationLease(purpose, run) {
110
115
  return withIndexWriterLease({ purpose }, run);
111
116
  }
117
+ /** Synchronous asset-write boundary over the same interprocess lease. */
118
+ export function withAssetMutationLeaseSync(purpose, run) {
119
+ const lockPath = getIndexWriterLockPath();
120
+ const inherited = leaseContext.getStore();
121
+ if (inherited?.has(lockPath))
122
+ return run();
123
+ const context = inherited ?? new Set();
124
+ const execute = () => {
125
+ const startedAt = Date.now();
126
+ fs.mkdirSync(path.dirname(lockPath), { recursive: true });
127
+ let lease;
128
+ while (!lease) {
129
+ lease = tryAcquireIndexWriterLease(lockPath, purpose);
130
+ if (!lease) {
131
+ if (Date.now() - startedAt >= DEFAULT_INDEX_WRITER_MAX_WAIT_MS) {
132
+ throw new Error(`timed out waiting for index writer lease for ${purpose}`);
133
+ }
134
+ Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, INDEX_WRITER_WAIT_MS);
135
+ }
136
+ }
137
+ context.add(lockPath);
138
+ try {
139
+ return run();
140
+ }
141
+ finally {
142
+ context.delete(lockPath);
143
+ lease.release();
144
+ }
145
+ };
146
+ return inherited ? execute() : leaseContext.run(context, execute);
147
+ }
112
148
  export function probeIndexWriterLease() {
113
149
  return probeLock(getIndexWriterLockPath(), { staleAfterMs: INDEX_WRITER_LOCK_STALE_AFTER_MS });
114
150
  }
@@ -22,7 +22,6 @@
22
22
  import fs from "node:fs";
23
23
  import path from "node:path";
24
24
  import { akmAdapter } from "../core/adapter/adapters/akm-adapter.js";
25
- import { recoverTxnsForRoot } from "../core/fs-txn.js";
26
25
  import { getDbPath } from "../core/paths.js";
27
26
  import { warnVerbose } from "../core/warn.js";
28
27
  import { closeDatabase, openExistingDatabase } from "../storage/repositories/index-connection.js";
@@ -57,17 +56,12 @@ export const WRITE_PATH_INDEX_BUSY_TIMEOUT_MS = 5_000;
57
56
  export async function indexWrittenAssets(stashDir, filePaths, options = {}) {
58
57
  try {
59
58
  return await withIndexWriterLease({ purpose: "index-written-assets" }, async () => {
60
- if (options.recoverMoves !== false) {
61
- // Unified fs-txn engine (WI-6.3): finish/roll back interrupted mv
62
- // transactions before the targeted write-path refresh reads the tree.
63
- await recoverTxnsForRoot(stashDir, (journal) => journal.kind === "mv");
64
- }
65
59
  const dbPath = getDbPath();
66
60
  if (!fs.existsSync(dbPath))
67
61
  return true;
68
- // The full walk never descends into dot-directories (they hold state like
69
- // `.meta/` and the legacy metadata sidecar) — mirror that dot-segment skip
70
- // here so this fast path indexes exactly what a full run would. Sensitive/
62
+ // The full walk never descends into dot-directories (for example `.meta/`)
63
+ // — mirror that dot-segment skip here so this fast path indexes exactly
64
+ // what a full run would. Sensitive/
71
65
  // infra abstention is the adapter's job now (see the `akmAdapter` note
72
66
  // below), not a path pre-filter.
73
67
  const files = filePaths.filter((f) => {
@@ -80,12 +74,11 @@ export async function indexWrittenAssets(stashDir, filePaths, options = {}) {
80
74
  // short. One drain call per file keeps the entry↔path pairing exact and
81
75
  // reuses the full-index recognize engine (F4a M-core-2 item 5): broken
82
76
  // workflows drop, valid workflow docs are cached for the side-table upsert.
83
- const component = deriveInstallations([{ path: stashDir, writable: true }])[0]?.components[0] ?? {
84
- id: stashDir,
85
- adapter: "akm",
86
- root: stashDir,
87
- writable: true,
88
- };
77
+ const component = deriveInstallations([
78
+ { path: stashDir, writable: true, ...(options.bundleId ? { registryId: options.bundleId } : {}) },
79
+ ])[0]?.components[0];
80
+ if (!component)
81
+ throw new Error(`Could not derive bundle provenance for ${stashDir}`);
89
82
  const pairs = [];
90
83
  const unindexable = new Set();
91
84
  for (const file of files) {
@@ -96,17 +89,18 @@ export async function indexWrittenAssets(stashDir, filePaths, options = {}) {
96
89
  const ctx = buildFileContext(stashDir, file);
97
90
  // Hardcoded `akmAdapter` on purpose (owner ruling 2026-07-21): this
98
91
  // write-path fast path only ever runs for assets a first-class akm
99
- // mutation command (`remember`/`wiki`/`workflow`/`setup`/`mv`) just wrote
100
- // into the PRIMARY akm workspace, so the akm adapter is always the right
101
- // recognizer here — no per-component dispatch needed.
92
+ // mutation command just wrote into a managed akm source, so the akm
93
+ // adapter is always the right recognizer here — no per-component
94
+ // dispatch needed.
102
95
  const drained = drainDirDocuments(akmAdapter, component, [ctx]);
103
96
  const entry = drained.entries[0];
104
97
  // Workflows also carry a workflow_documents side-table upsert — handled
105
98
  // below, mirroring the full walk — since `akm mv` rewrites citer files
106
99
  // that can be workflows. A broken workflow drains to zero entries (like
107
100
  // the old skip-with-warning) and is treated as unindexable.
108
- if (entry)
109
- pairs.push({ file, entry, contentHash: drained.hashByFile.get(ctx.absPath) });
101
+ const conceptId = drained.conceptIdByFile.get(ctx.absPath);
102
+ if (entry && conceptId)
103
+ pairs.push({ file, entry, conceptId, contentHash: drained.hashByFile.get(ctx.absPath) });
110
104
  else
111
105
  unindexable.add(file);
112
106
  }
@@ -119,7 +113,7 @@ export async function indexWrittenAssets(stashDir, filePaths, options = {}) {
119
113
  const rows = db.prepare("SELECT id FROM entries WHERE file_path = ?").all(file);
120
114
  deleteEntriesByIds(db, rows.map((row) => row.id));
121
115
  }
122
- for (const { file, entry, contentHash } of pairs) {
116
+ for (const { file, entry, conceptId, contentHash } of pairs) {
123
117
  const entryKey = `${stashDir}:${entry.type}:${entry.name}`;
124
118
  let entryWithSize = entry;
125
119
  try {
@@ -131,7 +125,7 @@ export async function indexWrittenAssets(stashDir, filePaths, options = {}) {
131
125
  // Real provenance (F4a M-core-2 item 5): populate item_ref/content_hash
132
126
  // via the SAME derivation the full-index writer uses, so a write-path
133
127
  // row is never a NULL-item_ref straggler.
134
- const provenance = deriveEntryProvenance({ bundleId: component.id, componentId: component.id, adapterId: component.adapter }, entry.type, entry.name);
128
+ const provenance = deriveEntryProvenance({ bundleId: component.id, componentId: component.id, adapterId: component.adapter }, entry.type, entry.name, conceptId);
135
129
  const entryId = upsertEntry(db, entryKey, path.dirname(file), file, stashDir, entryWithSize, buildSearchText(entry), provenance, contentHash);
136
130
  if (entry.type === "workflow") {
137
131
  // Same contract as the full walk (indexer.ts): the renderer cached