akm-cli 0.9.0-beta.9 → 0.9.0-rc.1

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 (381) hide show
  1. package/CHANGELOG.md +715 -0
  2. package/README.md +12 -4
  3. package/dist/akm +38 -0
  4. package/dist/akm-migrate-storage +38 -0
  5. package/dist/assets/help/help-improve.md +9 -6
  6. package/dist/assets/hints/cli-hints-full.md +6 -5
  7. package/dist/assets/profiles/default.json +9 -4
  8. package/dist/assets/profiles/frequent.json +1 -1
  9. package/dist/assets/profiles/memory-focus.json +1 -1
  10. package/dist/assets/profiles/proactive-maintenance.json +25 -0
  11. package/dist/assets/profiles/quick.json +1 -1
  12. package/dist/assets/profiles/recombine-only.json +21 -0
  13. package/dist/assets/profiles/reflect-distill.json +30 -0
  14. package/dist/assets/profiles/synthesize.json +15 -0
  15. package/dist/assets/profiles/thorough.json +1 -1
  16. package/dist/assets/prompts/consolidate-system.md +23 -0
  17. package/dist/assets/prompts/contradiction-judge.md +33 -0
  18. package/dist/assets/prompts/distill-knowledge-system.md +22 -0
  19. package/dist/assets/prompts/distill-lesson-system.md +36 -0
  20. package/dist/assets/prompts/extract-session.md +11 -3
  21. package/dist/assets/prompts/graph-extract-system.md +1 -0
  22. package/dist/assets/prompts/graph-extract-user-prompt.md +1 -1
  23. package/dist/assets/prompts/memory-infer-system.md +1 -0
  24. package/dist/assets/prompts/memory-infer-user.md +5 -0
  25. package/dist/assets/prompts/metadata-enhance-system.md +1 -0
  26. package/dist/assets/prompts/procedural-system.md +44 -0
  27. package/dist/assets/prompts/recombine-system.md +40 -0
  28. package/dist/assets/prompts/staleness-detect-system.md +6 -0
  29. package/dist/assets/prompts/validate-summary-judge.md +1 -0
  30. package/dist/assets/prompts/workflow-unit-preamble.md +26 -0
  31. package/dist/assets/stash-skeleton/facts/conventions/assets/agent.md +38 -0
  32. package/dist/assets/stash-skeleton/facts/conventions/assets/command.md +38 -0
  33. package/dist/assets/stash-skeleton/facts/conventions/assets/fact.md +39 -0
  34. package/dist/assets/stash-skeleton/facts/conventions/assets/knowledge.md +40 -0
  35. package/dist/assets/stash-skeleton/facts/conventions/assets/lesson.md +43 -0
  36. package/dist/assets/stash-skeleton/facts/conventions/assets/memory.md +38 -0
  37. package/dist/assets/stash-skeleton/facts/conventions/assets/script.md +43 -0
  38. package/dist/assets/stash-skeleton/facts/conventions/assets/skill.md +40 -0
  39. package/dist/assets/stash-skeleton/facts/conventions/assets/workflow.md +43 -0
  40. package/dist/assets/templates/html/health.html +281 -111
  41. package/dist/assets/wiki/ingest-workflow-template.md +45 -16
  42. package/dist/assets/wiki/schema-template.md +4 -4
  43. package/dist/cli/clack.js +56 -0
  44. package/dist/cli/config-migrate.js +7 -1
  45. package/dist/cli/confirm.js +1 -1
  46. package/dist/cli/parse-args.js +46 -1
  47. package/dist/cli/shared.js +28 -0
  48. package/dist/cli.js +25 -21
  49. package/dist/commands/agent/agent-dispatch.js +3 -2
  50. package/dist/commands/agent/agent-support.js +0 -7
  51. package/dist/commands/agent/contribute-cli.js +26 -7
  52. package/dist/commands/config-cli.js +26 -13
  53. package/dist/commands/env/child-env.js +47 -0
  54. package/dist/commands/env/env-binding.js +95 -0
  55. package/dist/commands/env/env-cli.js +228 -292
  56. package/dist/commands/env/env.js +14 -67
  57. package/dist/commands/env/secret-cli.js +140 -138
  58. package/dist/commands/feedback-cli.js +156 -155
  59. package/dist/commands/graph/graph-cli.js +5 -13
  60. package/dist/commands/graph/graph.js +3 -3
  61. package/dist/commands/health/advisories.js +151 -0
  62. package/dist/commands/health/checks.js +103 -16
  63. package/dist/commands/health/html-report.js +447 -81
  64. package/dist/commands/health/improve-metrics.js +771 -0
  65. package/dist/commands/health/llm-usage.js +65 -0
  66. package/dist/commands/health/md-report.js +103 -0
  67. package/dist/commands/health/metrics.js +278 -0
  68. package/dist/commands/health/stash-exposure.js +46 -0
  69. package/dist/commands/health/surfaces.js +216 -0
  70. package/dist/commands/health/task-runs.js +135 -0
  71. package/dist/commands/health/types.js +26 -0
  72. package/dist/commands/health/windows.js +195 -0
  73. package/dist/commands/health.js +91 -1091
  74. package/dist/commands/improve/anti-collapse.js +170 -0
  75. package/dist/commands/improve/calibration.js +161 -0
  76. package/dist/commands/improve/collapse-detector.js +421 -0
  77. package/dist/commands/improve/consolidate/chunking.js +141 -0
  78. package/dist/commands/improve/consolidate/eligibility.js +64 -0
  79. package/dist/commands/improve/consolidate/merge.js +145 -0
  80. package/dist/commands/improve/consolidate/sanitize.js +231 -0
  81. package/dist/commands/{lint.js → improve/consolidate/types.js} +1 -1
  82. package/dist/commands/improve/consolidate.js +1295 -1277
  83. package/dist/commands/improve/dedup.js +482 -0
  84. package/dist/commands/improve/distill/content-repair.js +202 -0
  85. package/dist/commands/improve/distill/promote-memory.js +229 -0
  86. package/dist/commands/improve/distill/quality-gate.js +236 -0
  87. package/dist/commands/improve/distill-guards.js +127 -0
  88. package/dist/commands/improve/distill-promotion-policy.js +826 -167
  89. package/dist/commands/improve/distill.js +228 -605
  90. package/dist/commands/improve/eligibility.js +434 -0
  91. package/dist/commands/improve/encoding-salience.js +205 -0
  92. package/dist/commands/improve/extract-cli.js +179 -59
  93. package/dist/commands/improve/extract-prompt.js +54 -3
  94. package/dist/commands/improve/extract-watch.js +140 -0
  95. package/dist/commands/improve/extract.js +409 -43
  96. package/dist/commands/improve/feedback-valence.js +54 -0
  97. package/dist/commands/improve/hot-probation.js +45 -0
  98. package/dist/commands/improve/improve-auto-accept.js +157 -10
  99. package/dist/commands/improve/improve-cli.js +115 -73
  100. package/dist/commands/improve/improve-profiles.js +28 -8
  101. package/dist/commands/improve/improve-result-file.js +15 -25
  102. package/dist/commands/improve/improve-session.js +58 -0
  103. package/dist/commands/improve/improve.js +485 -2764
  104. package/dist/commands/improve/locks.js +154 -0
  105. package/dist/commands/improve/loop-stages.js +1100 -0
  106. package/dist/commands/improve/memory/memory-belief.js +14 -15
  107. package/dist/commands/improve/memory/memory-contradiction-detect.js +83 -60
  108. package/dist/commands/improve/memory/memory-improve.js +27 -27
  109. package/dist/commands/improve/outcome-loop.js +270 -0
  110. package/dist/commands/improve/preparation.js +2002 -0
  111. package/dist/commands/improve/proactive-maintenance.js +37 -35
  112. package/dist/commands/improve/procedural.js +398 -0
  113. package/dist/commands/improve/recombine.js +818 -0
  114. package/dist/commands/improve/reflect-noise.js +0 -0
  115. package/dist/commands/improve/reflect.js +206 -45
  116. package/dist/commands/improve/salience.js +455 -0
  117. package/dist/commands/improve/schema-similarity-gate.js +168 -0
  118. package/dist/commands/improve/shared.js +51 -0
  119. package/dist/commands/improve/triage.js +93 -0
  120. package/dist/commands/lint/agent-linter.js +19 -24
  121. package/dist/commands/lint/base-linter.js +173 -60
  122. package/dist/commands/lint/command-linter.js +19 -24
  123. package/dist/commands/lint/env-key-rules.js +38 -1
  124. package/dist/commands/lint/fact-linter.js +39 -0
  125. package/dist/commands/lint/index.js +31 -13
  126. package/dist/commands/lint/memory-linter.js +1 -1
  127. package/dist/commands/lint/registry.js +7 -2
  128. package/dist/commands/lint/task-linter.js +3 -3
  129. package/dist/commands/lint/workflow-linter.js +26 -1
  130. package/dist/commands/observability-cli.js +4 -4
  131. package/dist/commands/proposal/drain-policies.js +13 -4
  132. package/dist/commands/proposal/drain.js +45 -51
  133. package/dist/commands/proposal/legacy-import.js +115 -0
  134. package/dist/commands/proposal/proposal-cli.js +24 -34
  135. package/dist/commands/proposal/proposal.js +2 -1
  136. package/dist/commands/proposal/propose.js +8 -3
  137. package/dist/commands/proposal/repository.js +829 -0
  138. package/dist/commands/proposal/validators/proposal-quality-validators.js +9 -8
  139. package/dist/commands/proposal/validators/proposals.js +93 -895
  140. package/dist/commands/read/curate.js +410 -111
  141. package/dist/commands/read/knowledge.js +10 -3
  142. package/dist/commands/read/remember-cli.js +133 -138
  143. package/dist/commands/read/search-cli.js +15 -8
  144. package/dist/commands/read/search.js +22 -11
  145. package/dist/commands/read/show.js +106 -14
  146. package/dist/commands/registry-cli.js +76 -87
  147. package/dist/commands/remember.js +11 -12
  148. package/dist/commands/sources/add-cli.js +91 -95
  149. package/dist/commands/sources/history.js +1 -1
  150. package/dist/commands/sources/init.js +66 -18
  151. package/dist/commands/sources/installed-stashes.js +11 -3
  152. package/dist/commands/sources/migration-help.js +7 -4
  153. package/dist/commands/sources/schema-repair.js +44 -46
  154. package/dist/commands/sources/self-update.js +2 -2
  155. package/dist/commands/sources/source-add.js +7 -3
  156. package/dist/commands/sources/sources-cli.js +3 -3
  157. package/dist/commands/sources/stash-cli.js +19 -39
  158. package/dist/commands/sources/stash-skeleton.js +57 -8
  159. package/dist/commands/tasks/default-tasks.js +15 -2
  160. package/dist/commands/tasks/tasks-cli.js +20 -29
  161. package/dist/commands/tasks/tasks.js +39 -11
  162. package/dist/commands/wiki-cli.js +23 -38
  163. package/dist/commands/workflow-cli.js +291 -13
  164. package/dist/core/asset/asset-registry.js +3 -1
  165. package/dist/core/asset/asset-spec.js +79 -5
  166. package/dist/core/asset/frontmatter.js +188 -167
  167. package/dist/core/asset/markdown.js +8 -0
  168. package/dist/core/authoring-rules.js +92 -0
  169. package/dist/core/common.js +4 -23
  170. package/dist/core/concurrent.js +10 -1
  171. package/dist/core/config/config-io.js +10 -1
  172. package/dist/core/config/config-migration.js +18 -40
  173. package/dist/core/config/config-schema.js +403 -62
  174. package/dist/core/config/config-types.js +3 -3
  175. package/dist/core/config/config.js +67 -22
  176. package/dist/core/deep-merge.js +38 -0
  177. package/dist/core/errors.js +1 -0
  178. package/dist/core/eval/rank-metrics.js +113 -0
  179. package/dist/core/events.js +4 -7
  180. package/dist/core/improve-types.js +47 -8
  181. package/dist/core/json-schema.js +142 -0
  182. package/dist/core/logs-db.js +14 -75
  183. package/dist/core/parse.js +36 -16
  184. package/dist/core/paths.js +18 -18
  185. package/dist/core/standards/resolve-standards-context.js +87 -0
  186. package/dist/core/standards/resolve-stash-standards.js +99 -0
  187. package/dist/core/standards/resolve-type-conventions.js +66 -0
  188. package/dist/core/state/migrations.js +770 -0
  189. package/dist/core/state-db.js +132 -1126
  190. package/dist/core/structured.js +69 -0
  191. package/dist/core/time.js +53 -0
  192. package/dist/core/warn.js +21 -0
  193. package/dist/core/write-source.js +37 -0
  194. package/dist/indexer/db/db.js +261 -770
  195. package/dist/indexer/db/entry-mapper.js +41 -0
  196. package/dist/indexer/db/graph-db.js +129 -86
  197. package/dist/indexer/db/llm-cache.js +2 -2
  198. package/dist/indexer/db/schema.js +516 -0
  199. package/dist/indexer/ensure-index.js +36 -92
  200. package/dist/indexer/feedback/utility-policy.js +75 -0
  201. package/dist/indexer/graph/graph-boost.js +51 -41
  202. package/dist/indexer/graph/graph-extraction.js +207 -4
  203. package/dist/indexer/index-writer-lock.js +18 -11
  204. package/dist/indexer/index-written-assets.js +105 -0
  205. package/dist/indexer/indexer.js +182 -204
  206. package/dist/indexer/passes/dir-staleness.js +114 -0
  207. package/dist/indexer/passes/memory-inference.js +13 -5
  208. package/dist/indexer/passes/metadata.js +20 -0
  209. package/dist/indexer/read-preflight.js +23 -0
  210. package/dist/indexer/search/db-search.js +89 -13
  211. package/dist/indexer/search/fts-query.js +51 -0
  212. package/dist/indexer/search/ranking-contributors.js +95 -9
  213. package/dist/indexer/search/ranking.js +79 -3
  214. package/dist/indexer/search/search-fields.js +6 -0
  215. package/dist/indexer/search/search-source.js +32 -21
  216. package/dist/indexer/search/semantic-status.js +4 -0
  217. package/dist/indexer/walk/matchers.js +48 -0
  218. package/dist/indexer/walk/walker.js +21 -13
  219. package/dist/integrations/agent/builders.js +41 -13
  220. package/dist/integrations/agent/config.js +20 -59
  221. package/dist/integrations/agent/detect.js +9 -0
  222. package/dist/integrations/agent/index.js +3 -19
  223. package/dist/integrations/agent/model-aliases.js +16 -2
  224. package/dist/integrations/agent/profiles.js +79 -6
  225. package/dist/integrations/agent/prompts.js +75 -9
  226. package/dist/integrations/agent/runner-dispatch.js +83 -0
  227. package/dist/integrations/agent/runner.js +13 -9
  228. package/dist/integrations/agent/spawn.js +206 -81
  229. package/dist/integrations/harnesses/aider/agent-builder.js +113 -0
  230. package/dist/integrations/harnesses/aider/index.js +58 -0
  231. package/dist/integrations/harnesses/aider/result-extractor.js +53 -0
  232. package/dist/integrations/harnesses/amazonq/agent-builder.js +153 -0
  233. package/dist/integrations/harnesses/amazonq/index.js +59 -0
  234. package/dist/integrations/harnesses/amazonq/result-extractor.js +48 -0
  235. package/dist/integrations/harnesses/claude/agent-builder.js +46 -7
  236. package/dist/integrations/harnesses/claude/index.js +27 -23
  237. package/dist/integrations/harnesses/claude/result-extractor.js +52 -0
  238. package/dist/integrations/harnesses/claude/session-log.js +10 -0
  239. package/dist/integrations/harnesses/codex/agent-builder.js +137 -0
  240. package/dist/integrations/harnesses/codex/index.js +63 -0
  241. package/dist/integrations/harnesses/codex/result-extractor.js +73 -0
  242. package/dist/integrations/harnesses/copilot/agent-builder.js +122 -0
  243. package/dist/integrations/harnesses/copilot/index.js +60 -0
  244. package/dist/integrations/harnesses/copilot/result-extractor.js +151 -0
  245. package/dist/integrations/harnesses/gemini/agent-builder.js +121 -0
  246. package/dist/integrations/harnesses/gemini/index.js +60 -0
  247. package/dist/integrations/harnesses/gemini/result-extractor.js +121 -0
  248. package/dist/integrations/harnesses/index.js +28 -7
  249. package/dist/integrations/harnesses/opencode/agent-builder.js +1 -1
  250. package/dist/integrations/harnesses/opencode/index.js +17 -16
  251. package/dist/integrations/harnesses/opencode/session-log.js +173 -3
  252. package/dist/integrations/harnesses/opencode-sdk/harness.js +65 -0
  253. package/dist/integrations/harnesses/opencode-sdk/index.js +10 -34
  254. package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +642 -71
  255. package/dist/integrations/harnesses/openhands/agent-builder.js +126 -0
  256. package/dist/integrations/harnesses/openhands/index.js +58 -0
  257. package/dist/integrations/harnesses/openhands/result-extractor.js +103 -0
  258. package/dist/integrations/harnesses/pi/agent-builder.js +104 -0
  259. package/dist/integrations/harnesses/pi/index.js +58 -0
  260. package/dist/integrations/harnesses/pi/result-extractor.js +135 -0
  261. package/dist/integrations/harnesses/types.js +8 -0
  262. package/dist/integrations/session-logs/index.js +40 -11
  263. package/dist/llm/call-ai.js +2 -2
  264. package/dist/llm/client.js +34 -11
  265. package/dist/llm/embedder.js +67 -4
  266. package/dist/llm/embedders/cache.js +3 -1
  267. package/dist/llm/embedders/deterministic.js +66 -0
  268. package/dist/llm/embedders/local.js +73 -3
  269. package/dist/llm/feature-gate.js +16 -15
  270. package/dist/llm/graph-extract.js +67 -44
  271. package/dist/llm/memory-infer-impl.js +138 -0
  272. package/dist/llm/memory-infer.js +1 -127
  273. package/dist/llm/metadata-enhance.js +44 -31
  274. package/dist/llm/structured-call.js +49 -0
  275. package/dist/migrate-storage-node.mjs +8 -0
  276. package/dist/output/context.js +5 -5
  277. package/dist/output/renderers.js +87 -15
  278. package/dist/output/shapes/curate.js +14 -2
  279. package/dist/output/shapes/helpers.js +0 -3
  280. package/dist/output/shapes/passthrough.js +6 -1
  281. package/dist/output/text/helpers.js +241 -2
  282. package/dist/output/text/workflow.js +4 -1
  283. package/dist/registry/providers/skills-sh.js +21 -147
  284. package/dist/registry/providers/static-index.js +15 -157
  285. package/dist/registry/resolve.js +27 -9
  286. package/dist/runtime.js +25 -1
  287. package/dist/schemas/akm-config.json +14225 -0
  288. package/dist/schemas/akm-workflow.json +328 -0
  289. package/dist/scripts/migrate-storage.js +2743 -8390
  290. package/dist/scripts/migrations/import-fs-improve-runs-to-db.js +1652 -607
  291. package/dist/setup/detect.js +9 -0
  292. package/dist/setup/legacy-config.js +106 -0
  293. package/dist/setup/prompt.js +57 -0
  294. package/dist/setup/providers.js +14 -0
  295. package/dist/setup/registry-stash-loader.js +12 -0
  296. package/dist/setup/semantic-assets.js +124 -0
  297. package/dist/setup/setup.js +52 -1614
  298. package/dist/setup/steps/connection.js +734 -0
  299. package/dist/setup/steps/output.js +31 -0
  300. package/dist/setup/steps/platforms.js +124 -0
  301. package/dist/setup/steps/semantic.js +27 -0
  302. package/dist/setup/steps/sources.js +222 -0
  303. package/dist/setup/steps/stashdir.js +42 -0
  304. package/dist/setup/steps/tasks.js +152 -0
  305. package/dist/sources/include.js +6 -2
  306. package/dist/sources/providers/filesystem.js +0 -1
  307. package/dist/sources/providers/git-install.js +210 -0
  308. package/dist/sources/providers/git-provider.js +234 -0
  309. package/dist/sources/providers/git-stash.js +248 -0
  310. package/dist/sources/providers/git.js +10 -661
  311. package/dist/sources/providers/npm.js +2 -6
  312. package/dist/sources/providers/provider-utils.js +13 -7
  313. package/dist/sources/providers/sync-from-ref.js +9 -1
  314. package/dist/sources/providers/website.js +9 -5
  315. package/dist/sources/website-ingest.js +187 -29
  316. package/dist/sources/wiki-fetchers/registry.js +53 -0
  317. package/dist/sources/wiki-fetchers/youtube.js +239 -0
  318. package/dist/storage/database.js +45 -10
  319. package/dist/storage/managed-db.js +82 -0
  320. package/dist/storage/repositories/canaries-repository.js +107 -0
  321. package/dist/storage/repositories/consolidation-repository.js +38 -0
  322. package/dist/storage/repositories/embeddings-repository.js +72 -0
  323. package/dist/storage/repositories/events-repository.js +187 -0
  324. package/dist/storage/repositories/extract-sessions-repository.js +96 -0
  325. package/dist/storage/repositories/improve-runs-repository.js +146 -0
  326. package/dist/storage/repositories/index-db.js +14 -8
  327. package/dist/storage/repositories/proposals-repository.js +220 -0
  328. package/dist/storage/repositories/recombine-repository.js +213 -0
  329. package/dist/storage/repositories/registry-cache.js +93 -0
  330. package/dist/storage/repositories/registry-index-cache-repository.js +46 -0
  331. package/dist/storage/repositories/task-history-repository.js +93 -0
  332. package/dist/storage/repositories/workflow-runs-repository.js +189 -1
  333. package/dist/storage/sqlite-pragmas.js +146 -0
  334. package/dist/tasks/backends/cron.js +1 -1
  335. package/dist/tasks/backends/index.js +9 -0
  336. package/dist/tasks/backends/launchd.js +1 -1
  337. package/dist/tasks/backends/schtasks.js +1 -1
  338. package/dist/tasks/{resolveAkmBin.js → resolve-akm-bin.js} +2 -2
  339. package/dist/tasks/runner.js +15 -13
  340. package/dist/text-import-hook.mjs +1 -1
  341. package/dist/wiki/wiki.js +52 -11
  342. package/dist/workflows/authoring/authoring.js +123 -10
  343. package/dist/workflows/authoring/workflow-program-template.yaml +31 -0
  344. package/dist/workflows/cli.js +5 -0
  345. package/dist/workflows/db.js +138 -4
  346. package/dist/workflows/exec/brief.js +484 -0
  347. package/dist/workflows/exec/native-executor.js +975 -0
  348. package/dist/workflows/exec/param-secrets.js +115 -0
  349. package/dist/workflows/exec/report.js +1295 -0
  350. package/dist/workflows/exec/run-workflow.js +596 -0
  351. package/dist/workflows/exec/scheduler.js +100 -0
  352. package/dist/workflows/exec/step-work.js +1156 -0
  353. package/dist/workflows/exec/unit-writer.js +23 -0
  354. package/dist/workflows/exec/watch.js +116 -0
  355. package/dist/workflows/exec/worktree.js +171 -0
  356. package/dist/workflows/ir/compile.js +388 -0
  357. package/dist/workflows/ir/params.js +54 -0
  358. package/dist/workflows/ir/plan-hash.js +33 -0
  359. package/dist/workflows/ir/schema.js +4 -0
  360. package/dist/workflows/parser.js +3 -1
  361. package/dist/workflows/program/expressions.js +369 -0
  362. package/dist/workflows/program/parser.js +760 -0
  363. package/dist/workflows/program/project.js +105 -0
  364. package/dist/workflows/program/schema.js +54 -0
  365. package/dist/workflows/renderer.js +82 -5
  366. package/dist/workflows/runtime/agent-identity.js +59 -14
  367. package/dist/workflows/runtime/runs.js +248 -153
  368. package/dist/workflows/runtime/unit-checkin.js +45 -0
  369. package/dist/workflows/runtime/workflow-asset-loader.js +188 -0
  370. package/dist/workflows/validate-summary.js +26 -10
  371. package/dist/workflows/validator.js +1 -1
  372. package/docs/README.md +69 -18
  373. package/docs/data-and-telemetry.md +7 -5
  374. package/docs/migration/release-notes/0.7.0.md +1 -1
  375. package/docs/migration/release-notes/0.9.0-beta.60.md +19 -0
  376. package/docs/migration/release-notes/0.9.0.md +39 -0
  377. package/package.json +10 -10
  378. package/dist/assets/tasks/core/update-stashes.yml +0 -4
  379. package/dist/commands/db-cli.js +0 -23
  380. package/dist/indexer/db/db-backup.js +0 -376
  381. package/dist/indexer/passes/staleness-detect.js +0 -488
@@ -11,6 +11,15 @@
11
11
  * always resolve to the full name for determinism)
12
12
  */
13
13
  const BUILTIN_ALIASES = [
14
+ {
15
+ // Anthropic's Mythos-class tier above Opus — the recommended resolution
16
+ // target for the `deep` workflow tier (see docs/features/workflows.md).
17
+ alias: "fable",
18
+ platforms: {
19
+ claude: "claude-fable-5",
20
+ opencode: "opencode/claude-fable-5",
21
+ },
22
+ },
14
23
  {
15
24
  alias: "opus",
16
25
  platforms: {
@@ -39,13 +48,18 @@ const BUILTIN_ALIASES = [
39
48
  *
40
49
  * @param model Raw alias ("opus") or exact model ID ("claude-opus-4-7").
41
50
  * @param platform Builder platform name ("claude", "opencode", ...).
42
- * @param custom Profile-level aliases from config.json — take priority over builtins.
51
+ * @param custom Profile-level aliases from config.json — take priority over globals and builtins.
52
+ * @param global Config-root `modelAliases` tier table (alias → platform → model, `"*"` fallback).
43
53
  * @returns Resolved model string, or `model` verbatim when no alias matches.
44
54
  */
45
- export function resolveModel(model, platform, custom) {
55
+ export function resolveModel(model, platform, custom, global) {
46
56
  const key = model.toLowerCase();
47
57
  if (custom?.[key])
48
58
  return custom[key];
59
+ const tier = global?.[key];
60
+ const fromGlobal = tier?.[platform] ?? tier?.["*"];
61
+ if (fromGlobal)
62
+ return fromGlobal;
49
63
  const entry = BUILTIN_ALIASES.find((a) => a.alias === key);
50
64
  return entry?.platforms[platform] ?? model;
51
65
  }
@@ -1,11 +1,18 @@
1
1
  // This Source Code Form is subject to the terms of the Mozilla Public
2
2
  // License, v. 2.0. If a copy of the MPL was not distributed with this
3
3
  // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
- const COMMON_PASSTHROUGH = ["HOME", "PATH", "USER", "LANG", "LC_ALL", "TERM", "TMPDIR"];
4
+ // AKM_EVENT_SOURCE carries usage-event provenance (improve/task) so that akm
5
+ // invocations a spawned agent makes are recorded as machine traffic, not user
6
+ // demand (DRIFT-6). Without it in the passthrough whitelist, buildChildEnv drops
7
+ // the stamp at the agent boundary — e.g. `akm wiki ingest` spawns an agent whose
8
+ // `akm curate/show/search` tool-calls then log source='user', silently inflating
9
+ // every lane's read-back (GRR). It is a provenance tag, never a secret.
10
+ const COMMON_PASSTHROUGH = ["HOME", "PATH", "USER", "LANG", "LC_ALL", "TERM", "TMPDIR", "AKM_EVENT_SOURCE"];
5
11
  /**
6
- * Built-in profiles for the five agent CLIs the v1 spec calls out
7
- * explicitly. The fields here are conservative defaults every value is
8
- * overridable from user config.
12
+ * Built-in profiles for the agent CLIs akm knows out of the box: the five the
13
+ * v1 spec calls out explicitly, plus the P2 harness adapters (copilot, pi,
14
+ * amazonq, openhands plan §"Capability matrix"). The fields here are
15
+ * conservative defaults — every value is overridable from user config.
9
16
  *
10
17
  * For headless/automation use (propose, reflect, tasks), use the '-headless' variant.
11
18
  */
@@ -50,9 +57,42 @@ const BUILTINS = {
50
57
  envPassthrough: [...COMMON_PASSTHROUGH, "OPENAI_API_KEY", "ANTHROPIC_API_KEY"],
51
58
  parseOutput: "text",
52
59
  },
60
+ // ── P2 harness-adapter profiles (plan §"Capability matrix") ────────────────
61
+ copilot: {
62
+ name: "copilot",
63
+ bin: "copilot",
64
+ args: [],
65
+ stdio: "interactive",
66
+ envPassthrough: [...COMMON_PASSTHROUGH, "GH_TOKEN", "GITHUB_TOKEN"],
67
+ parseOutput: "text",
68
+ },
69
+ pi: {
70
+ name: "pi",
71
+ bin: "pi",
72
+ args: [],
73
+ stdio: "interactive",
74
+ envPassthrough: [...COMMON_PASSTHROUGH, "PI_API_KEY", "ANTHROPIC_API_KEY", "OPENAI_API_KEY"],
75
+ parseOutput: "text",
76
+ },
77
+ amazonq: {
78
+ name: "amazonq",
79
+ bin: "q",
80
+ args: [],
81
+ stdio: "interactive",
82
+ envPassthrough: [...COMMON_PASSTHROUGH, "AWS_PROFILE", "AWS_REGION"],
83
+ parseOutput: "text",
84
+ },
85
+ openhands: {
86
+ name: "openhands",
87
+ bin: "openhands",
88
+ args: [],
89
+ stdio: "interactive",
90
+ envPassthrough: [...COMMON_PASSTHROUGH, "LLM_MODEL", "LLM_API_KEY", "LLM_BASE_URL"],
91
+ parseOutput: "text",
92
+ },
53
93
  };
54
94
  /**
55
- * Headless variants of the five base profiles for automation use (propose, reflect, tasks).
95
+ * Headless variants of the base profiles for automation use (propose, reflect, tasks).
56
96
  *
57
97
  * These profiles use `stdio: "captured"` and `parseOutput: "json"` so the
58
98
  * agent's response can be read from stdout. They share the same `bin` and
@@ -104,9 +144,42 @@ const HEADLESS_BUILTINS = {
104
144
  envPassthrough: [...COMMON_PASSTHROUGH, "OPENAI_API_KEY", "ANTHROPIC_API_KEY"],
105
145
  parseOutput: "json",
106
146
  },
147
+ // ── P2 harness-adapter headless variants (plan §"Capability matrix") ───────
148
+ "copilot-headless": {
149
+ name: "copilot-headless",
150
+ bin: "copilot",
151
+ args: [],
152
+ stdio: "captured",
153
+ envPassthrough: [...COMMON_PASSTHROUGH, "GH_TOKEN", "GITHUB_TOKEN"],
154
+ parseOutput: "json",
155
+ },
156
+ "pi-headless": {
157
+ name: "pi-headless",
158
+ bin: "pi",
159
+ args: [],
160
+ stdio: "captured",
161
+ envPassthrough: [...COMMON_PASSTHROUGH, "PI_API_KEY", "ANTHROPIC_API_KEY", "OPENAI_API_KEY"],
162
+ parseOutput: "json",
163
+ },
164
+ "amazonq-headless": {
165
+ name: "amazonq-headless",
166
+ bin: "q",
167
+ args: [],
168
+ stdio: "captured",
169
+ envPassthrough: [...COMMON_PASSTHROUGH, "AWS_PROFILE", "AWS_REGION"],
170
+ parseOutput: "json",
171
+ },
172
+ "openhands-headless": {
173
+ name: "openhands-headless",
174
+ bin: "openhands",
175
+ args: [],
176
+ stdio: "captured",
177
+ envPassthrough: [...COMMON_PASSTHROUGH, "LLM_MODEL", "LLM_API_KEY", "LLM_BASE_URL"],
178
+ parseOutput: "json",
179
+ },
107
180
  };
108
181
  /**
109
- * Names of the five primary built-in profiles. Stable, sorted. Does NOT
182
+ * Names of the primary built-in profiles. Stable, sorted. Does NOT
110
183
  * include the `-headless` variants (those are resolvable by name but are
111
184
  * excluded from detection/enumeration flows).
112
185
  */
@@ -26,6 +26,7 @@
26
26
  * during validation. We carry it through if the agent supplies it.
27
27
  */
28
28
  import { TYPE_DIRS } from "../../core/asset/asset-spec.js";
29
+ import { authoringRulesForType, DESCRIPTION_MAX_CHARS, DESCRIPTION_MIN_CHARS, requiresDescription, } from "../../core/authoring-rules.js";
29
30
  import { parseEmbeddedJsonResponse, stripCodeFences, stripThinkBlocks } from "../../core/parse.js";
30
31
  /**
31
32
  * Per-asset-type frontmatter / authoring hints surfaced in the prompt so
@@ -41,8 +42,9 @@ const TYPE_HINTS = {
41
42
  memory: "memory assets are short factual notes the user wants persisted across sessions. Frontmatter usually includes `description`.",
42
43
  workflow: "workflow assets are markdown describing a multi-step process. Include `# <Title>` and ordered `## Step N` sections.",
43
44
  script: "script assets are executable text files. Include a shebang and minimal usage comment.",
44
- env: "env assets are `.env` files holding a group of related CONFIGURATION for an app/service (KEY=VALUE pairs, `#` comments) — URLs, flags, and any credentials it needs. Values may or may not be sensitive; all are protected (key names discoverable, values stay on disk). Inject with `akm env run env:<name> -- <cmd>` (the safe path values never reach stdout/your context); do NOT run `akm env export` and read its output, as that prints values. For a single sensitive value used on its own for authentication (token, key, cert) use a `secret` instead. Never echo values back to the user.",
45
+ env: "env assets are `.env` files holding a group of related CONFIGURATION for an app/service (KEY=VALUE pairs, `#` comments) — URLs, flags, and any credentials it needs. Values may or may not be sensitive; all are protected (key names discoverable, values stay on disk). Inject with `akm env run env:<name> -- <cmd>`; prefer `--clean` in agent contexts so the child starts from a minimal inherited environment. AKM itself does not print values, but the child command can print its environment, so do not run `env`, `printenv`, shell tracing, or similar diagnostics when secrets are in scope. For a single sensitive value used on its own for authentication (token, key, cert) use a `secret` instead. Never echo values back to the user.",
45
46
  wiki: "wiki assets are markdown reference pages with `# Title` and structured headings.",
47
+ fact: "fact assets are durable stash-level facts (personal/team/project details, coding conventions, stash-meta). Frontmatter SHOULD include `description` and a `category` (personal|team|project|convention|meta); set `pinned: true` only for the small always-injected core. Keep each fact short, high-signal, and self-contained — it is durable context, not an episodic note.",
46
48
  };
47
49
  function hintForType(type) {
48
50
  return TYPE_HINTS[type] ?? `assets of type "${type}" — produce sensible markdown with optional frontmatter.`;
@@ -109,6 +111,30 @@ export function extractDraftConfidence(stdout) {
109
111
  return undefined;
110
112
  return value;
111
113
  }
114
+ /**
115
+ * Whether the source asset content has a non-empty `description:` key in its
116
+ * YAML frontmatter. Used by {@link buildReflectPrompt} (#636) to decide whether
117
+ * to inject the synthesize-a-description instruction. Uses an inline regex to
118
+ * avoid pulling the full YAML parser into the prompt module (mirrors the
119
+ * existing inline frontmatter handling here).
120
+ */
121
+ function sourceHasNonEmptyDescription(assetContent) {
122
+ if (!assetContent)
123
+ return false;
124
+ const fmMatch = assetContent.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n?/);
125
+ if (!fmMatch)
126
+ return false;
127
+ const fmBlock = fmMatch[1] ?? "";
128
+ // Match a top-level `description:` line and capture its inline value.
129
+ const descMatch = fmBlock.match(/^description\s*:\s*(.*)$/m);
130
+ if (!descMatch)
131
+ return false;
132
+ const value = (descMatch[1] ?? "")
133
+ .trim()
134
+ .replace(/^['"]|['"]$/g, "")
135
+ .trim();
136
+ return value.length > 0;
137
+ }
112
138
  /**
113
139
  * Build the prompt for `akm reflect [ref]`. Asks the agent to review an
114
140
  * existing asset (plus any negative feedback / lint findings) and propose
@@ -155,6 +181,34 @@ export function buildReflectPrompt(input) {
155
181
  // ref is set but no feedback — explicitly constrain scope to schema compliance
156
182
  sections.push("No usage feedback recorded. Limit your proposal to schema and structural improvements only: missing required frontmatter fields, unclear `when_to_use`, ambiguous description, or broken formatting. Do not speculate about runtime weaknesses you have not observed.");
157
183
  }
184
+ if (input.standardsContext?.trim()) {
185
+ sections.push("Standards to follow (the rulebook for this target):");
186
+ sections.push(input.standardsContext.trim());
187
+ }
188
+ {
189
+ const resolvedType = input.type ?? (input.ref?.includes(":") ? input.ref.split(":")[0] : "");
190
+ const authoringRules = resolvedType ? authoringRulesForType(resolvedType) : "";
191
+ if (authoringRules) {
192
+ sections.push(authoringRules);
193
+ }
194
+ // #636 — synthesize-a-description instruction. Many source assets (notably
195
+ // scraped docs: `source`/`title`/`scraped`) carry frontmatter but NO
196
+ // `description`. Reflect echoes the source frontmatter, so the proposal
197
+ // inherits the missing description and the promote-time validator
198
+ // (isValidDescription, 20–400 chars) rejects it. The fix is at GENERATION
199
+ // time: when the source lacks a non-empty `description` and the type
200
+ // requires one, tell the model — unmissably — that it MUST author a valid
201
+ // `description`. (The validator/promote path is NOT changed: it must never
202
+ // fabricate content to pass itself.)
203
+ if (resolvedType && requiresDescription(resolvedType) && !sourceHasNonEmptyDescription(input.assetContent)) {
204
+ sections.push([
205
+ "REQUIRED — synthesize a `description` (the source asset has none):",
206
+ `- The source frontmatter does NOT include a non-empty \`description\`, but a ${resolvedType} asset REQUIRES one or the proposal will be rejected at promote time.`,
207
+ `- You MUST author a valid \`description\` in the proposal frontmatter: ${DESCRIPTION_MIN_CHARS}–${DESCRIPTION_MAX_CHARS} characters of plain-prose sentence summarizing what this asset is about.`,
208
+ '- Synthesize it from the asset\'s `title:` frontmatter, its first `# Heading`, or the opening body sentence. Do NOT copy a bare heading fragment (e.g. "Overview", "Named Page", "Key Insight") and do NOT emit a truncated phrase that ends on `:`/`;`/`,` or a hanging connector word.',
209
+ ].join("\n"));
210
+ }
211
+ }
158
212
  if (input.assetContent?.trim()) {
159
213
  // Cap at 12 000 chars to stay well under OS ARG_MAX when the prompt is
160
214
  // passed as a CLI argument to opencode/claude. Large assets (wiki snapshots,
@@ -288,6 +342,16 @@ export function buildProposePrompt(input) {
288
342
  for (const line of input.schemaHints)
289
343
  sections.push(`- ${line}`);
290
344
  }
345
+ if (input.standardsContext?.trim()) {
346
+ sections.push("Standards to follow (the rulebook for this target):");
347
+ sections.push(input.standardsContext.trim());
348
+ }
349
+ {
350
+ const authoringRules = authoringRulesForType(input.type);
351
+ if (authoringRules) {
352
+ sections.push(authoringRules);
353
+ }
354
+ }
291
355
  sections.push("Produce a single proposal that, if accepted, would land as the asset described above.");
292
356
  sections.push(input.draftFilePath ? fileWriteContract(input.draftFilePath) : RESPONSE_CONTRACT_JSON);
293
357
  return sections.join("\n\n");
@@ -304,6 +368,16 @@ export function buildSchemaRepairPrompt(input) {
304
368
  `while preserving all existing content.`);
305
369
  sections.push(`Target ref: ${input.ref}`);
306
370
  sections.push(`Schema requirements for ${input.type} assets: ${hintForType(input.type)}`);
371
+ if (input.standardsContext?.trim()) {
372
+ sections.push("Standards to follow (the rulebook for this target):");
373
+ sections.push(input.standardsContext.trim());
374
+ }
375
+ {
376
+ const authoringRules = authoringRulesForType(input.type);
377
+ if (authoringRules) {
378
+ sections.push(authoringRules);
379
+ }
380
+ }
307
381
  const CONTENT_CAP = 3000;
308
382
  const body = input.assetContent.trimEnd();
309
383
  const truncated = body.length > CONTENT_CAP;
@@ -370,11 +444,3 @@ export function parseAgentProposalPayload(stdout) {
370
444
  }
371
445
  return out;
372
446
  }
373
- /**
374
- * Strip `\`\`\`json … \`\`\`` fences and `<think>…</think>` reasoning blocks
375
- * from agent output. Thin wrapper around `core/parse` helpers, kept exported
376
- * for backward compatibility (re-exported from `integrations/agent/index.ts`).
377
- */
378
- export function stripJsonFences(text) {
379
- return stripCodeFences(stripThinkBlocks(text));
380
- }
@@ -0,0 +1,83 @@
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
+ * X3 — the ONE dispatch seam for the {@link RunnerSpec} tagged union.
6
+ *
7
+ * The improve slice dispatches a `RunnerSpec` (`llm | agent | sdk`) in several
8
+ * places (`reflect.ts`, `proposal/drain.ts`, …). Before this module each site
9
+ * re-rolled the identical 3-arm switch and re-declared its own per-kind test
10
+ * seams (`chat`, `runAgentFn`, `runSdkFn`). `executeRunner` collapses that into
11
+ * one switch + one {@link RunnerSeams} object.
12
+ *
13
+ * Scoping (behavior-preserving):
14
+ * - The `agent` and `sdk` arms are byte-identical across call sites: invoke
15
+ * the profile runner (`runAgent` / `runOpencodeSdk`) with the per-call
16
+ * `RunAgentOptions` the caller passes. Those default runners live here so
17
+ * callers stop importing `runAgent` / `runOpencodeSdk` for dispatch. The
18
+ * `opts` (incl. any `timeoutMs`) is constructed by the caller and passed
19
+ * through unchanged, so each site keeps its exact option set.
20
+ * - The `llm` arm is irreducibly caller-specific (reflect wraps
21
+ * `runReflectViaLlm`, which returns reflect's iteration shape; drain wraps a
22
+ * plain `chatCompletion`). It is therefore a REQUIRED seam — there is no
23
+ * default `llm` handler — so neither caller's bespoke behavior is changed.
24
+ * - The `assertNever` exhaustiveness arm is kept so a 4th `RunnerSpec` kind is
25
+ * a compile error here instead of a silent runtime fall-through.
26
+ *
27
+ * The return type is {@link AgentRunResult} so a later `callStructured` layer
28
+ * (X2) can wrap `executeRunner` without changing this contract.
29
+ */
30
+ import { assertNever } from "../../core/assert.js";
31
+ import { closeServer as disposeOpencodeSdkServers, runOpencodeSdk } from "../harnesses/opencode-sdk/index.js";
32
+ import { runAgent } from "./spawn.js";
33
+ /**
34
+ * Release every long-lived resource the dispatch runners CACHE for reuse, so a
35
+ * one-shot process (the CLI) can exit cleanly once dispatching is done.
36
+ *
37
+ * The `sdk` runner keeps a per-env registry of `opencode serve` CHILD
38
+ * PROCESSES (see `opencode-sdk/sdk-runner.ts`), started lazily and reused
39
+ * across units within a process. Each live child is an OS handle that keeps
40
+ * Bun's event loop open — and the registry's own teardown is wired ONLY to
41
+ * `process.once('exit')`, which never fires while such a child holds the loop
42
+ * open. That is a deadlock: a successful `akm workflow run` that dispatched via
43
+ * the SDK path would hang the CLI (owner finding 4) because the process is
44
+ * never idle enough for the exit hook to run and close the children it is
45
+ * waiting on.
46
+ *
47
+ * The engine therefore calls this in its run `finally` (every exit path —
48
+ * success, gate rejection, failure, abort) to drain the registry deterministically
49
+ * BEFORE relying on the event loop to drain. The close is synchronous and
50
+ * idempotent; when no SDK server was ever started it is a no-op, so the `agent`
51
+ * / `llm` dispatch paths pay nothing. Servers are re-created lazily on the next
52
+ * dispatch, so calling this between independent dispatch invocations is safe.
53
+ */
54
+ export function disposeDispatchResources() {
55
+ disposeOpencodeSdkServers();
56
+ }
57
+ /**
58
+ * Dispatch a {@link RunnerSpec} to its runner and return the raw
59
+ * {@link AgentRunResult}. `opts` is the {@link RunAgentOptions} for the profile
60
+ * (`agent` / `sdk`) arms; it is passed through unchanged so each caller keeps
61
+ * its exact option set (incl. any `timeoutMs` the caller chose to apply).
62
+ */
63
+ export async function executeRunner(spec, prompt, opts, seams = {}) {
64
+ switch (spec.kind) {
65
+ case "llm": {
66
+ if (!seams.llm) {
67
+ throw new Error("executeRunner: an `llm` runner requires a `seams.llm` handler (no default LLM dispatch).");
68
+ }
69
+ return seams.llm(spec, prompt);
70
+ }
71
+ case "agent": {
72
+ const run = seams.runAgent ?? runAgent;
73
+ return run(spec.profile, prompt, opts);
74
+ }
75
+ case "sdk": {
76
+ const run = seams.runSdk ?? runOpencodeSdk;
77
+ return run(spec.profile, prompt, opts);
78
+ }
79
+ default:
80
+ // Exhaustiveness arm: a 4th RunnerSpec kind becomes a compile error here.
81
+ return assertNever(spec);
82
+ }
83
+ }
@@ -157,6 +157,19 @@ function resolveProcessRunnerWithLlmFallback(block, config, opts) {
157
157
  }
158
158
  return null;
159
159
  }
160
+ /**
161
+ * Build the tool-less HTTP runner from `defaults.llm`, or `null` when unset.
162
+ * The unattended-improve reflect pin (meta-review 07 Chain-G / P1.3) uses this
163
+ * as the mandatory downgrade target when config would otherwise hand reflect a
164
+ * tool-capable (agent/SDK) runner in a scheduled run. Throws ConfigError when
165
+ * `defaults.llm` names a profile that does not exist.
166
+ */
167
+ export function resolveDefaultLlmRunner(config, timeoutMs) {
168
+ const name = config.defaults?.llm;
169
+ if (!name)
170
+ return null;
171
+ return buildLlmRunnerSpec(name, timeoutMs, config);
172
+ }
160
173
  export function resolveValidationRunner(config) {
161
174
  const validation = config.profiles?.improve?.default?.processes?.validation;
162
175
  const block = validation && validation.enabled !== false ? validation : undefined;
@@ -213,15 +226,6 @@ export function resolveImproveProcessRunnerFromProfile(processConfig, config) {
213
226
  }
214
227
  return null;
215
228
  }
216
- /**
217
- * Convenience accessor for callers that previously read
218
- * `getProcessOptions("index", "staleness_detection", config).thresholdDays`.
219
- * After the 0.8.0 migration, those values live on first-class config keys —
220
- * see `config.index?.stalenessDetection?.thresholdDays` etc.
221
- */
222
- export function getStalenessDetectionThresholdDays(config) {
223
- return config.index?.stalenessDetection?.thresholdDays;
224
- }
225
229
  // Re-export `isProcessEnabled` from feature-gate.ts so callers that previously
226
230
  // imported it from runner.ts continue to work.
227
231
  export { isProcessEnabled } from "../../llm/feature-gate.js";