akm-cli 0.9.0-rc.8 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (450) hide show
  1. package/CHANGELOG.md +1063 -44
  2. package/README.md +51 -25
  3. package/SECURITY.md +14 -1
  4. package/STABILITY.md +497 -0
  5. package/dist/akm +148 -35
  6. package/dist/{akm-migrate-storage → akm-migrate} +6 -9
  7. package/dist/assets/hints/cli-hints-full.md +223 -95
  8. package/dist/assets/hints/cli-hints-short.md +85 -22
  9. package/dist/assets/improve-strategies/default.json +1 -1
  10. package/dist/assets/improve-strategies/reflect-distill.json +1 -1
  11. package/dist/assets/prompts/memory-infer-user.md +2 -3
  12. package/dist/assets/stash-skeleton/README.md +6 -5
  13. package/dist/assets/stash-skeleton/facts/conventions/assets/agent.md +2 -0
  14. package/dist/assets/stash-skeleton/facts/conventions/assets/command.md +2 -0
  15. package/dist/assets/stash-skeleton/facts/conventions/assets/fact.md +2 -0
  16. package/dist/assets/stash-skeleton/facts/conventions/assets/knowledge.md +2 -0
  17. package/dist/assets/stash-skeleton/facts/conventions/assets/lesson.md +2 -0
  18. package/dist/assets/stash-skeleton/facts/conventions/assets/memory.md +2 -0
  19. package/dist/assets/stash-skeleton/facts/conventions/assets/script.md +2 -0
  20. package/dist/assets/stash-skeleton/facts/conventions/assets/skill.md +2 -0
  21. package/dist/assets/stash-skeleton/facts/conventions/assets/workflow.md +2 -0
  22. package/dist/assets/stash-skeleton/facts/conventions/backlinks.md +2 -0
  23. package/dist/assets/stash-skeleton/facts/conventions/domains.md +2 -0
  24. package/dist/assets/stash-skeleton/facts/conventions/organization.md +20 -9
  25. package/dist/assets/tasks/core/extract.yml +1 -1
  26. package/dist/assets/tasks/core/version-check.yml +1 -1
  27. package/dist/assets/tasks/improve/akm-graph-refresh-weekly.yml +5 -0
  28. package/dist/assets/tasks/improve/akm-improve-catchup.yml +8 -0
  29. package/dist/assets/tasks/improve/akm-improve-consolidate.yml +5 -0
  30. package/dist/assets/tasks/improve/akm-improve-frequent.yml +5 -0
  31. package/dist/assets/tasks/improve/akm-improve-nightly.yml +5 -0
  32. package/dist/assets/templates/html/health.html +1 -3
  33. package/dist/assets/workflows/workflow-template.md +32 -15
  34. package/dist/cli/invocation.js +40 -15
  35. package/dist/cli/parse-args.js +0 -22
  36. package/dist/cli/retired-commands.js +121 -0
  37. package/dist/cli/shared.js +154 -22
  38. package/dist/cli/unknown-flags.js +236 -0
  39. package/dist/cli-node.mjs +2 -1
  40. package/dist/cli.js +696 -258
  41. package/dist/commands/agent/agent-dispatch.js +14 -3
  42. package/dist/commands/agent/contribute-cli.js +73 -88
  43. package/dist/commands/completions.js +79 -22
  44. package/dist/commands/config-cli.js +17 -150
  45. package/dist/commands/env/env-cli.js +59 -143
  46. package/dist/commands/env/env.js +12 -163
  47. package/dist/commands/env/marker-path.js +6 -0
  48. package/dist/commands/env/secret-cli.js +36 -66
  49. package/dist/commands/env/secret.js +24 -57
  50. package/dist/commands/feedback-cli.js +141 -87
  51. package/dist/commands/health/accept-rate.js +58 -0
  52. package/dist/commands/health/advisories.js +3 -4
  53. package/dist/commands/health/checks.js +85 -23
  54. package/dist/commands/health/html-report.js +7 -10
  55. package/dist/commands/health/improve-metrics.js +25 -83
  56. package/dist/commands/health/md-report.js +5 -9
  57. package/dist/commands/health/metrics.js +62 -20
  58. package/dist/commands/health/renderers.js +47 -0
  59. package/dist/commands/health/report-view-model.js +4 -5
  60. package/dist/commands/health/stash-exposure.js +1 -1
  61. package/dist/commands/health/surfaces.js +3 -48
  62. package/dist/commands/health/task-runs.js +3 -67
  63. package/dist/commands/health/types-improve.js +7 -0
  64. package/dist/commands/health.js +99 -28
  65. package/dist/commands/improve/anti-collapse.js +2 -2
  66. package/dist/commands/improve/autonomy-gate.js +68 -0
  67. package/dist/commands/improve/collapse-detector.js +41 -40
  68. package/dist/commands/improve/consolidate/eligibility.js +1 -23
  69. package/dist/commands/improve/consolidate/merge.js +4 -0
  70. package/dist/commands/improve/consolidate.js +140 -1000
  71. package/dist/commands/improve/distill/promote-memory.js +12 -12
  72. package/dist/commands/improve/distill/quality-gate.js +6 -6
  73. package/dist/commands/improve/distill.js +58 -69
  74. package/dist/commands/improve/eligibility.js +105 -57
  75. package/dist/commands/improve/extract-cli.js +14 -133
  76. package/dist/commands/improve/improve-cli.js +98 -114
  77. package/dist/commands/improve/improve-result-file.js +1 -28
  78. package/dist/commands/improve/improve-strategies.js +8 -5
  79. package/dist/commands/improve/improve.js +128 -91
  80. package/dist/commands/improve/loop-stages.js +182 -20
  81. package/dist/commands/improve/memory/derived-ref.js +45 -43
  82. package/dist/commands/improve/memory/memory-belief.js +1 -1
  83. package/dist/commands/improve/memory/memory-contradiction-detect.js +4 -12
  84. package/dist/commands/improve/memory/memory-improve.js +6 -5
  85. package/dist/commands/improve/outcome-loop.js +22 -65
  86. package/dist/commands/improve/preparation.js +114 -123
  87. package/dist/commands/improve/proactive-maintenance.js +2 -5
  88. package/dist/commands/improve/reflect.js +56 -160
  89. package/dist/commands/improve/salience.js +11 -122
  90. package/dist/commands/improve/source-identity.js +10 -38
  91. package/dist/commands/lint/base-linter.js +20 -124
  92. package/dist/commands/lint/env-key-rules.js +31 -47
  93. package/dist/commands/lint/index.js +249 -43
  94. package/dist/commands/{events.js → log.js} +33 -38
  95. package/dist/commands/migrate-cli.js +92 -12
  96. package/dist/commands/migration-tool.js +46 -0
  97. package/dist/commands/observability-cli.js +70 -209
  98. package/dist/commands/proposal/drain.js +101 -29
  99. package/dist/commands/proposal/proposal-cli.js +76 -48
  100. package/dist/commands/proposal/proposal.js +54 -18
  101. package/dist/commands/proposal/propose-cli.js +88 -0
  102. package/dist/commands/proposal/propose.js +23 -15
  103. package/dist/commands/proposal/repository.js +701 -278
  104. package/dist/commands/proposal/validators/proposal-quality-validators.js +2 -8
  105. package/dist/commands/proposal/validators/proposal-validators.js +55 -7
  106. package/dist/commands/proposal/validators/proposals.js +4 -7
  107. package/dist/commands/read/curate.js +34 -53
  108. package/dist/commands/read/knowledge.js +150 -95
  109. package/dist/commands/read/registry-search.js +2 -2
  110. package/dist/commands/read/remember-cli.js +42 -15
  111. package/dist/commands/read/search-cli.js +180 -78
  112. package/dist/commands/read/search.js +58 -43
  113. package/dist/commands/read/show.js +197 -141
  114. package/dist/commands/registry-cli.js +12 -51
  115. package/dist/commands/remember.js +14 -57
  116. package/dist/commands/sources/add-cli.js +100 -31
  117. package/dist/commands/sources/bundle-cli.js +166 -0
  118. package/dist/commands/sources/bundle-config-ops.js +7 -2
  119. package/dist/commands/sources/info.js +18 -5
  120. package/dist/commands/sources/init.js +12 -12
  121. package/dist/commands/sources/installed-stashes.js +382 -98
  122. package/dist/commands/sources/schema-repair.js +3 -2
  123. package/dist/commands/sources/self-update.js +131 -38
  124. package/dist/commands/sources/source-add.js +72 -17
  125. package/dist/commands/sources/source-clone.js +129 -45
  126. package/dist/commands/sources/source-manage.js +43 -23
  127. package/dist/commands/sources/sources-cli.js +57 -208
  128. package/dist/commands/sources/stash-cli.js +46 -53
  129. package/dist/commands/tasks/tasks-cli.js +91 -97
  130. package/dist/commands/tasks/tasks.js +276 -421
  131. package/dist/commands/workflow-cli.js +175 -450
  132. package/dist/core/adapter/adapters/akm-adapter.js +47 -28
  133. package/dist/core/adapter/adapters/akm-lint.js +42 -27
  134. package/dist/core/adapter/adapters/akm-metadata.js +15 -44
  135. package/dist/core/adapter/adapters/akm-task-adapter.js +15 -13
  136. package/dist/core/adapter/adapters/akm-workflow-adapter.js +55 -71
  137. package/dist/core/adapter/adapters/dotenv-adapter.js +1 -1
  138. package/dist/core/adapter/adapters/generic-files-adapter.js +2 -0
  139. package/dist/core/adapter/adapters/index.js +6 -6
  140. package/dist/core/adapter/adapters/llm-wiki-adapter.js +14 -8
  141. package/dist/core/adapter/adapters/okf-adapter.js +187 -19
  142. package/dist/core/adapter/adapters/shared.js +3 -19
  143. package/dist/core/adapter/adapters/tool-dir-shared.js +8 -3
  144. package/dist/core/adapter/adapters/website-snapshot-adapter.js +1 -0
  145. package/dist/core/adapter/detect-adapter.js +17 -0
  146. package/dist/core/adapter/recognize-match.js +6 -4
  147. package/dist/core/adapter/validate-context.js +214 -0
  148. package/dist/core/asset/akm-markdown.js +63 -0
  149. package/dist/core/asset/asset-placement.js +20 -6
  150. package/dist/core/asset/asset-ref.js +11 -9
  151. package/dist/core/asset/frontmatter-lint.js +30 -0
  152. package/dist/core/asset/frontmatter.js +37 -9
  153. package/dist/core/asset/markdown.js +40 -51
  154. package/dist/core/asset/resolve-ref.js +89 -18
  155. package/dist/core/asset/stash-meta.js +1 -1
  156. package/dist/core/bundle-id.js +51 -0
  157. package/dist/core/common.js +152 -38
  158. package/dist/core/config/config-io.js +12 -1
  159. package/dist/core/config/config-schema.js +35 -8
  160. package/dist/core/config/config-sources.js +55 -11
  161. package/dist/core/config/config-walker.js +25 -9
  162. package/dist/core/config/config.js +9 -48
  163. package/dist/core/config/experimental.js +21 -0
  164. package/dist/core/config/schema/embedding.js +5 -1
  165. package/dist/core/config/schema/experimental.js +30 -0
  166. package/dist/core/config/schema/improve-processes.js +0 -6
  167. package/dist/core/config/schema/improve.js +21 -3
  168. package/dist/core/config/schema/index-config.js +8 -15
  169. package/dist/core/config/schema/output.js +4 -1
  170. package/dist/core/config/schema/setup.js +9 -18
  171. package/dist/core/config/schema/sources-bundles.js +49 -33
  172. package/dist/core/config/schema/workflow.js +3 -3
  173. package/dist/core/env-secret-ref.js +76 -46
  174. package/dist/core/errors.js +18 -12
  175. package/dist/core/events.js +46 -128
  176. package/dist/core/file-change.js +6 -5
  177. package/dist/core/fs-txn.js +83 -7
  178. package/dist/core/git-message.js +2 -2
  179. package/dist/core/improve-result.js +1 -100
  180. package/dist/core/lesson-lint.js +1 -17
  181. package/dist/core/logs-db.js +2 -1
  182. package/dist/core/migration-operation.js +16 -0
  183. package/dist/core/mutation-target.js +78 -0
  184. package/dist/core/parse.js +4 -1
  185. package/dist/core/paths.js +17 -20
  186. package/dist/core/recognition-util.js +12 -14
  187. package/dist/core/redaction.js +34 -0
  188. package/dist/core/standards/resolve-standards-context.js +2 -14
  189. package/dist/core/standards/resolve-stash-standards.js +2 -2
  190. package/dist/core/standards/resolve-type-conventions.js +2 -2
  191. package/dist/core/state/migrations.js +41 -18
  192. package/dist/core/state-db.js +5 -14
  193. package/dist/core/structured.js +1 -1
  194. package/dist/core/subprocess.js +6 -4
  195. package/dist/core/text-truncation.js +9 -5
  196. package/dist/core/type-presentation.js +3 -3
  197. package/dist/core/warn.js +0 -3
  198. package/dist/core/write-source.js +771 -95
  199. package/dist/indexer/bundle-identity-guard.js +3 -2
  200. package/dist/indexer/db/graph-db.js +0 -24
  201. package/dist/indexer/ensure-index.js +1 -0
  202. package/dist/indexer/graph/graph-boost.js +9 -34
  203. package/dist/indexer/graph/graph-extraction.js +8 -5
  204. package/dist/indexer/index-writer-lock.js +53 -17
  205. package/dist/indexer/index-written-assets.js +16 -22
  206. package/dist/indexer/indexer.js +497 -239
  207. package/dist/indexer/installations.js +14 -96
  208. package/dist/indexer/passes/dir-staleness.js +16 -9
  209. package/dist/indexer/passes/memory-inference.js +11 -9
  210. package/dist/indexer/passes/metadata.js +113 -47
  211. package/dist/indexer/scan/doc-to-entry.js +38 -1
  212. package/dist/indexer/scan/drain-dir.js +13 -23
  213. package/dist/indexer/search/db-search.js +99 -54
  214. package/dist/indexer/search/fts-query.js +47 -24
  215. package/dist/indexer/search/ranking-contributors.js +42 -20
  216. package/dist/indexer/search/ranking.js +18 -99
  217. package/dist/indexer/search/search-fields.js +7 -2
  218. package/dist/indexer/search/search-source.js +82 -93
  219. package/dist/indexer/usage/usage-events.js +0 -89
  220. package/dist/indexer/walk/file-context.js +2 -1
  221. package/dist/indexer/walk/matchers.js +30 -43
  222. package/dist/indexer/walk/path-resolver.js +7 -2
  223. package/dist/indexer/walk/walker.js +38 -12
  224. package/dist/integrations/agent/builders.js +0 -6
  225. package/dist/integrations/agent/config.js +2 -2
  226. package/dist/integrations/agent/detect.js +49 -19
  227. package/dist/integrations/agent/engine-fallback.js +76 -0
  228. package/dist/integrations/agent/profiles.js +14 -0
  229. package/dist/integrations/agent/prompts.js +12 -8
  230. package/dist/integrations/agent/runner-dispatch.js +4 -2
  231. package/dist/integrations/agent/runner.js +0 -1
  232. package/dist/integrations/agent/spawn.js +5 -6
  233. package/dist/integrations/github.js +1 -1
  234. package/dist/integrations/harnesses/aider/agent-builder.js +6 -4
  235. package/dist/integrations/harnesses/amazonq/agent-builder.js +7 -4
  236. package/dist/integrations/harnesses/claude/session-log.js +0 -10
  237. package/dist/integrations/harnesses/codex/agent-builder.js +5 -2
  238. package/dist/integrations/harnesses/copilot/agent-builder.js +5 -3
  239. package/dist/integrations/harnesses/gemini/agent-builder.js +5 -3
  240. package/dist/integrations/harnesses/index.js +3 -7
  241. package/dist/integrations/harnesses/opencode/agent-builder.js +21 -2
  242. package/dist/integrations/harnesses/opencode/session-log.js +0 -15
  243. package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +13 -4
  244. package/dist/integrations/harnesses/openhands/agent-builder.js +9 -6
  245. package/dist/integrations/harnesses/pi/agent-builder.js +6 -4
  246. package/dist/integrations/lockfile.js +101 -6
  247. package/dist/integrations/session-logs/index.js +3 -28
  248. package/dist/llm/client.js +136 -100
  249. package/dist/llm/embedders/remote.js +13 -5
  250. package/dist/llm/feature-gate.js +4 -12
  251. package/dist/llm/graph-extract.js +5 -11
  252. package/dist/llm/memory-infer.js +144 -1
  253. package/dist/llm/metadata-enhance.js +5 -7
  254. package/dist/llm/structured-call.js +1 -1
  255. package/dist/llm/usage-persist.js +26 -5
  256. package/dist/llm/usage-telemetry.js +25 -2
  257. package/dist/output/cli-hints.js +1 -2
  258. package/dist/output/context.js +22 -7
  259. package/dist/output/format-exempt.js +80 -0
  260. package/dist/output/generic-render.js +259 -0
  261. package/dist/output/render-registry.js +57 -0
  262. package/dist/output/renderers.js +14 -36
  263. package/dist/output/shapes/curate.js +10 -1
  264. package/dist/output/shapes/events.js +12 -7
  265. package/dist/output/shapes/helpers.js +56 -83
  266. package/dist/output/shapes/migrate.js +8 -0
  267. package/dist/output/shapes/passthrough.js +7 -41
  268. package/dist/output/shapes/proposal/producer.js +15 -7
  269. package/dist/output/shapes.js +2 -9
  270. package/dist/output/text/{init.js → bundle-create.js} +3 -1
  271. package/dist/output/text/bundle-show.js +7 -0
  272. package/dist/output/text/command-format.js +164 -96
  273. package/dist/output/text/env.js +1 -3
  274. package/dist/output/text/events.js +8 -7
  275. package/dist/output/text/health-format.js +103 -0
  276. package/dist/output/text/health.js +7 -0
  277. package/dist/output/text/helpers.js +10 -8
  278. package/dist/output/text/lint-format.js +43 -0
  279. package/dist/output/text/{save.js → lint.js} +2 -2
  280. package/dist/output/text/migrate.js +88 -0
  281. package/dist/output/text/proposal/producer.js +4 -2
  282. package/dist/output/text/proposal-format.js +44 -72
  283. package/dist/output/text/registry-commands.js +1 -2
  284. package/dist/output/text/show-directives.js +15 -7
  285. package/dist/output/text/status-list.js +32 -0
  286. package/dist/output/text/sync.js +5 -0
  287. package/dist/output/text/workflow-format.js +24 -203
  288. package/dist/output/text/workflow.js +1 -7
  289. package/dist/output/text.js +16 -17
  290. package/dist/registry/factory.js +4 -6
  291. package/dist/registry/origin-resolve.js +16 -27
  292. package/dist/registry/providers/skills-sh.js +3 -3
  293. package/dist/registry/providers/static-index.js +13 -23
  294. package/dist/registry/resolve.js +42 -7
  295. package/dist/registry/semver.js +34 -84
  296. package/dist/runtime.js +2 -23
  297. package/dist/scripts/akm-migrate-node.js +60290 -0
  298. package/dist/scripts/akm-migrate.js +59628 -0
  299. package/dist/setup/detect.js +42 -15
  300. package/dist/setup/registry-stash-loader.js +2 -2
  301. package/dist/setup/setup.js +236 -136
  302. package/dist/setup/steps/connection.js +7 -9
  303. package/dist/setup/steps/platforms.js +9 -9
  304. package/dist/setup/steps/semantic.js +15 -3
  305. package/dist/setup/steps/sources.js +12 -13
  306. package/dist/setup/steps/stashdir.js +2 -3
  307. package/dist/setup/steps/tasks.js +237 -120
  308. package/dist/sources/freshness.js +1 -1
  309. package/dist/sources/provider-factory.js +11 -17
  310. package/dist/sources/providers/filesystem.js +2 -3
  311. package/dist/sources/providers/git-install.js +278 -34
  312. package/dist/sources/providers/git-provider.js +25 -23
  313. package/dist/sources/providers/git-stash.js +395 -106
  314. package/dist/sources/providers/git.js +2 -2
  315. package/dist/sources/providers/npm.js +16 -19
  316. package/dist/sources/providers/provider-utils.js +7 -4
  317. package/dist/sources/providers/sync-from-ref.js +3 -9
  318. package/dist/sources/providers/website.js +6 -1
  319. package/dist/sources/resolve.js +6 -5
  320. package/dist/sources/snapshot-fetchers/bluesky.js +146 -0
  321. package/dist/sources/snapshot-fetchers/content-extract.js +566 -0
  322. package/dist/sources/snapshot-fetchers/fetcher-util.js +41 -0
  323. package/dist/sources/snapshot-fetchers/github.js +100 -0
  324. package/dist/sources/snapshot-fetchers/host-guard.js +291 -0
  325. package/dist/sources/snapshot-fetchers/registry.js +17 -1
  326. package/dist/sources/snapshot-fetchers/robots.js +348 -0
  327. package/dist/sources/snapshot-fetchers/rss.js +282 -0
  328. package/dist/sources/snapshot-fetchers/secret-seam.js +42 -0
  329. package/dist/sources/snapshot-fetchers/website-ingest.js +566 -268
  330. package/dist/sources/snapshot-fetchers/x.js +910 -0
  331. package/dist/storage/database.js +7 -0
  332. package/dist/storage/engines/sqlite-migrations.js +23 -111
  333. package/dist/storage/managed-db.js +2 -2
  334. package/dist/storage/repositories/canaries-repository.js +1 -1
  335. package/dist/storage/repositories/events-repository.js +27 -11
  336. package/dist/storage/repositories/improve-runs-repository.js +6 -12
  337. package/dist/storage/repositories/index-connection.js +17 -6
  338. package/dist/storage/repositories/index-entries-repository.js +151 -240
  339. package/dist/storage/repositories/index-entry-mapper.js +15 -11
  340. package/dist/storage/repositories/index-fts-repository.js +5 -2
  341. package/dist/storage/repositories/index-llm-cache-repository.js +0 -1
  342. package/dist/storage/repositories/index-meta-repository.js +2 -3
  343. package/dist/storage/repositories/index-schema.js +10 -25
  344. package/dist/storage/repositories/index-utility-repository.js +15 -28
  345. package/dist/storage/repositories/index-vec-repository.js +6 -1
  346. package/dist/storage/repositories/outcome-repository.js +119 -0
  347. package/dist/storage/repositories/proposals-repository.js +296 -59
  348. package/dist/storage/repositories/registry-cache.js +19 -0
  349. package/dist/storage/repositories/salience-repository.js +172 -0
  350. package/dist/storage/repositories/task-history-repository.js +15 -13
  351. package/dist/storage/repositories/workflow-runs-repository.js +52 -40
  352. package/dist/tasks/backends/cron.js +105 -15
  353. package/dist/tasks/backends/index.js +1 -1
  354. package/dist/tasks/backends/launchd.js +85 -38
  355. package/dist/tasks/backends/schtasks.js +135 -15
  356. package/dist/tasks/embedded.js +56 -40
  357. package/dist/tasks/parser.js +7 -157
  358. package/dist/tasks/resolve-akm-bin.js +137 -59
  359. package/dist/tasks/runner.js +79 -42
  360. package/dist/tasks/scheduler-invocation.js +220 -10
  361. package/dist/tasks/schema.js +24 -1
  362. package/dist/tasks/task-id.js +1 -3
  363. package/dist/tasks/validator.js +20 -6
  364. package/dist/workflows/authoring/authoring.js +94 -143
  365. package/dist/workflows/authoring/scope-key.js +1 -1
  366. package/dist/workflows/exec/frozen-judge.js +28 -2
  367. package/dist/workflows/exec/native-executor.js +77 -57
  368. package/dist/workflows/exec/param-secrets.js +9 -9
  369. package/dist/workflows/exec/run-workflow.js +133 -79
  370. package/dist/workflows/exec/step-work.js +219 -346
  371. package/dist/{migrate-storage-node.mjs → workflows/exec/unit-dispatch.js} +1 -5
  372. package/dist/workflows/ir/compile.js +141 -270
  373. package/dist/workflows/ir/freeze.js +40 -30
  374. package/dist/workflows/ir/params.js +135 -11
  375. package/dist/workflows/ir/plan-hash.js +1 -1
  376. package/dist/workflows/ir/schema.js +25 -26
  377. package/dist/workflows/parser.js +872 -307
  378. package/dist/workflows/program/expressions.js +20 -208
  379. package/dist/workflows/program/schema.js +7 -10
  380. package/dist/workflows/renderer.js +95 -68
  381. package/dist/workflows/resource-limits.js +2 -0
  382. package/dist/workflows/runtime/checkin.js +3 -3
  383. package/dist/workflows/runtime/plan-classifier.js +16 -75
  384. package/dist/workflows/runtime/runs.js +186 -127
  385. package/dist/workflows/runtime/unit-checkin.js +1 -1
  386. package/dist/workflows/runtime/unit-phases.js +2 -2
  387. package/dist/workflows/runtime/workflow-asset-loader.js +232 -83
  388. package/dist/workflows/schema.js +1 -11
  389. package/dist/workflows/validate-summary.js +30 -36
  390. package/dist/workflows/validator.js +21 -62
  391. package/docs/README.md +68 -0
  392. package/docs/migration/README.md +8 -0
  393. package/docs/migration/release-notes/0.7.0.md +11 -11
  394. package/docs/migration/release-notes/0.9.0.md +208 -27
  395. package/docs/migration/v0.7-to-v0.8.md +46 -47
  396. package/docs/migration/v0.8-to-v0.9.md +564 -208
  397. package/docs/migration/v0.9.0-troubleshooting.md +561 -0
  398. package/docs/reference/README.md +12 -0
  399. package/docs/reference/cli.md +2253 -0
  400. package/docs/reference/configuration.md +358 -0
  401. package/docs/reference/data-and-telemetry.md +105 -42
  402. package/docs/reference/workflows.md +647 -0
  403. package/package.json +22 -11
  404. package/schemas/akm-asset-envelope.json +93 -0
  405. package/schemas/akm-config.json +81 -128
  406. package/schemas/akm-workflow.json +74 -73
  407. package/dist/assets/tasks/core/backup.yml +0 -5
  408. package/dist/assets/tasks/graph-refresh-weekly.yml +0 -10
  409. package/dist/cli/config-migrate.js +0 -1806
  410. package/dist/cli/config-validate.js +0 -41
  411. package/dist/commands/backup-cli.js +0 -56
  412. package/dist/commands/bundle/bundle-cli.js +0 -68
  413. package/dist/commands/bundle/bundle.js +0 -219
  414. package/dist/commands/graph/graph-cli.js +0 -124
  415. package/dist/commands/graph/graph.js +0 -489
  416. package/dist/commands/improve/extract-watch.js +0 -140
  417. package/dist/commands/mv-cli.js +0 -1221
  418. package/dist/commands/sources/history.js +0 -201
  419. package/dist/commands/tasks/default-tasks.js +0 -186
  420. package/dist/core/migration-backup.js +0 -1234
  421. package/dist/indexer/usage/unmigrated-vaults-guard.js +0 -95
  422. package/dist/llm/memory-infer-impl.js +0 -138
  423. package/dist/migrate/legacy/config-source-migration.js +0 -223
  424. package/dist/migrate/legacy/content-migration.js +0 -305
  425. package/dist/migrate/legacy/legacy-layout.js +0 -779
  426. package/dist/migrate/legacy/legacy-paths.js +0 -25
  427. package/dist/migrate/legacy/legacy-stash-json.js +0 -72
  428. package/dist/migrate/legacy/proposal-fs-import.js +0 -168
  429. package/dist/migrate/legacy/task-target-ref-migration.js +0 -272
  430. package/dist/migrate/legacy/three-db-cutover.js +0 -841
  431. package/dist/migrate/legacy/workflow-migrations-bodies.js +0 -52
  432. package/dist/migrate/legacy/workflow-migrations-frozen.js +0 -21
  433. package/dist/migrate/legacy-ref-grammar.js +0 -214
  434. package/dist/output/shapes/distill.js +0 -14
  435. package/dist/output/shapes/history.js +0 -11
  436. package/dist/output/text/distill.js +0 -6
  437. package/dist/output/text/enable-disable.js +0 -8
  438. package/dist/output/text/history.js +0 -6
  439. package/dist/registry/build-index.js +0 -382
  440. package/dist/schemas/akm-config.json +0 -4704
  441. package/dist/schemas/akm-task.json +0 -87
  442. package/dist/schemas/akm-workflow.json +0 -372
  443. package/dist/scripts/migrate-storage.js +0 -3816
  444. package/dist/workflows/authoring/workflow-program-template.yaml +0 -31
  445. package/dist/workflows/cli.js +0 -53
  446. package/dist/workflows/exec/brief.js +0 -481
  447. package/dist/workflows/exec/report.js +0 -1460
  448. package/dist/workflows/exec/watch.js +0 -116
  449. package/dist/workflows/program/parser.js +0 -813
  450. package/dist/workflows/program/project.js +0 -104
@@ -7,6 +7,18 @@
7
7
  * in an {@link AkmConfig}.
8
8
  */
9
9
  import { createHash } from "node:crypto";
10
+ import path from "node:path";
11
+ import { ConfigError } from "../errors.js";
12
+ /** The current one-component-per-bundle configuration entry, if present. */
13
+ export function bundleComponentConfig(bundle) {
14
+ if (!bundle?.components)
15
+ return undefined;
16
+ const components = Object.values(bundle.components);
17
+ if (components.length !== 1) {
18
+ throw new ConfigError("A bundle components map must contain exactly one component.", "INVALID_CONFIG_FILE");
19
+ }
20
+ return components[0];
21
+ }
10
22
  /**
11
23
  * Convert a `bundles` map (0.9.0 config-shape cutover, spec §10.1 / D-R5) into
12
24
  * the ordered {@link SourceConfigEntry} list the transitional runtime source
@@ -28,7 +40,18 @@ export function primaryBundlePath(config) {
28
40
  if (!bundles || !key)
29
41
  return undefined;
30
42
  const entry = bundles[key];
31
- return entry && typeof entry.path === "string" && entry.path.length > 0 ? entry.path : undefined;
43
+ if (!entry || typeof entry.path !== "string" || entry.path.length === 0)
44
+ return undefined;
45
+ const componentRoot = bundleComponentConfig(entry)?.root;
46
+ if (!componentRoot || componentRoot === ".")
47
+ return entry.path;
48
+ const bundleRoot = path.resolve(entry.path);
49
+ const resolved = path.resolve(bundleRoot, componentRoot);
50
+ const relative = path.relative(bundleRoot, resolved);
51
+ if (relative === ".." || relative.startsWith(`..${path.sep}`) || path.isAbsolute(relative)) {
52
+ throw new ConfigError(`Component root "${componentRoot}" escapes bundle "${key}".`, "INVALID_CONFIG_FILE");
53
+ }
54
+ return resolved;
32
55
  }
33
56
  export function bundlesToSourceEntries(config) {
34
57
  const bundles = config.bundles;
@@ -50,13 +73,14 @@ export function bundleEntryToSourceEntry(key, bundle, isPrimary = false) {
50
73
  const base = {
51
74
  name: key,
52
75
  ...(bundle.writable !== undefined ? { writable: bundle.writable } : {}),
76
+ ...(bundle.enabled !== undefined ? { enabled: bundle.enabled } : {}),
53
77
  ...(isPrimary ? { primary: true } : {}),
54
78
  };
55
79
  if (typeof bundle.path === "string" && bundle.path.length > 0) {
56
80
  return { type: "filesystem", path: bundle.path, ...base };
57
81
  }
58
82
  if (typeof bundle.git === "string" && bundle.git.length > 0) {
59
- return { type: "git", url: bundle.git, ...base };
83
+ return { type: "git", url: normalizeInstalledGitRef("", bundle.git), ...base };
60
84
  }
61
85
  if (bundle.website && typeof bundle.website.url === "string") {
62
86
  // All non-`url` website-descriptor keys (maxPages/refresh/maxDepth + any
@@ -79,20 +103,21 @@ export function bundleEntryToSourceEntry(key, bundle, isPrimary = false) {
79
103
  /**
80
104
  * Desired 0.9.0 bundle descriptor for a registry-installed source (spec §10.1).
81
105
  * Maps the install source kind onto the ONE source descriptor a bundle entry
82
- * carries: git/github → `{ git: ref }`, npm → `{ npm: ref }`, everything else
83
- * (local/filesystem) → `{ path: stashRoot }`.
106
+ * carries: git/github → a provider-ready clone URL, npm → `{ npm: ref }`,
107
+ * everything else (local/filesystem) → `{ path: stashRoot }`.
84
108
  *
85
109
  * CRITICAL (spec §10.2:453): the materialized cache root NEVER appears in the
86
110
  * descriptor for a git/npm bundle — the desired config carries only the source
87
- * LOCATOR (the re-installable ref); the resolved root belongs exclusively in the
88
- * lock's `localRoot`. Callers layer `registryId`/`writable` onto the result.
111
+ * descriptor; the install locator stays in `registryId` and the resolved root
112
+ * belongs exclusively in the lock's `localRoot`. Callers layer
113
+ * `registryId`/`writable` onto the result.
89
114
  */
90
115
  export function installedSourceDescriptor(source, ref, stashRoot) {
91
116
  switch (source) {
92
117
  case "git":
93
118
  case "github":
94
119
  if (ref)
95
- return { git: ref };
120
+ return { git: normalizeInstalledGitRef(source, ref) };
96
121
  break;
97
122
  case "npm":
98
123
  if (ref)
@@ -105,6 +130,19 @@ export function installedSourceDescriptor(source, ref, stashRoot) {
105
130
  // cache to re-materialize), so the resolved root IS the desired path.
106
131
  return { path: stashRoot };
107
132
  }
133
+ function normalizeInstalledGitRef(source, ref) {
134
+ if (ref.startsWith("git+"))
135
+ return ref.slice(4);
136
+ const isGithubShorthand = ref.startsWith("github:") || (source === "github" && /^[^/:#]+\/[^/#]+(?:#.+)?$/.test(ref));
137
+ if (!isGithubShorthand)
138
+ return ref;
139
+ const body = ref.startsWith("github:") ? ref.slice("github:".length) : ref;
140
+ const fragmentAt = body.indexOf("#");
141
+ const repository = fragmentAt >= 0 ? body.slice(0, fragmentAt) : body;
142
+ const requestedRef = fragmentAt >= 0 ? body.slice(fragmentAt + 1) : "";
143
+ const cloneUrl = `https://github.com/${repository.replace(/\.git$/i, "")}`;
144
+ return requestedRef ? `${cloneUrl}/tree/${requestedRef}` : cloneUrl;
145
+ }
108
146
  /**
109
147
  * Synthesize a stable identifier when a {@link SourceConfigEntry} omits its
110
148
  * `name`. Uses a short hash of the discriminating fields so two equivalent
@@ -144,8 +182,7 @@ export function parseSourceSpec(entry) {
144
182
  case "npm":
145
183
  return entry.path ? { type: "npm", package: entry.path } : undefined;
146
184
  default:
147
- // Unknown provider — best-effort fallback so callers still get something.
148
- return entry.path ? { type: "filesystem", path: entry.path } : undefined;
185
+ return undefined;
149
186
  }
150
187
  }
151
188
  /**
@@ -166,8 +203,15 @@ export function resolveConfiguredSources(config) {
166
203
  const out = [];
167
204
  for (const persisted of bundleEntries) {
168
205
  const runtime = toConfiguredSource(persisted, persisted.primary === true);
169
- if (runtime)
170
- out.push(runtime);
206
+ if (runtime) {
207
+ const component = bundleComponentConfig(config.bundles?.[persisted.name ?? ""]);
208
+ out.push({
209
+ ...runtime,
210
+ ...(component?.adapter ? { adapterId: component.adapter } : {}),
211
+ ...(component?.root ? { componentRoot: component.root } : {}),
212
+ ...(component?.writable !== undefined ? { writable: component.writable } : {}),
213
+ });
214
+ }
171
215
  }
172
216
  return out;
173
217
  }
@@ -211,15 +211,14 @@ export function configSet(config, dotted, raw) {
211
211
  return undefined;
212
212
  }, config);
213
213
  const next = setPath(config, path, isPlainObject(existing) && isPlainObject(parsed.data) ? deepMergeConfig(existing, parsed.data) : parsed.data);
214
- // Targeted invariant: defaultWriteTarget must point at a configured source
214
+ // Targeted invariant: defaultWriteTarget must point at a configured bundle
215
215
  // (#464.a). Whole-config validation happens at save time; this check fires
216
- // at set time so the user sees the typo immediately. Empty-sources case is
217
- // accepted here (legacy behaviour) — saveConfig will reject if it persists.
216
+ // at set time so the user sees the typo immediately.
218
217
  if (dotted === "defaultWriteTarget" && typeof value === "string") {
219
- const sources = next.sources ?? [];
220
- const knownNames = sources.map((s) => s.name).filter((n) => typeof n === "string" && n.length > 0);
221
- if (knownNames.length > 0 && !knownNames.includes(value)) {
222
- throw new UsageError(`Unknown source name "${value}" for defaultWriteTarget; configured source names: ${knownNames.map((n) => `"${n}"`).join(", ")}.`, "INVALID_FLAG_VALUE");
218
+ const bundles = next.bundles && typeof next.bundles === "object" ? next.bundles : {};
219
+ const knownNames = Object.keys(bundles);
220
+ if (!knownNames.includes(value)) {
221
+ throw new UsageError(`Unknown bundle "${value}" for defaultWriteTarget; configured bundles: ${knownNames.map((n) => `"${n}"`).join(", ") || "none"}.`, "INVALID_FLAG_VALUE");
223
222
  }
224
223
  }
225
224
  return next;
@@ -404,7 +403,24 @@ function unsetPath(config, path) {
404
403
  return next;
405
404
  }
406
405
  // ── Hint generation (#460) ──────────────────────────────────────────────────
407
- export function unknownKeyHint(_attempted) {
406
+ /**
407
+ * Per-key "use X instead" guidance for config keys retired before the 0.9
408
+ * cutover, keyed on the first dotted-path segment. Mitigation item 3: the
409
+ * generic "valid top-level keys" hint doesn't tell a pre-0.9 user what
410
+ * replaced the key they typed — this does.
411
+ */
412
+ const RETIRED_KEY_HINTS = {
413
+ stashDir: "stashDir was removed in 0.9; get the stash path from `akm config path --all` or `akm info`.",
414
+ sources: "sources was replaced by bundles in 0.9; run `akm-migrate apply` on a pre-0.9 config to convert it.",
415
+ installed: "installed was replaced by bundles in 0.9; run `akm-migrate apply` on a pre-0.9 config to convert it.",
416
+ wikiName: "the wiki subsystem was removed in 0.9; wikis are ordinary knowledge assets now — see `akm import`.",
417
+ wiki: "the wiki subsystem was removed in 0.9; wikis are ordinary knowledge assets now — see `akm import`.",
418
+ llm: "llm was replaced by named engines configuration in 0.9; configure `engines` instead.",
419
+ };
420
+ export function unknownKeyHint(attempted) {
408
421
  const keys = listTopLevelConfigKeys();
409
- return `Valid top-level keys: ${keys.join(", ")}. Use dotted paths for nested values (e.g. embedding.endpoint, engines.<name>.model).`;
422
+ const generic = `Valid top-level keys: ${keys.join(", ")}. Use dotted paths for nested values (e.g. embedding.endpoint, engines.<name>.model).`;
423
+ const firstSegment = attempted.split(".")[0] ?? "";
424
+ const retiredHint = RETIRED_KEY_HINTS[firstSegment];
425
+ return retiredHint ? `${retiredHint} ${generic}` : generic;
410
426
  }
@@ -58,7 +58,7 @@ export function resolveBatchSize(configured, contextLength) {
58
58
  // ── Defaults ────────────────────────────────────────────────────────────────
59
59
  export const DEFAULT_CONFIG = {
60
60
  configVersion: "0.9.0",
61
- semanticSearchMode: "auto",
61
+ semanticSearchMode: "off",
62
62
  registries: [
63
63
  { url: "https://raw.githubusercontent.com/itlackey/akm-registry/main/index.json", name: "akm-registry" },
64
64
  { url: "https://skills.sh", name: "skills.sh", provider: "skills-sh", enabled: false },
@@ -69,7 +69,6 @@ export const DEFAULT_CONFIG = {
69
69
  },
70
70
  };
71
71
  // ── Load / Save / Update ────────────────────────────────────────────────────
72
- const PROJECT_CONFIG_RELATIVE_PATH = path.join(".akm", "config.json");
73
72
  let cachedConfig;
74
73
  export function resetConfigCache() {
75
74
  cachedConfig = undefined;
@@ -129,9 +128,8 @@ export function loadUserConfig() {
129
128
  * Parse raw config text and validate via Zod.
130
129
  * ({@link AkmConfigSchema}). Returns the merged-with-defaults AkmConfig.
131
130
  *
132
- * The migration handles all one-time 0.7→0.8 transforms (legacy keys,
133
- * boolean→string coercions, openviking rename); the schema then validates
134
- * the canonical shape and throws on anything it doesn't recognise.
131
+ * The schema accepts only the current config version and validates the
132
+ * canonical shape before defaults are merged.
135
133
  */
136
134
  export function parseAndValidateConfigText(text, sourcePath) {
137
135
  const raw = parseConfigText(text, sourcePath);
@@ -175,10 +173,6 @@ export function getImproveProcessConfig(processName, selected) {
175
173
  return selected?.processes?.[processName];
176
174
  }
177
175
  export function loadConfig() {
178
- // Single-layer load: only the user-level config file is read. Project-level
179
- // .akm/config.json files discovered under cwd-ancestors emit a one-time
180
- // deprecation warning (#457) but are NOT merged.
181
- warnIfProjectConfigPresent(process.cwd());
182
176
  return loadUserConfig();
183
177
  }
184
178
  export function saveConfig(config) {
@@ -265,7 +259,7 @@ export async function mutateConfigWithPrecommit(mutate, precommit) {
265
259
  /**
266
260
  * Strip literal apiKey fields before writing config to disk.
267
261
  * API keys are expected to come from environment variables
268
- * (AKM_EMBED_API_KEY, AKM_LLM_API_KEY, AKM_PROFILE_<NAME>_API_KEY).
262
+ * (AKM_EMBED_API_KEY, AKM_LLM_API_KEY, AKM_ENGINE_<NAME>_API_KEY).
269
263
  *
270
264
  * `${VAR}` / `$VAR` references are preserved — they are not secrets, they
271
265
  * are deferred lookups resolved at consumption by `resolveSecret`. Dropping
@@ -350,15 +344,14 @@ export function resolveSecret(value) {
350
344
  /**
351
345
  * Read a per-pass {@link IndexPassConfig} entry from {@link IndexConfig},
352
346
  * filtering out the reserved feature-section keys so callers don't mistake
353
- * `metadataEnhance` / `stalenessDetection` for a pass.
347
+ * `metadataEnhance` for a pass.
354
348
  */
355
349
  /**
356
350
  * Reserved well-known keys on IndexConfig that are NOT per-pass entries.
357
- * `stalenessDetection` is retired (10-Q3) but stays reserved so a leftover
358
- * config section is never misread as a pass entry. `indexBodyOpening`
359
- * (stash-conventions SPEC-8) is a boolean feature flag, not a pass section.
351
+ * `indexBodyOpening` (stash-conventions SPEC-8) is a boolean feature flag, not
352
+ * a pass section.
360
353
  */
361
- const INDEX_RESERVED_KEYS = new Set(["metadataEnhance", "stalenessDetection", "indexBodyOpening"]);
354
+ const INDEX_RESERVED_KEYS = new Set(["metadataEnhance", "indexBodyOpening"]);
362
355
  export function getIndexPassConfig(config, passName) {
363
356
  if (!config)
364
357
  return undefined;
@@ -370,42 +363,10 @@ export function getIndexPassConfig(config, passName) {
370
363
  return entry;
371
364
  }
372
365
  // Re-export source runtime helpers — implementation lives in config-sources.ts.
373
- export { bundleEntryToSourceEntry, bundlesToSourceEntries, installedSourceDescriptor, parseSourceSpec, primaryBundlePath, resolveConfiguredSources, } from "./config-sources.js";
366
+ export { bundleComponentConfig, bundleEntryToSourceEntry, bundlesToSourceEntries, installedSourceDescriptor, parseSourceSpec, primaryBundlePath, resolveConfiguredSources, } from "./config-sources.js";
374
367
  /**
375
368
  * Merge a partial user-config override onto a base config. Used by
376
369
  * {@link loadUserConfig} (DEFAULT_CONFIG + on-disk) and {@link updateConfig}
377
370
  * (current config + partial patch). Sub-objects with named records (profiles,
378
371
  * defaults, etc.) shallow-merge; arrays override wholesale.
379
372
  */
380
- /**
381
- * Walk cwd-ancestors looking for `.akm/config.json`. If one is found, emit a
382
- * one-time deprecation warning per path. The file's contents are NOT read —
383
- * multi-layer project config was removed in this release; the warning stays
384
- * for one cycle so users notice they have a now-dead file on disk and can
385
- * migrate its settings to the user-level config.
386
- */
387
- const PROJECT_CONFIG_DEPRECATION_WARNED = new Set();
388
- function warnIfProjectConfigPresent(startDir) {
389
- let currentDir = path.resolve(startDir);
390
- while (true) {
391
- const configPath = path.join(currentDir, PROJECT_CONFIG_RELATIVE_PATH);
392
- if (isFile(configPath) && !PROJECT_CONFIG_DEPRECATION_WARNED.has(configPath)) {
393
- PROJECT_CONFIG_DEPRECATION_WARNED.add(configPath);
394
- warn(`[akm] DEPRECATED: project-level config file found at ${configPath}. ` +
395
- "Project-level config files are no longer merged (removed after 0.8.x deprecation). " +
396
- "Move any needed settings to ~/.config/akm/config.json; this file is ignored.");
397
- }
398
- const parentDir = path.dirname(currentDir);
399
- if (parentDir === currentDir)
400
- break;
401
- currentDir = parentDir;
402
- }
403
- }
404
- function isFile(filePath) {
405
- try {
406
- return fs.statSync(filePath).isFile();
407
- }
408
- catch {
409
- return false;
410
- }
411
- }
@@ -0,0 +1,21 @@
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
+ * True only when the user has explicitly opted into autonomous `akm improve`
6
+ * mutation.
7
+ *
8
+ * Accepts a partial config so callers holding a plain object (tests, the
9
+ * strategy resolver) do not need a fully-parsed one.
10
+ */
11
+ export function isImproveAutonomyEnabled(config) {
12
+ return config?.experimental?.improveAutonomy === true;
13
+ }
14
+ /**
15
+ * The config key an operator sets to enable a gated lane.
16
+ *
17
+ * Named rather than inlined because it is user-facing text: it goes into the
18
+ * `improve_skipped` event metadata, the `akm task doctor` output, and the
19
+ * health advisory, and those three must name the same key as the schema.
20
+ */
21
+ export const IMPROVE_AUTONOMY_CONFIG_KEY = "experimental.improveAutonomy";
@@ -27,7 +27,11 @@ export const EmbeddingConnectionConfigSchema = z
27
27
  endpoint: z.string().optional(),
28
28
  model: z.string().optional(),
29
29
  apiKey: z.string().regex(ENV_REFERENCE_PATTERN, `apiKey must be $VAR or \${VAR}`).optional(),
30
- dimension: positiveInt.optional(),
30
+ // Bounded to the index schema's own vec-table guard (1–4096,
31
+ // storage/repositories/index-schema.ts) so an out-of-range dimension
32
+ // fails at config validation with a clear message instead of crashing
33
+ // `akm index` when ensureSchema rejects it (§24.2 "Semantic" gate).
34
+ dimension: positiveInt.max(4096).optional(),
31
35
  localModel: z.string().min(1).optional(),
32
36
  maxTokens: positiveInt.optional(),
33
37
  batchSize: positiveInt.optional(),
@@ -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
+ * `experimental` config section — explicit opt-ins for behaviour that is not
6
+ * covered by the stability contract (D8).
7
+ *
8
+ * An entry here exists so a user can turn something ON deliberately. Every key
9
+ * defaults to OFF, and the runtime must treat "absent" and "false" identically:
10
+ * autonomy is never inferred from a partially-written config.
11
+ */
12
+ import { z } from "zod";
13
+ export const ExperimentalConfigSchema = z
14
+ .object({
15
+ /**
16
+ * Allow `akm improve` to mutate assets without review.
17
+ *
18
+ * OFF by default. Gates memory-cleanup, memory-inference writes, and triage
19
+ * `applyMode: "promote"`. Consolidation stays enabled because destructive
20
+ * operations are advisory and promotion emits a reviewable proposal.
21
+ * `akm improve` itself stays on either way — what this gates is autonomy,
22
+ * not the feature.
23
+ *
24
+ * `sync.push` is deliberately NOT gated by this key: it publishes
25
+ * already-committed content to a remote the user configured for that
26
+ * purpose, and it has its own `sync.push: false` / `--no-push` controls.
27
+ */
28
+ improveAutonomy: z.boolean().optional(),
29
+ })
30
+ .passthrough();
@@ -377,12 +377,6 @@ export const ImproveProfileConfigSchema = z
377
377
  description: z.string().min(1).optional(),
378
378
  processes: ImproveProfileProcessesSchema.optional(),
379
379
  limit: positiveInt.optional(),
380
- // #614 — symmetric valence weighting in the eligibility sort. When true,
381
- // the attention term becomes |valence| MAGNITUDE so BOTH strong positive
382
- // and strong negative feedback drive attention (utility stays dominant) and
383
- // strong-signed assets are routed to a fix/reinforce lane. DEFAULT OFF —
384
- // false/absent preserves the legacy negative-only ranking byte-for-byte.
385
- symmetricValence: z.boolean().optional(),
386
380
  sync: z
387
381
  .object({
388
382
  enabled: z.boolean().optional(),
@@ -42,10 +42,13 @@ const ImproveSalienceSchema = z
42
42
  replayBudget: z.number().int().min(0).optional(),
43
43
  })
44
44
  .passthrough();
45
- // R5 — longitudinal collapse/churn detector (observe-only in v1; deterministic,
45
+ // R5 — longitudinal collapse detector (observe-only; deterministic,
46
46
  // fail-open, runs only on cycles where consolidate did work).
47
47
  // Default ON; opt out via `improve.collapseDetector.enabled: false`.
48
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`.
49
52
  const ImproveCollapseDetectorSchema = z
50
53
  .object({
51
54
  enabled: z.boolean().optional(),
@@ -59,12 +62,26 @@ const ImproveCollapseDetectorSchema = z
59
62
  recallDropThreshold: z.number().min(0).max(1).optional(),
60
63
  // distinct-content-ratio decline over the window that fires collapse (default 0.05).
61
64
  entropyDropThreshold: z.number().min(0).max(1).optional(),
62
- // Accepted-action volume over the window below which churn never fires (default 25).
63
- churnMinAcceptedActions: z.number().int().min(1).optional(),
64
65
  // improve_cycle_metrics retention (default 365 days, owner-approved).
65
66
  retentionDays: z.number().int().min(1).optional(),
66
67
  })
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();
68
85
  export const ImproveConfigSchema = z
69
86
  .object({
70
87
  strategies: z.record(engineName, ImproveProfileConfigSchema).optional(),
@@ -72,5 +89,6 @@ export const ImproveConfigSchema = z
72
89
  eventRetentionDays: nonNegativeNumber.optional(),
73
90
  salience: ImproveSalienceSchema.optional(),
74
91
  collapseDetector: ImproveCollapseDetectorSchema.optional(),
92
+ stateGc: ImproveStateGcSchema.optional(),
75
93
  })
76
94
  .passthrough();
@@ -87,19 +87,6 @@ export const IndexPassConfigSchema = z.preprocess((raw, ctx) => {
87
87
  })
88
88
  .passthrough());
89
89
  const MetadataEnhanceSchema = z.object({ enabled: z.boolean().optional() }).passthrough();
90
- /**
91
- * RETIRED (meta-review 10-Q3): the staleness-detect pass was deleted; nothing
92
- * reads this section anymore. The key stays TOLERATED here so configs that
93
- * still carry `index.stalenessDetection` (written by 0.8.x migrations) do not
94
- * fail validation — deleting the key would route it into the per-pass
95
- * catchall, which rejects its `enabled`/`thresholdDays` fields.
96
- */
97
- const StalenessDetectionSchema = z
98
- .object({
99
- enabled: z.boolean().optional(),
100
- thresholdDays: positiveInt.optional(),
101
- })
102
- .passthrough();
103
90
  const IndexDefaultsSchema = z
104
91
  .object({
105
92
  engine: engineName.optional(),
@@ -142,6 +129,13 @@ const IndexConfigRuntimeSchema = z.preprocess((raw, ctx) => {
142
129
  if (typeof raw !== "object")
143
130
  return raw;
144
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
+ }
145
139
  if (passName === "indexBodyOpening") {
146
140
  if (typeof value !== "boolean") {
147
141
  ctx.addIssue({
@@ -166,7 +160,6 @@ const IndexConfigRuntimeSchema = z.preprocess((raw, ctx) => {
166
160
  .object({
167
161
  defaults: IndexDefaultsSchema.optional(),
168
162
  metadataEnhance: MetadataEnhanceSchema.optional(),
169
- stalenessDetection: StalenessDetectionSchema.optional(),
170
163
  indexBodyOpening: z
171
164
  .boolean()
172
165
  .optional()
@@ -174,7 +167,7 @@ const IndexConfigRuntimeSchema = z.preprocess((raw, ctx) => {
174
167
  "lowest-weight `content` search column and the embedding text (default false). Secret/env files " +
175
168
  "and session-kind memories are never captured. Toggling the flag changes indexed text: run " +
176
169
  "`akm index --full` afterwards to re-extract every entry and regenerate embeddings, and re-mint " +
177
- "collapse-detector canary baselines via `akm improve canary --refresh`."),
170
+ "collapse-detector canary baselines via `bun scripts/refresh-canary-set.ts --refresh`."),
178
171
  })
179
172
  .catchall(IndexPassConfigSchema));
180
173
  // The runtime catchall correctly validates arbitrary pass objects, but its
@@ -9,7 +9,10 @@ import { z } from "zod";
9
9
  // ── Output ──────────────────────────────────────────────────────────────────
10
10
  export const OutputConfigSchema = z
11
11
  .object({
12
- format: z.enum(["json", "yaml", "text"]).optional(),
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(),
13
16
  detail: z.enum(["brief", "normal", "full"]).optional(),
14
17
  })
15
18
  .passthrough();
@@ -7,21 +7,12 @@
7
7
  */
8
8
  import { z } from "zod";
9
9
  // ── Setup-derived recommendations ──────────────────────────────────────────
10
- /**
11
- * Cron-style schedule hints derived by `akm setup --reset-recommended`.
12
- *
13
- * These record the *recommended* cadence for the improve and index background
14
- * tasks. They are advisory metadata persisted into config so the value
15
- * survives a re-run; actual task scheduling lives in the tasks subsystem.
16
- */
17
- export const SetupTaskSchedulesSchema = z
18
- .object({
19
- improve: z.string().min(1).optional(),
20
- index: z.string().min(1).optional(),
21
- })
22
- .passthrough();
23
- export const SetupConfigSchema = z
24
- .object({
25
- taskSchedules: SetupTaskSchedulesSchema.optional(),
26
- })
27
- .passthrough();
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();
@@ -10,16 +10,7 @@ import { z } from "zod";
10
10
  import { isBundleSlug } from "../../asset/asset-ref.js";
11
11
  import { httpUrl, nonEmptyString, positiveInt } from "./primitives.js";
12
12
  // ── Sources / registries / installed ────────────────────────────────────────
13
- const SourceConfigEntryOptionsSchema = z
14
- .object({
15
- /**
16
- * @deprecated 0.9.0 (issue #507). Retired per-asset push-on-commit. Kept so
17
- * old configs still parse; its intent maps onto the batch push gate and
18
- * encountering it emits a one-time deprecation warning.
19
- */
20
- pushOnCommit: z.boolean().optional(),
21
- })
22
- .passthrough();
13
+ const SourceConfigEntryOptionsSchema = z.record(z.unknown());
23
14
  export const SourceConfigEntrySchema = z
24
15
  .object({
25
16
  type: nonEmptyString,
@@ -33,6 +24,13 @@ export const SourceConfigEntrySchema = z
33
24
  })
34
25
  .passthrough()
35
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
+ }
36
34
  if (!["filesystem", "git", "website", "npm"].includes(entry.type)) {
37
35
  ctx.addIssue({
38
36
  code: z.ZodIssueCode.custom,
@@ -58,29 +56,6 @@ export const RegistryConfigEntrySchema = z
58
56
  options: z.record(z.unknown()).optional(),
59
57
  })
60
58
  .passthrough();
61
- const KitSourceSchema = z.enum(["filesystem", "git", "npm", "github", "website", "local"]);
62
- export const InstalledStashEntrySchema = z
63
- .object({
64
- id: nonEmptyString,
65
- source: KitSourceSchema,
66
- ref: nonEmptyString,
67
- artifactUrl: nonEmptyString,
68
- stashRoot: nonEmptyString,
69
- cacheDir: nonEmptyString,
70
- installedAt: nonEmptyString,
71
- writable: z.boolean().optional(),
72
- resolvedVersion: z.string().min(1).optional(),
73
- resolvedRevision: z.string().min(1).optional(),
74
- })
75
- .passthrough()
76
- .superRefine((entry, ctx) => {
77
- if (entry.writable === true && entry.source !== "git" && entry.source !== "filesystem") {
78
- ctx.addIssue({
79
- code: z.ZodIssueCode.custom,
80
- message: `writable: true is only supported on filesystem and git sources (got "${entry.source}" on installed entry "${entry.id}").`,
81
- });
82
- }
83
- });
84
59
  // ── Bundles (0.9.0 config-shape cutover, spec §10.1 / D-R5) ─────────────────
85
60
  //
86
61
  // `bundles` + `defaultBundle` are the 0.9.0 desired-configuration shape that
@@ -105,6 +80,17 @@ const BundleWebsiteDescriptorSchema = z
105
80
  refresh: z.string().min(1).optional(),
106
81
  maxPages: positiveInt.optional(),
107
82
  maxDepth: positiveInt.optional(),
83
+ // Default true: crawl-scoped robots.txt compliance (Disallow/Crawl-delay
84
+ // for the akm/akm-cli product tokens or "*"). See
85
+ // src/sources/snapshot-fetchers/robots.ts. Opt out with `false` to
86
+ // restore pre-P1 behavior exactly (no /robots.txt request at all).
87
+ respectRobots: z.boolean().optional(),
88
+ // Hard wall-clock cap on the whole crawl, in milliseconds. Defaults to
89
+ // 10 minutes. Unlike a between-page check, this aborts work already in
90
+ // flight — including a `Retry-After` sleep, which a server can otherwise
91
+ // make arbitrarily long. Set to 0 to disable the cap entirely for a
92
+ // deliberately long-running crawl.
93
+ crawlTimeoutMs: z.number().int().min(0).optional(),
108
94
  })
109
95
  .passthrough();
110
96
  /** One component of a bundle (spec §10.1). Single-entry, transitional. */
@@ -123,6 +109,12 @@ export const BundleConfigEntrySchema = z
123
109
  website: BundleWebsiteDescriptorSchema.optional(),
124
110
  npm: z.string().min(1).optional(),
125
111
  writable: z.boolean().optional(),
112
+ // Opt a bundle out of indexing, search, refresh, and write targeting
113
+ // without deleting it. Carried over from the pre-cutover `sources[].enabled`
114
+ // flag, which the runtime still honors on the derived source entry
115
+ // (`write-source.ts`, `search-source.ts`); without it here, migrating a
116
+ // disabled source would silently reactivate it.
117
+ enabled: z.boolean().optional(),
126
118
  // The original registry install id when the bundle KEY was slug-derived from
127
119
  // it (e.g. registryId `github:owner/repo` → key `repo`). Preserved so the
128
120
  // source locator survives the config-shape migration (D-R5). Absent when the
@@ -132,6 +124,14 @@ export const BundleConfigEntrySchema = z
132
124
  })
133
125
  .passthrough()
134
126
  .superRefine((entry, ctx) => {
127
+ const options = entry.options;
128
+ if (options && typeof options === "object" && "pushOnCommit" in options) {
129
+ ctx.addIssue({
130
+ code: z.ZodIssueCode.custom,
131
+ path: ["options", "pushOnCommit"],
132
+ message: "options.pushOnCommit is not supported",
133
+ });
134
+ }
135
135
  const descriptors = ["path", "git", "website", "npm"].filter((k) => entry[k] !== undefined);
136
136
  if (descriptors.length === 0) {
137
137
  ctx.addIssue({
@@ -152,6 +152,22 @@ export const BundleConfigEntrySchema = z
152
152
  message: "writable: true is only supported on path and git bundle sources",
153
153
  });
154
154
  }
155
+ const componentEntries = entry.components ? Object.entries(entry.components) : [];
156
+ if (entry.components !== undefined && componentEntries.length !== 1) {
157
+ ctx.addIssue({
158
+ code: z.ZodIssueCode.custom,
159
+ path: ["components"],
160
+ message: "a bundle components map must contain exactly one component",
161
+ });
162
+ }
163
+ const componentEntry = componentEntries[0];
164
+ if (componentEntry?.[1].writable === true && (entry.website !== undefined || entry.npm !== undefined)) {
165
+ ctx.addIssue({
166
+ code: z.ZodIssueCode.custom,
167
+ path: ["components", componentEntry[0], "writable"],
168
+ message: "writable: true is only supported on path and git bundle sources",
169
+ });
170
+ }
155
171
  });
156
172
  /**
157
173
  * `bundles` map. Keys are workspace bundle slugs (spec §11.1 / D-R5 charset).