akm-cli 0.9.0-rc.0 → 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 (598) hide show
  1. package/CHANGELOG.md +1283 -22
  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/prompts/workflow-unit-preamble.md +26 -0
  26. package/dist/assets/stash-skeleton/README.md +38 -10
  27. package/dist/assets/stash-skeleton/facts/conventions/assets/agent.md +8 -0
  28. package/dist/assets/stash-skeleton/facts/conventions/assets/command.md +8 -0
  29. package/dist/assets/stash-skeleton/facts/conventions/assets/fact.md +14 -1
  30. package/dist/assets/stash-skeleton/facts/conventions/assets/knowledge.md +13 -1
  31. package/dist/assets/stash-skeleton/facts/conventions/assets/lesson.md +9 -1
  32. package/dist/assets/stash-skeleton/facts/conventions/assets/memory.md +11 -0
  33. package/dist/assets/stash-skeleton/facts/conventions/assets/script.md +9 -0
  34. package/dist/assets/stash-skeleton/facts/conventions/assets/skill.md +9 -0
  35. package/dist/assets/stash-skeleton/facts/conventions/assets/workflow.md +8 -0
  36. package/dist/assets/stash-skeleton/facts/conventions/backlinks.md +100 -0
  37. package/dist/assets/stash-skeleton/facts/conventions/domains.md +64 -0
  38. package/dist/assets/stash-skeleton/facts/conventions/organization.md +136 -0
  39. package/dist/assets/tasks/core/extract.yml +3 -2
  40. package/dist/assets/tasks/core/improve.yml +2 -1
  41. package/dist/assets/tasks/core/index-refresh.yml +1 -0
  42. package/dist/assets/tasks/core/sync.yml +1 -0
  43. package/dist/assets/tasks/core/version-check.yml +2 -1
  44. package/dist/assets/tasks/improve/akm-graph-refresh-weekly.yml +5 -0
  45. package/dist/assets/tasks/improve/akm-improve-catchup.yml +8 -0
  46. package/dist/assets/tasks/improve/akm-improve-consolidate.yml +5 -0
  47. package/dist/assets/tasks/improve/akm-improve-frequent.yml +5 -0
  48. package/dist/assets/tasks/improve/akm-improve-nightly.yml +5 -0
  49. package/dist/assets/templates/html/health.html +5 -4
  50. package/dist/assets/workflows/workflow-template.md +31 -15
  51. package/dist/cli/invocation.js +279 -0
  52. package/dist/cli/parse-args.js +5 -90
  53. package/dist/cli/retired-commands.js +78 -0
  54. package/dist/cli/shared.js +158 -48
  55. package/dist/cli-node.mjs +2 -1
  56. package/dist/cli.js +747 -293
  57. package/dist/commands/agent/agent-dispatch.js +19 -18
  58. package/dist/commands/agent/agent-support.js +0 -24
  59. package/dist/commands/agent/contribute-cli.js +43 -97
  60. package/dist/commands/completions.js +80 -23
  61. package/dist/commands/config-cli.js +44 -281
  62. package/dist/commands/env/env-binding.js +99 -0
  63. package/dist/commands/env/env-cli.js +84 -224
  64. package/dist/commands/env/env.js +12 -163
  65. package/dist/commands/env/marker-path.js +6 -0
  66. package/dist/commands/env/secret-cli.js +45 -61
  67. package/dist/commands/env/secret.js +32 -62
  68. package/dist/commands/feedback-cli.js +179 -85
  69. package/dist/commands/health/accept-rate.js +58 -0
  70. package/dist/commands/health/advisories.js +7 -8
  71. package/dist/commands/health/checks.js +279 -94
  72. package/dist/commands/health/html-report.js +197 -578
  73. package/dist/commands/health/improve-metrics.js +277 -246
  74. package/dist/commands/health/llm-usage.js +19 -19
  75. package/dist/commands/health/md-report.js +16 -7
  76. package/dist/commands/health/metrics.js +67 -32
  77. package/dist/commands/health/renderers.js +47 -0
  78. package/dist/commands/health/report-view-model.js +508 -0
  79. package/dist/commands/health/stash-exposure.js +1 -1
  80. package/dist/commands/health/surfaces.js +16 -56
  81. package/dist/commands/health/task-runs.js +3 -67
  82. package/dist/{migrate-storage-node.mjs → commands/health/types-checks.js} +1 -5
  83. package/dist/commands/health/types-improve.js +29 -0
  84. package/dist/{output/text/save.js → commands/health/types-metrics.js} +1 -2
  85. package/dist/commands/health/types-result.js +7 -0
  86. package/dist/commands/health/types-runs.js +4 -0
  87. package/dist/commands/health/types-session-log.js +4 -0
  88. package/dist/commands/health/types-windows.js +4 -0
  89. package/dist/commands/health/types.js +26 -21
  90. package/dist/commands/health/windows.js +2 -3
  91. package/dist/commands/health.js +296 -167
  92. package/dist/commands/improve/anti-collapse.js +5 -5
  93. package/dist/commands/improve/autonomy-gate.js +68 -0
  94. package/dist/commands/improve/collapse-detector.js +65 -52
  95. package/dist/commands/improve/consolidate/chunking.js +9 -7
  96. package/dist/commands/improve/consolidate/eligibility.js +1 -23
  97. package/dist/commands/improve/consolidate/merge.js +4 -0
  98. package/dist/commands/improve/consolidate.js +454 -1354
  99. package/dist/commands/improve/content-hash.js +39 -0
  100. package/dist/commands/improve/distill/content-repair.js +4 -10
  101. package/dist/commands/improve/distill/promote-memory.js +89 -64
  102. package/dist/commands/improve/distill/quality-gate.js +118 -42
  103. package/dist/commands/improve/distill-guards.js +1 -1
  104. package/dist/commands/improve/distill-promotion-policy.js +33 -888
  105. package/dist/commands/improve/distill.js +607 -363
  106. package/dist/commands/improve/eligibility.js +165 -79
  107. package/dist/commands/improve/extract-cli.js +35 -126
  108. package/dist/commands/improve/extract-prompt.js +6 -35
  109. package/dist/commands/improve/extract.js +640 -391
  110. package/dist/commands/improve/feedback-valence.js +2 -12
  111. package/dist/commands/improve/improve-cli.js +134 -135
  112. package/dist/commands/improve/improve-result-file.js +30 -50
  113. package/dist/commands/improve/improve-run-types.js +4 -0
  114. package/dist/commands/improve/improve-strategies.js +135 -0
  115. package/dist/commands/improve/improve.js +904 -701
  116. package/dist/commands/improve/locks.js +64 -111
  117. package/dist/commands/improve/loop-stages.js +1110 -923
  118. package/dist/commands/improve/memory/derived-ref.js +124 -0
  119. package/dist/commands/improve/memory/memory-belief.js +79 -7
  120. package/dist/commands/improve/memory/memory-contradiction-detect.js +49 -52
  121. package/dist/commands/improve/memory/memory-improve.js +25 -37
  122. package/dist/commands/improve/outcome-loop.js +25 -88
  123. package/dist/commands/improve/preparation.js +1034 -813
  124. package/dist/commands/improve/proactive-maintenance.js +34 -9
  125. package/dist/commands/improve/proposal-envelope.js +31 -0
  126. package/dist/commands/improve/reflect.js +983 -794
  127. package/dist/commands/improve/run-context.js +119 -0
  128. package/dist/commands/improve/salience.js +24 -127
  129. package/dist/commands/improve/session-asset.js +7 -3
  130. package/dist/commands/improve/shared.js +14 -34
  131. package/dist/commands/improve/source-identity.js +28 -0
  132. package/dist/commands/improve/triage.js +20 -17
  133. package/dist/commands/lint/base-linter.js +340 -313
  134. package/dist/commands/lint/env-key-rules.js +31 -47
  135. package/dist/commands/lint/index.js +185 -30
  136. package/dist/commands/{events.js → log.js} +28 -38
  137. package/dist/commands/migrate-cli.js +54 -0
  138. package/dist/commands/migration-tool.js +55 -0
  139. package/dist/commands/observability-cli.js +70 -208
  140. package/dist/commands/proposal/diff-format.js +50 -0
  141. package/dist/commands/proposal/drain-policies.js +0 -6
  142. package/dist/commands/proposal/drain.js +91 -40
  143. package/dist/commands/proposal/proposal-cli.js +134 -132
  144. package/dist/commands/proposal/proposal-types.js +56 -0
  145. package/dist/commands/proposal/proposal.js +83 -65
  146. package/dist/commands/proposal/propose-cli.js +88 -0
  147. package/dist/commands/proposal/propose.js +105 -88
  148. package/dist/commands/proposal/repository.js +1303 -278
  149. package/dist/commands/proposal/validators/proposal-quality-validators.js +16 -6
  150. package/dist/commands/proposal/validators/proposal-validators.js +61 -12
  151. package/dist/commands/proposal/validators/proposals.js +6 -8
  152. package/dist/commands/read/curate.js +78 -73
  153. package/dist/commands/read/knowledge.js +510 -13
  154. package/dist/commands/read/registry-search.js +2 -2
  155. package/dist/commands/read/remember-cli.js +84 -15
  156. package/dist/commands/read/search-cli.js +203 -96
  157. package/dist/commands/read/search.js +126 -94
  158. package/dist/commands/read/show.js +226 -250
  159. package/dist/commands/registry-cli.js +34 -60
  160. package/dist/commands/remember.js +18 -57
  161. package/dist/commands/sources/add-cli.js +104 -49
  162. package/dist/commands/sources/bundle-cli.js +166 -0
  163. package/dist/commands/sources/bundle-config-ops.js +63 -0
  164. package/dist/commands/sources/info.js +27 -15
  165. package/dist/commands/sources/init.js +30 -40
  166. package/dist/commands/sources/installed-stashes.js +469 -172
  167. package/dist/commands/sources/migration-help.js +7 -4
  168. package/dist/commands/sources/schema-repair.js +10 -9
  169. package/dist/commands/sources/self-update.js +182 -121
  170. package/dist/commands/sources/source-add.js +169 -178
  171. package/dist/commands/sources/source-clone.js +144 -41
  172. package/dist/commands/sources/source-manage.js +94 -59
  173. package/dist/commands/sources/sources-cli.js +64 -205
  174. package/dist/commands/sources/stash-cli.js +91 -54
  175. package/dist/commands/sources/stash-skeleton.js +1 -1
  176. package/dist/commands/tasks/tasks-cli.js +106 -104
  177. package/dist/commands/tasks/tasks.js +445 -262
  178. package/dist/commands/workflow-cli.js +232 -121
  179. package/dist/core/action-contributors.js +1 -1
  180. package/dist/core/activation-policy.js +49 -0
  181. package/dist/core/adapter/adapters/agent-skills-adapter.js +181 -0
  182. package/dist/core/adapter/adapters/akm-adapter.js +528 -0
  183. package/dist/core/adapter/adapters/akm-lint.js +392 -0
  184. package/dist/core/adapter/adapters/akm-metadata.js +387 -0
  185. package/dist/core/adapter/adapters/akm-task-adapter.js +149 -0
  186. package/dist/core/adapter/adapters/akm-workflow-adapter.js +180 -0
  187. package/dist/core/adapter/adapters/claude-adapter.js +61 -0
  188. package/dist/core/adapter/adapters/dotenv-adapter.js +187 -0
  189. package/dist/core/adapter/adapters/generic-files-adapter.js +119 -0
  190. package/dist/core/adapter/adapters/index.js +80 -0
  191. package/dist/core/adapter/adapters/llm-wiki-adapter.js +419 -0
  192. package/dist/core/adapter/adapters/okf-adapter.js +391 -0
  193. package/dist/core/adapter/adapters/opencode-adapter.js +68 -0
  194. package/dist/core/adapter/adapters/shared.js +286 -0
  195. package/dist/core/adapter/adapters/tool-dir-shared.js +217 -0
  196. package/dist/core/adapter/adapters/website-snapshot-adapter.js +155 -0
  197. package/dist/core/adapter/bundle-adapter.js +4 -0
  198. package/dist/core/adapter/detect-adapter.js +17 -0
  199. package/dist/core/adapter/recognize-match.js +44 -0
  200. package/dist/core/adapter/registry.js +56 -0
  201. package/dist/core/adapter/types.js +4 -0
  202. package/dist/core/asset/akm-markdown.js +30 -0
  203. package/dist/core/asset/asset-placement.js +243 -0
  204. package/dist/core/asset/asset-ref.js +110 -79
  205. package/dist/core/asset/asset-serialize.js +20 -0
  206. package/dist/core/asset/frontmatter.js +28 -12
  207. package/dist/core/asset/markdown.js +40 -51
  208. package/dist/core/asset/resolve-ref.js +274 -0
  209. package/dist/core/asset/stash-meta.js +2 -2
  210. package/dist/core/bundle-id.js +51 -0
  211. package/dist/core/common.js +281 -86
  212. package/dist/core/config/config-io.js +42 -128
  213. package/dist/core/config/config-schema.js +233 -834
  214. package/dist/core/config/config-sources.js +162 -39
  215. package/dist/core/config/config-types.js +16 -11
  216. package/dist/core/config/config-version.js +29 -0
  217. package/dist/core/config/config-walker.js +126 -37
  218. package/dist/core/config/config.js +154 -331
  219. package/dist/core/config/deep-merge.js +41 -0
  220. package/dist/core/config/engine-semantics.js +28 -0
  221. package/dist/core/config/experimental.js +21 -0
  222. package/dist/core/config/schema/embedding.js +38 -0
  223. package/dist/core/config/schema/engines.js +116 -0
  224. package/dist/core/config/schema/experimental.js +47 -0
  225. package/dist/core/config/schema/feedback.js +31 -0
  226. package/dist/core/config/schema/improve-processes.js +389 -0
  227. package/dist/core/config/schema/improve.js +94 -0
  228. package/dist/core/config/schema/index-config.js +176 -0
  229. package/dist/core/config/schema/output.js +18 -0
  230. package/dist/core/config/schema/primitives.js +94 -0
  231. package/dist/core/config/schema/search.js +30 -0
  232. package/dist/core/config/schema/setup.js +18 -0
  233. package/dist/core/config/schema/sources-bundles.js +169 -0
  234. package/dist/core/config/schema/workflow.js +29 -0
  235. package/dist/core/env-secret-ref.js +155 -20
  236. package/dist/core/errors.js +17 -15
  237. package/dist/core/events-types.js +4 -0
  238. package/dist/core/events.js +46 -128
  239. package/dist/core/extra-params.js +62 -0
  240. package/dist/core/file-change.js +17 -0
  241. package/dist/core/file-lock.js +202 -57
  242. package/dist/core/fs-txn.js +392 -0
  243. package/dist/core/git-message.js +59 -0
  244. package/dist/core/improve-result.js +167 -0
  245. package/dist/core/json-schema.js +142 -0
  246. package/dist/core/lesson-lint.js +1 -17
  247. package/dist/core/logs-db.js +1 -1
  248. package/dist/core/maintenance-barrier.js +135 -0
  249. package/dist/core/migration-operation.js +44 -0
  250. package/dist/core/mutation-target.js +78 -0
  251. package/dist/core/paths.js +22 -25
  252. package/dist/core/platform.js +10 -0
  253. package/dist/core/recognition-util.js +128 -0
  254. package/dist/core/redaction.js +392 -0
  255. package/dist/core/standards/resolve-standards-context.js +36 -65
  256. package/dist/core/standards/resolve-stash-standards.js +2 -2
  257. package/dist/core/standards/resolve-type-conventions.js +5 -5
  258. package/dist/core/state/migrations.js +242 -11
  259. package/dist/core/state-db.js +98 -10
  260. package/dist/core/structured.js +1 -1
  261. package/dist/core/subprocess.js +303 -0
  262. package/dist/core/text-truncation.js +9 -5
  263. package/dist/core/time.js +20 -0
  264. package/dist/core/type-presentation.js +130 -0
  265. package/dist/core/warn.js +0 -3
  266. package/dist/core/write-source.js +834 -118
  267. package/dist/indexer/bundle-identity-guard.js +92 -0
  268. package/dist/indexer/db/graph-db.js +1 -25
  269. package/dist/indexer/db/llm-cache.js +1 -1
  270. package/dist/indexer/ensure-index.js +30 -9
  271. package/dist/indexer/graph/graph-boost.js +9 -30
  272. package/dist/indexer/graph/graph-extraction.js +41 -27
  273. package/dist/indexer/graph/graph-types.js +4 -0
  274. package/dist/indexer/index-writer-lock.js +93 -49
  275. package/dist/indexer/index-written-assets.js +100 -53
  276. package/dist/indexer/indexer.js +746 -329
  277. package/dist/indexer/init.js +18 -25
  278. package/dist/indexer/installations.js +142 -0
  279. package/dist/indexer/passes/dir-staleness.js +18 -10
  280. package/dist/indexer/passes/memory-inference.js +25 -15
  281. package/dist/indexer/passes/metadata.js +412 -243
  282. package/dist/indexer/scan/doc-to-entry.js +160 -0
  283. package/dist/indexer/scan/drain-dir.js +134 -0
  284. package/dist/indexer/search/db-search.js +292 -108
  285. package/dist/indexer/search/fts-query.js +64 -0
  286. package/dist/indexer/search/ranking-contributors.js +145 -25
  287. package/dist/indexer/search/ranking-types.js +4 -0
  288. package/dist/indexer/search/ranking.js +28 -71
  289. package/dist/indexer/search/search-attribution.js +67 -0
  290. package/dist/indexer/search/search-fields.js +18 -3
  291. package/dist/indexer/search/search-hit-enrichers.js +30 -40
  292. package/dist/indexer/search/search-source.js +157 -111
  293. package/dist/indexer/search/semantic-status.js +4 -1
  294. package/dist/indexer/usage/usage-events.js +10 -30
  295. package/dist/indexer/walk/file-context.js +3 -45
  296. package/dist/indexer/walk/matchers.js +42 -34
  297. package/dist/indexer/walk/path-resolver.js +11 -5
  298. package/dist/indexer/walk/walker.js +42 -14
  299. package/dist/integrations/agent/builder-shared.js +7 -0
  300. package/dist/integrations/agent/builders.js +5 -56
  301. package/dist/integrations/agent/config.js +3 -143
  302. package/dist/integrations/agent/detect.js +17 -2
  303. package/dist/integrations/agent/engine-resolution.js +231 -0
  304. package/dist/integrations/agent/index.js +1 -2
  305. package/dist/integrations/agent/model-aliases.js +16 -2
  306. package/dist/integrations/agent/profiles.js +36 -62
  307. package/dist/integrations/agent/prompts.js +46 -18
  308. package/dist/integrations/agent/runner-dispatch.js +93 -4
  309. package/dist/integrations/agent/runner.js +76 -208
  310. package/dist/integrations/agent/spawn.js +88 -196
  311. package/dist/integrations/harnesses/aider/agent-builder.js +114 -0
  312. package/dist/integrations/harnesses/aider/index.js +48 -0
  313. package/dist/integrations/harnesses/aider/result-extractor.js +53 -0
  314. package/dist/integrations/harnesses/amazonq/agent-builder.js +147 -0
  315. package/dist/integrations/harnesses/amazonq/index.js +45 -0
  316. package/dist/integrations/harnesses/amazonq/result-extractor.js +48 -0
  317. package/dist/integrations/harnesses/claude/agent-builder.js +46 -8
  318. package/dist/integrations/harnesses/claude/config-import.js +1 -3
  319. package/dist/integrations/harnesses/claude/index.js +24 -35
  320. package/dist/integrations/harnesses/claude/result-extractor.js +52 -0
  321. package/dist/integrations/harnesses/claude/session-log.js +27 -75
  322. package/dist/integrations/harnesses/codex/agent-builder.js +138 -0
  323. package/dist/integrations/harnesses/codex/index.js +52 -0
  324. package/dist/integrations/harnesses/codex/result-extractor.js +73 -0
  325. package/dist/integrations/harnesses/copilot/agent-builder.js +122 -0
  326. package/dist/integrations/harnesses/copilot/index.js +48 -0
  327. package/dist/integrations/harnesses/copilot/result-extractor.js +151 -0
  328. package/dist/integrations/harnesses/gemini/agent-builder.js +120 -0
  329. package/dist/integrations/harnesses/gemini/index.js +48 -0
  330. package/dist/integrations/harnesses/gemini/result-extractor.js +121 -0
  331. package/dist/integrations/harnesses/ids.js +24 -0
  332. package/dist/integrations/harnesses/index.js +54 -34
  333. package/dist/integrations/harnesses/opencode/agent-builder.js +23 -5
  334. package/dist/integrations/harnesses/opencode/config-import.js +1 -3
  335. package/dist/integrations/harnesses/opencode/index.js +14 -32
  336. package/dist/integrations/harnesses/opencode/session-log.js +67 -125
  337. package/dist/integrations/harnesses/opencode-sdk/harness.js +51 -0
  338. package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +681 -108
  339. package/dist/integrations/harnesses/openhands/agent-builder.js +128 -0
  340. package/dist/integrations/harnesses/openhands/index.js +48 -0
  341. package/dist/integrations/harnesses/openhands/result-extractor.js +103 -0
  342. package/dist/integrations/harnesses/pi/agent-builder.js +97 -0
  343. package/dist/integrations/harnesses/pi/index.js +45 -0
  344. package/dist/integrations/harnesses/pi/result-extractor.js +135 -0
  345. package/dist/integrations/harnesses/shared.js +17 -0
  346. package/dist/integrations/harnesses/types.js +43 -32
  347. package/dist/integrations/lockfile.js +211 -24
  348. package/dist/integrations/session-logs/index.js +36 -39
  349. package/dist/integrations/session-logs/provider-base.js +113 -0
  350. package/dist/llm/client.js +182 -110
  351. package/dist/llm/embedders/deterministic.js +2 -2
  352. package/dist/llm/embedders/remote.js +21 -9
  353. package/dist/llm/feature-gate.js +17 -57
  354. package/dist/llm/graph-extract.js +12 -13
  355. package/dist/llm/index-passes.js +8 -42
  356. package/dist/llm/memory-infer.js +144 -1
  357. package/dist/llm/metadata-enhance.js +45 -30
  358. package/dist/llm/structured-call.js +16 -8
  359. package/dist/llm/usage-persist.js +30 -5
  360. package/dist/llm/usage-telemetry.js +59 -6
  361. package/dist/output/cli-hints.js +1 -2
  362. package/dist/output/command-registry.js +27 -0
  363. package/dist/output/context.js +22 -7
  364. package/dist/output/format-exempt.js +80 -0
  365. package/dist/output/generic-render.js +251 -0
  366. package/dist/output/html-render.js +11 -16
  367. package/dist/output/render-registry.js +57 -0
  368. package/dist/output/renderers.js +14 -279
  369. package/dist/output/shapes/curate.js +10 -1
  370. package/dist/output/shapes/events.js +12 -7
  371. package/dist/output/shapes/helpers.js +58 -84
  372. package/dist/output/shapes/passthrough.js +11 -39
  373. package/dist/output/shapes/proposal/producer.js +15 -7
  374. package/dist/output/shapes/registry.js +12 -6
  375. package/dist/output/shapes.js +0 -9
  376. package/dist/output/text/{init.js → bundle-create.js} +3 -1
  377. package/dist/output/text/bundle-show.js +7 -0
  378. package/dist/output/text/command-format.js +562 -0
  379. package/dist/output/text/env.js +1 -3
  380. package/dist/output/text/events.js +8 -7
  381. package/dist/output/text/helpers.js +15 -1164
  382. package/dist/output/text/proposal/producer.js +4 -2
  383. package/dist/output/text/proposal-format.js +202 -0
  384. package/dist/output/text/registry-commands.js +1 -2
  385. package/dist/output/text/registry.js +12 -6
  386. package/dist/output/text/show-directives.js +117 -0
  387. package/dist/output/text/show-format.js +103 -0
  388. package/dist/output/text/sync.js +5 -0
  389. package/dist/output/text/workflow-format.js +332 -0
  390. package/dist/output/text/workflow.js +3 -2
  391. package/dist/output/text.js +10 -19
  392. package/dist/registry/factory.js +4 -6
  393. package/dist/registry/origin-resolve.js +16 -27
  394. package/dist/registry/providers/skills-sh.js +3 -3
  395. package/dist/registry/providers/static-index.js +15 -25
  396. package/dist/registry/resolve.js +43 -94
  397. package/dist/registry/semver.js +43 -0
  398. package/dist/runtime.js +81 -12
  399. package/dist/scripts/akm-migrate.js +35529 -0
  400. package/dist/setup/detect.js +5 -7
  401. package/dist/setup/detected-engines.js +136 -0
  402. package/dist/setup/engine-config.js +100 -0
  403. package/dist/setup/registry-stash-loader.js +3 -3
  404. package/dist/setup/semantic-assets.js +12 -9
  405. package/dist/setup/setup.js +444 -208
  406. package/dist/setup/steps/connection-shared.js +120 -0
  407. package/dist/setup/steps/connection.js +108 -305
  408. package/dist/setup/steps/platforms.js +13 -12
  409. package/dist/setup/steps/semantic.js +15 -3
  410. package/dist/setup/steps/sources.js +21 -15
  411. package/dist/setup/steps/stashdir.js +6 -4
  412. package/dist/setup/steps/tasks.js +236 -119
  413. package/dist/setup/steps.js +3 -2
  414. package/dist/sources/freshness.js +39 -0
  415. package/dist/sources/provider-factory.js +11 -17
  416. package/dist/sources/providers/filesystem.js +2 -3
  417. package/dist/sources/providers/git-install.js +278 -34
  418. package/dist/sources/providers/git-provider.js +54 -56
  419. package/dist/sources/providers/git-stash.js +420 -91
  420. package/dist/sources/providers/git.js +2 -2
  421. package/dist/sources/providers/npm.js +16 -19
  422. package/dist/sources/providers/provider-utils.js +47 -22
  423. package/dist/sources/providers/sync-from-ref.js +3 -9
  424. package/dist/sources/providers/website.js +2 -2
  425. package/dist/sources/resolve.js +11 -10
  426. package/dist/sources/snapshot-fetchers/types.js +4 -0
  427. package/dist/sources/{website-ingest.js → snapshot-fetchers/website-ingest.js} +110 -41
  428. package/dist/storage/database.js +60 -4
  429. package/dist/storage/engines/sqlite-migrations.js +156 -5
  430. package/dist/storage/locations.js +1 -2
  431. package/dist/storage/repositories/canaries-repository.js +1 -1
  432. package/dist/storage/repositories/events-repository.js +51 -11
  433. package/dist/storage/repositories/improve-runs-repository.js +6 -32
  434. package/dist/storage/repositories/index-connection.js +79 -0
  435. package/dist/storage/repositories/index-db.js +4 -3
  436. package/dist/storage/repositories/index-entries-repository.js +863 -0
  437. package/dist/{indexer/db/entry-mapper.js → storage/repositories/index-entry-mapper.js} +19 -2
  438. package/dist/storage/repositories/index-entry-types.js +4 -0
  439. package/dist/storage/repositories/index-fts-repository.js +167 -0
  440. package/dist/storage/repositories/index-llm-cache-repository.js +108 -0
  441. package/dist/storage/repositories/index-meta-repository.js +49 -0
  442. package/dist/{indexer/db/schema.js → storage/repositories/index-schema.js} +226 -100
  443. package/dist/storage/repositories/index-sql.js +12 -0
  444. package/dist/storage/repositories/index-utility-repository.js +356 -0
  445. package/dist/storage/repositories/index-vec-repository.js +250 -0
  446. package/dist/storage/repositories/outcome-repository.js +119 -0
  447. package/dist/storage/repositories/proposals-repository.js +317 -75
  448. package/dist/storage/repositories/registry-cache.js +1 -1
  449. package/dist/storage/repositories/salience-repository.js +172 -0
  450. package/dist/storage/repositories/task-history-repository.js +110 -3
  451. package/dist/storage/repositories/workflow-runs-repository.js +240 -19
  452. package/dist/tasks/backends/cron.js +169 -46
  453. package/dist/tasks/backends/exec-utils.js +76 -3
  454. package/dist/tasks/backends/index.js +6 -9
  455. package/dist/tasks/backends/launchd.js +292 -55
  456. package/dist/tasks/backends/schtasks.js +557 -70
  457. package/dist/tasks/backends/types.js +4 -0
  458. package/dist/tasks/command-executable.js +93 -0
  459. package/dist/tasks/embedded.js +56 -38
  460. package/dist/tasks/parser.js +156 -64
  461. package/dist/tasks/resolve-akm-bin.js +144 -51
  462. package/dist/tasks/runner.js +377 -209
  463. package/dist/tasks/schedule.js +108 -19
  464. package/dist/tasks/scheduler-invocation.js +296 -0
  465. package/dist/tasks/schema.js +1 -1
  466. package/dist/tasks/task-id.js +35 -0
  467. package/dist/tasks/validator.js +30 -16
  468. package/dist/text-import-hook.mjs +1 -1
  469. package/dist/workflows/authoring/authoring.js +104 -43
  470. package/dist/workflows/authoring/scope-key.js +1 -1
  471. package/dist/workflows/cli.js +0 -16
  472. package/dist/workflows/concurrency-policy.js +15 -0
  473. package/dist/workflows/exec/brief.js +450 -0
  474. package/dist/workflows/exec/frozen-judge.js +47 -0
  475. package/dist/workflows/exec/native-executor.js +1038 -0
  476. package/dist/workflows/exec/param-secrets.js +115 -0
  477. package/dist/workflows/exec/report.js +1460 -0
  478. package/dist/workflows/exec/run-workflow.js +602 -0
  479. package/dist/workflows/exec/scheduler.js +71 -0
  480. package/dist/workflows/exec/step-work.js +1190 -0
  481. package/dist/workflows/exec/unit-writer.js +23 -0
  482. package/dist/workflows/exec/workflow-engine-gate.js +67 -0
  483. package/dist/workflows/exec/worktree.js +171 -0
  484. package/dist/workflows/ir/compile.js +246 -0
  485. package/dist/workflows/ir/freeze.js +233 -0
  486. package/dist/workflows/ir/params.js +54 -0
  487. package/dist/workflows/ir/plan-hash.js +68 -0
  488. package/dist/workflows/ir/schema.js +540 -0
  489. package/dist/workflows/parser.js +878 -304
  490. package/dist/workflows/program/expressions.js +181 -0
  491. package/dist/workflows/program/schema.js +51 -0
  492. package/dist/workflows/renderer.js +100 -45
  493. package/dist/workflows/resource-limits.js +22 -0
  494. package/dist/workflows/runtime/agent-identity.js +59 -14
  495. package/dist/workflows/runtime/checkin.js +1 -1
  496. package/dist/workflows/runtime/plan-classifier.js +131 -0
  497. package/dist/workflows/runtime/runs.js +376 -119
  498. package/dist/workflows/runtime/unit-checkin.js +45 -0
  499. package/dist/workflows/runtime/unit-phases.js +20 -0
  500. package/dist/workflows/runtime/workflow-asset-loader.js +241 -40
  501. package/dist/workflows/schema.js +1 -11
  502. package/dist/workflows/validate-summary.js +2 -3
  503. package/dist/workflows/validator.js +52 -30
  504. package/docs/README.md +42 -78
  505. package/docs/migration/README.md +8 -0
  506. package/docs/migration/release-notes/0.6.0.md +1 -1
  507. package/docs/migration/release-notes/0.7.0.md +9 -8
  508. package/docs/migration/release-notes/0.9.0.md +158 -14
  509. package/docs/migration/v0.7-to-v0.8.md +46 -47
  510. package/docs/migration/v0.8-to-v0.9.md +844 -0
  511. package/docs/reference/README.md +12 -0
  512. package/docs/reference/data-and-telemetry.md +333 -0
  513. package/package.json +21 -17
  514. package/schemas/akm-asset-envelope.json +93 -0
  515. package/schemas/akm-config.json +4636 -0
  516. package/schemas/akm-task.json +87 -0
  517. package/schemas/akm-workflow.json +373 -0
  518. package/dist/akm-migrate-storage +0 -38
  519. package/dist/assets/help/help-accept.md +0 -12
  520. package/dist/assets/help/help-improve.md +0 -84
  521. package/dist/assets/help/help-proposals.md +0 -17
  522. package/dist/assets/help/help-propose.md +0 -17
  523. package/dist/assets/help/help-reject.md +0 -11
  524. package/dist/assets/profiles/frequent.json +0 -13
  525. package/dist/assets/profiles/recombine-only.json +0 -21
  526. package/dist/assets/profiles/reflect-distill.json +0 -30
  527. package/dist/assets/profiles/synthesize.json +0 -15
  528. package/dist/assets/prompts/procedural-system.md +0 -44
  529. package/dist/assets/prompts/recombine-system.md +0 -40
  530. package/dist/assets/prompts/staleness-detect-system.md +0 -6
  531. package/dist/assets/tasks/core/backup.yml +0 -4
  532. package/dist/assets/tasks/graph-refresh-weekly.yml +0 -10
  533. package/dist/assets/templates/html/default.html +0 -78
  534. package/dist/assets/templates/html/vendor/echarts.min.js +0 -45
  535. package/dist/assets/wiki/index-template.md +0 -12
  536. package/dist/assets/wiki/ingest-workflow-template.md +0 -83
  537. package/dist/assets/wiki/log-template.md +0 -8
  538. package/dist/assets/wiki/schema-template.md +0 -61
  539. package/dist/cli/config-migrate.js +0 -150
  540. package/dist/cli/config-validate.js +0 -39
  541. package/dist/commands/graph/graph-cli.js +0 -124
  542. package/dist/commands/graph/graph.js +0 -487
  543. package/dist/commands/improve/calibration.js +0 -161
  544. package/dist/commands/improve/dedup.js +0 -482
  545. package/dist/commands/improve/extract-watch.js +0 -140
  546. package/dist/commands/improve/hot-probation.js +0 -45
  547. package/dist/commands/improve/improve-auto-accept.js +0 -276
  548. package/dist/commands/improve/improve-profiles.js +0 -168
  549. package/dist/commands/improve/procedural.js +0 -398
  550. package/dist/commands/improve/recombine.js +0 -818
  551. package/dist/commands/improve/schema-similarity-gate.js +0 -168
  552. package/dist/commands/lint/agent-linter.js +0 -44
  553. package/dist/commands/lint/command-linter.js +0 -44
  554. package/dist/commands/lint/default-linter.js +0 -16
  555. package/dist/commands/lint/fact-linter.js +0 -39
  556. package/dist/commands/lint/knowledge-linter.js +0 -16
  557. package/dist/commands/lint/memory-linter.js +0 -61
  558. package/dist/commands/lint/registry.js +0 -41
  559. package/dist/commands/lint/skill-linter.js +0 -45
  560. package/dist/commands/lint/task-linter.js +0 -50
  561. package/dist/commands/lint/workflow-linter.js +0 -81
  562. package/dist/commands/proposal/legacy-import.js +0 -115
  563. package/dist/commands/sources/history.js +0 -196
  564. package/dist/commands/tasks/default-tasks.js +0 -186
  565. package/dist/commands/wiki-cli.js +0 -292
  566. package/dist/core/asset/asset-registry.js +0 -76
  567. package/dist/core/asset/asset-spec.js +0 -259
  568. package/dist/core/config/config-migration.js +0 -602
  569. package/dist/core/deep-merge.js +0 -38
  570. package/dist/core/eval/rank-metrics.js +0 -113
  571. package/dist/core/ripgrep/install.js +0 -163
  572. package/dist/core/ripgrep/resolve.js +0 -81
  573. package/dist/indexer/db/db.js +0 -1413
  574. package/dist/indexer/manifest.js +0 -170
  575. package/dist/indexer/passes/metadata-contributors.js +0 -31
  576. package/dist/indexer/usage/unmigrated-vaults-guard.js +0 -94
  577. package/dist/integrations/harnesses/opencode-sdk/index.js +0 -49
  578. package/dist/llm/call-ai.js +0 -62
  579. package/dist/llm/memory-infer-impl.js +0 -138
  580. package/dist/output/shapes/distill.js +0 -14
  581. package/dist/output/shapes/history.js +0 -11
  582. package/dist/output/text/distill.js +0 -6
  583. package/dist/output/text/enable-disable.js +0 -8
  584. package/dist/output/text/history.js +0 -6
  585. package/dist/output/text/wiki.js +0 -16
  586. package/dist/registry/build-index.js +0 -386
  587. package/dist/scripts/migrate-storage.js +0 -19108
  588. package/dist/scripts/migrations/import-fs-improve-runs-to-db.js +0 -9411
  589. package/dist/scripts/migrations/v16-to-v17.js +0 -141
  590. package/dist/setup/legacy-config.js +0 -106
  591. package/dist/storage/repositories/consolidation-repository.js +0 -38
  592. package/dist/storage/repositories/recombine-repository.js +0 -213
  593. package/dist/wiki/wiki-templates.js +0 -15
  594. package/dist/wiki/wiki.js +0 -1012
  595. package/dist/workflows/db.js +0 -215
  596. package/docs/data-and-telemetry.md +0 -226
  597. /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/registry.js +0 -0
  598. /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) {