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
@@ -1,602 +0,0 @@
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
- * Config shape migration logic for AKM v0.8.0.
6
- *
7
- * This module is intentionally kept free of imports from `config.ts` to avoid
8
- * circular dependencies: `config.ts` imports `migrateConfigShape` from here,
9
- * and `config-migrate.ts` (the CLI command) also imports from here.
10
- *
11
- * Migration policy (0.8.0): every legacy field is migrated to its NEW final
12
- * location and stripped from the raw config. Production code reads ONLY the
13
- * new shape. There are no backward-compat shims after this migration.
14
- */
15
- import { v1ProfilePlatform } from "../../integrations/harnesses/index.js";
16
- import { warn } from "../warn.js";
17
- /**
18
- * Current config schema version sentinel.
19
- * Configs at this version are considered fully migrated and will not be rewritten.
20
- */
21
- export const CURRENT_CONFIG_VERSION = "0.8.0";
22
- /**
23
- * Compare two `configVersion` values and return -1/0/1 (a<b / a==b / a>b).
24
- *
25
- * Both the legacy numeric scheme (`1`, `2`, …) and the semver-string scheme
26
- * (`"0.8.0"`, `"0.9.1"`) are accepted. Mixed comparisons promote the numeric
27
- * value to a semver-like string of the form `0.N.0` (so legacy `2` ≈ `"0.2.0"`
28
- * is compared element-wise against the string form). Returns `undefined`
29
- * when either value cannot be parsed at all.
30
- */
31
- export function compareConfigVersion(a, b) {
32
- const partsA = normalizeVersion(a);
33
- const partsB = normalizeVersion(b);
34
- if (!partsA || !partsB)
35
- return undefined;
36
- const len = Math.max(partsA.length, partsB.length);
37
- for (let i = 0; i < len; i++) {
38
- const ai = partsA[i] ?? 0;
39
- const bi = partsB[i] ?? 0;
40
- if (ai < bi)
41
- return -1;
42
- if (ai > bi)
43
- return 1;
44
- }
45
- return 0;
46
- }
47
- function normalizeVersion(v) {
48
- if (typeof v === "number" && Number.isFinite(v)) {
49
- return [0, Math.trunc(v), 0];
50
- }
51
- if (typeof v === "string") {
52
- const trimmed = v.trim();
53
- if (!trimmed)
54
- return undefined;
55
- const cleaned = trimmed.replace(/^v/i, "").split(/[-+]/, 1)[0];
56
- const segments = cleaned.split(".").map((part) => Number.parseInt(part, 10));
57
- if (segments.length === 0 || segments.some((n) => !Number.isFinite(n)))
58
- return undefined;
59
- return segments;
60
- }
61
- return undefined;
62
- }
63
- // ── Helpers for deep-merging into nested locations ──────────────────────────
64
- function getObj(parent, key) {
65
- const existing = parent[key];
66
- if (existing && typeof existing === "object" && !Array.isArray(existing)) {
67
- return existing;
68
- }
69
- const next = {};
70
- parent[key] = next;
71
- return next;
72
- }
73
- /** Get the `profiles.improve.default.processes.<name>` object (creating intermediate nodes). */
74
- function getImproveProcess(result, processName) {
75
- const profiles = getObj(result, "profiles");
76
- const improve = getObj(profiles, "improve");
77
- const defaultProfile = getObj(improve, "default");
78
- const processes = getObj(defaultProfile, "processes");
79
- return getObj(processes, processName);
80
- }
81
- function isObj(v) {
82
- return !!v && typeof v === "object" && !Array.isArray(v);
83
- }
84
- function hasOpenvikingSource(raw) {
85
- const sources = raw.sources;
86
- if (!Array.isArray(sources))
87
- return false;
88
- for (const entry of sources) {
89
- if (isObj(entry) && entry.type === "openviking")
90
- return true;
91
- }
92
- return false;
93
- }
94
- /**
95
- * Convert a snake_case or kebab-case identifier into camelCase. Leaves an
96
- * already-camelCased value untouched. Used by the catch-all branches to
97
- * normalize unknown legacy keys (e.g. `my_custom_process` → `myCustomProcess`).
98
- */
99
- function toCamelCase(key) {
100
- return key.replace(/[-_]([a-zA-Z0-9])/g, (_, ch) => ch.toUpperCase());
101
- }
102
- /**
103
- * Migrate a generic feature-gate-shaped value (boolean OR an object that may
104
- * carry `{ enabled, options }`) into a target object at `result[section][key]`
105
- * (where section is "index" or "search"). Preserves recognized `options.*`
106
- * fields by spreading them onto the target shallowly.
107
- *
108
- * Returns true when the value was understood enough to set anything.
109
- */
110
- function migrateGenericGateToSection(result, section, camelKey, legacy) {
111
- const parent = getObj(result, section);
112
- const target = getObj(parent, camelKey);
113
- if (typeof legacy === "boolean") {
114
- target.enabled = legacy;
115
- return true;
116
- }
117
- if (!isObj(legacy))
118
- return false;
119
- let touched = false;
120
- if (typeof legacy.enabled === "boolean") {
121
- target.enabled = legacy.enabled;
122
- touched = true;
123
- }
124
- if (isObj(legacy.options)) {
125
- // Best-effort: copy primitive option values onto the target so they aren't
126
- // dropped. The exact final shape is unknown for unrecognized keys, so we
127
- // place them under an `options` sub-object to keep the new shape clean.
128
- target.options = { ...(isObj(target.options) ? target.options : {}), ...legacy.options };
129
- touched = true;
130
- }
131
- return touched;
132
- }
133
- /**
134
- * Migrate a single legacy ProcessEntry-like value (boolean or
135
- * { enabled, mode, profile, timeoutMs, options }) into an ImproveProcessConfig
136
- * at the target location. Merges shallowly with anything already present.
137
- */
138
- function migrateProcessEntryToImprove(result, processName, legacy) {
139
- const target = getImproveProcess(result, processName);
140
- if (typeof legacy === "boolean") {
141
- target.enabled = legacy;
142
- return;
143
- }
144
- if (!isObj(legacy))
145
- return;
146
- if (typeof legacy.enabled === "boolean")
147
- target.enabled = legacy.enabled;
148
- if (typeof legacy.mode === "string")
149
- target.mode = legacy.mode;
150
- if (typeof legacy.profile === "string")
151
- target.profile = legacy.profile;
152
- if (legacy.timeoutMs === null || typeof legacy.timeoutMs === "number")
153
- target.timeoutMs = legacy.timeoutMs;
154
- if (isObj(legacy.options)) {
155
- const opts = legacy.options;
156
- // 0.8.0 removed `cooldown` / `cooldownDays` — drop them silently. Reflect
157
- // and distill now use signal-delta eligibility; consolidate uses
158
- // pool-delta. Carrying these forward would just trip the schema gate.
159
- if (Array.isArray(opts.allowedTypes)) {
160
- target.allowedTypes = opts.allowedTypes;
161
- }
162
- }
163
- }
164
- /**
165
- * Determine whether a raw config object needs migration to the 0.8.0 shape and
166
- * apply any necessary field renames or promotions.
167
- *
168
- * A config is considered already migrated when `configVersion === "0.8.0"`
169
- * (canonical string sentinel for this release) or when `configVersion` is a
170
- * number ≥ 2 AND the config carries no recognized legacy keys.
171
- */
172
- export function migrateConfigShape(raw, opts) {
173
- const emitWarn = opts?.warn ?? warn;
174
- const hasLegacyKeys = Object.hasOwn(raw, "features") ||
175
- (isObj(raw.llm) && (Object.hasOwn(raw.llm, "endpoint") || Object.hasOwn(raw.llm, "features"))) ||
176
- isObj(raw.agent) ||
177
- Object.hasOwn(raw, "stashes") ||
178
- typeof raw.semanticSearchMode === "boolean" ||
179
- hasOpenvikingSource(raw);
180
- // Already migrated — string sentinel "0.8.0" with no legacy keys present.
181
- if (raw.configVersion === CURRENT_CONFIG_VERSION && !hasLegacyKeys) {
182
- return { changed: false, result: raw };
183
- }
184
- // Legacy numeric versioning sentinel (>= 2) with no legacy keys present.
185
- if (typeof raw.configVersion === "number" && raw.configVersion >= 2 && !hasLegacyKeys) {
186
- return { changed: false, result: raw };
187
- }
188
- const result = { ...raw };
189
- let changed = false;
190
- // ── 0) Pre-migrations: legacy keys and shape coercions ─────────────────
191
- //
192
- // These run before the deeper feature-block migrations because they
193
- // affect keys the later passes assume are already canonical.
194
- // 0a) Coerce semanticSearchMode boolean → string ("auto" | "off").
195
- if (typeof result.semanticSearchMode === "boolean") {
196
- result.semanticSearchMode = result.semanticSearchMode ? "auto" : "off";
197
- changed = true;
198
- }
199
- // 0b) Rename legacy stashes[] → sources[].
200
- if (Array.isArray(result.stashes)) {
201
- if (!Array.isArray(result.sources)) {
202
- result.sources = result.stashes;
203
- emitWarn("[akm config-migrate] Legacy `stashes[]` config key renamed to `sources[]`. " +
204
- "Re-save your config to remove the deprecation notice.");
205
- }
206
- else {
207
- emitWarn("[akm config-migrate] Both `stashes[]` and `sources[]` present; `stashes[]` dropped (sources takes precedence).");
208
- }
209
- delete result.stashes;
210
- changed = true;
211
- }
212
- // 0c) Rename openviking source type. The old type is gone in 0.8.0; the
213
- // canonical replacement is a website source. Users with non-trivial
214
- // openviking config likely need manual intervention — we warn loudly.
215
- if (Array.isArray(result.sources)) {
216
- const sources = result.sources;
217
- const mapped = [];
218
- let renamed = false;
219
- for (const entry of sources) {
220
- if (isObj(entry) && entry.type === "openviking") {
221
- const name = typeof entry.name === "string" && entry.name ? entry.name : "unnamed";
222
- emitWarn(`[akm config-migrate] Source "${name}" (type: openviking) is no longer supported. ` +
223
- "Remove it from your config, or replace with a `website`/`git` source. " +
224
- "Entry dropped from sources[].");
225
- renamed = true;
226
- continue;
227
- }
228
- mapped.push(entry);
229
- }
230
- if (renamed) {
231
- result.sources = mapped;
232
- changed = true;
233
- }
234
- }
235
- // ── 1) Migrate `llm.features.*` → new homes ────────────────────────────
236
- if (isObj(result.llm)) {
237
- const llm = { ...result.llm };
238
- if (isObj(llm.features)) {
239
- const llmFeatures = llm.features;
240
- const setProcessEnabled = (processName, enabled) => {
241
- if (typeof enabled !== "boolean")
242
- return;
243
- const target = getImproveProcess(result, processName);
244
- target.enabled = enabled;
245
- };
246
- if ("memory_consolidation" in llmFeatures) {
247
- setProcessEnabled("consolidate", llmFeatures.memory_consolidation);
248
- }
249
- if ("feedback_distillation" in llmFeatures) {
250
- // 0.8.0 unified the feedback_distillation gate into processes.distill.enabled.
251
- setProcessEnabled("distill", llmFeatures.feedback_distillation);
252
- }
253
- if ("memory_inference" in llmFeatures) {
254
- setProcessEnabled("memoryInference", llmFeatures.memory_inference);
255
- }
256
- if ("graph_extraction" in llmFeatures) {
257
- setProcessEnabled("graphExtraction", llmFeatures.graph_extraction);
258
- }
259
- if ("metadata_enhance" in llmFeatures) {
260
- const index = getObj(result, "index");
261
- const me = getObj(index, "metadataEnhance");
262
- if (typeof llmFeatures.metadata_enhance === "boolean")
263
- me.enabled = llmFeatures.metadata_enhance;
264
- }
265
- if ("lesson_quality_gate" in llmFeatures) {
266
- const distill = getImproveProcess(result, "distill");
267
- const qg = getObj(distill, "qualityGate");
268
- if (typeof llmFeatures.lesson_quality_gate === "boolean")
269
- qg.enabled = llmFeatures.lesson_quality_gate;
270
- }
271
- if ("proposal_quality_gate" in llmFeatures) {
272
- const reflect = getImproveProcess(result, "reflect");
273
- const qg = getObj(reflect, "qualityGate");
274
- if (typeof llmFeatures.proposal_quality_gate === "boolean")
275
- qg.enabled = llmFeatures.proposal_quality_gate;
276
- }
277
- if ("memory_contradiction_detection" in llmFeatures) {
278
- const consolidate = getImproveProcess(result, "consolidate");
279
- const cd = getObj(consolidate, "contradictionDetection");
280
- if (typeof llmFeatures.memory_contradiction_detection === "boolean") {
281
- cd.enabled = llmFeatures.memory_contradiction_detection;
282
- }
283
- }
284
- delete llm.features;
285
- changed = true;
286
- }
287
- // 2) Migrate top-level `llm` (LlmConnectionConfig) → `profiles.llm.default`
288
- // + `defaults.llm = "default"` if it actually has connection fields.
289
- if (typeof llm.endpoint === "string") {
290
- const profiles = getObj(result, "profiles");
291
- const llmProfiles = getObj(profiles, "llm");
292
- // Don't overwrite if a "default" entry already exists.
293
- if (!isObj(llmProfiles.default)) {
294
- llmProfiles.default = { ...llm };
295
- }
296
- const defaults = getObj(result, "defaults");
297
- if (typeof defaults.llm !== "string")
298
- defaults.llm = "default";
299
- changed = true;
300
- }
301
- // Always strip the legacy `llm` block — its only remaining job was holding
302
- // connection fields and `features`, both migrated.
303
- delete result.llm;
304
- }
305
- // ── 3) Migrate `features.*` (top-level) → new homes ────────────────────
306
- if (isObj(result.features)) {
307
- const features = result.features;
308
- if (isObj(features.improve)) {
309
- const fi = features.improve;
310
- // memory_consolidation (bool or ProcessEntry) → processes.consolidate
311
- if ("memory_consolidation" in fi) {
312
- migrateProcessEntryToImprove(result, "consolidate", fi.memory_consolidation);
313
- }
314
- // feedback_distillation (bool) → processes.distill (0.8.0 unification).
315
- if ("feedback_distillation" in fi) {
316
- migrateProcessEntryToImprove(result, "distill", fi.feedback_distillation);
317
- }
318
- // validation (ProcessEntry) → processes.validation
319
- if ("validation" in fi) {
320
- migrateProcessEntryToImprove(result, "validation", fi.validation);
321
- }
322
- // reflect/distill/consolidate (ProcessEntry) — merged with .options.cooldown → cooldownByType
323
- if ("reflect" in fi)
324
- migrateProcessEntryToImprove(result, "reflect", fi.reflect);
325
- if ("distill" in fi)
326
- migrateProcessEntryToImprove(result, "distill", fi.distill);
327
- if ("consolidate" in fi)
328
- migrateProcessEntryToImprove(result, "consolidate", fi.consolidate);
329
- // Catch-all: any remaining keys are treated as custom processes and
330
- // migrated to profiles.improve.default.processes.<camelKey>. Without
331
- // this branch, user-defined entries would be silently dropped when the
332
- // legacy `features` block is deleted below.
333
- const knownImproveKeys = new Set([
334
- "memory_consolidation",
335
- "feedback_distillation",
336
- "validation",
337
- "reflect",
338
- "distill",
339
- "consolidate",
340
- ]);
341
- for (const [legacyKey, legacyVal] of Object.entries(fi)) {
342
- if (knownImproveKeys.has(legacyKey))
343
- continue;
344
- const camelKey = toCamelCase(legacyKey);
345
- if (typeof legacyVal === "boolean" || isObj(legacyVal)) {
346
- migrateProcessEntryToImprove(result, camelKey, legacyVal);
347
- emitWarn(`[akm config-migrate] Unknown features.improve.${legacyKey} migrated to ` +
348
- `profiles.improve.default.processes.${camelKey}. Please verify the new location.`);
349
- }
350
- else {
351
- emitWarn(`[akm config-migrate] features.improve.${legacyKey} has an unrecognized value type ` +
352
- `(${typeof legacyVal}); dropping. Please re-add it under profiles.improve.* manually.`);
353
- }
354
- }
355
- changed = true;
356
- }
357
- if (isObj(features.index)) {
358
- const findex = features.index;
359
- if ("memory_inference" in findex) {
360
- migrateProcessEntryToImprove(result, "memoryInference", findex.memory_inference);
361
- }
362
- if ("graph_extraction" in findex) {
363
- migrateProcessEntryToImprove(result, "graphExtraction", findex.graph_extraction);
364
- }
365
- if ("metadata_enhance" in findex) {
366
- const index = getObj(result, "index");
367
- const me = getObj(index, "metadataEnhance");
368
- const val = findex.metadata_enhance;
369
- if (typeof val === "boolean")
370
- me.enabled = val;
371
- else if (isObj(val) && typeof val.enabled === "boolean")
372
- me.enabled = val.enabled;
373
- }
374
- // staleness_detection: the pass was retired (meta-review 10-Q3), so the
375
- // legacy features.index.staleness_detection entry is deliberately DROPPED
376
- // during migration ("staleness_detection" stays in knownIndexKeys below so
377
- // the catch-all does not resurrect it under index.stalenessDetection).
378
- // Catch-all: unknown features.index.<key> entries land at
379
- // index.<keyAsCamelCase> (preserving { enabled, options } when present).
380
- const knownIndexKeys = new Set([
381
- "memory_inference",
382
- "graph_extraction",
383
- "metadata_enhance",
384
- "staleness_detection",
385
- ]);
386
- for (const [legacyKey, legacyVal] of Object.entries(findex)) {
387
- if (knownIndexKeys.has(legacyKey))
388
- continue;
389
- const camelKey = toCamelCase(legacyKey);
390
- const ok = migrateGenericGateToSection(result, "index", camelKey, legacyVal);
391
- if (ok) {
392
- emitWarn(`[akm config-migrate] Unknown features.index.${legacyKey} migrated to ` +
393
- `index.${camelKey}. Please verify the new location is correct.`);
394
- }
395
- else {
396
- emitWarn(`[akm config-migrate] features.index.${legacyKey} has an unrecognized value shape; ` +
397
- `dropping. Please re-add it under index.${camelKey} manually if needed.`);
398
- }
399
- }
400
- changed = true;
401
- }
402
- if (isObj(features.search)) {
403
- const fsearch = features.search;
404
- // Catch-all: unknown features.search.<key> entries land at
405
- // search.<keyAsCamelCase> (preserving { enabled, options } when present).
406
- // `curate_rerank` is a removed dead feature — listed here so the catch-all
407
- // skips it and it is simply dropped (not resurrected under search.curateRerank).
408
- const knownSearchKeys = new Set(["curate_rerank"]);
409
- for (const [legacyKey, legacyVal] of Object.entries(fsearch)) {
410
- if (knownSearchKeys.has(legacyKey))
411
- continue;
412
- const camelKey = toCamelCase(legacyKey);
413
- const ok = migrateGenericGateToSection(result, "search", camelKey, legacyVal);
414
- if (ok) {
415
- emitWarn(`[akm config-migrate] Unknown features.search.${legacyKey} migrated to ` +
416
- `search.${camelKey}. Please verify the new location is correct.`);
417
- }
418
- else {
419
- emitWarn(`[akm config-migrate] features.search.${legacyKey} has an unrecognized value shape; ` +
420
- `dropping. Please re-add it under search.${camelKey} manually if needed.`);
421
- }
422
- }
423
- changed = true;
424
- }
425
- delete result.features;
426
- }
427
- // ── 4) Migrate `agent.*` (v1) → `profiles.agent` + `defaults.agent` ──────
428
- if (isObj(result.agent)) {
429
- const agent = result.agent;
430
- // 4a) agent.default → defaults.agent
431
- if (typeof agent.default === "string" && agent.default.trim()) {
432
- const defaults = getObj(result, "defaults");
433
- if (typeof defaults.agent !== "string")
434
- defaults.agent = agent.default.trim();
435
- changed = true;
436
- }
437
- // 4b) agent.profiles → profiles.agent (only entries with valid `platform`)
438
- if (isObj(agent.profiles)) {
439
- const v1Profiles = agent.profiles;
440
- const profiles = getObj(result, "profiles");
441
- const agentProfiles = getObj(profiles, "agent");
442
- for (const [name, raw] of Object.entries(v1Profiles)) {
443
- if (!isObj(raw))
444
- continue;
445
- if (isObj(agentProfiles[name]))
446
- continue; // do not overwrite existing v2 entries
447
- // v1 profiles do not carry a "platform" — synthesize one from name where possible.
448
- const platform = typeof raw.platform === "string" ? raw.platform : guessAgentPlatform(name);
449
- if (!platform)
450
- continue;
451
- const v2 = { platform };
452
- if (typeof raw.bin === "string" && raw.bin.trim())
453
- v2.bin = raw.bin.trim();
454
- if (Array.isArray(raw.args) && raw.args.every((a) => typeof a === "string"))
455
- v2.args = raw.args;
456
- if (typeof raw.model === "string" && raw.model.trim())
457
- v2.model = raw.model.trim();
458
- if (typeof raw.workspace === "string" && raw.workspace.trim())
459
- v2.workspace = raw.workspace.trim();
460
- agentProfiles[name] = v2;
461
- changed = true;
462
- }
463
- }
464
- // 4c) agent.processes.<name> (v1 binding) → profiles.improve.default.processes.<name>.profile
465
- if (isObj(agent.processes)) {
466
- const v1Processes = agent.processes;
467
- for (const [processName, raw] of Object.entries(v1Processes)) {
468
- if (processName === "task")
469
- continue; // legacy v1-only; drop
470
- let profileName;
471
- let timeoutMs;
472
- if (typeof raw === "string" && raw.trim()) {
473
- profileName = raw.trim();
474
- }
475
- else if (isObj(raw)) {
476
- if (typeof raw.profile === "string" && raw.profile.trim())
477
- profileName = raw.profile.trim();
478
- if (raw.timeoutMs === null || typeof raw.timeoutMs === "number") {
479
- timeoutMs = raw.timeoutMs;
480
- }
481
- }
482
- if (!profileName)
483
- continue;
484
- // Map v1 process names to v2 improve process names.
485
- const v2Name = mapV1ProcessName(processName);
486
- if (!v2Name)
487
- continue;
488
- const target = getImproveProcess(result, v2Name);
489
- target.profile = profileName;
490
- target.mode = "agent";
491
- if (timeoutMs !== undefined)
492
- target.timeoutMs = timeoutMs;
493
- changed = true;
494
- }
495
- }
496
- delete result.agent;
497
- }
498
- // ── 5) Migrate `improve.*` (top-level pipeline options) ──────────────────
499
- if (isObj(result.improve)) {
500
- const improve = { ...result.improve };
501
- // 0.8.0 removed reflectCooldownByType — reflect now uses signal-delta
502
- // eligibility. Drop the key silently rather than carrying it into a shape
503
- // the schema rejects.
504
- if (typeof improve.limit === "number") {
505
- const profiles = getObj(result, "profiles");
506
- const improveProfiles = getObj(profiles, "improve");
507
- const defaultProfile = getObj(improveProfiles, "default");
508
- defaultProfile.limit = improve.limit;
509
- changed = true;
510
- }
511
- delete improve.reflectCooldownByType;
512
- delete improve.limit;
513
- delete improve.schedule;
514
- if (Object.keys(improve).length > 0) {
515
- result.improve = improve;
516
- }
517
- else {
518
- delete result.improve;
519
- }
520
- }
521
- // ── 6) Legacy `defaults.improve` object form ({ limit, preset }) ─────────
522
- if (isObj(result.defaults)) {
523
- const defaultsRaw = { ...result.defaults };
524
- const defaultsImprove = defaultsRaw.improve;
525
- if (isObj(defaultsImprove)) {
526
- const improveObj = defaultsImprove;
527
- if (typeof improveObj.limit === "number") {
528
- const profiles = getObj(result, "profiles");
529
- const improveProfiles = getObj(profiles, "improve");
530
- const defaultProfile = getObj(improveProfiles, "default");
531
- if (typeof defaultProfile.limit !== "number")
532
- defaultProfile.limit = improveObj.limit;
533
- changed = true;
534
- }
535
- if (improveObj.preset !== undefined) {
536
- emitWarn("[akm config-migrate] defaults.improve.preset is no longer supported. " +
537
- "Use `--profile <name>` (built-ins: default, quick, thorough, memory-focus) instead.");
538
- }
539
- delete defaultsRaw.improve;
540
- if (Object.keys(defaultsRaw).length > 0) {
541
- result.defaults = defaultsRaw;
542
- }
543
- else {
544
- delete result.defaults;
545
- }
546
- changed = true;
547
- }
548
- }
549
- // Stamp the new version sentinel on any migration that did substantive work.
550
- if (changed) {
551
- result.configVersion = CURRENT_CONFIG_VERSION;
552
- }
553
- return { changed, result };
554
- }
555
- /**
556
- * Guess a v2 agent platform for a known v1 profile name. Returns `undefined`
557
- * for unknown names — the caller drops those entries (they have no usable
558
- * platform).
559
- */
560
- function guessAgentPlatform(name) {
561
- // #566: consult the harness registry instead of re-deriving the heuristic.
562
- // `v1ProfilePlatform` iterates HARNESS_REGISTRY and asks each harness's own
563
- // `matchesV1ProfileName()`, so:
564
- // - 'claude' AND the 'claude-code' alias both resolve to canonical 'claude'
565
- // (the normalization bridge keeps legacy v1 names round-tripping);
566
- // - decorated names like 'opencode-sdk-x' resolve most-specific-first;
567
- // - an unknown harness name returns undefined (caller drops it) instead of
568
- // being silently misclassified. Adding a harness needs no edit here.
569
- return v1ProfilePlatform(name);
570
- }
571
- /**
572
- * Map a v1 process name (e.g. `"reflect"`, `"propose"`) to its v2 improve
573
- * process name. Returns `undefined` for names that have no v2 home (e.g.
574
- * `"task"`, which was removed).
575
- */
576
- function mapV1ProcessName(name) {
577
- switch (name) {
578
- case "reflect":
579
- return "reflect";
580
- case "distill":
581
- return "distill";
582
- case "consolidate":
583
- return "consolidate";
584
- case "propose":
585
- // v1 "propose" mapped to reflect/distill at runtime; bind to reflect by default.
586
- return "reflect";
587
- case "validation":
588
- return "validation";
589
- case "memoryInference":
590
- case "memory_inference":
591
- return "memoryInference";
592
- case "graphExtraction":
593
- case "graph_extraction":
594
- return "graphExtraction";
595
- case "feedbackDistillation":
596
- case "feedback_distillation":
597
- // 0.8.0 unified feedbackDistillation into distill (single source of truth).
598
- return "distill";
599
- default:
600
- return undefined;
601
- }
602
- }
@@ -1,38 +0,0 @@
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
- * Generic recursive object merge, extracted from the setup wizard (it is not
6
- * setup-specific). Plain objects merge key-by-key; arrays and scalars replace
7
- * wholesale. Used to apply a partial `--file` config over the existing config
8
- * without dropping sibling subkeys.
9
- */
10
- /** True for non-null, non-array plain objects. */
11
- export function isPlainObject(value) {
12
- return typeof value === "object" && value !== null && !Array.isArray(value);
13
- }
14
- /**
15
- * Recursively merge `incoming` into `base`: plain objects merge key-by-key,
16
- * while arrays and scalars replace wholesale. A partial input therefore only
17
- * updates the keys it carries and never drops sibling subkeys (e.g. a file
18
- * containing `{ output: { format: "text" } }` leaves `output.detail` intact).
19
- *
20
- * `base` is treated as immutable — a fresh object graph is returned.
21
- */
22
- export function deepMergeConfig(base, incoming) {
23
- if (!isPlainObject(incoming))
24
- return incoming;
25
- const baseObj = isPlainObject(base) ? base : {};
26
- const out = { ...baseObj };
27
- for (const [key, value] of Object.entries(incoming)) {
28
- if (value === undefined)
29
- continue;
30
- if (isPlainObject(value) && isPlainObject(baseObj[key])) {
31
- out[key] = deepMergeConfig(baseObj[key], value);
32
- }
33
- else {
34
- out[key] = value;
35
- }
36
- }
37
- return out;
38
- }