akm-cli 0.9.0-rc.1 → 0.9.0-rc.13

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 (587) hide show
  1. package/CHANGELOG.md +1190 -52
  2. package/README.md +62 -37
  3. package/SECURITY.md +46 -31
  4. package/dist/akm +162 -38
  5. package/dist/akm-migrate +44 -0
  6. package/dist/assets/backends/schtasks-template.xml +2 -1
  7. package/dist/assets/hints/cli-hints-full.md +268 -118
  8. package/dist/assets/hints/cli-hints-short.md +87 -24
  9. package/dist/assets/{profiles → improve-strategies}/catchup.json +3 -1
  10. package/dist/assets/{profiles → improve-strategies}/consolidate.json +3 -1
  11. package/dist/assets/{profiles → improve-strategies}/default.json +6 -7
  12. package/dist/assets/improve-strategies/frequent.json +15 -0
  13. package/dist/assets/{profiles → improve-strategies}/graph-refresh.json +4 -2
  14. package/dist/assets/{profiles → improve-strategies}/memory-focus.json +4 -1
  15. package/dist/assets/{profiles → improve-strategies}/proactive-maintenance.json +5 -5
  16. package/dist/assets/{profiles → improve-strategies}/quick.json +4 -2
  17. package/dist/assets/improve-strategies/reflect-distill.json +30 -0
  18. package/dist/assets/{profiles → improve-strategies}/thorough.json +1 -1
  19. package/dist/assets/prompts/consolidate-system.md +5 -5
  20. package/dist/assets/prompts/extract-session.md +2 -6
  21. package/dist/assets/prompts/memory-infer-user.md +2 -3
  22. package/dist/assets/prompts/reflect-llm-framed-contract.md +11 -0
  23. package/dist/assets/prompts/reflect-llm-schema-contract.md +3 -0
  24. package/dist/assets/prompts/reflect-output-repair.md +3 -0
  25. package/dist/assets/stash-skeleton/README.md +38 -10
  26. package/dist/assets/stash-skeleton/facts/conventions/assets/agent.md +8 -0
  27. package/dist/assets/stash-skeleton/facts/conventions/assets/command.md +8 -0
  28. package/dist/assets/stash-skeleton/facts/conventions/assets/fact.md +14 -1
  29. package/dist/assets/stash-skeleton/facts/conventions/assets/knowledge.md +13 -1
  30. package/dist/assets/stash-skeleton/facts/conventions/assets/lesson.md +9 -1
  31. package/dist/assets/stash-skeleton/facts/conventions/assets/memory.md +11 -0
  32. package/dist/assets/stash-skeleton/facts/conventions/assets/script.md +9 -0
  33. package/dist/assets/stash-skeleton/facts/conventions/assets/skill.md +9 -0
  34. package/dist/assets/stash-skeleton/facts/conventions/assets/workflow.md +8 -0
  35. package/dist/assets/stash-skeleton/facts/conventions/backlinks.md +100 -0
  36. package/dist/assets/stash-skeleton/facts/conventions/domains.md +64 -0
  37. package/dist/assets/stash-skeleton/facts/conventions/organization.md +136 -0
  38. package/dist/assets/tasks/core/extract.yml +3 -2
  39. package/dist/assets/tasks/core/improve.yml +2 -1
  40. package/dist/assets/tasks/core/index-refresh.yml +1 -0
  41. package/dist/assets/tasks/core/sync.yml +1 -0
  42. package/dist/assets/tasks/core/version-check.yml +2 -1
  43. package/dist/assets/tasks/improve/akm-graph-refresh-weekly.yml +5 -0
  44. package/dist/assets/tasks/improve/akm-improve-catchup.yml +8 -0
  45. package/dist/assets/tasks/improve/akm-improve-consolidate.yml +5 -0
  46. package/dist/assets/tasks/improve/akm-improve-frequent.yml +5 -0
  47. package/dist/assets/tasks/improve/akm-improve-nightly.yml +5 -0
  48. package/dist/assets/templates/html/health.html +5 -4
  49. package/dist/assets/workflows/workflow-template.md +31 -15
  50. package/dist/cli/invocation.js +279 -0
  51. package/dist/cli/parse-args.js +5 -90
  52. package/dist/cli/retired-commands.js +78 -0
  53. package/dist/cli/shared.js +158 -48
  54. package/dist/cli-node.mjs +2 -1
  55. package/dist/cli.js +747 -293
  56. package/dist/commands/agent/agent-dispatch.js +19 -18
  57. package/dist/commands/agent/agent-support.js +0 -24
  58. package/dist/commands/agent/contribute-cli.js +43 -97
  59. package/dist/commands/completions.js +80 -23
  60. package/dist/commands/config-cli.js +44 -281
  61. package/dist/commands/env/env-binding.js +13 -9
  62. package/dist/commands/env/env-cli.js +76 -159
  63. package/dist/commands/env/env.js +12 -163
  64. package/dist/commands/env/marker-path.js +6 -0
  65. package/dist/commands/env/secret-cli.js +45 -61
  66. package/dist/commands/env/secret.js +32 -62
  67. package/dist/commands/feedback-cli.js +179 -85
  68. package/dist/commands/health/accept-rate.js +58 -0
  69. package/dist/commands/health/advisories.js +7 -8
  70. package/dist/commands/health/checks.js +279 -94
  71. package/dist/commands/health/html-report.js +197 -578
  72. package/dist/commands/health/improve-metrics.js +277 -246
  73. package/dist/commands/health/llm-usage.js +19 -19
  74. package/dist/commands/health/md-report.js +16 -7
  75. package/dist/commands/health/metrics.js +67 -32
  76. package/dist/commands/health/renderers.js +47 -0
  77. package/dist/commands/health/report-view-model.js +508 -0
  78. package/dist/commands/health/stash-exposure.js +1 -1
  79. package/dist/commands/health/surfaces.js +16 -56
  80. package/dist/commands/health/task-runs.js +3 -67
  81. package/dist/{migrate-storage-node.mjs → commands/health/types-checks.js} +1 -5
  82. package/dist/commands/health/types-improve.js +29 -0
  83. package/dist/{output/text/save.js → commands/health/types-metrics.js} +1 -2
  84. package/dist/commands/health/types-result.js +7 -0
  85. package/dist/commands/health/types-runs.js +4 -0
  86. package/dist/commands/health/types-session-log.js +4 -0
  87. package/dist/commands/health/types-windows.js +4 -0
  88. package/dist/commands/health/types.js +26 -21
  89. package/dist/commands/health/windows.js +2 -3
  90. package/dist/commands/health.js +296 -167
  91. package/dist/commands/improve/anti-collapse.js +5 -5
  92. package/dist/commands/improve/autonomy-gate.js +68 -0
  93. package/dist/commands/improve/collapse-detector.js +65 -52
  94. package/dist/commands/improve/consolidate/chunking.js +9 -7
  95. package/dist/commands/improve/consolidate/eligibility.js +1 -23
  96. package/dist/commands/improve/consolidate/merge.js +4 -0
  97. package/dist/commands/improve/consolidate.js +454 -1354
  98. package/dist/commands/improve/content-hash.js +39 -0
  99. package/dist/commands/improve/distill/content-repair.js +4 -10
  100. package/dist/commands/improve/distill/promote-memory.js +89 -64
  101. package/dist/commands/improve/distill/quality-gate.js +118 -42
  102. package/dist/commands/improve/distill-guards.js +1 -1
  103. package/dist/commands/improve/distill-promotion-policy.js +33 -888
  104. package/dist/commands/improve/distill.js +607 -363
  105. package/dist/commands/improve/eligibility.js +165 -79
  106. package/dist/commands/improve/extract-cli.js +35 -126
  107. package/dist/commands/improve/extract-prompt.js +6 -35
  108. package/dist/commands/improve/extract.js +640 -391
  109. package/dist/commands/improve/feedback-valence.js +2 -12
  110. package/dist/commands/improve/improve-cli.js +134 -135
  111. package/dist/commands/improve/improve-result-file.js +30 -50
  112. package/dist/commands/improve/improve-run-types.js +4 -0
  113. package/dist/commands/improve/improve-strategies.js +135 -0
  114. package/dist/commands/improve/improve.js +904 -701
  115. package/dist/commands/improve/locks.js +64 -111
  116. package/dist/commands/improve/loop-stages.js +1110 -923
  117. package/dist/commands/improve/memory/derived-ref.js +124 -0
  118. package/dist/commands/improve/memory/memory-belief.js +79 -7
  119. package/dist/commands/improve/memory/memory-contradiction-detect.js +49 -52
  120. package/dist/commands/improve/memory/memory-improve.js +25 -37
  121. package/dist/commands/improve/outcome-loop.js +25 -88
  122. package/dist/commands/improve/preparation.js +1034 -813
  123. package/dist/commands/improve/proactive-maintenance.js +34 -9
  124. package/dist/commands/improve/proposal-envelope.js +31 -0
  125. package/dist/commands/improve/reflect.js +983 -794
  126. package/dist/commands/improve/run-context.js +119 -0
  127. package/dist/commands/improve/salience.js +24 -127
  128. package/dist/commands/improve/session-asset.js +7 -3
  129. package/dist/commands/improve/shared.js +14 -34
  130. package/dist/commands/improve/source-identity.js +28 -0
  131. package/dist/commands/improve/triage.js +20 -17
  132. package/dist/commands/lint/base-linter.js +340 -313
  133. package/dist/commands/lint/env-key-rules.js +31 -47
  134. package/dist/commands/lint/index.js +185 -30
  135. package/dist/commands/{events.js → log.js} +28 -38
  136. package/dist/commands/migrate-cli.js +54 -0
  137. package/dist/commands/migration-tool.js +55 -0
  138. package/dist/commands/observability-cli.js +70 -208
  139. package/dist/commands/proposal/diff-format.js +50 -0
  140. package/dist/commands/proposal/drain-policies.js +0 -6
  141. package/dist/commands/proposal/drain.js +91 -40
  142. package/dist/commands/proposal/proposal-cli.js +134 -132
  143. package/dist/commands/proposal/proposal-types.js +56 -0
  144. package/dist/commands/proposal/proposal.js +83 -65
  145. package/dist/commands/proposal/propose-cli.js +88 -0
  146. package/dist/commands/proposal/propose.js +105 -88
  147. package/dist/commands/proposal/repository.js +1303 -278
  148. package/dist/commands/proposal/validators/proposal-quality-validators.js +16 -6
  149. package/dist/commands/proposal/validators/proposal-validators.js +61 -12
  150. package/dist/commands/proposal/validators/proposals.js +6 -8
  151. package/dist/commands/read/curate.js +78 -73
  152. package/dist/commands/read/knowledge.js +510 -13
  153. package/dist/commands/read/registry-search.js +2 -2
  154. package/dist/commands/read/remember-cli.js +84 -15
  155. package/dist/commands/read/search-cli.js +203 -96
  156. package/dist/commands/read/search.js +126 -94
  157. package/dist/commands/read/show.js +226 -250
  158. package/dist/commands/registry-cli.js +34 -60
  159. package/dist/commands/remember.js +18 -57
  160. package/dist/commands/sources/add-cli.js +104 -49
  161. package/dist/commands/sources/bundle-cli.js +166 -0
  162. package/dist/commands/sources/bundle-config-ops.js +63 -0
  163. package/dist/commands/sources/info.js +27 -15
  164. package/dist/commands/sources/init.js +30 -40
  165. package/dist/commands/sources/installed-stashes.js +469 -172
  166. package/dist/commands/sources/schema-repair.js +10 -9
  167. package/dist/commands/sources/self-update.js +182 -121
  168. package/dist/commands/sources/source-add.js +169 -178
  169. package/dist/commands/sources/source-clone.js +144 -41
  170. package/dist/commands/sources/source-manage.js +94 -59
  171. package/dist/commands/sources/sources-cli.js +64 -205
  172. package/dist/commands/sources/stash-cli.js +91 -54
  173. package/dist/commands/sources/stash-skeleton.js +1 -1
  174. package/dist/commands/tasks/tasks-cli.js +106 -104
  175. package/dist/commands/tasks/tasks.js +445 -262
  176. package/dist/commands/workflow-cli.js +75 -228
  177. package/dist/core/action-contributors.js +1 -1
  178. package/dist/core/activation-policy.js +49 -0
  179. package/dist/core/adapter/adapters/agent-skills-adapter.js +181 -0
  180. package/dist/core/adapter/adapters/akm-adapter.js +528 -0
  181. package/dist/core/adapter/adapters/akm-lint.js +392 -0
  182. package/dist/core/adapter/adapters/akm-metadata.js +387 -0
  183. package/dist/core/adapter/adapters/akm-task-adapter.js +149 -0
  184. package/dist/core/adapter/adapters/akm-workflow-adapter.js +180 -0
  185. package/dist/core/adapter/adapters/claude-adapter.js +61 -0
  186. package/dist/core/adapter/adapters/dotenv-adapter.js +187 -0
  187. package/dist/core/adapter/adapters/generic-files-adapter.js +119 -0
  188. package/dist/core/adapter/adapters/index.js +80 -0
  189. package/dist/core/adapter/adapters/llm-wiki-adapter.js +419 -0
  190. package/dist/core/adapter/adapters/okf-adapter.js +391 -0
  191. package/dist/core/adapter/adapters/opencode-adapter.js +68 -0
  192. package/dist/core/adapter/adapters/shared.js +286 -0
  193. package/dist/core/adapter/adapters/tool-dir-shared.js +217 -0
  194. package/dist/core/adapter/adapters/website-snapshot-adapter.js +155 -0
  195. package/dist/core/adapter/bundle-adapter.js +4 -0
  196. package/dist/core/adapter/detect-adapter.js +17 -0
  197. package/dist/core/adapter/recognize-match.js +44 -0
  198. package/dist/core/adapter/registry.js +56 -0
  199. package/dist/core/adapter/types.js +4 -0
  200. package/dist/core/asset/akm-markdown.js +30 -0
  201. package/dist/core/asset/asset-placement.js +243 -0
  202. package/dist/core/asset/asset-ref.js +110 -79
  203. package/dist/core/asset/asset-serialize.js +20 -0
  204. package/dist/core/asset/frontmatter.js +28 -12
  205. package/dist/core/asset/markdown.js +40 -51
  206. package/dist/core/asset/resolve-ref.js +274 -0
  207. package/dist/core/asset/stash-meta.js +2 -2
  208. package/dist/core/bundle-id.js +51 -0
  209. package/dist/core/common.js +281 -86
  210. package/dist/core/config/config-io.js +42 -128
  211. package/dist/core/config/config-schema.js +233 -855
  212. package/dist/core/config/config-sources.js +162 -39
  213. package/dist/core/config/config-types.js +16 -11
  214. package/dist/core/config/config-version.js +29 -0
  215. package/dist/core/config/config-walker.js +126 -37
  216. package/dist/core/config/config.js +154 -331
  217. package/dist/core/config/deep-merge.js +41 -0
  218. package/dist/core/config/engine-semantics.js +28 -0
  219. package/dist/core/config/experimental.js +21 -0
  220. package/dist/core/config/schema/embedding.js +38 -0
  221. package/dist/core/config/schema/engines.js +116 -0
  222. package/dist/core/config/schema/experimental.js +47 -0
  223. package/dist/core/config/schema/feedback.js +31 -0
  224. package/dist/core/config/schema/improve-processes.js +389 -0
  225. package/dist/core/config/schema/improve.js +94 -0
  226. package/dist/core/config/schema/index-config.js +176 -0
  227. package/dist/core/config/schema/output.js +18 -0
  228. package/dist/core/config/schema/primitives.js +94 -0
  229. package/dist/core/config/schema/search.js +30 -0
  230. package/dist/core/config/schema/setup.js +18 -0
  231. package/dist/core/config/schema/sources-bundles.js +169 -0
  232. package/dist/core/config/schema/workflow.js +29 -0
  233. package/dist/core/env-secret-ref.js +155 -20
  234. package/dist/core/errors.js +17 -15
  235. package/dist/core/events-types.js +4 -0
  236. package/dist/core/events.js +46 -128
  237. package/dist/core/extra-params.js +62 -0
  238. package/dist/core/file-change.js +17 -0
  239. package/dist/core/file-lock.js +202 -57
  240. package/dist/core/fs-txn.js +392 -0
  241. package/dist/core/git-message.js +59 -0
  242. package/dist/core/improve-result.js +167 -0
  243. package/dist/core/lesson-lint.js +1 -17
  244. package/dist/core/logs-db.js +1 -1
  245. package/dist/core/maintenance-barrier.js +135 -0
  246. package/dist/core/migration-operation.js +44 -0
  247. package/dist/core/mutation-target.js +78 -0
  248. package/dist/core/paths.js +22 -25
  249. package/dist/core/platform.js +10 -0
  250. package/dist/core/recognition-util.js +128 -0
  251. package/dist/core/redaction.js +392 -0
  252. package/dist/core/standards/resolve-standards-context.js +36 -65
  253. package/dist/core/standards/resolve-stash-standards.js +2 -2
  254. package/dist/core/standards/resolve-type-conventions.js +5 -5
  255. package/dist/core/state/migrations.js +242 -11
  256. package/dist/core/state-db.js +98 -10
  257. package/dist/core/structured.js +1 -1
  258. package/dist/core/subprocess.js +303 -0
  259. package/dist/core/text-truncation.js +9 -5
  260. package/dist/core/time.js +20 -0
  261. package/dist/core/type-presentation.js +130 -0
  262. package/dist/core/warn.js +0 -3
  263. package/dist/core/write-source.js +834 -118
  264. package/dist/indexer/bundle-identity-guard.js +92 -0
  265. package/dist/indexer/db/graph-db.js +1 -25
  266. package/dist/indexer/db/llm-cache.js +1 -1
  267. package/dist/indexer/ensure-index.js +30 -9
  268. package/dist/indexer/graph/graph-boost.js +9 -30
  269. package/dist/indexer/graph/graph-extraction.js +41 -27
  270. package/dist/indexer/graph/graph-types.js +4 -0
  271. package/dist/indexer/index-writer-lock.js +93 -49
  272. package/dist/indexer/index-written-assets.js +100 -53
  273. package/dist/indexer/indexer.js +746 -329
  274. package/dist/indexer/init.js +18 -25
  275. package/dist/indexer/installations.js +142 -0
  276. package/dist/indexer/passes/dir-staleness.js +18 -10
  277. package/dist/indexer/passes/memory-inference.js +25 -15
  278. package/dist/indexer/passes/metadata.js +412 -243
  279. package/dist/indexer/scan/doc-to-entry.js +160 -0
  280. package/dist/indexer/scan/drain-dir.js +134 -0
  281. package/dist/indexer/search/db-search.js +292 -108
  282. package/dist/indexer/search/fts-query.js +64 -0
  283. package/dist/indexer/search/ranking-contributors.js +145 -25
  284. package/dist/indexer/search/ranking-types.js +4 -0
  285. package/dist/indexer/search/ranking.js +28 -71
  286. package/dist/indexer/search/search-attribution.js +67 -0
  287. package/dist/indexer/search/search-fields.js +18 -3
  288. package/dist/indexer/search/search-hit-enrichers.js +30 -40
  289. package/dist/indexer/search/search-source.js +157 -111
  290. package/dist/indexer/search/semantic-status.js +4 -1
  291. package/dist/indexer/usage/usage-events.js +10 -30
  292. package/dist/indexer/walk/file-context.js +3 -45
  293. package/dist/indexer/walk/matchers.js +42 -73
  294. package/dist/indexer/walk/path-resolver.js +11 -5
  295. package/dist/indexer/walk/walker.js +42 -14
  296. package/dist/integrations/agent/builder-shared.js +7 -0
  297. package/dist/integrations/agent/builders.js +5 -58
  298. package/dist/integrations/agent/config.js +3 -143
  299. package/dist/integrations/agent/detect.js +17 -2
  300. package/dist/integrations/agent/engine-resolution.js +231 -0
  301. package/dist/integrations/agent/index.js +1 -2
  302. package/dist/integrations/agent/model-aliases.js +8 -3
  303. package/dist/integrations/agent/profiles.js +6 -99
  304. package/dist/integrations/agent/prompts.js +46 -18
  305. package/dist/integrations/agent/runner-dispatch.js +78 -13
  306. package/dist/integrations/agent/runner.js +76 -208
  307. package/dist/integrations/agent/spawn.js +48 -279
  308. package/dist/integrations/harnesses/aider/agent-builder.js +9 -8
  309. package/dist/integrations/harnesses/aider/index.js +2 -12
  310. package/dist/integrations/harnesses/amazonq/agent-builder.js +10 -16
  311. package/dist/integrations/harnesses/amazonq/index.js +3 -17
  312. package/dist/integrations/harnesses/claude/agent-builder.js +2 -3
  313. package/dist/integrations/harnesses/claude/config-import.js +1 -3
  314. package/dist/integrations/harnesses/claude/index.js +1 -14
  315. package/dist/integrations/harnesses/claude/session-log.js +27 -75
  316. package/dist/integrations/harnesses/codex/agent-builder.js +8 -7
  317. package/dist/integrations/harnesses/codex/index.js +2 -13
  318. package/dist/integrations/harnesses/copilot/agent-builder.js +9 -9
  319. package/dist/integrations/harnesses/copilot/index.js +1 -13
  320. package/dist/integrations/harnesses/gemini/agent-builder.js +8 -9
  321. package/dist/integrations/harnesses/gemini/index.js +1 -13
  322. package/dist/integrations/harnesses/ids.js +24 -0
  323. package/dist/integrations/harnesses/index.js +31 -33
  324. package/dist/integrations/harnesses/opencode/agent-builder.js +23 -5
  325. package/dist/integrations/harnesses/opencode/config-import.js +1 -3
  326. package/dist/integrations/harnesses/opencode/index.js +1 -18
  327. package/dist/integrations/harnesses/opencode/session-log.js +67 -125
  328. package/dist/integrations/harnesses/opencode-sdk/harness.js +3 -17
  329. package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +274 -191
  330. package/dist/integrations/harnesses/openhands/agent-builder.js +12 -10
  331. package/dist/integrations/harnesses/openhands/index.js +2 -12
  332. package/dist/integrations/harnesses/pi/agent-builder.js +11 -18
  333. package/dist/integrations/harnesses/pi/index.js +3 -16
  334. package/dist/integrations/harnesses/shared.js +17 -0
  335. package/dist/integrations/harnesses/types.js +38 -34
  336. package/dist/integrations/lockfile.js +211 -24
  337. package/dist/integrations/session-logs/index.js +24 -40
  338. package/dist/integrations/session-logs/provider-base.js +113 -0
  339. package/dist/llm/client.js +182 -110
  340. package/dist/llm/embedders/deterministic.js +2 -2
  341. package/dist/llm/embedders/remote.js +21 -9
  342. package/dist/llm/feature-gate.js +17 -57
  343. package/dist/llm/graph-extract.js +12 -13
  344. package/dist/llm/index-passes.js +8 -42
  345. package/dist/llm/memory-infer.js +144 -1
  346. package/dist/llm/metadata-enhance.js +45 -30
  347. package/dist/llm/structured-call.js +16 -8
  348. package/dist/llm/usage-persist.js +30 -5
  349. package/dist/llm/usage-telemetry.js +59 -6
  350. package/dist/output/cli-hints.js +1 -2
  351. package/dist/output/command-registry.js +27 -0
  352. package/dist/output/context.js +22 -7
  353. package/dist/output/format-exempt.js +80 -0
  354. package/dist/output/generic-render.js +251 -0
  355. package/dist/output/html-render.js +11 -16
  356. package/dist/output/render-registry.js +57 -0
  357. package/dist/output/renderers.js +15 -281
  358. package/dist/output/shapes/curate.js +10 -1
  359. package/dist/output/shapes/events.js +12 -7
  360. package/dist/output/shapes/helpers.js +58 -84
  361. package/dist/output/shapes/passthrough.js +8 -40
  362. package/dist/output/shapes/proposal/producer.js +15 -7
  363. package/dist/output/shapes/registry.js +12 -6
  364. package/dist/output/shapes.js +0 -9
  365. package/dist/output/text/{init.js → bundle-create.js} +3 -1
  366. package/dist/output/text/bundle-show.js +7 -0
  367. package/dist/output/text/command-format.js +562 -0
  368. package/dist/output/text/env.js +1 -3
  369. package/dist/output/text/events.js +8 -7
  370. package/dist/output/text/helpers.js +15 -1375
  371. package/dist/output/text/proposal/producer.js +4 -2
  372. package/dist/output/text/proposal-format.js +202 -0
  373. package/dist/output/text/registry-commands.js +1 -2
  374. package/dist/output/text/registry.js +12 -6
  375. package/dist/output/text/show-directives.js +117 -0
  376. package/dist/output/text/show-format.js +103 -0
  377. package/dist/output/text/sync.js +5 -0
  378. package/dist/output/text/workflow-format.js +332 -0
  379. package/dist/output/text/workflow.js +1 -2
  380. package/dist/output/text.js +10 -19
  381. package/dist/registry/factory.js +4 -6
  382. package/dist/registry/origin-resolve.js +16 -27
  383. package/dist/registry/providers/skills-sh.js +3 -3
  384. package/dist/registry/providers/static-index.js +15 -25
  385. package/dist/registry/resolve.js +43 -94
  386. package/dist/registry/semver.js +43 -0
  387. package/dist/runtime.js +81 -12
  388. package/dist/scripts/akm-migrate.js +35529 -0
  389. package/dist/setup/detect.js +5 -7
  390. package/dist/setup/detected-engines.js +136 -0
  391. package/dist/setup/engine-config.js +100 -0
  392. package/dist/setup/registry-stash-loader.js +3 -3
  393. package/dist/setup/semantic-assets.js +12 -9
  394. package/dist/setup/setup.js +444 -208
  395. package/dist/setup/steps/connection-shared.js +120 -0
  396. package/dist/setup/steps/connection.js +108 -305
  397. package/dist/setup/steps/platforms.js +13 -12
  398. package/dist/setup/steps/semantic.js +15 -3
  399. package/dist/setup/steps/sources.js +21 -15
  400. package/dist/setup/steps/stashdir.js +6 -4
  401. package/dist/setup/steps/tasks.js +236 -119
  402. package/dist/setup/steps.js +3 -2
  403. package/dist/sources/freshness.js +39 -0
  404. package/dist/sources/provider-factory.js +11 -17
  405. package/dist/sources/providers/filesystem.js +2 -3
  406. package/dist/sources/providers/git-install.js +278 -34
  407. package/dist/sources/providers/git-provider.js +54 -56
  408. package/dist/sources/providers/git-stash.js +420 -91
  409. package/dist/sources/providers/git.js +2 -2
  410. package/dist/sources/providers/npm.js +16 -19
  411. package/dist/sources/providers/provider-utils.js +47 -22
  412. package/dist/sources/providers/sync-from-ref.js +3 -9
  413. package/dist/sources/providers/website.js +2 -2
  414. package/dist/sources/resolve.js +11 -10
  415. package/dist/sources/snapshot-fetchers/types.js +4 -0
  416. package/dist/sources/{website-ingest.js → snapshot-fetchers/website-ingest.js} +110 -41
  417. package/dist/storage/database.js +60 -4
  418. package/dist/storage/engines/sqlite-migrations.js +156 -5
  419. package/dist/storage/locations.js +1 -2
  420. package/dist/storage/repositories/canaries-repository.js +1 -1
  421. package/dist/storage/repositories/events-repository.js +51 -11
  422. package/dist/storage/repositories/improve-runs-repository.js +6 -32
  423. package/dist/storage/repositories/index-connection.js +79 -0
  424. package/dist/storage/repositories/index-db.js +4 -3
  425. package/dist/storage/repositories/index-entries-repository.js +863 -0
  426. package/dist/{indexer/db/entry-mapper.js → storage/repositories/index-entry-mapper.js} +19 -2
  427. package/dist/storage/repositories/index-entry-types.js +4 -0
  428. package/dist/storage/repositories/index-fts-repository.js +167 -0
  429. package/dist/storage/repositories/index-llm-cache-repository.js +108 -0
  430. package/dist/storage/repositories/index-meta-repository.js +49 -0
  431. package/dist/{indexer/db/schema.js → storage/repositories/index-schema.js} +226 -100
  432. package/dist/storage/repositories/index-sql.js +12 -0
  433. package/dist/storage/repositories/index-utility-repository.js +356 -0
  434. package/dist/storage/repositories/index-vec-repository.js +250 -0
  435. package/dist/storage/repositories/outcome-repository.js +119 -0
  436. package/dist/storage/repositories/proposals-repository.js +317 -75
  437. package/dist/storage/repositories/registry-cache.js +1 -1
  438. package/dist/storage/repositories/salience-repository.js +172 -0
  439. package/dist/storage/repositories/task-history-repository.js +110 -3
  440. package/dist/storage/repositories/workflow-runs-repository.js +68 -35
  441. package/dist/tasks/backends/cron.js +169 -46
  442. package/dist/tasks/backends/exec-utils.js +76 -3
  443. package/dist/tasks/backends/index.js +6 -9
  444. package/dist/tasks/backends/launchd.js +292 -55
  445. package/dist/tasks/backends/schtasks.js +557 -70
  446. package/dist/tasks/backends/types.js +4 -0
  447. package/dist/tasks/command-executable.js +93 -0
  448. package/dist/tasks/embedded.js +56 -38
  449. package/dist/tasks/parser.js +156 -64
  450. package/dist/tasks/resolve-akm-bin.js +144 -51
  451. package/dist/tasks/runner.js +377 -209
  452. package/dist/tasks/schedule.js +108 -19
  453. package/dist/tasks/scheduler-invocation.js +296 -0
  454. package/dist/tasks/schema.js +1 -1
  455. package/dist/tasks/task-id.js +35 -0
  456. package/dist/tasks/validator.js +30 -16
  457. package/dist/workflows/authoring/authoring.js +96 -148
  458. package/dist/workflows/authoring/scope-key.js +1 -1
  459. package/dist/workflows/cli.js +0 -20
  460. package/dist/workflows/concurrency-policy.js +15 -0
  461. package/dist/workflows/exec/brief.js +25 -59
  462. package/dist/workflows/exec/frozen-judge.js +47 -0
  463. package/dist/workflows/exec/native-executor.js +157 -94
  464. package/dist/workflows/exec/report.js +365 -200
  465. package/dist/workflows/exec/run-workflow.js +46 -40
  466. package/dist/workflows/exec/scheduler.js +12 -41
  467. package/dist/workflows/exec/step-work.js +239 -205
  468. package/dist/workflows/exec/workflow-engine-gate.js +67 -0
  469. package/dist/workflows/ir/compile.js +141 -283
  470. package/dist/workflows/ir/freeze.js +233 -0
  471. package/dist/workflows/ir/plan-hash.js +40 -5
  472. package/dist/workflows/ir/schema.js +537 -1
  473. package/dist/workflows/parser.js +878 -306
  474. package/dist/workflows/program/expressions.js +20 -208
  475. package/dist/workflows/program/schema.js +7 -10
  476. package/dist/workflows/renderer.js +99 -121
  477. package/dist/workflows/resource-limits.js +22 -0
  478. package/dist/workflows/runtime/checkin.js +1 -1
  479. package/dist/workflows/runtime/plan-classifier.js +131 -0
  480. package/dist/workflows/runtime/runs.js +200 -113
  481. package/dist/workflows/runtime/unit-checkin.js +1 -1
  482. package/dist/workflows/runtime/unit-phases.js +20 -0
  483. package/dist/workflows/runtime/workflow-asset-loader.js +235 -97
  484. package/dist/workflows/schema.js +1 -11
  485. package/dist/workflows/validate-summary.js +4 -26
  486. package/dist/workflows/validator.js +52 -30
  487. package/docs/README.md +42 -78
  488. package/docs/migration/README.md +8 -0
  489. package/docs/migration/release-notes/0.6.0.md +1 -1
  490. package/docs/migration/release-notes/0.7.0.md +9 -8
  491. package/docs/migration/release-notes/0.9.0.md +158 -14
  492. package/docs/migration/v0.7-to-v0.8.md +46 -47
  493. package/docs/migration/v0.8-to-v0.9.md +844 -0
  494. package/docs/reference/README.md +12 -0
  495. package/docs/reference/data-and-telemetry.md +333 -0
  496. package/package.json +21 -17
  497. package/schemas/akm-asset-envelope.json +93 -0
  498. package/schemas/akm-config.json +4636 -0
  499. package/schemas/akm-task.json +87 -0
  500. package/{dist/schemas → schemas}/akm-workflow.json +127 -82
  501. package/dist/akm-migrate-storage +0 -38
  502. package/dist/assets/help/help-accept.md +0 -12
  503. package/dist/assets/help/help-improve.md +0 -84
  504. package/dist/assets/help/help-proposals.md +0 -17
  505. package/dist/assets/help/help-propose.md +0 -17
  506. package/dist/assets/help/help-reject.md +0 -11
  507. package/dist/assets/profiles/frequent.json +0 -13
  508. package/dist/assets/profiles/recombine-only.json +0 -21
  509. package/dist/assets/profiles/reflect-distill.json +0 -30
  510. package/dist/assets/profiles/synthesize.json +0 -15
  511. package/dist/assets/prompts/procedural-system.md +0 -44
  512. package/dist/assets/prompts/recombine-system.md +0 -40
  513. package/dist/assets/prompts/staleness-detect-system.md +0 -6
  514. package/dist/assets/tasks/core/backup.yml +0 -4
  515. package/dist/assets/tasks/graph-refresh-weekly.yml +0 -10
  516. package/dist/assets/templates/html/default.html +0 -78
  517. package/dist/assets/templates/html/vendor/echarts.min.js +0 -45
  518. package/dist/assets/wiki/index-template.md +0 -12
  519. package/dist/assets/wiki/ingest-workflow-template.md +0 -83
  520. package/dist/assets/wiki/log-template.md +0 -8
  521. package/dist/assets/wiki/schema-template.md +0 -61
  522. package/dist/cli/config-migrate.js +0 -150
  523. package/dist/cli/config-validate.js +0 -39
  524. package/dist/commands/graph/graph-cli.js +0 -124
  525. package/dist/commands/graph/graph.js +0 -487
  526. package/dist/commands/improve/calibration.js +0 -161
  527. package/dist/commands/improve/dedup.js +0 -482
  528. package/dist/commands/improve/extract-watch.js +0 -140
  529. package/dist/commands/improve/hot-probation.js +0 -45
  530. package/dist/commands/improve/improve-auto-accept.js +0 -276
  531. package/dist/commands/improve/improve-profiles.js +0 -168
  532. package/dist/commands/improve/procedural.js +0 -398
  533. package/dist/commands/improve/recombine.js +0 -818
  534. package/dist/commands/improve/schema-similarity-gate.js +0 -168
  535. package/dist/commands/lint/agent-linter.js +0 -44
  536. package/dist/commands/lint/command-linter.js +0 -44
  537. package/dist/commands/lint/default-linter.js +0 -16
  538. package/dist/commands/lint/fact-linter.js +0 -39
  539. package/dist/commands/lint/knowledge-linter.js +0 -16
  540. package/dist/commands/lint/memory-linter.js +0 -61
  541. package/dist/commands/lint/registry.js +0 -41
  542. package/dist/commands/lint/skill-linter.js +0 -45
  543. package/dist/commands/lint/task-linter.js +0 -50
  544. package/dist/commands/lint/workflow-linter.js +0 -81
  545. package/dist/commands/proposal/legacy-import.js +0 -115
  546. package/dist/commands/sources/history.js +0 -196
  547. package/dist/commands/tasks/default-tasks.js +0 -186
  548. package/dist/commands/wiki-cli.js +0 -292
  549. package/dist/core/asset/asset-registry.js +0 -76
  550. package/dist/core/asset/asset-spec.js +0 -316
  551. package/dist/core/config/config-migration.js +0 -602
  552. package/dist/core/deep-merge.js +0 -38
  553. package/dist/core/eval/rank-metrics.js +0 -113
  554. package/dist/core/ripgrep/install.js +0 -163
  555. package/dist/core/ripgrep/resolve.js +0 -81
  556. package/dist/indexer/db/db.js +0 -1414
  557. package/dist/indexer/manifest.js +0 -170
  558. package/dist/indexer/passes/metadata-contributors.js +0 -31
  559. package/dist/indexer/usage/unmigrated-vaults-guard.js +0 -94
  560. package/dist/integrations/harnesses/opencode-sdk/index.js +0 -25
  561. package/dist/llm/call-ai.js +0 -62
  562. package/dist/llm/memory-infer-impl.js +0 -138
  563. package/dist/output/shapes/distill.js +0 -14
  564. package/dist/output/shapes/history.js +0 -11
  565. package/dist/output/text/distill.js +0 -6
  566. package/dist/output/text/enable-disable.js +0 -8
  567. package/dist/output/text/history.js +0 -6
  568. package/dist/output/text/wiki.js +0 -16
  569. package/dist/registry/build-index.js +0 -386
  570. package/dist/schemas/akm-config.json +0 -14225
  571. package/dist/scripts/migrate-storage.js +0 -13169
  572. package/dist/scripts/migrations/import-fs-improve-runs-to-db.js +0 -10169
  573. package/dist/scripts/migrations/v16-to-v17.js +0 -141
  574. package/dist/setup/legacy-config.js +0 -106
  575. package/dist/storage/repositories/consolidation-repository.js +0 -38
  576. package/dist/storage/repositories/recombine-repository.js +0 -213
  577. package/dist/wiki/wiki-templates.js +0 -15
  578. package/dist/wiki/wiki.js +0 -1012
  579. package/dist/workflows/authoring/workflow-program-template.yaml +0 -31
  580. package/dist/workflows/db.js +0 -350
  581. package/dist/workflows/exec/watch.js +0 -116
  582. package/dist/workflows/program/parser.js +0 -760
  583. package/dist/workflows/program/project.js +0 -105
  584. package/docs/data-and-telemetry.md +0 -227
  585. package/docs/migration/release-notes/0.9.0-beta.60.md +0 -19
  586. /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/registry.js +0 -0
  587. /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/youtube.js +0 -0
@@ -0,0 +1,166 @@
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
+ * `akm bundle` command group — 0.9 CLI overhaul (S7).
6
+ *
7
+ * Consolidates the five former top-level bundle-lifecycle commands under one
8
+ * group, hard break, no alias kept at the top level:
9
+ * - `create` (= old top-level `init`, src/commands/sources/init.ts)
10
+ * - `add` (= old top-level `add`, src/commands/sources/add-cli.ts — the
11
+ * command definition moved here; `add-cli.ts` keeps its exported helpers,
12
+ * including `auditInstalledStashForDangerousKeys`, which a test imports
13
+ * directly)
14
+ * - `list` (= old top-level `list`)
15
+ * - `remove` (= old top-level `remove`)
16
+ * - `update` (= old top-level `update`)
17
+ * - `show <name>` — NEW: a single-bundle detail view of the `list` payload.
18
+ *
19
+ * `add`/`list`/`remove`/`update` are pure relocations (payload and output
20
+ * shape unchanged: `SourceEntry`/`RemoveResponse`/`UpdateResponse` keep their
21
+ * bare `add`/`list`/`remove`/`update` output shape). `create` is a genuine
22
+ * verb rename (was `init`), so its output shape is renamed to `bundle-create`
23
+ * to match (the same convention S8 used for `propose` -> `proposal new`'s
24
+ * `proposal-new` shape). `show` is a new shape, `bundle-show`.
25
+ */
26
+ import { defineGroupCommand, defineJsonCommand, output } from "../../cli/shared.js";
27
+ import { NotFoundError, UsageError } from "../../core/errors.js";
28
+ import { appendEvent } from "../../core/events.js";
29
+ import { addCommand } from "./add-cli.js";
30
+ import { akmInit } from "./init.js";
31
+ import { akmListSources, akmRemove, akmUpdate } from "./installed-stashes.js";
32
+ const VALID_SOURCE_KINDS = new Set(["filesystem", "git", "npm", "website"]);
33
+ function parseKindFilter(raw) {
34
+ if (!raw)
35
+ return undefined;
36
+ const kinds = raw.split(",").map((s) => s.trim());
37
+ for (const k of kinds) {
38
+ if (!VALID_SOURCE_KINDS.has(k)) {
39
+ throw new UsageError(`Invalid --kind value: "${k}". Expected one of: filesystem, git, npm, website`);
40
+ }
41
+ }
42
+ return kinds;
43
+ }
44
+ const createCommand = defineJsonCommand({
45
+ meta: {
46
+ name: "create",
47
+ description: "Initialize akm's working bundle directory and persist it in config",
48
+ },
49
+ args: {
50
+ dir: { type: "string", description: "Custom bundle directory path (default: ~/akm)" },
51
+ "set-default": {
52
+ type: "boolean",
53
+ description: "Make --dir the default bundle. Without this, `akm bundle create --dir X` scaffolds X but leaves your existing default bundle unchanged.",
54
+ default: false,
55
+ },
56
+ },
57
+ async run({ args }) {
58
+ const result = await akmInit({
59
+ dir: args.dir,
60
+ setDefault: args["set-default"],
61
+ });
62
+ output("bundle-create", result);
63
+ },
64
+ });
65
+ const listCommand = defineJsonCommand({
66
+ meta: { name: "list", description: "List configured bundles and their resolved source state" },
67
+ args: {
68
+ kind: {
69
+ type: "string",
70
+ description: "Filter by source provider (filesystem, git, npm, website). Comma-separated.",
71
+ },
72
+ },
73
+ async run({ args }) {
74
+ const kind = parseKindFilter(args.kind);
75
+ const result = await akmListSources({ kind });
76
+ output("list", result);
77
+ },
78
+ });
79
+ const showCommand = defineJsonCommand({
80
+ meta: { name: "show", description: "Show detail for a single configured bundle" },
81
+ args: {
82
+ name: { type: "positional", description: "Bundle name (as reported by `akm bundle list`)", required: true },
83
+ },
84
+ async run({ args }) {
85
+ const { sources } = await akmListSources();
86
+ const entry = sources.find((s) => s.name === args.name);
87
+ if (!entry) {
88
+ throw new NotFoundError(`No configured bundle named "${args.name}"`, "SOURCE_NOT_FOUND");
89
+ }
90
+ output("bundle-show", entry);
91
+ },
92
+ });
93
+ const removeCommand = defineJsonCommand({
94
+ meta: { name: "remove", description: "Remove a bundle by id, ref, path, URL, or name" },
95
+ args: {
96
+ target: { type: "positional", description: "Bundle to remove (id, ref, path, URL, or name)", required: true },
97
+ yes: { type: "boolean", alias: "y", description: "Skip confirmation prompt", default: false },
98
+ },
99
+ async run({ args }) {
100
+ const { confirmDestructive } = await import("../../cli/confirm.js");
101
+ const confirmed = await confirmDestructive(`Remove bundle "${args.target}"? This cannot be undone.`, {
102
+ yes: args.yes === true,
103
+ });
104
+ if (!confirmed) {
105
+ process.stderr.write("Aborted.\n");
106
+ return;
107
+ }
108
+ const result = await akmRemove({ target: args.target });
109
+ appendEvent({
110
+ eventType: "remove",
111
+ metadata: {
112
+ target: args.target,
113
+ ref: typeof result.removed?.ref === "string" ? result.removed.ref : null,
114
+ id: typeof result.removed?.id === "string" ? result.removed.id : null,
115
+ },
116
+ });
117
+ output("remove", result);
118
+ },
119
+ });
120
+ const updateCommand = defineJsonCommand({
121
+ meta: { name: "update", description: "Update one or all managed bundles" },
122
+ args: {
123
+ target: { type: "positional", description: "Bundle to update (id or ref)", required: false },
124
+ all: { type: "boolean", description: "Update all installed entries", default: false },
125
+ force: { type: "boolean", description: "Force fresh download even if version is unchanged", default: false },
126
+ // F1/R-058: gates ONLY the rare branch where the resolved content
127
+ // directory moves and the previous `localRoot` is deleted — a normal
128
+ // refresh (the overwhelming majority of updates) deletes nothing and
129
+ // never consults this flag. Mirrors `remove`'s `-y/--yes`.
130
+ yes: {
131
+ type: "boolean",
132
+ alias: "y",
133
+ description: "Skip the confirmation prompt when an update needs to delete a previous install directory (because the resolved content location moved). No effect on a normal refresh, which deletes nothing.",
134
+ default: false,
135
+ },
136
+ },
137
+ async run({ args }) {
138
+ const result = await akmUpdate({ target: args.target, all: args.all, force: args.force, yes: args.yes });
139
+ appendEvent({
140
+ eventType: "update",
141
+ metadata: {
142
+ target: args.target ?? null,
143
+ all: args.all === true,
144
+ force: args.force === true,
145
+ processed: Array.isArray(result.processed)
146
+ ? result.processed.length
147
+ : 0,
148
+ },
149
+ });
150
+ output("update", result);
151
+ },
152
+ });
153
+ export const bundleCommand = defineGroupCommand({
154
+ meta: {
155
+ name: "bundle",
156
+ description: "Create, add to, inspect, and manage your bundles (working bundle + configured sources)",
157
+ },
158
+ subCommands: {
159
+ create: createCommand,
160
+ add: addCommand,
161
+ list: listCommand,
162
+ show: showCommand,
163
+ remove: removeCommand,
164
+ update: updateCommand,
165
+ },
166
+ });
@@ -0,0 +1,63 @@
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
+ * Bundle-map config write helpers (0.9.0 config-shape cutover, spec §10.1).
6
+ *
7
+ * The `stashDir`/`sources[]`/`installed[]` trio is retired: every source is now
8
+ * a `bundles.<slug>` entry, and the primary working stash is the `defaultBundle`.
9
+ * These helpers give the source writers (`akm bundle create`, `akm setup`, `akm bundle add`,
10
+ * `akm sources add/remove`) one place to derive slug-legal bundle keys (via the
11
+ * shared {@link deriveBundleId} — D-R5), locate an existing bundle by its source
12
+ * descriptor, and set/repoint the primary bundle — without duplicating the
13
+ * keying rules across call sites.
14
+ */
15
+ import path from "node:path";
16
+ import { primaryBundlePath } from "../../core/config/config.js";
17
+ import { deriveBundleId } from "../../indexer/installations.js";
18
+ export { primaryBundlePath };
19
+ /**
20
+ * Upsert the primary filesystem bundle (`{ path, writable: true }`) and point
21
+ * `defaultBundle` at it. Reuses the current default key when it already names a
22
+ * filesystem bundle (so re-pointing the primary keeps a stable id); otherwise
23
+ * derives a fresh slug-legal key from the path.
24
+ */
25
+ export function withPrimaryBundle(config, stashDir) {
26
+ const bundles = { ...(config.bundles ?? {}) };
27
+ let key = config.defaultBundle;
28
+ if (!key || !(key in bundles) || typeof bundles[key]?.path !== "string") {
29
+ key = deriveBundleId(undefined, stashDir, new Set(Object.keys(bundles)));
30
+ }
31
+ bundles[key] = {
32
+ ...bundles[key],
33
+ path: stashDir,
34
+ writable: true,
35
+ components: { main: { root: ".", adapter: "akm", writable: true } },
36
+ };
37
+ return { ...config, bundles, defaultBundle: key };
38
+ }
39
+ /** Existing bundle key whose filesystem descriptor resolves to `resolvedPath`, or `undefined`. */
40
+ export function bundleKeyForPath(config, resolvedPath) {
41
+ for (const [key, bundle] of Object.entries(config.bundles ?? {})) {
42
+ if (typeof bundle.path === "string" && path.resolve(bundle.path) === resolvedPath)
43
+ return key;
44
+ }
45
+ return undefined;
46
+ }
47
+ /** Existing bundle key whose git/website/npm descriptor matches `url`, or `undefined`. */
48
+ export function bundleKeyForUrl(config, url) {
49
+ for (const [key, bundle] of Object.entries(config.bundles ?? {})) {
50
+ if (bundle.git === url || bundle.website?.url === url || bundle.npm === url)
51
+ return key;
52
+ }
53
+ return undefined;
54
+ }
55
+ /**
56
+ * Derive a slug-legal, batch-unique bundle key for a new source: prefer the
57
+ * caller's `preferredName` when it is a legal slug, else slug the seed locator
58
+ * (path/url) — the shared {@link deriveBundleId} rule (D-R5), made unique against
59
+ * the currently-configured bundle keys.
60
+ */
61
+ export function nextBundleKey(bundles, preferredName, seedLocator) {
62
+ return deriveBundleId(preferredName, seedLocator, new Set(Object.keys(bundles)));
63
+ }
@@ -2,11 +2,16 @@
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
  import fs from "node:fs";
5
- import { getAssetTypes } from "../../core/asset/asset-spec.js";
5
+ import { placementTypes } from "../../core/asset/asset-placement.js";
6
+ import { resolveStashDir } from "../../core/common.js";
6
7
  import { getSources, loadConfig } from "../../core/config/config.js";
7
8
  import { getDbPath } from "../../core/paths.js";
8
- import { closeDatabase, getEntryCount, getMeta, isVecAvailable, openExistingDatabase } from "../../indexer/db/db.js";
9
+ import { error } from "../../core/warn.js";
9
10
  import { getEffectiveSemanticStatus, readSemanticStatus } from "../../indexer/search/semantic-status.js";
11
+ import { closeDatabase, openExistingDatabase } from "../../storage/repositories/index-connection.js";
12
+ import { getEntryCount, getEntryCountByType } from "../../storage/repositories/index-entries-repository.js";
13
+ import { getMeta } from "../../storage/repositories/index-meta-repository.js";
14
+ import { isVecAvailable } from "../../storage/repositories/index-vec-repository.js";
10
15
  import { pkgVersion } from "../../version.js";
11
16
  /**
12
17
  * Assemble system info describing the current capabilities, configuration,
@@ -16,8 +21,13 @@ import { pkgVersion } from "../../version.js";
16
21
  */
17
22
  export function assembleInfo(options) {
18
23
  const config = loadConfig();
19
- // Asset types (copy into a mutable array — `getAssetTypes()` returns readonly)
20
- const assetTypes = [...getAssetTypes()];
24
+ // Primary stash directory + default bundle name — same resolution
25
+ // `akm sources list` uses (R-057), so `akm info` and `akm sources list`
26
+ // agree on which stash is primary.
27
+ const stashDir = resolveStashDir();
28
+ const defaultBundle = config.defaultBundle ?? null;
29
+ // Asset types (copy into a mutable array — `placementTypes()` returns readonly)
30
+ const assetTypes = [...placementTypes()];
21
31
  const semanticRuntime = readSemanticStatus();
22
32
  const semanticStatus = getEffectiveSemanticStatus(config, semanticRuntime);
23
33
  // Search modes
@@ -32,28 +42,26 @@ export function assembleInfo(options) {
32
42
  ...(r.provider ? { provider: r.provider } : {}),
33
43
  ...(r.enabled !== undefined ? { enabled: r.enabled } : {}),
34
44
  }));
35
- // Stash providers — prefer `sources[]`; fall back to `stashDir` when the
36
- // user has not yet migrated to the sources[] config shape so that info
37
- // always reflects at least one provider when a stash is configured.
45
+ // Stash providers — the unified `bundles` source list (spec §10.1), which
46
+ // already includes the primary (`defaultBundle`) stash first.
38
47
  const configuredSources = getSources(config);
39
- const stashesList = configuredSources.length === 0 && config.stashDir
40
- ? [{ type: "filesystem", path: config.stashDir, name: "primary" }]
41
- : configuredSources;
42
- const sourceProviders = stashesList.map((s) => ({
48
+ const sourceProviders = configuredSources.map((s) => ({
43
49
  type: s.type,
44
50
  ...(s.name ? { name: s.name } : {}),
45
51
  ...(s.path ? { path: s.path } : {}),
46
52
  ...(s.url ? { url: s.url } : {}),
47
53
  ...(s.enabled !== undefined ? { enabled: s.enabled } : {}),
48
54
  }));
49
- // Index stats — resolve the DB path from config so info reads the same
50
- // database that health and search use, rather than a bare getDbPath() call
51
- // that ignores XDG_DATA_HOME or per-config overrides.
55
+ // Index stats — `options.dbPath` is a test-only override (see the param
56
+ // doc above); real callers fall through to the same `getDbPath()` that
57
+ // health and search use, so info reads the same database they do.
52
58
  const resolvedDbPath = options?.dbPath ?? getDbPath();
53
59
  const indexStats = readIndexStats(resolvedDbPath);
54
60
  return {
55
61
  schemaVersion: 1,
56
62
  version: pkgVersion,
63
+ bundleDir: stashDir,
64
+ defaultBundle,
57
65
  assetTypes,
58
66
  searchModes,
59
67
  semanticSearch: {
@@ -70,6 +78,7 @@ export function assembleInfo(options) {
70
78
  function readIndexStats(resolvedPath) {
71
79
  const EMPTY = {
72
80
  entryCount: 0,
81
+ byType: {},
73
82
  lastBuiltAt: null,
74
83
  hasEmbeddings: false,
75
84
  vecAvailable: false,
@@ -81,6 +90,7 @@ function readIndexStats(resolvedPath) {
81
90
  db = openExistingDatabase(resolvedPath);
82
91
  return {
83
92
  entryCount: getEntryCount(db),
93
+ byType: getEntryCountByType(db),
84
94
  lastBuiltAt: getMeta(db, "builtAt") ?? null,
85
95
  hasEmbeddings: getMeta(db, "hasEmbeddings") === "1",
86
96
  vecAvailable: isVecAvailable(db),
@@ -89,7 +99,9 @@ function readIndexStats(resolvedPath) {
89
99
  catch (err) {
90
100
  // Surface the error so operators can diagnose mismatches between
91
101
  // `akm info` and `akm health` rather than silently returning zeros.
92
- process.stderr.write(`[akm info] failed to read index stats from ${resolvedPath}: ${String(err)}\n`);
102
+ // Routed through core/warn's `error()` (not a raw process.stderr.write)
103
+ // so `--quiet`/`setQuiet()` actually gate this line (R-057).
104
+ error(`[akm info] failed to read index stats from ${resolvedPath}: ${String(err)}`);
93
105
  return EMPTY;
94
106
  }
95
107
  finally {
@@ -10,18 +10,18 @@
10
10
  import { spawnSync } from "node:child_process";
11
11
  import fs from "node:fs";
12
12
  import path from "node:path";
13
- import { TYPE_DIRS } from "../../core/asset/asset-spec.js";
14
- import { loadUserConfig, saveConfig } from "../../core/config/config.js";
13
+ import { stashDirNames } from "../../core/asset/asset-placement.js";
14
+ import { mutateConfig } from "../../core/config/config.js";
15
15
  import { ConfigError } from "../../core/errors.js";
16
- import { assertSafeStashDir, getBinDir, getConfigPath, getDefaultStashDir } from "../../core/paths.js";
17
- import { ensureRg } from "../../core/ripgrep/install.js";
16
+ import { assertSafeStashDir, getConfigPath, getDefaultStashDir } from "../../core/paths.js";
17
+ import { primaryBundlePath, withPrimaryBundle } from "./bundle-config-ops.js";
18
18
  import { copyStashSkeleton, ensureStashGitignore, scaffoldStashMeta } from "./stash-skeleton.js";
19
19
  /**
20
20
  * Refuse to persist a temporary-directory stashDir to the user's config when
21
21
  * running under a test runner AND `--dir <tempdir>` was passed explicitly.
22
22
  * This guard targets the exact agent-overreach pattern documented in
23
- * `memory:akm-init-persists-stashdir-warning`: an agent ran
24
- * `akm init --dir $(mktemp -d)` for an E2E test and silently rewrote the
23
+ * `memories/akm-init-persists-stashdir-warning`: an agent ran
24
+ * `akm bundle create --dir $(mktemp -d)` for an E2E test and silently rewrote the
25
25
  * developer's real config to point at a now-deleted temp dir.
26
26
  *
27
27
  * Tests that legitimately resolve a tempdir via HOME (default-path init) are
@@ -31,7 +31,7 @@ import { copyStashSkeleton, ensureStashGitignore, scaffoldStashMeta } from "./st
31
31
  * - `BUN_TEST=1` — explicit opt-in
32
32
  * - `NODE_ENV=test` — what `bun test` sets today
33
33
  *
34
- * Tests that genuinely need to exercise `akm init --dir /tmp/...` should set
34
+ * Tests that genuinely need to exercise `akm bundle create --dir /tmp/...` should set
35
35
  * `AKM_FORCE_INIT_TMP_STASH=1`.
36
36
  */
37
37
  function assertInitSandbox(stashDir, dirExplicitlyProvided) {
@@ -72,8 +72,8 @@ async function akmInitReal(options) {
72
72
  const setDefault = options?.setDefault === true;
73
73
  const stashDir = options?.dir ? path.resolve(options.dir) : getDefaultStashDir();
74
74
  // Safety check (#473): refuse stashDir at /, $HOME, /etc, ~/.config, etc.
75
- // Runs BEFORE any disk write — a fat-fingered `akm init --dir /` or
76
- // `akm init --dir ~` would otherwise mkdir + git-init the user's system
75
+ // Runs BEFORE any disk write — a fat-fingered `akm bundle create --dir /` or
76
+ // `akm bundle create --dir ~` would otherwise mkdir + git-init the user's system
77
77
  // root or home directory. Catastrophic-on-misuse vs. trivial-to-recover-from.
78
78
  assertSafeStashDir(stashDir);
79
79
  // Defense-in-depth: refuse to persist an explicit --dir /tmp/... stashDir
@@ -84,7 +84,7 @@ async function akmInitReal(options) {
84
84
  fs.mkdirSync(stashDir, { recursive: true });
85
85
  created = true;
86
86
  }
87
- for (const sub of Object.values(TYPE_DIRS)) {
87
+ for (const sub of stashDirNames()) {
88
88
  const subDir = path.join(stashDir, sub);
89
89
  if (!fs.existsSync(subDir)) {
90
90
  fs.mkdirSync(subDir, { recursive: true });
@@ -97,16 +97,16 @@ async function akmInitReal(options) {
97
97
  // opts into versioning by un-ignoring a path.
98
98
  ensureStashGitignore(stashDir);
99
99
  // Run seeding UNCONDITIONALLY (not just when the stash was newly created) so
100
- // re-running `akm init` on an existing stash backfills any missing skeleton
100
+ // re-running `akm bundle create` on an existing stash backfills any missing skeleton
101
101
  // files — the README, the per-type SOFT convention templates under
102
102
  // facts/conventions/assets/, and the `.meta/index.md` orientation doc. Both
103
103
  // helpers are absent-only: they never overwrite a file a user has edited.
104
104
  copyStashSkeleton(stashDir);
105
105
  scaffoldStashMeta(stashDir);
106
106
  // Persist stashDir in config.json — but ONLY when the user is actually
107
- // setting up / opting into a default. A bare `akm init --dir <secondary>`
107
+ // setting up / opting into a default. A bare `akm bundle create --dir <secondary>`
108
108
  // must NOT silently repoint the user's real default stash (the footgun
109
- // documented in memory:akm-init-persists-stashdir-warning).
109
+ // documented in memories/akm-init-persists-stashdir-warning).
110
110
  //
111
111
  // Decision matrix — persist when ANY of:
112
112
  // (a) no --dir provided → default HOME-resolved setup flow
@@ -115,35 +115,25 @@ async function akmInitReal(options) {
115
115
  // Otherwise (--dir + existing default + no --set-default) leave the default
116
116
  // pointer alone; the target dir is still scaffolded above.
117
117
  const configPath = getConfigPath();
118
- const existing = loadUserConfig();
119
- const existingStashDir = existing.stashDir;
120
- const shouldPersist = !dirExplicitlyProvided || !existingStashDir || setDefault;
121
- let defaultStashUpdated = false;
118
+ let defaultBundleUpdated = false;
122
119
  let previousStashDir;
123
- if (shouldPersist) {
124
- if (!existingStashDir || existingStashDir !== stashDir) {
125
- saveConfig({ ...existing, stashDir });
126
- defaultStashUpdated = true;
127
- }
128
- // else: already pointed here — no-op, no spurious rewrite.
129
- }
130
- else {
131
- // Default left untouched; surface it so the CLI can inform the user.
132
- previousStashDir = existingStashDir;
133
- }
134
- // Ensure ripgrep is available (install to cache/bin if needed)
135
- let ripgrep;
136
- if (!isUnderTestRunner()) {
137
- try {
138
- const binDir = getBinDir();
139
- const rgResult = ensureRg(binDir);
140
- ripgrep = rgResult;
141
- }
142
- catch {
143
- // Non-fatal: ripgrep is optional, search works without it
144
- }
120
+ if (options?.persistConfig !== false) {
121
+ const result = mutateConfig((latest) => {
122
+ // 0.9.0 (spec §10.1): the primary stash is the `defaultBundle`'s filesystem
123
+ // `path`, not the retired top-level `stashDir`.
124
+ const currentPrimary = primaryBundlePath(latest);
125
+ const shouldPersist = !dirExplicitlyProvided || !currentPrimary || setDefault;
126
+ if (!shouldPersist) {
127
+ previousStashDir = currentPrimary;
128
+ return latest;
129
+ }
130
+ if (currentPrimary === stashDir)
131
+ return latest;
132
+ return withPrimaryBundle(latest, stashDir);
133
+ });
134
+ defaultBundleUpdated = result.written;
145
135
  }
146
- return { stashDir, created, configPath, defaultStashUpdated, previousStashDir, ripgrep };
136
+ return { bundleDir: stashDir, created, configPath, defaultBundleUpdated, previousBundleDir: previousStashDir };
147
137
  }
148
138
  /** Initialise `dir` as a git repository if it is not already one. */
149
139
  function ensureGitRepo(dir) {