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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (587) hide show
  1. package/CHANGELOG.md +1190 -52
  2. package/README.md +62 -37
  3. package/SECURITY.md +46 -31
  4. package/dist/akm +162 -38
  5. package/dist/akm-migrate +44 -0
  6. package/dist/assets/backends/schtasks-template.xml +2 -1
  7. package/dist/assets/hints/cli-hints-full.md +268 -118
  8. package/dist/assets/hints/cli-hints-short.md +87 -24
  9. package/dist/assets/{profiles → improve-strategies}/catchup.json +3 -1
  10. package/dist/assets/{profiles → improve-strategies}/consolidate.json +3 -1
  11. package/dist/assets/{profiles → improve-strategies}/default.json +6 -7
  12. package/dist/assets/improve-strategies/frequent.json +15 -0
  13. package/dist/assets/{profiles → improve-strategies}/graph-refresh.json +4 -2
  14. package/dist/assets/{profiles → improve-strategies}/memory-focus.json +4 -1
  15. package/dist/assets/{profiles → improve-strategies}/proactive-maintenance.json +5 -5
  16. package/dist/assets/{profiles → improve-strategies}/quick.json +4 -2
  17. package/dist/assets/improve-strategies/reflect-distill.json +30 -0
  18. package/dist/assets/{profiles → improve-strategies}/thorough.json +1 -1
  19. package/dist/assets/prompts/consolidate-system.md +5 -5
  20. package/dist/assets/prompts/extract-session.md +2 -6
  21. package/dist/assets/prompts/memory-infer-user.md +2 -3
  22. package/dist/assets/prompts/reflect-llm-framed-contract.md +11 -0
  23. package/dist/assets/prompts/reflect-llm-schema-contract.md +3 -0
  24. package/dist/assets/prompts/reflect-output-repair.md +3 -0
  25. package/dist/assets/stash-skeleton/README.md +38 -10
  26. package/dist/assets/stash-skeleton/facts/conventions/assets/agent.md +8 -0
  27. package/dist/assets/stash-skeleton/facts/conventions/assets/command.md +8 -0
  28. package/dist/assets/stash-skeleton/facts/conventions/assets/fact.md +14 -1
  29. package/dist/assets/stash-skeleton/facts/conventions/assets/knowledge.md +13 -1
  30. package/dist/assets/stash-skeleton/facts/conventions/assets/lesson.md +9 -1
  31. package/dist/assets/stash-skeleton/facts/conventions/assets/memory.md +11 -0
  32. package/dist/assets/stash-skeleton/facts/conventions/assets/script.md +9 -0
  33. package/dist/assets/stash-skeleton/facts/conventions/assets/skill.md +9 -0
  34. package/dist/assets/stash-skeleton/facts/conventions/assets/workflow.md +8 -0
  35. package/dist/assets/stash-skeleton/facts/conventions/backlinks.md +100 -0
  36. package/dist/assets/stash-skeleton/facts/conventions/domains.md +64 -0
  37. package/dist/assets/stash-skeleton/facts/conventions/organization.md +136 -0
  38. package/dist/assets/tasks/core/extract.yml +3 -2
  39. package/dist/assets/tasks/core/improve.yml +2 -1
  40. package/dist/assets/tasks/core/index-refresh.yml +1 -0
  41. package/dist/assets/tasks/core/sync.yml +1 -0
  42. package/dist/assets/tasks/core/version-check.yml +2 -1
  43. package/dist/assets/tasks/improve/akm-graph-refresh-weekly.yml +5 -0
  44. package/dist/assets/tasks/improve/akm-improve-catchup.yml +8 -0
  45. package/dist/assets/tasks/improve/akm-improve-consolidate.yml +5 -0
  46. package/dist/assets/tasks/improve/akm-improve-frequent.yml +5 -0
  47. package/dist/assets/tasks/improve/akm-improve-nightly.yml +5 -0
  48. package/dist/assets/templates/html/health.html +5 -4
  49. package/dist/assets/workflows/workflow-template.md +31 -15
  50. package/dist/cli/invocation.js +279 -0
  51. package/dist/cli/parse-args.js +5 -90
  52. package/dist/cli/retired-commands.js +78 -0
  53. package/dist/cli/shared.js +158 -48
  54. package/dist/cli-node.mjs +2 -1
  55. package/dist/cli.js +747 -293
  56. package/dist/commands/agent/agent-dispatch.js +19 -18
  57. package/dist/commands/agent/agent-support.js +0 -24
  58. package/dist/commands/agent/contribute-cli.js +43 -97
  59. package/dist/commands/completions.js +80 -23
  60. package/dist/commands/config-cli.js +44 -281
  61. package/dist/commands/env/env-binding.js +13 -9
  62. package/dist/commands/env/env-cli.js +76 -159
  63. package/dist/commands/env/env.js +12 -163
  64. package/dist/commands/env/marker-path.js +6 -0
  65. package/dist/commands/env/secret-cli.js +45 -61
  66. package/dist/commands/env/secret.js +32 -62
  67. package/dist/commands/feedback-cli.js +179 -85
  68. package/dist/commands/health/accept-rate.js +58 -0
  69. package/dist/commands/health/advisories.js +7 -8
  70. package/dist/commands/health/checks.js +279 -94
  71. package/dist/commands/health/html-report.js +197 -578
  72. package/dist/commands/health/improve-metrics.js +277 -246
  73. package/dist/commands/health/llm-usage.js +19 -19
  74. package/dist/commands/health/md-report.js +16 -7
  75. package/dist/commands/health/metrics.js +67 -32
  76. package/dist/commands/health/renderers.js +47 -0
  77. package/dist/commands/health/report-view-model.js +508 -0
  78. package/dist/commands/health/stash-exposure.js +1 -1
  79. package/dist/commands/health/surfaces.js +16 -56
  80. package/dist/commands/health/task-runs.js +3 -67
  81. package/dist/{migrate-storage-node.mjs → commands/health/types-checks.js} +1 -5
  82. package/dist/commands/health/types-improve.js +29 -0
  83. package/dist/{output/text/save.js → commands/health/types-metrics.js} +1 -2
  84. package/dist/commands/health/types-result.js +7 -0
  85. package/dist/commands/health/types-runs.js +4 -0
  86. package/dist/commands/health/types-session-log.js +4 -0
  87. package/dist/commands/health/types-windows.js +4 -0
  88. package/dist/commands/health/types.js +26 -21
  89. package/dist/commands/health/windows.js +2 -3
  90. package/dist/commands/health.js +296 -167
  91. package/dist/commands/improve/anti-collapse.js +5 -5
  92. package/dist/commands/improve/autonomy-gate.js +68 -0
  93. package/dist/commands/improve/collapse-detector.js +65 -52
  94. package/dist/commands/improve/consolidate/chunking.js +9 -7
  95. package/dist/commands/improve/consolidate/eligibility.js +1 -23
  96. package/dist/commands/improve/consolidate/merge.js +4 -0
  97. package/dist/commands/improve/consolidate.js +454 -1354
  98. package/dist/commands/improve/content-hash.js +39 -0
  99. package/dist/commands/improve/distill/content-repair.js +4 -10
  100. package/dist/commands/improve/distill/promote-memory.js +89 -64
  101. package/dist/commands/improve/distill/quality-gate.js +118 -42
  102. package/dist/commands/improve/distill-guards.js +1 -1
  103. package/dist/commands/improve/distill-promotion-policy.js +33 -888
  104. package/dist/commands/improve/distill.js +607 -363
  105. package/dist/commands/improve/eligibility.js +165 -79
  106. package/dist/commands/improve/extract-cli.js +35 -126
  107. package/dist/commands/improve/extract-prompt.js +6 -35
  108. package/dist/commands/improve/extract.js +640 -391
  109. package/dist/commands/improve/feedback-valence.js +2 -12
  110. package/dist/commands/improve/improve-cli.js +134 -135
  111. package/dist/commands/improve/improve-result-file.js +30 -50
  112. package/dist/commands/improve/improve-run-types.js +4 -0
  113. package/dist/commands/improve/improve-strategies.js +135 -0
  114. package/dist/commands/improve/improve.js +904 -701
  115. package/dist/commands/improve/locks.js +64 -111
  116. package/dist/commands/improve/loop-stages.js +1110 -923
  117. package/dist/commands/improve/memory/derived-ref.js +124 -0
  118. package/dist/commands/improve/memory/memory-belief.js +79 -7
  119. package/dist/commands/improve/memory/memory-contradiction-detect.js +49 -52
  120. package/dist/commands/improve/memory/memory-improve.js +25 -37
  121. package/dist/commands/improve/outcome-loop.js +25 -88
  122. package/dist/commands/improve/preparation.js +1034 -813
  123. package/dist/commands/improve/proactive-maintenance.js +34 -9
  124. package/dist/commands/improve/proposal-envelope.js +31 -0
  125. package/dist/commands/improve/reflect.js +983 -794
  126. package/dist/commands/improve/run-context.js +119 -0
  127. package/dist/commands/improve/salience.js +24 -127
  128. package/dist/commands/improve/session-asset.js +7 -3
  129. package/dist/commands/improve/shared.js +14 -34
  130. package/dist/commands/improve/source-identity.js +28 -0
  131. package/dist/commands/improve/triage.js +20 -17
  132. package/dist/commands/lint/base-linter.js +340 -313
  133. package/dist/commands/lint/env-key-rules.js +31 -47
  134. package/dist/commands/lint/index.js +185 -30
  135. package/dist/commands/{events.js → log.js} +28 -38
  136. package/dist/commands/migrate-cli.js +54 -0
  137. package/dist/commands/migration-tool.js +55 -0
  138. package/dist/commands/observability-cli.js +70 -208
  139. package/dist/commands/proposal/diff-format.js +50 -0
  140. package/dist/commands/proposal/drain-policies.js +0 -6
  141. package/dist/commands/proposal/drain.js +91 -40
  142. package/dist/commands/proposal/proposal-cli.js +134 -132
  143. package/dist/commands/proposal/proposal-types.js +56 -0
  144. package/dist/commands/proposal/proposal.js +83 -65
  145. package/dist/commands/proposal/propose-cli.js +88 -0
  146. package/dist/commands/proposal/propose.js +105 -88
  147. package/dist/commands/proposal/repository.js +1303 -278
  148. package/dist/commands/proposal/validators/proposal-quality-validators.js +16 -6
  149. package/dist/commands/proposal/validators/proposal-validators.js +61 -12
  150. package/dist/commands/proposal/validators/proposals.js +6 -8
  151. package/dist/commands/read/curate.js +78 -73
  152. package/dist/commands/read/knowledge.js +510 -13
  153. package/dist/commands/read/registry-search.js +2 -2
  154. package/dist/commands/read/remember-cli.js +84 -15
  155. package/dist/commands/read/search-cli.js +203 -96
  156. package/dist/commands/read/search.js +126 -94
  157. package/dist/commands/read/show.js +226 -250
  158. package/dist/commands/registry-cli.js +34 -60
  159. package/dist/commands/remember.js +18 -57
  160. package/dist/commands/sources/add-cli.js +104 -49
  161. package/dist/commands/sources/bundle-cli.js +166 -0
  162. package/dist/commands/sources/bundle-config-ops.js +63 -0
  163. package/dist/commands/sources/info.js +27 -15
  164. package/dist/commands/sources/init.js +30 -40
  165. package/dist/commands/sources/installed-stashes.js +469 -172
  166. package/dist/commands/sources/schema-repair.js +10 -9
  167. package/dist/commands/sources/self-update.js +182 -121
  168. package/dist/commands/sources/source-add.js +169 -178
  169. package/dist/commands/sources/source-clone.js +144 -41
  170. package/dist/commands/sources/source-manage.js +94 -59
  171. package/dist/commands/sources/sources-cli.js +64 -205
  172. package/dist/commands/sources/stash-cli.js +91 -54
  173. package/dist/commands/sources/stash-skeleton.js +1 -1
  174. package/dist/commands/tasks/tasks-cli.js +106 -104
  175. package/dist/commands/tasks/tasks.js +445 -262
  176. package/dist/commands/workflow-cli.js +75 -228
  177. package/dist/core/action-contributors.js +1 -1
  178. package/dist/core/activation-policy.js +49 -0
  179. package/dist/core/adapter/adapters/agent-skills-adapter.js +181 -0
  180. package/dist/core/adapter/adapters/akm-adapter.js +528 -0
  181. package/dist/core/adapter/adapters/akm-lint.js +392 -0
  182. package/dist/core/adapter/adapters/akm-metadata.js +387 -0
  183. package/dist/core/adapter/adapters/akm-task-adapter.js +149 -0
  184. package/dist/core/adapter/adapters/akm-workflow-adapter.js +180 -0
  185. package/dist/core/adapter/adapters/claude-adapter.js +61 -0
  186. package/dist/core/adapter/adapters/dotenv-adapter.js +187 -0
  187. package/dist/core/adapter/adapters/generic-files-adapter.js +119 -0
  188. package/dist/core/adapter/adapters/index.js +80 -0
  189. package/dist/core/adapter/adapters/llm-wiki-adapter.js +419 -0
  190. package/dist/core/adapter/adapters/okf-adapter.js +391 -0
  191. package/dist/core/adapter/adapters/opencode-adapter.js +68 -0
  192. package/dist/core/adapter/adapters/shared.js +286 -0
  193. package/dist/core/adapter/adapters/tool-dir-shared.js +217 -0
  194. package/dist/core/adapter/adapters/website-snapshot-adapter.js +155 -0
  195. package/dist/core/adapter/bundle-adapter.js +4 -0
  196. package/dist/core/adapter/detect-adapter.js +17 -0
  197. package/dist/core/adapter/recognize-match.js +44 -0
  198. package/dist/core/adapter/registry.js +56 -0
  199. package/dist/core/adapter/types.js +4 -0
  200. package/dist/core/asset/akm-markdown.js +30 -0
  201. package/dist/core/asset/asset-placement.js +243 -0
  202. package/dist/core/asset/asset-ref.js +110 -79
  203. package/dist/core/asset/asset-serialize.js +20 -0
  204. package/dist/core/asset/frontmatter.js +28 -12
  205. package/dist/core/asset/markdown.js +40 -51
  206. package/dist/core/asset/resolve-ref.js +274 -0
  207. package/dist/core/asset/stash-meta.js +2 -2
  208. package/dist/core/bundle-id.js +51 -0
  209. package/dist/core/common.js +281 -86
  210. package/dist/core/config/config-io.js +42 -128
  211. package/dist/core/config/config-schema.js +233 -855
  212. package/dist/core/config/config-sources.js +162 -39
  213. package/dist/core/config/config-types.js +16 -11
  214. package/dist/core/config/config-version.js +29 -0
  215. package/dist/core/config/config-walker.js +126 -37
  216. package/dist/core/config/config.js +154 -331
  217. package/dist/core/config/deep-merge.js +41 -0
  218. package/dist/core/config/engine-semantics.js +28 -0
  219. package/dist/core/config/experimental.js +21 -0
  220. package/dist/core/config/schema/embedding.js +38 -0
  221. package/dist/core/config/schema/engines.js +116 -0
  222. package/dist/core/config/schema/experimental.js +47 -0
  223. package/dist/core/config/schema/feedback.js +31 -0
  224. package/dist/core/config/schema/improve-processes.js +389 -0
  225. package/dist/core/config/schema/improve.js +94 -0
  226. package/dist/core/config/schema/index-config.js +176 -0
  227. package/dist/core/config/schema/output.js +18 -0
  228. package/dist/core/config/schema/primitives.js +94 -0
  229. package/dist/core/config/schema/search.js +30 -0
  230. package/dist/core/config/schema/setup.js +18 -0
  231. package/dist/core/config/schema/sources-bundles.js +169 -0
  232. package/dist/core/config/schema/workflow.js +29 -0
  233. package/dist/core/env-secret-ref.js +155 -20
  234. package/dist/core/errors.js +17 -15
  235. package/dist/core/events-types.js +4 -0
  236. package/dist/core/events.js +46 -128
  237. package/dist/core/extra-params.js +62 -0
  238. package/dist/core/file-change.js +17 -0
  239. package/dist/core/file-lock.js +202 -57
  240. package/dist/core/fs-txn.js +392 -0
  241. package/dist/core/git-message.js +59 -0
  242. package/dist/core/improve-result.js +167 -0
  243. package/dist/core/lesson-lint.js +1 -17
  244. package/dist/core/logs-db.js +1 -1
  245. package/dist/core/maintenance-barrier.js +135 -0
  246. package/dist/core/migration-operation.js +44 -0
  247. package/dist/core/mutation-target.js +78 -0
  248. package/dist/core/paths.js +22 -25
  249. package/dist/core/platform.js +10 -0
  250. package/dist/core/recognition-util.js +128 -0
  251. package/dist/core/redaction.js +392 -0
  252. package/dist/core/standards/resolve-standards-context.js +36 -65
  253. package/dist/core/standards/resolve-stash-standards.js +2 -2
  254. package/dist/core/standards/resolve-type-conventions.js +5 -5
  255. package/dist/core/state/migrations.js +242 -11
  256. package/dist/core/state-db.js +98 -10
  257. package/dist/core/structured.js +1 -1
  258. package/dist/core/subprocess.js +303 -0
  259. package/dist/core/text-truncation.js +9 -5
  260. package/dist/core/time.js +20 -0
  261. package/dist/core/type-presentation.js +130 -0
  262. package/dist/core/warn.js +0 -3
  263. package/dist/core/write-source.js +834 -118
  264. package/dist/indexer/bundle-identity-guard.js +92 -0
  265. package/dist/indexer/db/graph-db.js +1 -25
  266. package/dist/indexer/db/llm-cache.js +1 -1
  267. package/dist/indexer/ensure-index.js +30 -9
  268. package/dist/indexer/graph/graph-boost.js +9 -30
  269. package/dist/indexer/graph/graph-extraction.js +41 -27
  270. package/dist/indexer/graph/graph-types.js +4 -0
  271. package/dist/indexer/index-writer-lock.js +93 -49
  272. package/dist/indexer/index-written-assets.js +100 -53
  273. package/dist/indexer/indexer.js +746 -329
  274. package/dist/indexer/init.js +18 -25
  275. package/dist/indexer/installations.js +142 -0
  276. package/dist/indexer/passes/dir-staleness.js +18 -10
  277. package/dist/indexer/passes/memory-inference.js +25 -15
  278. package/dist/indexer/passes/metadata.js +412 -243
  279. package/dist/indexer/scan/doc-to-entry.js +160 -0
  280. package/dist/indexer/scan/drain-dir.js +134 -0
  281. package/dist/indexer/search/db-search.js +292 -108
  282. package/dist/indexer/search/fts-query.js +64 -0
  283. package/dist/indexer/search/ranking-contributors.js +145 -25
  284. package/dist/indexer/search/ranking-types.js +4 -0
  285. package/dist/indexer/search/ranking.js +28 -71
  286. package/dist/indexer/search/search-attribution.js +67 -0
  287. package/dist/indexer/search/search-fields.js +18 -3
  288. package/dist/indexer/search/search-hit-enrichers.js +30 -40
  289. package/dist/indexer/search/search-source.js +157 -111
  290. package/dist/indexer/search/semantic-status.js +4 -1
  291. package/dist/indexer/usage/usage-events.js +10 -30
  292. package/dist/indexer/walk/file-context.js +3 -45
  293. package/dist/indexer/walk/matchers.js +42 -73
  294. package/dist/indexer/walk/path-resolver.js +11 -5
  295. package/dist/indexer/walk/walker.js +42 -14
  296. package/dist/integrations/agent/builder-shared.js +7 -0
  297. package/dist/integrations/agent/builders.js +5 -58
  298. package/dist/integrations/agent/config.js +3 -143
  299. package/dist/integrations/agent/detect.js +17 -2
  300. package/dist/integrations/agent/engine-resolution.js +231 -0
  301. package/dist/integrations/agent/index.js +1 -2
  302. package/dist/integrations/agent/model-aliases.js +8 -3
  303. package/dist/integrations/agent/profiles.js +6 -99
  304. package/dist/integrations/agent/prompts.js +46 -18
  305. package/dist/integrations/agent/runner-dispatch.js +78 -13
  306. package/dist/integrations/agent/runner.js +76 -208
  307. package/dist/integrations/agent/spawn.js +48 -279
  308. package/dist/integrations/harnesses/aider/agent-builder.js +9 -8
  309. package/dist/integrations/harnesses/aider/index.js +2 -12
  310. package/dist/integrations/harnesses/amazonq/agent-builder.js +10 -16
  311. package/dist/integrations/harnesses/amazonq/index.js +3 -17
  312. package/dist/integrations/harnesses/claude/agent-builder.js +2 -3
  313. package/dist/integrations/harnesses/claude/config-import.js +1 -3
  314. package/dist/integrations/harnesses/claude/index.js +1 -14
  315. package/dist/integrations/harnesses/claude/session-log.js +27 -75
  316. package/dist/integrations/harnesses/codex/agent-builder.js +8 -7
  317. package/dist/integrations/harnesses/codex/index.js +2 -13
  318. package/dist/integrations/harnesses/copilot/agent-builder.js +9 -9
  319. package/dist/integrations/harnesses/copilot/index.js +1 -13
  320. package/dist/integrations/harnesses/gemini/agent-builder.js +8 -9
  321. package/dist/integrations/harnesses/gemini/index.js +1 -13
  322. package/dist/integrations/harnesses/ids.js +24 -0
  323. package/dist/integrations/harnesses/index.js +31 -33
  324. package/dist/integrations/harnesses/opencode/agent-builder.js +23 -5
  325. package/dist/integrations/harnesses/opencode/config-import.js +1 -3
  326. package/dist/integrations/harnesses/opencode/index.js +1 -18
  327. package/dist/integrations/harnesses/opencode/session-log.js +67 -125
  328. package/dist/integrations/harnesses/opencode-sdk/harness.js +3 -17
  329. package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +274 -191
  330. package/dist/integrations/harnesses/openhands/agent-builder.js +12 -10
  331. package/dist/integrations/harnesses/openhands/index.js +2 -12
  332. package/dist/integrations/harnesses/pi/agent-builder.js +11 -18
  333. package/dist/integrations/harnesses/pi/index.js +3 -16
  334. package/dist/integrations/harnesses/shared.js +17 -0
  335. package/dist/integrations/harnesses/types.js +38 -34
  336. package/dist/integrations/lockfile.js +211 -24
  337. package/dist/integrations/session-logs/index.js +24 -40
  338. package/dist/integrations/session-logs/provider-base.js +113 -0
  339. package/dist/llm/client.js +182 -110
  340. package/dist/llm/embedders/deterministic.js +2 -2
  341. package/dist/llm/embedders/remote.js +21 -9
  342. package/dist/llm/feature-gate.js +17 -57
  343. package/dist/llm/graph-extract.js +12 -13
  344. package/dist/llm/index-passes.js +8 -42
  345. package/dist/llm/memory-infer.js +144 -1
  346. package/dist/llm/metadata-enhance.js +45 -30
  347. package/dist/llm/structured-call.js +16 -8
  348. package/dist/llm/usage-persist.js +30 -5
  349. package/dist/llm/usage-telemetry.js +59 -6
  350. package/dist/output/cli-hints.js +1 -2
  351. package/dist/output/command-registry.js +27 -0
  352. package/dist/output/context.js +22 -7
  353. package/dist/output/format-exempt.js +80 -0
  354. package/dist/output/generic-render.js +251 -0
  355. package/dist/output/html-render.js +11 -16
  356. package/dist/output/render-registry.js +57 -0
  357. package/dist/output/renderers.js +15 -281
  358. package/dist/output/shapes/curate.js +10 -1
  359. package/dist/output/shapes/events.js +12 -7
  360. package/dist/output/shapes/helpers.js +58 -84
  361. package/dist/output/shapes/passthrough.js +8 -40
  362. package/dist/output/shapes/proposal/producer.js +15 -7
  363. package/dist/output/shapes/registry.js +12 -6
  364. package/dist/output/shapes.js +0 -9
  365. package/dist/output/text/{init.js → bundle-create.js} +3 -1
  366. package/dist/output/text/bundle-show.js +7 -0
  367. package/dist/output/text/command-format.js +562 -0
  368. package/dist/output/text/env.js +1 -3
  369. package/dist/output/text/events.js +8 -7
  370. package/dist/output/text/helpers.js +15 -1375
  371. package/dist/output/text/proposal/producer.js +4 -2
  372. package/dist/output/text/proposal-format.js +202 -0
  373. package/dist/output/text/registry-commands.js +1 -2
  374. package/dist/output/text/registry.js +12 -6
  375. package/dist/output/text/show-directives.js +117 -0
  376. package/dist/output/text/show-format.js +103 -0
  377. package/dist/output/text/sync.js +5 -0
  378. package/dist/output/text/workflow-format.js +332 -0
  379. package/dist/output/text/workflow.js +1 -2
  380. package/dist/output/text.js +10 -19
  381. package/dist/registry/factory.js +4 -6
  382. package/dist/registry/origin-resolve.js +16 -27
  383. package/dist/registry/providers/skills-sh.js +3 -3
  384. package/dist/registry/providers/static-index.js +15 -25
  385. package/dist/registry/resolve.js +43 -94
  386. package/dist/registry/semver.js +43 -0
  387. package/dist/runtime.js +81 -12
  388. package/dist/scripts/akm-migrate.js +35529 -0
  389. package/dist/setup/detect.js +5 -7
  390. package/dist/setup/detected-engines.js +136 -0
  391. package/dist/setup/engine-config.js +100 -0
  392. package/dist/setup/registry-stash-loader.js +3 -3
  393. package/dist/setup/semantic-assets.js +12 -9
  394. package/dist/setup/setup.js +444 -208
  395. package/dist/setup/steps/connection-shared.js +120 -0
  396. package/dist/setup/steps/connection.js +108 -305
  397. package/dist/setup/steps/platforms.js +13 -12
  398. package/dist/setup/steps/semantic.js +15 -3
  399. package/dist/setup/steps/sources.js +21 -15
  400. package/dist/setup/steps/stashdir.js +6 -4
  401. package/dist/setup/steps/tasks.js +236 -119
  402. package/dist/setup/steps.js +3 -2
  403. package/dist/sources/freshness.js +39 -0
  404. package/dist/sources/provider-factory.js +11 -17
  405. package/dist/sources/providers/filesystem.js +2 -3
  406. package/dist/sources/providers/git-install.js +278 -34
  407. package/dist/sources/providers/git-provider.js +54 -56
  408. package/dist/sources/providers/git-stash.js +420 -91
  409. package/dist/sources/providers/git.js +2 -2
  410. package/dist/sources/providers/npm.js +16 -19
  411. package/dist/sources/providers/provider-utils.js +47 -22
  412. package/dist/sources/providers/sync-from-ref.js +3 -9
  413. package/dist/sources/providers/website.js +2 -2
  414. package/dist/sources/resolve.js +11 -10
  415. package/dist/sources/snapshot-fetchers/types.js +4 -0
  416. package/dist/sources/{website-ingest.js → snapshot-fetchers/website-ingest.js} +110 -41
  417. package/dist/storage/database.js +60 -4
  418. package/dist/storage/engines/sqlite-migrations.js +156 -5
  419. package/dist/storage/locations.js +1 -2
  420. package/dist/storage/repositories/canaries-repository.js +1 -1
  421. package/dist/storage/repositories/events-repository.js +51 -11
  422. package/dist/storage/repositories/improve-runs-repository.js +6 -32
  423. package/dist/storage/repositories/index-connection.js +79 -0
  424. package/dist/storage/repositories/index-db.js +4 -3
  425. package/dist/storage/repositories/index-entries-repository.js +863 -0
  426. package/dist/{indexer/db/entry-mapper.js → storage/repositories/index-entry-mapper.js} +19 -2
  427. package/dist/storage/repositories/index-entry-types.js +4 -0
  428. package/dist/storage/repositories/index-fts-repository.js +167 -0
  429. package/dist/storage/repositories/index-llm-cache-repository.js +108 -0
  430. package/dist/storage/repositories/index-meta-repository.js +49 -0
  431. package/dist/{indexer/db/schema.js → storage/repositories/index-schema.js} +226 -100
  432. package/dist/storage/repositories/index-sql.js +12 -0
  433. package/dist/storage/repositories/index-utility-repository.js +356 -0
  434. package/dist/storage/repositories/index-vec-repository.js +250 -0
  435. package/dist/storage/repositories/outcome-repository.js +119 -0
  436. package/dist/storage/repositories/proposals-repository.js +317 -75
  437. package/dist/storage/repositories/registry-cache.js +1 -1
  438. package/dist/storage/repositories/salience-repository.js +172 -0
  439. package/dist/storage/repositories/task-history-repository.js +110 -3
  440. package/dist/storage/repositories/workflow-runs-repository.js +68 -35
  441. package/dist/tasks/backends/cron.js +169 -46
  442. package/dist/tasks/backends/exec-utils.js +76 -3
  443. package/dist/tasks/backends/index.js +6 -9
  444. package/dist/tasks/backends/launchd.js +292 -55
  445. package/dist/tasks/backends/schtasks.js +557 -70
  446. package/dist/tasks/backends/types.js +4 -0
  447. package/dist/tasks/command-executable.js +93 -0
  448. package/dist/tasks/embedded.js +56 -38
  449. package/dist/tasks/parser.js +156 -64
  450. package/dist/tasks/resolve-akm-bin.js +144 -51
  451. package/dist/tasks/runner.js +377 -209
  452. package/dist/tasks/schedule.js +108 -19
  453. package/dist/tasks/scheduler-invocation.js +296 -0
  454. package/dist/tasks/schema.js +1 -1
  455. package/dist/tasks/task-id.js +35 -0
  456. package/dist/tasks/validator.js +30 -16
  457. package/dist/workflows/authoring/authoring.js +96 -148
  458. package/dist/workflows/authoring/scope-key.js +1 -1
  459. package/dist/workflows/cli.js +0 -20
  460. package/dist/workflows/concurrency-policy.js +15 -0
  461. package/dist/workflows/exec/brief.js +25 -59
  462. package/dist/workflows/exec/frozen-judge.js +47 -0
  463. package/dist/workflows/exec/native-executor.js +157 -94
  464. package/dist/workflows/exec/report.js +365 -200
  465. package/dist/workflows/exec/run-workflow.js +46 -40
  466. package/dist/workflows/exec/scheduler.js +12 -41
  467. package/dist/workflows/exec/step-work.js +239 -205
  468. package/dist/workflows/exec/workflow-engine-gate.js +67 -0
  469. package/dist/workflows/ir/compile.js +141 -283
  470. package/dist/workflows/ir/freeze.js +233 -0
  471. package/dist/workflows/ir/plan-hash.js +40 -5
  472. package/dist/workflows/ir/schema.js +537 -1
  473. package/dist/workflows/parser.js +878 -306
  474. package/dist/workflows/program/expressions.js +20 -208
  475. package/dist/workflows/program/schema.js +7 -10
  476. package/dist/workflows/renderer.js +99 -121
  477. package/dist/workflows/resource-limits.js +22 -0
  478. package/dist/workflows/runtime/checkin.js +1 -1
  479. package/dist/workflows/runtime/plan-classifier.js +131 -0
  480. package/dist/workflows/runtime/runs.js +200 -113
  481. package/dist/workflows/runtime/unit-checkin.js +1 -1
  482. package/dist/workflows/runtime/unit-phases.js +20 -0
  483. package/dist/workflows/runtime/workflow-asset-loader.js +235 -97
  484. package/dist/workflows/schema.js +1 -11
  485. package/dist/workflows/validate-summary.js +4 -26
  486. package/dist/workflows/validator.js +52 -30
  487. package/docs/README.md +42 -78
  488. package/docs/migration/README.md +8 -0
  489. package/docs/migration/release-notes/0.6.0.md +1 -1
  490. package/docs/migration/release-notes/0.7.0.md +9 -8
  491. package/docs/migration/release-notes/0.9.0.md +158 -14
  492. package/docs/migration/v0.7-to-v0.8.md +46 -47
  493. package/docs/migration/v0.8-to-v0.9.md +844 -0
  494. package/docs/reference/README.md +12 -0
  495. package/docs/reference/data-and-telemetry.md +333 -0
  496. package/package.json +21 -17
  497. package/schemas/akm-asset-envelope.json +93 -0
  498. package/schemas/akm-config.json +4636 -0
  499. package/schemas/akm-task.json +87 -0
  500. package/{dist/schemas → schemas}/akm-workflow.json +127 -82
  501. package/dist/akm-migrate-storage +0 -38
  502. package/dist/assets/help/help-accept.md +0 -12
  503. package/dist/assets/help/help-improve.md +0 -84
  504. package/dist/assets/help/help-proposals.md +0 -17
  505. package/dist/assets/help/help-propose.md +0 -17
  506. package/dist/assets/help/help-reject.md +0 -11
  507. package/dist/assets/profiles/frequent.json +0 -13
  508. package/dist/assets/profiles/recombine-only.json +0 -21
  509. package/dist/assets/profiles/reflect-distill.json +0 -30
  510. package/dist/assets/profiles/synthesize.json +0 -15
  511. package/dist/assets/prompts/procedural-system.md +0 -44
  512. package/dist/assets/prompts/recombine-system.md +0 -40
  513. package/dist/assets/prompts/staleness-detect-system.md +0 -6
  514. package/dist/assets/tasks/core/backup.yml +0 -4
  515. package/dist/assets/tasks/graph-refresh-weekly.yml +0 -10
  516. package/dist/assets/templates/html/default.html +0 -78
  517. package/dist/assets/templates/html/vendor/echarts.min.js +0 -45
  518. package/dist/assets/wiki/index-template.md +0 -12
  519. package/dist/assets/wiki/ingest-workflow-template.md +0 -83
  520. package/dist/assets/wiki/log-template.md +0 -8
  521. package/dist/assets/wiki/schema-template.md +0 -61
  522. package/dist/cli/config-migrate.js +0 -150
  523. package/dist/cli/config-validate.js +0 -39
  524. package/dist/commands/graph/graph-cli.js +0 -124
  525. package/dist/commands/graph/graph.js +0 -487
  526. package/dist/commands/improve/calibration.js +0 -161
  527. package/dist/commands/improve/dedup.js +0 -482
  528. package/dist/commands/improve/extract-watch.js +0 -140
  529. package/dist/commands/improve/hot-probation.js +0 -45
  530. package/dist/commands/improve/improve-auto-accept.js +0 -276
  531. package/dist/commands/improve/improve-profiles.js +0 -168
  532. package/dist/commands/improve/procedural.js +0 -398
  533. package/dist/commands/improve/recombine.js +0 -818
  534. package/dist/commands/improve/schema-similarity-gate.js +0 -168
  535. package/dist/commands/lint/agent-linter.js +0 -44
  536. package/dist/commands/lint/command-linter.js +0 -44
  537. package/dist/commands/lint/default-linter.js +0 -16
  538. package/dist/commands/lint/fact-linter.js +0 -39
  539. package/dist/commands/lint/knowledge-linter.js +0 -16
  540. package/dist/commands/lint/memory-linter.js +0 -61
  541. package/dist/commands/lint/registry.js +0 -41
  542. package/dist/commands/lint/skill-linter.js +0 -45
  543. package/dist/commands/lint/task-linter.js +0 -50
  544. package/dist/commands/lint/workflow-linter.js +0 -81
  545. package/dist/commands/proposal/legacy-import.js +0 -115
  546. package/dist/commands/sources/history.js +0 -196
  547. package/dist/commands/tasks/default-tasks.js +0 -186
  548. package/dist/commands/wiki-cli.js +0 -292
  549. package/dist/core/asset/asset-registry.js +0 -76
  550. package/dist/core/asset/asset-spec.js +0 -316
  551. package/dist/core/config/config-migration.js +0 -602
  552. package/dist/core/deep-merge.js +0 -38
  553. package/dist/core/eval/rank-metrics.js +0 -113
  554. package/dist/core/ripgrep/install.js +0 -163
  555. package/dist/core/ripgrep/resolve.js +0 -81
  556. package/dist/indexer/db/db.js +0 -1414
  557. package/dist/indexer/manifest.js +0 -170
  558. package/dist/indexer/passes/metadata-contributors.js +0 -31
  559. package/dist/indexer/usage/unmigrated-vaults-guard.js +0 -94
  560. package/dist/integrations/harnesses/opencode-sdk/index.js +0 -25
  561. package/dist/llm/call-ai.js +0 -62
  562. package/dist/llm/memory-infer-impl.js +0 -138
  563. package/dist/output/shapes/distill.js +0 -14
  564. package/dist/output/shapes/history.js +0 -11
  565. package/dist/output/text/distill.js +0 -6
  566. package/dist/output/text/enable-disable.js +0 -8
  567. package/dist/output/text/history.js +0 -6
  568. package/dist/output/text/wiki.js +0 -16
  569. package/dist/registry/build-index.js +0 -386
  570. package/dist/schemas/akm-config.json +0 -14225
  571. package/dist/scripts/migrate-storage.js +0 -13169
  572. package/dist/scripts/migrations/import-fs-improve-runs-to-db.js +0 -10169
  573. package/dist/scripts/migrations/v16-to-v17.js +0 -141
  574. package/dist/setup/legacy-config.js +0 -106
  575. package/dist/storage/repositories/consolidation-repository.js +0 -38
  576. package/dist/storage/repositories/recombine-repository.js +0 -213
  577. package/dist/wiki/wiki-templates.js +0 -15
  578. package/dist/wiki/wiki.js +0 -1012
  579. package/dist/workflows/authoring/workflow-program-template.yaml +0 -31
  580. package/dist/workflows/db.js +0 -350
  581. package/dist/workflows/exec/watch.js +0 -116
  582. package/dist/workflows/program/parser.js +0 -760
  583. package/dist/workflows/program/project.js +0 -105
  584. package/docs/data-and-telemetry.md +0 -227
  585. package/docs/migration/release-notes/0.9.0-beta.60.md +0 -19
  586. /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/registry.js +0 -0
  587. /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/youtube.js +0 -0
@@ -0,0 +1,94 @@
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
+ * Top-level `improve` config section (utility decay, salience, collapse
6
+ * detector, strategies). Extracted verbatim from the former `config-schema.ts`
7
+ * monolith — no behavior change.
8
+ */
9
+ import { z } from "zod";
10
+ import { ImproveProfileConfigSchema } from "./improve-processes.js";
11
+ import { engineName, nonNegativeNumber } from "./primitives.js";
12
+ // ── Improve top-level (utility decay, event retention) ─────────────────────
13
+ const ImproveUtilityDecaySchema = z
14
+ .object({
15
+ halfLifeDays: z.number().finite().min(0.1).optional(),
16
+ feedbackStabilityBoost: z.number().finite().min(1).optional(),
17
+ })
18
+ .passthrough();
19
+ const ImproveSalienceSchema = z
20
+ .object({
21
+ /**
22
+ * WS-2 Part-V gate: enable the outcome-weight term in the salience projection.
23
+ * Default TRUE/absent (DEFAULT ON since the G2 saturation cap landed — see
24
+ * salience.ts): uses the WS-2 weights (w_e=0.25, w_o=0.15, w_r=0.60) so the
25
+ * prediction-error outcome signal shapes rankScore (the R1 loop-closure).
26
+ * Set to `false` to opt out and restore the WS-1 parity weights
27
+ * (w_e=0.30, w_r=0.70, w_o=0); the `outcome` sub-score is still computed
28
+ * and stored for observability in that mode.
29
+ */
30
+ outcomeWeightEnabled: z.boolean().optional(),
31
+ /**
32
+ * Minimum encoding salience score [0, 1] for a zero-feedback asset to be
33
+ * admitted to the high-salience improve lane (#608).
34
+ * Default 0.75. Set to 1.0 to disable the lane entirely.
35
+ */
36
+ salienceThreshold: z.number().min(0).max(1).optional(),
37
+ /**
38
+ * Per-run additive replay budget (#610). Up to this many top-salience refs are
39
+ * revisited even with no reactive signal and regardless of cooldown. Additive
40
+ * on top of --limit. Default 0 = no replay.
41
+ */
42
+ replayBudget: z.number().int().min(0).optional(),
43
+ })
44
+ .passthrough();
45
+ // R5 — longitudinal collapse detector (observe-only; deterministic,
46
+ // fail-open, runs only on cycles where consolidate did work).
47
+ // Default ON; opt out via `improve.collapseDetector.enabled: false`.
48
+ // See docs/architecture/specs/improve-collapse-churn-detector-design.md.
49
+ // The design's CHURN alert class was removed (never fired in production —
50
+ // its accepted-change-volume input was always a hardcoded 0), so this schema
51
+ // no longer carries `churnMinAcceptedActions`.
52
+ const ImproveCollapseDetectorSchema = z
53
+ .object({
54
+ enabled: z.boolean().optional(),
55
+ // Canary set size minted on first run (owner-approved 30–50 range; default 40).
56
+ canaryCount: z.number().int().min(3).max(200).optional(),
57
+ // Top-K cutoff for canary recall/nDCG (default 10).
58
+ k: z.number().int().min(1).max(100).optional(),
59
+ // Trend window in qualifying cycles (default 5).
60
+ windowCycles: z.number().int().min(2).max(50).optional(),
61
+ // Absolute mean-recall drop vs window median that fires collapse (default 0.15).
62
+ recallDropThreshold: z.number().min(0).max(1).optional(),
63
+ // distinct-content-ratio decline over the window that fires collapse (default 0.05).
64
+ entropyDropThreshold: z.number().min(0).max(1).optional(),
65
+ // improve_cycle_metrics retention (default 365 days, owner-approved).
66
+ retentionDays: z.number().int().min(1).optional(),
67
+ })
68
+ .passthrough();
69
+ // #733 — orphan-GC pass (Workstream C, lean by design: one config gate).
70
+ // The pass ALWAYS runs and ALWAYS reports counts (via the `asset_state_gc`
71
+ // event); this gate controls ONLY whether it actually deletes rows whose
72
+ // `missing_since` has been past the grace window (`STATE_GC_GRACE_MS`, 7
73
+ // days — a named constant, not configurable) for longer than that window.
74
+ const ImproveStateGcSchema = z
75
+ .object({
76
+ /**
77
+ * Actually DELETE `asset_salience` / `asset_outcome` rows once they have
78
+ * been unresolvable for longer than the grace window. Default false for
79
+ * 0.9.0: live data (the event's `pending` counts) proves the report
80
+ * clean before deletion is turned on.
81
+ */
82
+ collect: z.boolean().optional(),
83
+ })
84
+ .passthrough();
85
+ export const ImproveConfigSchema = z
86
+ .object({
87
+ strategies: z.record(engineName, ImproveProfileConfigSchema).optional(),
88
+ utilityDecay: ImproveUtilityDecaySchema.optional(),
89
+ eventRetentionDays: nonNegativeNumber.optional(),
90
+ salience: ImproveSalienceSchema.optional(),
91
+ collapseDetector: ImproveCollapseDetectorSchema.optional(),
92
+ stateGc: ImproveStateGcSchema.optional(),
93
+ })
94
+ .passthrough();
@@ -0,0 +1,176 @@
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
+ * `index` config: reserved feature sections + arbitrary per-pass entries.
6
+ * Extracted verbatim from the former `config-schema.ts` monolith — no behavior
7
+ * change.
8
+ */
9
+ import { z } from "zod";
10
+ import { engineName, LlmInvocationOverridesSchema, nonEmptyString, positiveInt } from "./primitives.js";
11
+ // ── Index / per-pass ────────────────────────────────────────────────────────
12
+ //
13
+ // WI-9.6c: `graphExtractionIncludeTypes` is no longer validated against a
14
+ // hardcoded allowlist (the prior GRAPH_EXTRACTION_INCLUDE_TYPES_ALLOWED,
15
+ // which included a stale `wiki` entry and was already missing `fact` from the
16
+ // runtime consumer's own list — the schema-level allowlist had drifted from
17
+ // reality). Accept-any until Chunk 2 sources a real type list from adapter
18
+ // metadata: the field is now an array of arbitrary non-empty strings.
19
+ // Runtime consumers already handle unknown/unsupported type strings
20
+ // gracefully — src/indexer/graph/graph-extraction.ts's
21
+ // `SUPPORTED_GRAPH_EXTRACTION_INCLUDE_TYPES` set (and `collectEligibleFiles`)
22
+ // silently skips any type it doesn't recognize (no placement entry ⇒ zero
23
+ // eligible files for that type; no crash). This is a permissive-direction
24
+ // behavior change: configs with a previously-rejected type string now parse.
25
+ const INDEX_PASS_RETIRED_KEYS = new Set([
26
+ "endpoint",
27
+ "provider",
28
+ "apiKey",
29
+ "baseUrl",
30
+ "temperature",
31
+ "maxTokens",
32
+ "capabilities",
33
+ ]);
34
+ const INDEX_PASS_KNOWN_KEYS = new Set([
35
+ "engine",
36
+ "model",
37
+ "timeoutMs",
38
+ "enabled",
39
+ "llm",
40
+ "graphExtractionBatchSize",
41
+ "graphExtractionIncludeTypes",
42
+ "lazyGraphExtraction",
43
+ ]);
44
+ /**
45
+ * Per-pass `index.<pass>` entry. Uses preprocess + manual validation so we can
46
+ * emit targeted error messages ("Retired or misplaced engine setting",
47
+ * "Unknown key `index.<pass>.<key>`")
48
+ * instead of Zod's generic `Unrecognized key` / `Expected boolean, received
49
+ * string` strings — keeps `akm` startup errors actionable.
50
+ */
51
+ export const IndexPassConfigSchema = z.preprocess((raw, ctx) => {
52
+ if (typeof raw !== "object" || raw === null || Array.isArray(raw)) {
53
+ return raw; // let z.object below produce the type error
54
+ }
55
+ const obj = raw;
56
+ for (const key of Object.keys(obj)) {
57
+ if (INDEX_PASS_RETIRED_KEYS.has(key)) {
58
+ ctx.addIssue({
59
+ code: z.ZodIssueCode.custom,
60
+ message: `Retired or misplaced engine setting: \`${[...(ctx.path ?? []), key].join(".")}\` is not allowed. ` +
61
+ "Select a named engine and use typed invocation fields instead.",
62
+ });
63
+ return raw;
64
+ }
65
+ if (!INDEX_PASS_KNOWN_KEYS.has(key)) {
66
+ ctx.addIssue({
67
+ code: z.ZodIssueCode.custom,
68
+ message: `Unknown key \`${[...(ctx.path ?? []), key].join(".")}\`. Per-pass entries support ` +
69
+ "`engine`, `model`, `timeoutMs`, `enabled`, `llm`, `graphExtractionBatchSize`, " +
70
+ "`graphExtractionIncludeTypes`, and `lazyGraphExtraction`.",
71
+ });
72
+ return raw;
73
+ }
74
+ }
75
+ return raw;
76
+ }, z
77
+ .object({
78
+ engine: engineName.optional(),
79
+ model: nonEmptyString.optional(),
80
+ timeoutMs: z.union([positiveInt, z.null()]).optional(),
81
+ enabled: z.boolean().optional(),
82
+ llm: LlmInvocationOverridesSchema.optional(),
83
+ graphExtractionBatchSize: positiveInt.optional(),
84
+ // Accept-any until Chunk 2 (WI-9.6c) — no longer enum-restricted.
85
+ graphExtractionIncludeTypes: z.array(z.string().min(1)).nonempty().optional(),
86
+ lazyGraphExtraction: z.boolean().optional(),
87
+ })
88
+ .passthrough());
89
+ const MetadataEnhanceSchema = z.object({ enabled: z.boolean().optional() }).passthrough();
90
+ const IndexDefaultsSchema = z
91
+ .object({
92
+ engine: engineName.optional(),
93
+ model: nonEmptyString.optional(),
94
+ timeoutMs: z.union([positiveInt, z.null()]).optional(),
95
+ llm: LlmInvocationOverridesSchema.optional(),
96
+ })
97
+ .passthrough();
98
+ /**
99
+ * Index config is a union of reserved feature sections and per-pass entries.
100
+ * Passthrough so per-pass entries (keyed by arbitrary pass names like `graph`,
101
+ * `enrichment`) can live next to the reserved keys.
102
+ *
103
+ * Reserved scalar key `indexBodyOpening` (stash-conventions SPEC-8, default
104
+ * false): when true, the metadata pass captures the first prose paragraph of
105
+ * each markdown asset body into `entry.bodyOpening`, which folds into the
106
+ * lowest-weight `content` FTS column and the embedding text. It is a boolean,
107
+ * not a per-pass object — the preprocess below exempts it from the
108
+ * object-shape check so it never routes into the per-pass catchall.
109
+ *
110
+ * The outer preprocess emits the legacy parser's actionable error messages
111
+ * for the two most common type-shape mistakes:
112
+ * - An array at the `index` block.
113
+ * - A non-object at `index.<passName>`.
114
+ * Inner field validation (graphExtractionIncludeTypes shape, invocation
115
+ * overrides, provider-key rejection) is delegated to {@link IndexPassConfigSchema}.
116
+ * `graphExtractionIncludeTypes` accepts arbitrary non-empty strings
117
+ * (WI-9.6c — no hardcoded type allowlist; accept-any until Chunk 2).
118
+ */
119
+ const IndexConfigRuntimeSchema = z.preprocess((raw, ctx) => {
120
+ if (raw === undefined || raw === null)
121
+ return raw;
122
+ if (Array.isArray(raw)) {
123
+ ctx.addIssue({
124
+ code: z.ZodIssueCode.custom,
125
+ message: 'Invalid `index` config: expected an object keyed by pass name (e.g. `{ "enrichment": { "enabled": false } }`).',
126
+ });
127
+ return raw;
128
+ }
129
+ if (typeof raw !== "object")
130
+ return raw;
131
+ for (const [passName, value] of Object.entries(raw)) {
132
+ if (passName === "stalenessDetection") {
133
+ ctx.addIssue({
134
+ code: z.ZodIssueCode.custom,
135
+ message: "Invalid `index.stalenessDetection`: the removed pass is not supported.",
136
+ });
137
+ return raw;
138
+ }
139
+ if (passName === "indexBodyOpening") {
140
+ if (typeof value !== "boolean") {
141
+ ctx.addIssue({
142
+ code: z.ZodIssueCode.custom,
143
+ message: "Invalid `index.indexBodyOpening`: expected a boolean (true to index the first body paragraph " +
144
+ `of markdown assets into search). Got ${Array.isArray(value) ? "array" : typeof value}.`,
145
+ });
146
+ return raw;
147
+ }
148
+ continue;
149
+ }
150
+ if (typeof value !== "object" || value === null || Array.isArray(value)) {
151
+ ctx.addIssue({
152
+ code: z.ZodIssueCode.custom,
153
+ message: `Invalid \`index.${passName}\` config: expected an object like \`{ "enabled": false }\`.`,
154
+ });
155
+ return raw;
156
+ }
157
+ }
158
+ return raw;
159
+ }, z
160
+ .object({
161
+ defaults: IndexDefaultsSchema.optional(),
162
+ metadataEnhance: MetadataEnhanceSchema.optional(),
163
+ indexBodyOpening: z
164
+ .boolean()
165
+ .optional()
166
+ .describe("Index the first prose paragraph of each markdown asset body (capped at 280 chars) into the " +
167
+ "lowest-weight `content` search column and the embedding text (default false). Secret/env files " +
168
+ "and session-kind memories are never captured. Toggling the flag changes indexed text: run " +
169
+ "`akm index --full` afterwards to re-extract every entry and regenerate embeddings, and re-mint " +
170
+ "collapse-detector canary baselines via `bun scripts/refresh-canary-set.ts --refresh`."),
171
+ })
172
+ .catchall(IndexPassConfigSchema));
173
+ // The runtime catchall correctly validates arbitrary pass objects, but its
174
+ // inferred string index signature also covers reserved scalar keys. Publish a
175
+ // precise output type while retaining the stricter runtime and JSON schemas.
176
+ export const IndexConfigSchema = IndexConfigRuntimeSchema;
@@ -0,0 +1,18 @@
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
+ * `output` config section. Extracted verbatim from the former `config-schema.ts`
6
+ * monolith — no behavior change.
7
+ */
8
+ import { z } from "zod";
9
+ // ── Output ──────────────────────────────────────────────────────────────────
10
+ export const OutputConfigSchema = z
11
+ .object({
12
+ // D7 — every `--format` value is a valid default, not just the three that
13
+ // predated universal md/html rendering. Kept in step with OUTPUT_FORMATS
14
+ // (`src/output/context.ts`).
15
+ format: z.enum(["json", "yaml", "text", "jsonl", "md", "html"]).optional(),
16
+ detail: z.enum(["brief", "normal", "full"]).optional(),
17
+ })
18
+ .passthrough();
@@ -0,0 +1,94 @@
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
+ * Shared atomic Zod schemas and small helpers used across the config-schema
6
+ * modules. Extracted verbatim from the former `config-schema.ts` monolith — no
7
+ * behavior change (see `./index` re-export barrel at `../config-schema.ts`).
8
+ */
9
+ import { z } from "zod";
10
+ import { validateExtraParams } from "../../extra-params.js";
11
+ import { ENGINE_NAME_PATTERN_SOURCE } from "../engine-semantics.js";
12
+ /** Persisted config schema version. Package prerelease/patch versions do not change this value. */
13
+ export const CURRENT_CONFIG_VERSION = "0.9.0";
14
+ // ── Reusable atomic schemas ─────────────────────────────────────────────────
15
+ /** Positive integer (used for tokens, timeouts, batch sizes). */
16
+ export const positiveInt = z.number().int().positive();
17
+ /** Non-negative finite number (used for scores, weights, days). */
18
+ export const nonNegativeNumber = z.number().finite().min(0);
19
+ /** Non-empty string (rejects "" and whitespace-only). */
20
+ export const nonEmptyString = z
21
+ .string()
22
+ .min(1)
23
+ .refine((v) => v.trim().length > 0, { message: "expected a non-empty string" });
24
+ /** HTTP(S) URL string. */
25
+ export const httpUrl = z.string().refine((v) => v.startsWith("http://") || v.startsWith("https://"), {
26
+ message: "endpoint must start with http:// or https://",
27
+ });
28
+ const ENGINE_NAME_PATTERN = new RegExp(ENGINE_NAME_PATTERN_SOURCE);
29
+ export const ENV_REFERENCE_PATTERN = /^\$[A-Za-z_][A-Za-z0-9_]*$|^\$\{[A-Za-z_][A-Za-z0-9_]*\}$/;
30
+ export const engineName = z
31
+ .string()
32
+ .max(63)
33
+ .regex(ENGINE_NAME_PATTERN, "names must be lowercase kebab-case and must not begin with reserved akm-");
34
+ export const chatCompletionsEndpoint = z.string().superRefine((value, ctx) => {
35
+ try {
36
+ const url = new URL(value);
37
+ if (url.protocol !== "http:" && url.protocol !== "https:") {
38
+ ctx.addIssue({ code: z.ZodIssueCode.custom, message: "endpoint must use http:// or https://" });
39
+ }
40
+ if (url.username || url.password || url.search || url.hash || !url.pathname.endsWith("/chat/completions")) {
41
+ ctx.addIssue({
42
+ code: z.ZodIssueCode.custom,
43
+ message: "endpoint must be a credential-free OpenAI chat-completions URL without query or fragment",
44
+ });
45
+ }
46
+ }
47
+ catch {
48
+ ctx.addIssue({ code: z.ZodIssueCode.custom, message: "endpoint must be a complete URL" });
49
+ }
50
+ });
51
+ export const ExtraParamsSchema = z.record(z.unknown()).superRefine((value, ctx) => {
52
+ for (const issue of validateExtraParams(value)) {
53
+ ctx.addIssue({ code: z.ZodIssueCode.custom, path: issue.path, message: issue.message });
54
+ }
55
+ });
56
+ function normalizeAliasKeys(raw, ctx) {
57
+ if (!raw || typeof raw !== "object" || Array.isArray(raw))
58
+ return raw;
59
+ const normalized = {};
60
+ const originalByKey = new Map();
61
+ for (const [key, value] of Object.entries(raw)) {
62
+ const lower = key.toLowerCase();
63
+ const previous = originalByKey.get(lower);
64
+ if (previous !== undefined) {
65
+ ctx.addIssue({
66
+ code: z.ZodIssueCode.custom,
67
+ path: [key],
68
+ message: `alias collides case-insensitively with ${previous}`,
69
+ });
70
+ continue;
71
+ }
72
+ originalByKey.set(lower, key);
73
+ normalized[lower] = value;
74
+ }
75
+ return normalized;
76
+ }
77
+ export const ModelAliasMapSchema = z.preprocess((raw, ctx) => normalizeAliasKeys(raw, ctx), z.record(z.string().min(1), z.string().min(1)));
78
+ export const GlobalModelAliasesSchema = z.preprocess((raw, ctx) => normalizeAliasKeys(raw, ctx), z.record(z.string().min(1), z.record(z.string().min(1), z.string().min(1))));
79
+ // ── Shared connection/invocation building blocks ────────────────────────────
80
+ export const LlmCapabilitiesSchema = z
81
+ .object({
82
+ structuredOutput: z.boolean().optional(),
83
+ })
84
+ .passthrough();
85
+ export const LlmInvocationOverridesSchema = z
86
+ .object({
87
+ temperature: z.number().finite().optional(),
88
+ maxTokens: positiveInt.optional(),
89
+ supportsJsonSchema: z.boolean().optional(),
90
+ extraParams: ExtraParamsSchema.optional(),
91
+ contextLength: positiveInt.optional(),
92
+ enableThinking: z.boolean().optional(),
93
+ })
94
+ .passthrough();
@@ -0,0 +1,30 @@
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
+ * `search` config section (graph-boost tuning). Extracted verbatim from the
6
+ * former `config-schema.ts` monolith — no behavior change.
7
+ */
8
+ import { z } from "zod";
9
+ import { nonEmptyString, nonNegativeNumber, positiveInt } from "./primitives.js";
10
+ // ── Search ──────────────────────────────────────────────────────────────────
11
+ const SearchGraphBoostSchema = z
12
+ .object({
13
+ directBoostPerEntity: nonNegativeNumber.optional(),
14
+ directBoostCap: nonNegativeNumber.optional(),
15
+ hopBoostPerEntity: nonNegativeNumber.optional(),
16
+ hopBoostCap: nonNegativeNumber.optional(),
17
+ /** Hard-capped at 3; values > 3 hard-error so users see the typo. */
18
+ maxHops: positiveInt.max(3).optional(),
19
+ confidenceMode: z.enum(["off", "blend", "multiply"]).default("blend").optional(),
20
+ /** Range [0, 1]; values > 1 hard-error (no silent clamp). */
21
+ confidenceWeight: z.number().finite().min(0).max(1).default(0.2).optional(),
22
+ })
23
+ .passthrough();
24
+ export const SearchConfigSchema = z
25
+ .object({
26
+ minScore: nonNegativeNumber.optional(),
27
+ defaultExcludeTypes: z.array(nonEmptyString).optional(),
28
+ graphBoost: SearchGraphBoostSchema.optional(),
29
+ })
30
+ .passthrough();
@@ -0,0 +1,18 @@
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
+ * Setup-derived recommendations (`setup`). Extracted verbatim from the former
6
+ * `config-schema.ts` monolith — no behavior change.
7
+ */
8
+ import { z } from "zod";
9
+ // ── Setup-derived recommendations ──────────────────────────────────────────
10
+ //
11
+ // R-063 #11: this object previously carried a `taskSchedules` sub-key (cron
12
+ // hints nominally derived by `akm setup --reset-recommended`), but nothing in
13
+ // the tasks subsystem or setup flow ever read or wrote it — confirmed dead at
14
+ // HEAD (deriveRecommendedConfig's return type never included it either; see
15
+ // tests/integration/setup/detect-environment.test.ts's regression guard).
16
+ // Removed. The `setup` namespace itself is kept (passthrough) for future
17
+ // setup-derived config.
18
+ export const SetupConfigSchema = z.object({}).passthrough();
@@ -0,0 +1,169 @@
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
+ * Sources / registries / installed entries + the 0.9.0 `bundles` shape.
6
+ * Extracted verbatim from the former `config-schema.ts` monolith — no behavior
7
+ * change.
8
+ */
9
+ import { z } from "zod";
10
+ import { isBundleSlug } from "../../asset/asset-ref.js";
11
+ import { httpUrl, nonEmptyString, positiveInt } from "./primitives.js";
12
+ // ── Sources / registries / installed ────────────────────────────────────────
13
+ const SourceConfigEntryOptionsSchema = z.record(z.unknown());
14
+ export const SourceConfigEntrySchema = z
15
+ .object({
16
+ type: nonEmptyString,
17
+ path: z.string().min(1).optional(),
18
+ url: z.string().min(1).optional(),
19
+ name: z.string().min(1).optional(),
20
+ enabled: z.boolean().optional(),
21
+ writable: z.boolean().optional(),
22
+ primary: z.boolean().optional(),
23
+ options: SourceConfigEntryOptionsSchema.optional(),
24
+ })
25
+ .passthrough()
26
+ .superRefine((entry, ctx) => {
27
+ if (entry.options && "pushOnCommit" in entry.options) {
28
+ ctx.addIssue({
29
+ code: z.ZodIssueCode.custom,
30
+ path: ["options", "pushOnCommit"],
31
+ message: "options.pushOnCommit is not supported",
32
+ });
33
+ }
34
+ if (!["filesystem", "git", "website", "npm"].includes(entry.type)) {
35
+ ctx.addIssue({
36
+ code: z.ZodIssueCode.custom,
37
+ path: ["type"],
38
+ message: `unsupported source type "${entry.type}"; expected filesystem, git, website, or npm`,
39
+ });
40
+ }
41
+ if (entry.writable === true && (entry.type === "website" || entry.type === "npm")) {
42
+ ctx.addIssue({
43
+ code: z.ZodIssueCode.custom,
44
+ message: `writable: true is only supported on filesystem and git sources (got "${entry.type}"` +
45
+ (entry.name ? ` on source "${entry.name}"` : "") +
46
+ ").",
47
+ });
48
+ }
49
+ });
50
+ export const RegistryConfigEntrySchema = z
51
+ .object({
52
+ url: httpUrl,
53
+ name: z.string().min(1).optional(),
54
+ enabled: z.boolean().optional(),
55
+ provider: z.string().min(1).optional(),
56
+ options: z.record(z.unknown()).optional(),
57
+ })
58
+ .passthrough();
59
+ // ── Bundles (0.9.0 config-shape cutover, spec §10.1 / D-R5) ─────────────────
60
+ //
61
+ // `bundles` + `defaultBundle` are the 0.9.0 desired-configuration shape that
62
+ // supersedes the pre-cutover `stashDir` / `sources[]` / `installed[]` trio. Each
63
+ // bundle entry carries ONE source descriptor (`path` | `git` | `website` | `npm`
64
+ // — mirroring today's source types), an optional `writable`, an optional
65
+ // `registryId` locator (the original registry install id, preserved verbatim so
66
+ // a non-slug-legal id like `github:owner/repo` is not lost when its slug-legal
67
+ // bundle KEY is derived), and an optional single-entry `components` map (spec
68
+ // §10.1; the transitional one-component-per-bundle coupling — NOT multi-component
69
+ // machinery). The map KEY is the workspace bundle slug (spec §11.1 charset: no
70
+ // `/`, `:`, `.`, `#`, whitespace), validated with {@link isBundleSlug}.
71
+ //
72
+ // The config migrator ({@link migrateConfigSourcesToBundles}) emits these keyed
73
+ // by exactly what `deriveInstallations` derives today (D-R5). `bindings` (spec
74
+ // §10.1) is Tier B and is NEVER accepted here (the top-level superRefine rejects
75
+ // it) — it is not part of the 0.9.0 config-shape cutover.
76
+ /** Website source descriptor for a bundle entry (spec §10.1). */
77
+ const BundleWebsiteDescriptorSchema = z
78
+ .object({
79
+ url: httpUrl,
80
+ refresh: z.string().min(1).optional(),
81
+ maxPages: positiveInt.optional(),
82
+ maxDepth: positiveInt.optional(),
83
+ })
84
+ .passthrough();
85
+ /** One component of a bundle (spec §10.1). Single-entry, transitional. */
86
+ const BundleComponentConfigSchema = z
87
+ .object({
88
+ root: z.string().min(1).optional(),
89
+ adapter: nonEmptyString.optional(),
90
+ writable: z.boolean().optional(),
91
+ })
92
+ .passthrough();
93
+ export const BundleConfigEntrySchema = z
94
+ .object({
95
+ // Exactly one source descriptor (enforced in superRefine below):
96
+ path: z.string().min(1).optional(),
97
+ git: z.string().min(1).optional(),
98
+ website: BundleWebsiteDescriptorSchema.optional(),
99
+ npm: z.string().min(1).optional(),
100
+ writable: z.boolean().optional(),
101
+ // Opt a bundle out of indexing, search, refresh, and write targeting
102
+ // without deleting it. Carried over from the pre-cutover `sources[].enabled`
103
+ // flag, which the runtime still honors on the derived source entry
104
+ // (`write-source.ts`, `search-source.ts`); without it here, migrating a
105
+ // disabled source would silently reactivate it.
106
+ enabled: z.boolean().optional(),
107
+ // The original registry install id when the bundle KEY was slug-derived from
108
+ // it (e.g. registryId `github:owner/repo` → key `repo`). Preserved so the
109
+ // source locator survives the config-shape migration (D-R5). Absent when the
110
+ // bundle key already equals the source's stable id.
111
+ registryId: z.string().min(1).optional(),
112
+ components: z.record(z.string().min(1), BundleComponentConfigSchema).optional(),
113
+ })
114
+ .passthrough()
115
+ .superRefine((entry, ctx) => {
116
+ const options = entry.options;
117
+ if (options && typeof options === "object" && "pushOnCommit" in options) {
118
+ ctx.addIssue({
119
+ code: z.ZodIssueCode.custom,
120
+ path: ["options", "pushOnCommit"],
121
+ message: "options.pushOnCommit is not supported",
122
+ });
123
+ }
124
+ const descriptors = ["path", "git", "website", "npm"].filter((k) => entry[k] !== undefined);
125
+ if (descriptors.length === 0) {
126
+ ctx.addIssue({
127
+ code: z.ZodIssueCode.custom,
128
+ message: "a bundle entry must carry exactly one source descriptor (path, git, website, or npm)",
129
+ });
130
+ }
131
+ else if (descriptors.length > 1) {
132
+ ctx.addIssue({
133
+ code: z.ZodIssueCode.custom,
134
+ message: `a bundle entry must carry exactly one source descriptor; got ${descriptors.join(", ")}`,
135
+ });
136
+ }
137
+ if (entry.writable === true && (entry.website !== undefined || entry.npm !== undefined)) {
138
+ ctx.addIssue({
139
+ code: z.ZodIssueCode.custom,
140
+ path: ["writable"],
141
+ message: "writable: true is only supported on path and git bundle sources",
142
+ });
143
+ }
144
+ const componentEntries = entry.components ? Object.entries(entry.components) : [];
145
+ if (entry.components !== undefined && componentEntries.length !== 1) {
146
+ ctx.addIssue({
147
+ code: z.ZodIssueCode.custom,
148
+ path: ["components"],
149
+ message: "a bundle components map must contain exactly one component",
150
+ });
151
+ }
152
+ const componentEntry = componentEntries[0];
153
+ if (componentEntry?.[1].writable === true && (entry.website !== undefined || entry.npm !== undefined)) {
154
+ ctx.addIssue({
155
+ code: z.ZodIssueCode.custom,
156
+ path: ["components", componentEntry[0], "writable"],
157
+ message: "writable: true is only supported on path and git bundle sources",
158
+ });
159
+ }
160
+ });
161
+ /**
162
+ * `bundles` map. Keys are workspace bundle slugs (spec §11.1 / D-R5 charset).
163
+ * The key charset is validated with {@link isBundleSlug} so a key can never carry
164
+ * `/`, `:`, `.`, `#`, or whitespace (which would break the `bundle//conceptId`
165
+ * ref grammar).
166
+ */
167
+ export const BundlesConfigSchema = z.record(z.string().min(1).refine(isBundleSlug, {
168
+ message: "bundle key must be a legal slug (no '/', ':', '.', '#', or whitespace)",
169
+ }), BundleConfigEntrySchema);
@@ -0,0 +1,29 @@
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
+ * `workflow` engine settings. Extracted verbatim from the former
6
+ * `config-schema.ts` monolith — no behavior change.
7
+ */
8
+ import { z } from "zod";
9
+ import { positiveInt } from "./primitives.js";
10
+ // ── Workflow engine ─────────────────────────────────────────────────────────
11
+ /**
12
+ * Workflow-engine settings (`workflow`).
13
+ *
14
+ * `maxConcurrency` is the engine-wide ceiling on concurrent units for native
15
+ * fan-out (`akm workflow run`). It replaces the hard-coded `min(16, cores−2)`
16
+ * cap (which matched Claude Code) with a user knob:
17
+ * - UNSET → the CPU-derived default `min(16, max(1, cores−2))`.
18
+ * - SET → the explicit positive integer, CLAMPED at read time to
19
+ * `[1, WORKFLOW_MAX_CONCURRENCY_CEILING]` (64). Values above the ceiling
20
+ * are clamped, not rejected, so a config shared across machines with wildly
21
+ * different core counts never hard-fails validation.
22
+ * The R3 brief/report driver surface does NOT consult this — drivers own their
23
+ * own parallelism (the engine only caps native dispatch).
24
+ */
25
+ export const WorkflowConfigSchema = z
26
+ .object({
27
+ maxConcurrency: positiveInt.optional(),
28
+ })
29
+ .passthrough();