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

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