akm-cli 0.9.0-beta.6 → 0.9.0-rc.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (326) hide show
  1. package/CHANGELOG.md +663 -0
  2. package/README.md +12 -4
  3. package/dist/akm +38 -0
  4. package/dist/akm-migrate-storage +38 -0
  5. package/dist/assets/help/help-improve.md +9 -6
  6. package/dist/assets/hints/cli-hints-full.md +6 -5
  7. package/dist/assets/profiles/default.json +9 -4
  8. package/dist/assets/profiles/frequent.json +1 -1
  9. package/dist/assets/profiles/memory-focus.json +1 -1
  10. package/dist/assets/profiles/proactive-maintenance.json +25 -0
  11. package/dist/assets/profiles/quick.json +1 -1
  12. package/dist/assets/profiles/recombine-only.json +21 -0
  13. package/dist/assets/profiles/reflect-distill.json +30 -0
  14. package/dist/assets/profiles/synthesize.json +15 -0
  15. package/dist/assets/profiles/thorough.json +1 -1
  16. package/dist/assets/prompts/consolidate-system.md +23 -0
  17. package/dist/assets/prompts/contradiction-judge.md +33 -0
  18. package/dist/assets/prompts/distill-knowledge-system.md +22 -0
  19. package/dist/assets/prompts/distill-lesson-system.md +36 -0
  20. package/dist/assets/prompts/extract-session.md +11 -3
  21. package/dist/assets/prompts/graph-extract-system.md +1 -0
  22. package/dist/assets/prompts/graph-extract-user-prompt.md +1 -1
  23. package/dist/assets/prompts/memory-infer-system.md +1 -0
  24. package/dist/assets/prompts/memory-infer-user.md +5 -0
  25. package/dist/assets/prompts/metadata-enhance-system.md +1 -0
  26. package/dist/assets/prompts/procedural-system.md +44 -0
  27. package/dist/assets/prompts/recombine-system.md +40 -0
  28. package/dist/assets/prompts/staleness-detect-system.md +6 -0
  29. package/dist/assets/prompts/validate-summary-judge.md +1 -0
  30. package/dist/assets/stash-skeleton/facts/conventions/assets/agent.md +38 -0
  31. package/dist/assets/stash-skeleton/facts/conventions/assets/command.md +38 -0
  32. package/dist/assets/stash-skeleton/facts/conventions/assets/fact.md +39 -0
  33. package/dist/assets/stash-skeleton/facts/conventions/assets/knowledge.md +40 -0
  34. package/dist/assets/stash-skeleton/facts/conventions/assets/lesson.md +43 -0
  35. package/dist/assets/stash-skeleton/facts/conventions/assets/memory.md +38 -0
  36. package/dist/assets/stash-skeleton/facts/conventions/assets/script.md +43 -0
  37. package/dist/assets/stash-skeleton/facts/conventions/assets/skill.md +40 -0
  38. package/dist/assets/stash-skeleton/facts/conventions/assets/workflow.md +43 -0
  39. package/dist/assets/templates/html/health.html +281 -111
  40. package/dist/assets/wiki/ingest-workflow-template.md +45 -16
  41. package/dist/assets/wiki/schema-template.md +4 -4
  42. package/dist/cli/clack.js +56 -0
  43. package/dist/cli/config-migrate.js +7 -1
  44. package/dist/cli/confirm.js +1 -1
  45. package/dist/cli/parse-args.js +46 -1
  46. package/dist/cli/shared.js +28 -0
  47. package/dist/cli.js +25 -14
  48. package/dist/commands/agent/agent-dispatch.js +3 -2
  49. package/dist/commands/agent/agent-support.js +0 -7
  50. package/dist/commands/agent/contribute-cli.js +26 -7
  51. package/dist/commands/config-cli.js +26 -13
  52. package/dist/commands/env/child-env.js +47 -0
  53. package/dist/commands/env/env-cli.js +220 -227
  54. package/dist/commands/env/env.js +14 -67
  55. package/dist/commands/env/secret-cli.js +140 -138
  56. package/dist/commands/feedback-cli.js +153 -147
  57. package/dist/commands/graph/graph-cli.js +5 -13
  58. package/dist/commands/graph/graph.js +76 -72
  59. package/dist/commands/health/advisories.js +151 -0
  60. package/dist/commands/health/checks.js +103 -16
  61. package/dist/commands/health/html-report.js +447 -81
  62. package/dist/commands/health/improve-metrics.js +771 -0
  63. package/dist/commands/health/llm-usage.js +65 -0
  64. package/dist/commands/health/md-report.js +103 -0
  65. package/dist/commands/health/metrics.js +278 -0
  66. package/dist/commands/health/stash-exposure.js +46 -0
  67. package/dist/commands/health/surfaces.js +216 -0
  68. package/dist/commands/health/task-runs.js +135 -0
  69. package/dist/commands/health/types.js +26 -0
  70. package/dist/commands/health/windows.js +195 -0
  71. package/dist/commands/health.js +91 -1083
  72. package/dist/commands/improve/anti-collapse.js +170 -0
  73. package/dist/commands/improve/calibration.js +161 -0
  74. package/dist/commands/improve/collapse-detector.js +421 -0
  75. package/dist/commands/improve/consolidate/chunking.js +141 -0
  76. package/dist/commands/improve/consolidate/eligibility.js +64 -0
  77. package/dist/commands/improve/consolidate/merge.js +145 -0
  78. package/dist/commands/improve/consolidate/sanitize.js +231 -0
  79. package/dist/commands/{lint.js → improve/consolidate/types.js} +1 -1
  80. package/dist/commands/improve/consolidate.js +1313 -1278
  81. package/dist/commands/improve/dedup.js +482 -0
  82. package/dist/commands/improve/distill/content-repair.js +202 -0
  83. package/dist/commands/improve/distill/promote-memory.js +229 -0
  84. package/dist/commands/improve/distill/quality-gate.js +236 -0
  85. package/dist/commands/improve/distill-guards.js +127 -0
  86. package/dist/commands/improve/distill-promotion-policy.js +826 -167
  87. package/dist/commands/improve/distill.js +243 -599
  88. package/dist/commands/improve/eligibility.js +434 -0
  89. package/dist/commands/improve/encoding-salience.js +205 -0
  90. package/dist/commands/improve/extract-cli.js +179 -59
  91. package/dist/commands/improve/extract-prompt.js +55 -4
  92. package/dist/commands/improve/extract-watch.js +140 -0
  93. package/dist/commands/improve/extract.js +409 -43
  94. package/dist/commands/improve/feedback-valence.js +54 -0
  95. package/dist/commands/improve/hot-probation.js +45 -0
  96. package/dist/commands/improve/improve-auto-accept.js +160 -7
  97. package/dist/commands/improve/improve-cli.js +115 -73
  98. package/dist/commands/improve/improve-profiles.js +32 -8
  99. package/dist/commands/improve/improve-result-file.js +15 -25
  100. package/dist/commands/improve/improve-session.js +58 -0
  101. package/dist/commands/improve/improve.js +510 -2537
  102. package/dist/commands/improve/locks.js +154 -0
  103. package/dist/commands/improve/loop-stages.js +1100 -0
  104. package/dist/commands/improve/memory/memory-belief.js +14 -15
  105. package/dist/commands/improve/memory/memory-contradiction-detect.js +83 -60
  106. package/dist/commands/improve/memory/memory-improve.js +27 -27
  107. package/dist/commands/improve/outcome-loop.js +270 -0
  108. package/dist/commands/improve/preparation.js +2002 -0
  109. package/dist/commands/improve/proactive-maintenance.js +115 -0
  110. package/dist/commands/improve/procedural.js +398 -0
  111. package/dist/commands/improve/recombine.js +818 -0
  112. package/dist/commands/improve/reflect-noise.js +0 -0
  113. package/dist/commands/improve/reflect.js +212 -45
  114. package/dist/commands/improve/salience.js +455 -0
  115. package/dist/commands/improve/schema-similarity-gate.js +168 -0
  116. package/dist/commands/improve/shared.js +51 -0
  117. package/dist/commands/improve/triage.js +93 -0
  118. package/dist/commands/lint/agent-linter.js +19 -24
  119. package/dist/commands/lint/base-linter.js +173 -60
  120. package/dist/commands/lint/command-linter.js +19 -24
  121. package/dist/commands/lint/env-key-rules.js +38 -1
  122. package/dist/commands/lint/fact-linter.js +39 -0
  123. package/dist/commands/lint/index.js +31 -13
  124. package/dist/commands/lint/memory-linter.js +1 -1
  125. package/dist/commands/lint/registry.js +7 -2
  126. package/dist/commands/lint/task-linter.js +3 -3
  127. package/dist/commands/lint/workflow-linter.js +26 -1
  128. package/dist/commands/observability-cli.js +4 -4
  129. package/dist/commands/proposal/drain-policies.js +13 -4
  130. package/dist/commands/proposal/drain.js +45 -51
  131. package/dist/commands/proposal/legacy-import.js +115 -0
  132. package/dist/commands/proposal/proposal-cli.js +24 -34
  133. package/dist/commands/proposal/proposal.js +7 -1
  134. package/dist/commands/proposal/propose.js +8 -3
  135. package/dist/commands/proposal/repository.js +829 -0
  136. package/dist/commands/proposal/validators/proposal-quality-validators.js +9 -8
  137. package/dist/commands/proposal/validators/proposals.js +93 -882
  138. package/dist/commands/read/curate.js +419 -103
  139. package/dist/commands/read/knowledge.js +10 -3
  140. package/dist/commands/read/remember-cli.js +133 -138
  141. package/dist/commands/read/search-cli.js +15 -8
  142. package/dist/commands/read/search.js +22 -11
  143. package/dist/commands/read/show.js +106 -14
  144. package/dist/commands/registry-cli.js +76 -87
  145. package/dist/commands/remember.js +11 -12
  146. package/dist/commands/sources/add-cli.js +91 -95
  147. package/dist/commands/sources/history.js +1 -1
  148. package/dist/commands/sources/init.js +66 -18
  149. package/dist/commands/sources/installed-stashes.js +11 -3
  150. package/dist/commands/sources/schema-repair.js +44 -46
  151. package/dist/commands/sources/self-update.js +2 -2
  152. package/dist/commands/sources/source-add.js +7 -3
  153. package/dist/commands/sources/sources-cli.js +3 -3
  154. package/dist/commands/sources/stash-cli.js +29 -41
  155. package/dist/commands/sources/stash-skeleton.js +57 -8
  156. package/dist/commands/tasks/default-tasks.js +15 -2
  157. package/dist/commands/tasks/tasks-cli.js +20 -29
  158. package/dist/commands/tasks/tasks.js +39 -11
  159. package/dist/commands/wiki-cli.js +23 -38
  160. package/dist/commands/workflow-cli.js +15 -1
  161. package/dist/core/asset/asset-registry.js +3 -1
  162. package/dist/core/asset/asset-spec.js +21 -4
  163. package/dist/core/asset/frontmatter.js +188 -167
  164. package/dist/core/asset/markdown.js +8 -0
  165. package/dist/core/authoring-rules.js +92 -0
  166. package/dist/core/common.js +4 -23
  167. package/dist/core/concurrent.js +10 -1
  168. package/dist/core/config/config-io.js +10 -1
  169. package/dist/core/config/config-migration.js +18 -40
  170. package/dist/core/config/config-schema.js +389 -58
  171. package/dist/core/config/config-types.js +3 -3
  172. package/dist/core/config/config.js +67 -22
  173. package/dist/core/deep-merge.js +38 -0
  174. package/dist/core/errors.js +1 -0
  175. package/dist/core/eval/rank-metrics.js +113 -0
  176. package/dist/core/events.js +4 -7
  177. package/dist/core/improve-types.js +47 -8
  178. package/dist/core/logs-db.js +14 -75
  179. package/dist/core/parse.js +36 -16
  180. package/dist/core/paths.js +21 -18
  181. package/dist/core/standards/resolve-standards-context.js +87 -0
  182. package/dist/core/standards/resolve-stash-standards.js +99 -0
  183. package/dist/core/standards/resolve-type-conventions.js +66 -0
  184. package/dist/core/state/migrations.js +770 -0
  185. package/dist/core/state-db.js +142 -1091
  186. package/dist/core/structured.js +69 -0
  187. package/dist/core/time.js +53 -0
  188. package/dist/core/warn.js +21 -0
  189. package/dist/core/write-source.js +37 -0
  190. package/dist/indexer/db/db.js +356 -780
  191. package/dist/indexer/db/entry-mapper.js +41 -0
  192. package/dist/indexer/db/graph-db.js +129 -86
  193. package/dist/indexer/db/llm-cache.js +2 -2
  194. package/dist/indexer/db/schema.js +516 -0
  195. package/dist/indexer/ensure-index.js +103 -24
  196. package/dist/indexer/feedback/utility-policy.js +75 -0
  197. package/dist/indexer/graph/graph-boost.js +51 -41
  198. package/dist/indexer/graph/graph-extraction.js +207 -4
  199. package/dist/indexer/index-writer-lock.js +106 -0
  200. package/dist/indexer/index-written-assets.js +105 -0
  201. package/dist/indexer/indexer.js +291 -310
  202. package/dist/indexer/passes/dir-staleness.js +114 -0
  203. package/dist/indexer/passes/memory-inference.js +13 -5
  204. package/dist/indexer/passes/metadata.js +20 -0
  205. package/dist/indexer/read-preflight.js +23 -0
  206. package/dist/indexer/search/db-search.js +89 -13
  207. package/dist/indexer/search/fts-query.js +51 -0
  208. package/dist/indexer/search/ranking-contributors.js +95 -9
  209. package/dist/indexer/search/ranking.js +79 -3
  210. package/dist/indexer/search/search-fields.js +6 -0
  211. package/dist/indexer/search/search-source.js +32 -21
  212. package/dist/indexer/search/semantic-status.js +4 -0
  213. package/dist/indexer/walk/matchers.js +9 -0
  214. package/dist/indexer/walk/walker.js +21 -13
  215. package/dist/integrations/agent/builders.js +39 -13
  216. package/dist/integrations/agent/config.js +20 -59
  217. package/dist/integrations/agent/detect.js +9 -0
  218. package/dist/integrations/agent/index.js +3 -19
  219. package/dist/integrations/agent/model-aliases.js +7 -2
  220. package/dist/integrations/agent/profiles.js +7 -1
  221. package/dist/integrations/agent/prompts.js +75 -9
  222. package/dist/integrations/agent/runner-dispatch.js +59 -0
  223. package/dist/integrations/agent/runner.js +13 -9
  224. package/dist/integrations/agent/spawn.js +69 -67
  225. package/dist/integrations/harnesses/claude/agent-builder.js +1 -1
  226. package/dist/integrations/harnesses/claude/index.js +2 -0
  227. package/dist/integrations/harnesses/claude/session-log.js +11 -1
  228. package/dist/integrations/harnesses/index.js +2 -3
  229. package/dist/integrations/harnesses/opencode/agent-builder.js +1 -1
  230. package/dist/integrations/harnesses/opencode/index.js +2 -0
  231. package/dist/integrations/harnesses/opencode/session-log.js +173 -3
  232. package/dist/integrations/harnesses/opencode-sdk/index.js +2 -2
  233. package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +98 -17
  234. package/dist/integrations/harnesses/types.js +1 -0
  235. package/dist/integrations/session-logs/index.js +16 -0
  236. package/dist/llm/call-ai.js +2 -2
  237. package/dist/llm/client.js +57 -15
  238. package/dist/llm/embedder.js +67 -4
  239. package/dist/llm/embedders/cache.js +3 -1
  240. package/dist/llm/embedders/deterministic.js +66 -0
  241. package/dist/llm/embedders/local.js +73 -3
  242. package/dist/llm/feature-gate.js +16 -15
  243. package/dist/llm/graph-extract.js +67 -44
  244. package/dist/llm/memory-infer-impl.js +138 -0
  245. package/dist/llm/memory-infer.js +1 -127
  246. package/dist/llm/metadata-enhance.js +44 -31
  247. package/dist/llm/structured-call.js +49 -0
  248. package/dist/migrate-storage-node.mjs +8 -0
  249. package/dist/output/context.js +5 -5
  250. package/dist/output/renderers.js +85 -14
  251. package/dist/output/shapes/curate.js +14 -2
  252. package/dist/output/shapes/helpers.js +0 -3
  253. package/dist/output/shapes/passthrough.js +2 -1
  254. package/dist/output/text/helpers.js +29 -1
  255. package/dist/output/text/workflow.js +1 -0
  256. package/dist/registry/providers/skills-sh.js +21 -147
  257. package/dist/registry/providers/static-index.js +15 -157
  258. package/dist/registry/resolve.js +27 -9
  259. package/dist/runtime.js +25 -1
  260. package/dist/scripts/migrate-storage.js +2718 -2354
  261. package/dist/scripts/migrations/import-fs-improve-runs-to-db.js +891 -597
  262. package/dist/setup/detect.js +9 -0
  263. package/dist/setup/legacy-config.js +106 -0
  264. package/dist/setup/prompt.js +57 -0
  265. package/dist/setup/providers.js +14 -0
  266. package/dist/setup/registry-stash-loader.js +12 -0
  267. package/dist/setup/semantic-assets.js +124 -0
  268. package/dist/setup/setup.js +52 -1614
  269. package/dist/setup/steps/connection.js +734 -0
  270. package/dist/setup/steps/output.js +31 -0
  271. package/dist/setup/steps/platforms.js +124 -0
  272. package/dist/setup/steps/semantic.js +27 -0
  273. package/dist/setup/steps/sources.js +222 -0
  274. package/dist/setup/steps/stashdir.js +42 -0
  275. package/dist/setup/steps/tasks.js +152 -0
  276. package/dist/sources/include.js +6 -2
  277. package/dist/sources/providers/filesystem.js +0 -1
  278. package/dist/sources/providers/git-install.js +210 -0
  279. package/dist/sources/providers/git-provider.js +234 -0
  280. package/dist/sources/providers/git-stash.js +248 -0
  281. package/dist/sources/providers/git.js +10 -661
  282. package/dist/sources/providers/npm.js +2 -6
  283. package/dist/sources/providers/provider-utils.js +13 -7
  284. package/dist/sources/providers/sync-from-ref.js +9 -1
  285. package/dist/sources/providers/tar-utils.js +16 -8
  286. package/dist/sources/providers/website.js +9 -5
  287. package/dist/sources/website-ingest.js +187 -29
  288. package/dist/sources/wiki-fetchers/registry.js +53 -0
  289. package/dist/sources/wiki-fetchers/youtube.js +239 -0
  290. package/dist/storage/database.js +45 -10
  291. package/dist/storage/managed-db.js +82 -0
  292. package/dist/storage/repositories/canaries-repository.js +107 -0
  293. package/dist/storage/repositories/consolidation-repository.js +38 -0
  294. package/dist/storage/repositories/embeddings-repository.js +72 -0
  295. package/dist/storage/repositories/events-repository.js +187 -0
  296. package/dist/storage/repositories/extract-sessions-repository.js +96 -0
  297. package/dist/storage/repositories/improve-runs-repository.js +146 -0
  298. package/dist/storage/repositories/index-db.js +14 -8
  299. package/dist/storage/repositories/proposals-repository.js +220 -0
  300. package/dist/storage/repositories/recombine-repository.js +213 -0
  301. package/dist/storage/repositories/registry-cache.js +93 -0
  302. package/dist/storage/repositories/registry-index-cache-repository.js +46 -0
  303. package/dist/storage/repositories/task-history-repository.js +93 -0
  304. package/dist/storage/sqlite-pragmas.js +146 -0
  305. package/dist/tasks/backends/cron.js +1 -1
  306. package/dist/tasks/backends/index.js +9 -0
  307. package/dist/tasks/backends/launchd.js +1 -1
  308. package/dist/tasks/backends/schtasks.js +1 -1
  309. package/dist/tasks/{resolveAkmBin.js → resolve-akm-bin.js} +2 -2
  310. package/dist/tasks/runner.js +15 -13
  311. package/dist/text-import-hook.mjs +0 -0
  312. package/dist/wiki/wiki.js +52 -11
  313. package/dist/workflows/cli.js +1 -0
  314. package/dist/workflows/db.js +3 -4
  315. package/dist/workflows/runtime/runs.js +43 -118
  316. package/dist/workflows/runtime/workflow-asset-loader.js +125 -0
  317. package/dist/workflows/validate-summary.js +2 -7
  318. package/docs/README.md +69 -18
  319. package/docs/data-and-telemetry.md +5 -4
  320. package/docs/migration/release-notes/0.7.0.md +1 -1
  321. package/docs/migration/release-notes/0.9.0.md +39 -0
  322. package/package.json +10 -10
  323. package/dist/assets/tasks/core/update-stashes.yml +0 -4
  324. package/dist/commands/db-cli.js +0 -23
  325. package/dist/indexer/db/db-backup.js +0 -376
  326. package/dist/indexer/passes/staleness-detect.js +0 -488
@@ -4,12 +4,21 @@
4
4
  /**
5
5
  * Maps over items concurrently with a pool size limit.
6
6
  * Uses Promise.allSettled semantics — one failure does not cancel others.
7
+ *
8
+ * Cooperative cancellation (P0.5 seam for the workflow scheduler): when
9
+ * `opts.signal` aborts, workers stop CLAIMING new items — in-flight `fn`
10
+ * calls run to completion (pass the same signal into `fn`'s own work to
11
+ * preempt those too). Unclaimed items stay `undefined` in the result,
12
+ * indistinguishable from individual failures by design: callers already
13
+ * treat `undefined` as "no result".
7
14
  */
8
- export async function concurrentMap(items, fn, concurrency = 1) {
15
+ export async function concurrentMap(items, fn, concurrency = 1, opts) {
9
16
  const results = new Array(items.length).fill(undefined);
10
17
  let nextIndex = 0;
11
18
  async function worker() {
12
19
  while (nextIndex < items.length) {
20
+ if (opts?.signal?.aborted)
21
+ return;
13
22
  const i = nextIndex++;
14
23
  try {
15
24
  results[i] = await fn(items[i], i);
@@ -84,12 +84,21 @@ export function backupExistingConfig(configPath) {
84
84
  if (!fs.existsSync(configPath))
85
85
  return undefined;
86
86
  const backupDir = path.join(getCacheDir(), "config-backups");
87
- fs.mkdirSync(backupDir, { recursive: true });
87
+ // 08-F4: lock the backup dir owner-only up front (0700) — matching the
88
+ // env.ts/secret.ts convention — so no other local user can traverse in during
89
+ // the copy→chmod window. chmod again to tighten a dir from an older version.
90
+ fs.mkdirSync(backupDir, { recursive: true, mode: 0o700 });
91
+ fs.chmodSync(backupDir, 0o700);
88
92
  const timestamp = new Date().toISOString().replace(/[.:]/g, "-");
89
93
  const timestamped = path.join(backupDir, `config-${timestamp}.json`);
90
94
  const latest = path.join(backupDir, "config.latest.json");
91
95
  fs.copyFileSync(configPath, timestamped);
92
96
  fs.copyFileSync(configPath, latest);
97
+ // 08-F4: a config backup carries the same sensitive fields as the live config
98
+ // (endpoints, tokens). `copyFileSync` inherits the source's (often 0644) mode,
99
+ // so tighten the backups to owner-only — mirrors the env-cli 0600 write floor.
100
+ fs.chmodSync(timestamped, 0o600);
101
+ fs.chmodSync(latest, 0o600);
93
102
  pruneOldBackups(backupDir);
94
103
  return { timestamped, latest };
95
104
  }
@@ -169,7 +169,8 @@ function migrateProcessEntryToImprove(result, processName, legacy) {
169
169
  * (canonical string sentinel for this release) or when `configVersion` is a
170
170
  * number ≥ 2 AND the config carries no recognized legacy keys.
171
171
  */
172
- export function migrateConfigShape(raw) {
172
+ export function migrateConfigShape(raw, opts) {
173
+ const emitWarn = opts?.warn ?? warn;
173
174
  const hasLegacyKeys = Object.hasOwn(raw, "features") ||
174
175
  (isObj(raw.llm) && (Object.hasOwn(raw.llm, "endpoint") || Object.hasOwn(raw.llm, "features"))) ||
175
176
  isObj(raw.agent) ||
@@ -199,11 +200,11 @@ export function migrateConfigShape(raw) {
199
200
  if (Array.isArray(result.stashes)) {
200
201
  if (!Array.isArray(result.sources)) {
201
202
  result.sources = result.stashes;
202
- console.warn("[akm config-migrate] Legacy `stashes[]` config key renamed to `sources[]`. " +
203
+ emitWarn("[akm config-migrate] Legacy `stashes[]` config key renamed to `sources[]`. " +
203
204
  "Re-save your config to remove the deprecation notice.");
204
205
  }
205
206
  else {
206
- console.warn("[akm config-migrate] Both `stashes[]` and `sources[]` present; `stashes[]` dropped (sources takes precedence).");
207
+ emitWarn("[akm config-migrate] Both `stashes[]` and `sources[]` present; `stashes[]` dropped (sources takes precedence).");
207
208
  }
208
209
  delete result.stashes;
209
210
  changed = true;
@@ -218,7 +219,7 @@ export function migrateConfigShape(raw) {
218
219
  for (const entry of sources) {
219
220
  if (isObj(entry) && entry.type === "openviking") {
220
221
  const name = typeof entry.name === "string" && entry.name ? entry.name : "unnamed";
221
- console.warn(`[akm config-migrate] Source "${name}" (type: openviking) is no longer supported. ` +
222
+ emitWarn(`[akm config-migrate] Source "${name}" (type: openviking) is no longer supported. ` +
222
223
  "Remove it from your config, or replace with a `website`/`git` source. " +
223
224
  "Entry dropped from sources[].");
224
225
  renamed = true;
@@ -261,12 +262,6 @@ export function migrateConfigShape(raw) {
261
262
  if (typeof llmFeatures.metadata_enhance === "boolean")
262
263
  me.enabled = llmFeatures.metadata_enhance;
263
264
  }
264
- if ("curate_rerank" in llmFeatures) {
265
- const search = getObj(result, "search");
266
- const cr = getObj(search, "curateRerank");
267
- if (typeof llmFeatures.curate_rerank === "boolean")
268
- cr.enabled = llmFeatures.curate_rerank;
269
- }
270
265
  if ("lesson_quality_gate" in llmFeatures) {
271
266
  const distill = getImproveProcess(result, "distill");
272
267
  const qg = getObj(distill, "qualityGate");
@@ -349,11 +344,11 @@ export function migrateConfigShape(raw) {
349
344
  const camelKey = toCamelCase(legacyKey);
350
345
  if (typeof legacyVal === "boolean" || isObj(legacyVal)) {
351
346
  migrateProcessEntryToImprove(result, camelKey, legacyVal);
352
- warn(`[akm config-migrate] Unknown features.improve.${legacyKey} migrated to ` +
347
+ emitWarn(`[akm config-migrate] Unknown features.improve.${legacyKey} migrated to ` +
353
348
  `profiles.improve.default.processes.${camelKey}. Please verify the new location.`);
354
349
  }
355
350
  else {
356
- warn(`[akm config-migrate] features.improve.${legacyKey} has an unrecognized value type ` +
351
+ emitWarn(`[akm config-migrate] features.improve.${legacyKey} has an unrecognized value type ` +
357
352
  `(${typeof legacyVal}); dropping. Please re-add it under profiles.improve.* manually.`);
358
353
  }
359
354
  }
@@ -376,20 +371,10 @@ export function migrateConfigShape(raw) {
376
371
  else if (isObj(val) && typeof val.enabled === "boolean")
377
372
  me.enabled = val.enabled;
378
373
  }
379
- if ("staleness_detection" in findex) {
380
- const index = getObj(result, "index");
381
- const sd = getObj(index, "stalenessDetection");
382
- const val = findex.staleness_detection;
383
- if (typeof val === "boolean")
384
- sd.enabled = val;
385
- else if (isObj(val)) {
386
- if (typeof val.enabled === "boolean")
387
- sd.enabled = val.enabled;
388
- if (isObj(val.options) && typeof val.options.thresholdDays === "number") {
389
- sd.thresholdDays = val.options.thresholdDays;
390
- }
391
- }
392
- }
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).
393
378
  // Catch-all: unknown features.index.<key> entries land at
394
379
  // index.<keyAsCamelCase> (preserving { enabled, options } when present).
395
380
  const knownIndexKeys = new Set([
@@ -404,11 +389,11 @@ export function migrateConfigShape(raw) {
404
389
  const camelKey = toCamelCase(legacyKey);
405
390
  const ok = migrateGenericGateToSection(result, "index", camelKey, legacyVal);
406
391
  if (ok) {
407
- warn(`[akm config-migrate] Unknown features.index.${legacyKey} migrated to ` +
392
+ emitWarn(`[akm config-migrate] Unknown features.index.${legacyKey} migrated to ` +
408
393
  `index.${camelKey}. Please verify the new location is correct.`);
409
394
  }
410
395
  else {
411
- warn(`[akm config-migrate] features.index.${legacyKey} has an unrecognized value shape; ` +
396
+ emitWarn(`[akm config-migrate] features.index.${legacyKey} has an unrecognized value shape; ` +
412
397
  `dropping. Please re-add it under index.${camelKey} manually if needed.`);
413
398
  }
414
399
  }
@@ -416,17 +401,10 @@ export function migrateConfigShape(raw) {
416
401
  }
417
402
  if (isObj(features.search)) {
418
403
  const fsearch = features.search;
419
- if ("curate_rerank" in fsearch) {
420
- const search = getObj(result, "search");
421
- const cr = getObj(search, "curateRerank");
422
- const val = fsearch.curate_rerank;
423
- if (typeof val === "boolean")
424
- cr.enabled = val;
425
- else if (isObj(val) && typeof val.enabled === "boolean")
426
- cr.enabled = val.enabled;
427
- }
428
404
  // Catch-all: unknown features.search.<key> entries land at
429
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).
430
408
  const knownSearchKeys = new Set(["curate_rerank"]);
431
409
  for (const [legacyKey, legacyVal] of Object.entries(fsearch)) {
432
410
  if (knownSearchKeys.has(legacyKey))
@@ -434,11 +412,11 @@ export function migrateConfigShape(raw) {
434
412
  const camelKey = toCamelCase(legacyKey);
435
413
  const ok = migrateGenericGateToSection(result, "search", camelKey, legacyVal);
436
414
  if (ok) {
437
- warn(`[akm config-migrate] Unknown features.search.${legacyKey} migrated to ` +
415
+ emitWarn(`[akm config-migrate] Unknown features.search.${legacyKey} migrated to ` +
438
416
  `search.${camelKey}. Please verify the new location is correct.`);
439
417
  }
440
418
  else {
441
- warn(`[akm config-migrate] features.search.${legacyKey} has an unrecognized value shape; ` +
419
+ emitWarn(`[akm config-migrate] features.search.${legacyKey} has an unrecognized value shape; ` +
442
420
  `dropping. Please re-add it under search.${camelKey} manually if needed.`);
443
421
  }
444
422
  }
@@ -555,7 +533,7 @@ export function migrateConfigShape(raw) {
555
533
  changed = true;
556
534
  }
557
535
  if (improveObj.preset !== undefined) {
558
- console.warn("[akm config-migrate] defaults.improve.preset is no longer supported. " +
536
+ emitWarn("[akm config-migrate] defaults.improve.preset is no longer supported. " +
559
537
  "Use `--profile <name>` (built-ins: default, quick, thorough, memory-focus) instead.");
560
538
  }
561
539
  delete defaultsRaw.improve;