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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (587) hide show
  1. package/CHANGELOG.md +1190 -52
  2. package/README.md +62 -37
  3. package/SECURITY.md +46 -31
  4. package/dist/akm +162 -38
  5. package/dist/akm-migrate +44 -0
  6. package/dist/assets/backends/schtasks-template.xml +2 -1
  7. package/dist/assets/hints/cli-hints-full.md +268 -118
  8. package/dist/assets/hints/cli-hints-short.md +87 -24
  9. package/dist/assets/{profiles → improve-strategies}/catchup.json +3 -1
  10. package/dist/assets/{profiles → improve-strategies}/consolidate.json +3 -1
  11. package/dist/assets/{profiles → improve-strategies}/default.json +6 -7
  12. package/dist/assets/improve-strategies/frequent.json +15 -0
  13. package/dist/assets/{profiles → improve-strategies}/graph-refresh.json +4 -2
  14. package/dist/assets/{profiles → improve-strategies}/memory-focus.json +4 -1
  15. package/dist/assets/{profiles → improve-strategies}/proactive-maintenance.json +5 -5
  16. package/dist/assets/{profiles → improve-strategies}/quick.json +4 -2
  17. package/dist/assets/improve-strategies/reflect-distill.json +30 -0
  18. package/dist/assets/{profiles → improve-strategies}/thorough.json +1 -1
  19. package/dist/assets/prompts/consolidate-system.md +5 -5
  20. package/dist/assets/prompts/extract-session.md +2 -6
  21. package/dist/assets/prompts/memory-infer-user.md +2 -3
  22. package/dist/assets/prompts/reflect-llm-framed-contract.md +11 -0
  23. package/dist/assets/prompts/reflect-llm-schema-contract.md +3 -0
  24. package/dist/assets/prompts/reflect-output-repair.md +3 -0
  25. package/dist/assets/stash-skeleton/README.md +38 -10
  26. package/dist/assets/stash-skeleton/facts/conventions/assets/agent.md +8 -0
  27. package/dist/assets/stash-skeleton/facts/conventions/assets/command.md +8 -0
  28. package/dist/assets/stash-skeleton/facts/conventions/assets/fact.md +14 -1
  29. package/dist/assets/stash-skeleton/facts/conventions/assets/knowledge.md +13 -1
  30. package/dist/assets/stash-skeleton/facts/conventions/assets/lesson.md +9 -1
  31. package/dist/assets/stash-skeleton/facts/conventions/assets/memory.md +11 -0
  32. package/dist/assets/stash-skeleton/facts/conventions/assets/script.md +9 -0
  33. package/dist/assets/stash-skeleton/facts/conventions/assets/skill.md +9 -0
  34. package/dist/assets/stash-skeleton/facts/conventions/assets/workflow.md +8 -0
  35. package/dist/assets/stash-skeleton/facts/conventions/backlinks.md +100 -0
  36. package/dist/assets/stash-skeleton/facts/conventions/domains.md +64 -0
  37. package/dist/assets/stash-skeleton/facts/conventions/organization.md +136 -0
  38. package/dist/assets/tasks/core/extract.yml +3 -2
  39. package/dist/assets/tasks/core/improve.yml +2 -1
  40. package/dist/assets/tasks/core/index-refresh.yml +1 -0
  41. package/dist/assets/tasks/core/sync.yml +1 -0
  42. package/dist/assets/tasks/core/version-check.yml +2 -1
  43. package/dist/assets/tasks/improve/akm-graph-refresh-weekly.yml +5 -0
  44. package/dist/assets/tasks/improve/akm-improve-catchup.yml +8 -0
  45. package/dist/assets/tasks/improve/akm-improve-consolidate.yml +5 -0
  46. package/dist/assets/tasks/improve/akm-improve-frequent.yml +5 -0
  47. package/dist/assets/tasks/improve/akm-improve-nightly.yml +5 -0
  48. package/dist/assets/templates/html/health.html +5 -4
  49. package/dist/assets/workflows/workflow-template.md +31 -15
  50. package/dist/cli/invocation.js +279 -0
  51. package/dist/cli/parse-args.js +5 -90
  52. package/dist/cli/retired-commands.js +78 -0
  53. package/dist/cli/shared.js +158 -48
  54. package/dist/cli-node.mjs +2 -1
  55. package/dist/cli.js +747 -293
  56. package/dist/commands/agent/agent-dispatch.js +19 -18
  57. package/dist/commands/agent/agent-support.js +0 -24
  58. package/dist/commands/agent/contribute-cli.js +43 -97
  59. package/dist/commands/completions.js +80 -23
  60. package/dist/commands/config-cli.js +44 -281
  61. package/dist/commands/env/env-binding.js +13 -9
  62. package/dist/commands/env/env-cli.js +76 -159
  63. package/dist/commands/env/env.js +12 -163
  64. package/dist/commands/env/marker-path.js +6 -0
  65. package/dist/commands/env/secret-cli.js +45 -61
  66. package/dist/commands/env/secret.js +32 -62
  67. package/dist/commands/feedback-cli.js +179 -85
  68. package/dist/commands/health/accept-rate.js +58 -0
  69. package/dist/commands/health/advisories.js +7 -8
  70. package/dist/commands/health/checks.js +279 -94
  71. package/dist/commands/health/html-report.js +197 -578
  72. package/dist/commands/health/improve-metrics.js +277 -246
  73. package/dist/commands/health/llm-usage.js +19 -19
  74. package/dist/commands/health/md-report.js +16 -7
  75. package/dist/commands/health/metrics.js +67 -32
  76. package/dist/commands/health/renderers.js +47 -0
  77. package/dist/commands/health/report-view-model.js +508 -0
  78. package/dist/commands/health/stash-exposure.js +1 -1
  79. package/dist/commands/health/surfaces.js +16 -56
  80. package/dist/commands/health/task-runs.js +3 -67
  81. package/dist/{migrate-storage-node.mjs → commands/health/types-checks.js} +1 -5
  82. package/dist/commands/health/types-improve.js +29 -0
  83. package/dist/{output/text/save.js → commands/health/types-metrics.js} +1 -2
  84. package/dist/commands/health/types-result.js +7 -0
  85. package/dist/commands/health/types-runs.js +4 -0
  86. package/dist/commands/health/types-session-log.js +4 -0
  87. package/dist/commands/health/types-windows.js +4 -0
  88. package/dist/commands/health/types.js +26 -21
  89. package/dist/commands/health/windows.js +2 -3
  90. package/dist/commands/health.js +296 -167
  91. package/dist/commands/improve/anti-collapse.js +5 -5
  92. package/dist/commands/improve/autonomy-gate.js +68 -0
  93. package/dist/commands/improve/collapse-detector.js +65 -52
  94. package/dist/commands/improve/consolidate/chunking.js +9 -7
  95. package/dist/commands/improve/consolidate/eligibility.js +1 -23
  96. package/dist/commands/improve/consolidate/merge.js +4 -0
  97. package/dist/commands/improve/consolidate.js +454 -1354
  98. package/dist/commands/improve/content-hash.js +39 -0
  99. package/dist/commands/improve/distill/content-repair.js +4 -10
  100. package/dist/commands/improve/distill/promote-memory.js +89 -64
  101. package/dist/commands/improve/distill/quality-gate.js +118 -42
  102. package/dist/commands/improve/distill-guards.js +1 -1
  103. package/dist/commands/improve/distill-promotion-policy.js +33 -888
  104. package/dist/commands/improve/distill.js +607 -363
  105. package/dist/commands/improve/eligibility.js +165 -79
  106. package/dist/commands/improve/extract-cli.js +35 -126
  107. package/dist/commands/improve/extract-prompt.js +6 -35
  108. package/dist/commands/improve/extract.js +640 -391
  109. package/dist/commands/improve/feedback-valence.js +2 -12
  110. package/dist/commands/improve/improve-cli.js +134 -135
  111. package/dist/commands/improve/improve-result-file.js +30 -50
  112. package/dist/commands/improve/improve-run-types.js +4 -0
  113. package/dist/commands/improve/improve-strategies.js +135 -0
  114. package/dist/commands/improve/improve.js +904 -701
  115. package/dist/commands/improve/locks.js +64 -111
  116. package/dist/commands/improve/loop-stages.js +1110 -923
  117. package/dist/commands/improve/memory/derived-ref.js +124 -0
  118. package/dist/commands/improve/memory/memory-belief.js +79 -7
  119. package/dist/commands/improve/memory/memory-contradiction-detect.js +49 -52
  120. package/dist/commands/improve/memory/memory-improve.js +25 -37
  121. package/dist/commands/improve/outcome-loop.js +25 -88
  122. package/dist/commands/improve/preparation.js +1034 -813
  123. package/dist/commands/improve/proactive-maintenance.js +34 -9
  124. package/dist/commands/improve/proposal-envelope.js +31 -0
  125. package/dist/commands/improve/reflect.js +983 -794
  126. package/dist/commands/improve/run-context.js +119 -0
  127. package/dist/commands/improve/salience.js +24 -127
  128. package/dist/commands/improve/session-asset.js +7 -3
  129. package/dist/commands/improve/shared.js +14 -34
  130. package/dist/commands/improve/source-identity.js +28 -0
  131. package/dist/commands/improve/triage.js +20 -17
  132. package/dist/commands/lint/base-linter.js +340 -313
  133. package/dist/commands/lint/env-key-rules.js +31 -47
  134. package/dist/commands/lint/index.js +185 -30
  135. package/dist/commands/{events.js → log.js} +28 -38
  136. package/dist/commands/migrate-cli.js +54 -0
  137. package/dist/commands/migration-tool.js +55 -0
  138. package/dist/commands/observability-cli.js +70 -208
  139. package/dist/commands/proposal/diff-format.js +50 -0
  140. package/dist/commands/proposal/drain-policies.js +0 -6
  141. package/dist/commands/proposal/drain.js +91 -40
  142. package/dist/commands/proposal/proposal-cli.js +134 -132
  143. package/dist/commands/proposal/proposal-types.js +56 -0
  144. package/dist/commands/proposal/proposal.js +83 -65
  145. package/dist/commands/proposal/propose-cli.js +88 -0
  146. package/dist/commands/proposal/propose.js +105 -88
  147. package/dist/commands/proposal/repository.js +1303 -278
  148. package/dist/commands/proposal/validators/proposal-quality-validators.js +16 -6
  149. package/dist/commands/proposal/validators/proposal-validators.js +61 -12
  150. package/dist/commands/proposal/validators/proposals.js +6 -8
  151. package/dist/commands/read/curate.js +78 -73
  152. package/dist/commands/read/knowledge.js +510 -13
  153. package/dist/commands/read/registry-search.js +2 -2
  154. package/dist/commands/read/remember-cli.js +84 -15
  155. package/dist/commands/read/search-cli.js +203 -96
  156. package/dist/commands/read/search.js +126 -94
  157. package/dist/commands/read/show.js +226 -250
  158. package/dist/commands/registry-cli.js +34 -60
  159. package/dist/commands/remember.js +18 -57
  160. package/dist/commands/sources/add-cli.js +104 -49
  161. package/dist/commands/sources/bundle-cli.js +166 -0
  162. package/dist/commands/sources/bundle-config-ops.js +63 -0
  163. package/dist/commands/sources/info.js +27 -15
  164. package/dist/commands/sources/init.js +30 -40
  165. package/dist/commands/sources/installed-stashes.js +469 -172
  166. package/dist/commands/sources/schema-repair.js +10 -9
  167. package/dist/commands/sources/self-update.js +182 -121
  168. package/dist/commands/sources/source-add.js +169 -178
  169. package/dist/commands/sources/source-clone.js +144 -41
  170. package/dist/commands/sources/source-manage.js +94 -59
  171. package/dist/commands/sources/sources-cli.js +64 -205
  172. package/dist/commands/sources/stash-cli.js +91 -54
  173. package/dist/commands/sources/stash-skeleton.js +1 -1
  174. package/dist/commands/tasks/tasks-cli.js +106 -104
  175. package/dist/commands/tasks/tasks.js +445 -262
  176. package/dist/commands/workflow-cli.js +75 -228
  177. package/dist/core/action-contributors.js +1 -1
  178. package/dist/core/activation-policy.js +49 -0
  179. package/dist/core/adapter/adapters/agent-skills-adapter.js +181 -0
  180. package/dist/core/adapter/adapters/akm-adapter.js +528 -0
  181. package/dist/core/adapter/adapters/akm-lint.js +392 -0
  182. package/dist/core/adapter/adapters/akm-metadata.js +387 -0
  183. package/dist/core/adapter/adapters/akm-task-adapter.js +149 -0
  184. package/dist/core/adapter/adapters/akm-workflow-adapter.js +180 -0
  185. package/dist/core/adapter/adapters/claude-adapter.js +61 -0
  186. package/dist/core/adapter/adapters/dotenv-adapter.js +187 -0
  187. package/dist/core/adapter/adapters/generic-files-adapter.js +119 -0
  188. package/dist/core/adapter/adapters/index.js +80 -0
  189. package/dist/core/adapter/adapters/llm-wiki-adapter.js +419 -0
  190. package/dist/core/adapter/adapters/okf-adapter.js +391 -0
  191. package/dist/core/adapter/adapters/opencode-adapter.js +68 -0
  192. package/dist/core/adapter/adapters/shared.js +286 -0
  193. package/dist/core/adapter/adapters/tool-dir-shared.js +217 -0
  194. package/dist/core/adapter/adapters/website-snapshot-adapter.js +155 -0
  195. package/dist/core/adapter/bundle-adapter.js +4 -0
  196. package/dist/core/adapter/detect-adapter.js +17 -0
  197. package/dist/core/adapter/recognize-match.js +44 -0
  198. package/dist/core/adapter/registry.js +56 -0
  199. package/dist/core/adapter/types.js +4 -0
  200. package/dist/core/asset/akm-markdown.js +30 -0
  201. package/dist/core/asset/asset-placement.js +243 -0
  202. package/dist/core/asset/asset-ref.js +110 -79
  203. package/dist/core/asset/asset-serialize.js +20 -0
  204. package/dist/core/asset/frontmatter.js +28 -12
  205. package/dist/core/asset/markdown.js +40 -51
  206. package/dist/core/asset/resolve-ref.js +274 -0
  207. package/dist/core/asset/stash-meta.js +2 -2
  208. package/dist/core/bundle-id.js +51 -0
  209. package/dist/core/common.js +281 -86
  210. package/dist/core/config/config-io.js +42 -128
  211. package/dist/core/config/config-schema.js +233 -855
  212. package/dist/core/config/config-sources.js +162 -39
  213. package/dist/core/config/config-types.js +16 -11
  214. package/dist/core/config/config-version.js +29 -0
  215. package/dist/core/config/config-walker.js +126 -37
  216. package/dist/core/config/config.js +154 -331
  217. package/dist/core/config/deep-merge.js +41 -0
  218. package/dist/core/config/engine-semantics.js +28 -0
  219. package/dist/core/config/experimental.js +21 -0
  220. package/dist/core/config/schema/embedding.js +38 -0
  221. package/dist/core/config/schema/engines.js +116 -0
  222. package/dist/core/config/schema/experimental.js +47 -0
  223. package/dist/core/config/schema/feedback.js +31 -0
  224. package/dist/core/config/schema/improve-processes.js +389 -0
  225. package/dist/core/config/schema/improve.js +94 -0
  226. package/dist/core/config/schema/index-config.js +176 -0
  227. package/dist/core/config/schema/output.js +18 -0
  228. package/dist/core/config/schema/primitives.js +94 -0
  229. package/dist/core/config/schema/search.js +30 -0
  230. package/dist/core/config/schema/setup.js +18 -0
  231. package/dist/core/config/schema/sources-bundles.js +169 -0
  232. package/dist/core/config/schema/workflow.js +29 -0
  233. package/dist/core/env-secret-ref.js +155 -20
  234. package/dist/core/errors.js +17 -15
  235. package/dist/core/events-types.js +4 -0
  236. package/dist/core/events.js +46 -128
  237. package/dist/core/extra-params.js +62 -0
  238. package/dist/core/file-change.js +17 -0
  239. package/dist/core/file-lock.js +202 -57
  240. package/dist/core/fs-txn.js +392 -0
  241. package/dist/core/git-message.js +59 -0
  242. package/dist/core/improve-result.js +167 -0
  243. package/dist/core/lesson-lint.js +1 -17
  244. package/dist/core/logs-db.js +1 -1
  245. package/dist/core/maintenance-barrier.js +135 -0
  246. package/dist/core/migration-operation.js +44 -0
  247. package/dist/core/mutation-target.js +78 -0
  248. package/dist/core/paths.js +22 -25
  249. package/dist/core/platform.js +10 -0
  250. package/dist/core/recognition-util.js +128 -0
  251. package/dist/core/redaction.js +392 -0
  252. package/dist/core/standards/resolve-standards-context.js +36 -65
  253. package/dist/core/standards/resolve-stash-standards.js +2 -2
  254. package/dist/core/standards/resolve-type-conventions.js +5 -5
  255. package/dist/core/state/migrations.js +242 -11
  256. package/dist/core/state-db.js +98 -10
  257. package/dist/core/structured.js +1 -1
  258. package/dist/core/subprocess.js +303 -0
  259. package/dist/core/text-truncation.js +9 -5
  260. package/dist/core/time.js +20 -0
  261. package/dist/core/type-presentation.js +130 -0
  262. package/dist/core/warn.js +0 -3
  263. package/dist/core/write-source.js +834 -118
  264. package/dist/indexer/bundle-identity-guard.js +92 -0
  265. package/dist/indexer/db/graph-db.js +1 -25
  266. package/dist/indexer/db/llm-cache.js +1 -1
  267. package/dist/indexer/ensure-index.js +30 -9
  268. package/dist/indexer/graph/graph-boost.js +9 -30
  269. package/dist/indexer/graph/graph-extraction.js +41 -27
  270. package/dist/indexer/graph/graph-types.js +4 -0
  271. package/dist/indexer/index-writer-lock.js +93 -49
  272. package/dist/indexer/index-written-assets.js +100 -53
  273. package/dist/indexer/indexer.js +746 -329
  274. package/dist/indexer/init.js +18 -25
  275. package/dist/indexer/installations.js +142 -0
  276. package/dist/indexer/passes/dir-staleness.js +18 -10
  277. package/dist/indexer/passes/memory-inference.js +25 -15
  278. package/dist/indexer/passes/metadata.js +412 -243
  279. package/dist/indexer/scan/doc-to-entry.js +160 -0
  280. package/dist/indexer/scan/drain-dir.js +134 -0
  281. package/dist/indexer/search/db-search.js +292 -108
  282. package/dist/indexer/search/fts-query.js +64 -0
  283. package/dist/indexer/search/ranking-contributors.js +145 -25
  284. package/dist/indexer/search/ranking-types.js +4 -0
  285. package/dist/indexer/search/ranking.js +28 -71
  286. package/dist/indexer/search/search-attribution.js +67 -0
  287. package/dist/indexer/search/search-fields.js +18 -3
  288. package/dist/indexer/search/search-hit-enrichers.js +30 -40
  289. package/dist/indexer/search/search-source.js +157 -111
  290. package/dist/indexer/search/semantic-status.js +4 -1
  291. package/dist/indexer/usage/usage-events.js +10 -30
  292. package/dist/indexer/walk/file-context.js +3 -45
  293. package/dist/indexer/walk/matchers.js +42 -73
  294. package/dist/indexer/walk/path-resolver.js +11 -5
  295. package/dist/indexer/walk/walker.js +42 -14
  296. package/dist/integrations/agent/builder-shared.js +7 -0
  297. package/dist/integrations/agent/builders.js +5 -58
  298. package/dist/integrations/agent/config.js +3 -143
  299. package/dist/integrations/agent/detect.js +17 -2
  300. package/dist/integrations/agent/engine-resolution.js +231 -0
  301. package/dist/integrations/agent/index.js +1 -2
  302. package/dist/integrations/agent/model-aliases.js +8 -3
  303. package/dist/integrations/agent/profiles.js +6 -99
  304. package/dist/integrations/agent/prompts.js +46 -18
  305. package/dist/integrations/agent/runner-dispatch.js +78 -13
  306. package/dist/integrations/agent/runner.js +76 -208
  307. package/dist/integrations/agent/spawn.js +48 -279
  308. package/dist/integrations/harnesses/aider/agent-builder.js +9 -8
  309. package/dist/integrations/harnesses/aider/index.js +2 -12
  310. package/dist/integrations/harnesses/amazonq/agent-builder.js +10 -16
  311. package/dist/integrations/harnesses/amazonq/index.js +3 -17
  312. package/dist/integrations/harnesses/claude/agent-builder.js +2 -3
  313. package/dist/integrations/harnesses/claude/config-import.js +1 -3
  314. package/dist/integrations/harnesses/claude/index.js +1 -14
  315. package/dist/integrations/harnesses/claude/session-log.js +27 -75
  316. package/dist/integrations/harnesses/codex/agent-builder.js +8 -7
  317. package/dist/integrations/harnesses/codex/index.js +2 -13
  318. package/dist/integrations/harnesses/copilot/agent-builder.js +9 -9
  319. package/dist/integrations/harnesses/copilot/index.js +1 -13
  320. package/dist/integrations/harnesses/gemini/agent-builder.js +8 -9
  321. package/dist/integrations/harnesses/gemini/index.js +1 -13
  322. package/dist/integrations/harnesses/ids.js +24 -0
  323. package/dist/integrations/harnesses/index.js +31 -33
  324. package/dist/integrations/harnesses/opencode/agent-builder.js +23 -5
  325. package/dist/integrations/harnesses/opencode/config-import.js +1 -3
  326. package/dist/integrations/harnesses/opencode/index.js +1 -18
  327. package/dist/integrations/harnesses/opencode/session-log.js +67 -125
  328. package/dist/integrations/harnesses/opencode-sdk/harness.js +3 -17
  329. package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +274 -191
  330. package/dist/integrations/harnesses/openhands/agent-builder.js +12 -10
  331. package/dist/integrations/harnesses/openhands/index.js +2 -12
  332. package/dist/integrations/harnesses/pi/agent-builder.js +11 -18
  333. package/dist/integrations/harnesses/pi/index.js +3 -16
  334. package/dist/integrations/harnesses/shared.js +17 -0
  335. package/dist/integrations/harnesses/types.js +38 -34
  336. package/dist/integrations/lockfile.js +211 -24
  337. package/dist/integrations/session-logs/index.js +24 -40
  338. package/dist/integrations/session-logs/provider-base.js +113 -0
  339. package/dist/llm/client.js +182 -110
  340. package/dist/llm/embedders/deterministic.js +2 -2
  341. package/dist/llm/embedders/remote.js +21 -9
  342. package/dist/llm/feature-gate.js +17 -57
  343. package/dist/llm/graph-extract.js +12 -13
  344. package/dist/llm/index-passes.js +8 -42
  345. package/dist/llm/memory-infer.js +144 -1
  346. package/dist/llm/metadata-enhance.js +45 -30
  347. package/dist/llm/structured-call.js +16 -8
  348. package/dist/llm/usage-persist.js +30 -5
  349. package/dist/llm/usage-telemetry.js +59 -6
  350. package/dist/output/cli-hints.js +1 -2
  351. package/dist/output/command-registry.js +27 -0
  352. package/dist/output/context.js +22 -7
  353. package/dist/output/format-exempt.js +80 -0
  354. package/dist/output/generic-render.js +251 -0
  355. package/dist/output/html-render.js +11 -16
  356. package/dist/output/render-registry.js +57 -0
  357. package/dist/output/renderers.js +15 -281
  358. package/dist/output/shapes/curate.js +10 -1
  359. package/dist/output/shapes/events.js +12 -7
  360. package/dist/output/shapes/helpers.js +58 -84
  361. package/dist/output/shapes/passthrough.js +8 -40
  362. package/dist/output/shapes/proposal/producer.js +15 -7
  363. package/dist/output/shapes/registry.js +12 -6
  364. package/dist/output/shapes.js +0 -9
  365. package/dist/output/text/{init.js → bundle-create.js} +3 -1
  366. package/dist/output/text/bundle-show.js +7 -0
  367. package/dist/output/text/command-format.js +562 -0
  368. package/dist/output/text/env.js +1 -3
  369. package/dist/output/text/events.js +8 -7
  370. package/dist/output/text/helpers.js +15 -1375
  371. package/dist/output/text/proposal/producer.js +4 -2
  372. package/dist/output/text/proposal-format.js +202 -0
  373. package/dist/output/text/registry-commands.js +1 -2
  374. package/dist/output/text/registry.js +12 -6
  375. package/dist/output/text/show-directives.js +117 -0
  376. package/dist/output/text/show-format.js +103 -0
  377. package/dist/output/text/sync.js +5 -0
  378. package/dist/output/text/workflow-format.js +332 -0
  379. package/dist/output/text/workflow.js +1 -2
  380. package/dist/output/text.js +10 -19
  381. package/dist/registry/factory.js +4 -6
  382. package/dist/registry/origin-resolve.js +16 -27
  383. package/dist/registry/providers/skills-sh.js +3 -3
  384. package/dist/registry/providers/static-index.js +15 -25
  385. package/dist/registry/resolve.js +43 -94
  386. package/dist/registry/semver.js +43 -0
  387. package/dist/runtime.js +81 -12
  388. package/dist/scripts/akm-migrate.js +35529 -0
  389. package/dist/setup/detect.js +5 -7
  390. package/dist/setup/detected-engines.js +136 -0
  391. package/dist/setup/engine-config.js +100 -0
  392. package/dist/setup/registry-stash-loader.js +3 -3
  393. package/dist/setup/semantic-assets.js +12 -9
  394. package/dist/setup/setup.js +444 -208
  395. package/dist/setup/steps/connection-shared.js +120 -0
  396. package/dist/setup/steps/connection.js +108 -305
  397. package/dist/setup/steps/platforms.js +13 -12
  398. package/dist/setup/steps/semantic.js +15 -3
  399. package/dist/setup/steps/sources.js +21 -15
  400. package/dist/setup/steps/stashdir.js +6 -4
  401. package/dist/setup/steps/tasks.js +236 -119
  402. package/dist/setup/steps.js +3 -2
  403. package/dist/sources/freshness.js +39 -0
  404. package/dist/sources/provider-factory.js +11 -17
  405. package/dist/sources/providers/filesystem.js +2 -3
  406. package/dist/sources/providers/git-install.js +278 -34
  407. package/dist/sources/providers/git-provider.js +54 -56
  408. package/dist/sources/providers/git-stash.js +420 -91
  409. package/dist/sources/providers/git.js +2 -2
  410. package/dist/sources/providers/npm.js +16 -19
  411. package/dist/sources/providers/provider-utils.js +47 -22
  412. package/dist/sources/providers/sync-from-ref.js +3 -9
  413. package/dist/sources/providers/website.js +2 -2
  414. package/dist/sources/resolve.js +11 -10
  415. package/dist/sources/snapshot-fetchers/types.js +4 -0
  416. package/dist/sources/{website-ingest.js → snapshot-fetchers/website-ingest.js} +110 -41
  417. package/dist/storage/database.js +60 -4
  418. package/dist/storage/engines/sqlite-migrations.js +156 -5
  419. package/dist/storage/locations.js +1 -2
  420. package/dist/storage/repositories/canaries-repository.js +1 -1
  421. package/dist/storage/repositories/events-repository.js +51 -11
  422. package/dist/storage/repositories/improve-runs-repository.js +6 -32
  423. package/dist/storage/repositories/index-connection.js +79 -0
  424. package/dist/storage/repositories/index-db.js +4 -3
  425. package/dist/storage/repositories/index-entries-repository.js +863 -0
  426. package/dist/{indexer/db/entry-mapper.js → storage/repositories/index-entry-mapper.js} +19 -2
  427. package/dist/storage/repositories/index-entry-types.js +4 -0
  428. package/dist/storage/repositories/index-fts-repository.js +167 -0
  429. package/dist/storage/repositories/index-llm-cache-repository.js +108 -0
  430. package/dist/storage/repositories/index-meta-repository.js +49 -0
  431. package/dist/{indexer/db/schema.js → storage/repositories/index-schema.js} +226 -100
  432. package/dist/storage/repositories/index-sql.js +12 -0
  433. package/dist/storage/repositories/index-utility-repository.js +356 -0
  434. package/dist/storage/repositories/index-vec-repository.js +250 -0
  435. package/dist/storage/repositories/outcome-repository.js +119 -0
  436. package/dist/storage/repositories/proposals-repository.js +317 -75
  437. package/dist/storage/repositories/registry-cache.js +1 -1
  438. package/dist/storage/repositories/salience-repository.js +172 -0
  439. package/dist/storage/repositories/task-history-repository.js +110 -3
  440. package/dist/storage/repositories/workflow-runs-repository.js +68 -35
  441. package/dist/tasks/backends/cron.js +169 -46
  442. package/dist/tasks/backends/exec-utils.js +76 -3
  443. package/dist/tasks/backends/index.js +6 -9
  444. package/dist/tasks/backends/launchd.js +292 -55
  445. package/dist/tasks/backends/schtasks.js +557 -70
  446. package/dist/tasks/backends/types.js +4 -0
  447. package/dist/tasks/command-executable.js +93 -0
  448. package/dist/tasks/embedded.js +56 -38
  449. package/dist/tasks/parser.js +156 -64
  450. package/dist/tasks/resolve-akm-bin.js +144 -51
  451. package/dist/tasks/runner.js +377 -209
  452. package/dist/tasks/schedule.js +108 -19
  453. package/dist/tasks/scheduler-invocation.js +296 -0
  454. package/dist/tasks/schema.js +1 -1
  455. package/dist/tasks/task-id.js +35 -0
  456. package/dist/tasks/validator.js +30 -16
  457. package/dist/workflows/authoring/authoring.js +96 -148
  458. package/dist/workflows/authoring/scope-key.js +1 -1
  459. package/dist/workflows/cli.js +0 -20
  460. package/dist/workflows/concurrency-policy.js +15 -0
  461. package/dist/workflows/exec/brief.js +25 -59
  462. package/dist/workflows/exec/frozen-judge.js +47 -0
  463. package/dist/workflows/exec/native-executor.js +157 -94
  464. package/dist/workflows/exec/report.js +365 -200
  465. package/dist/workflows/exec/run-workflow.js +46 -40
  466. package/dist/workflows/exec/scheduler.js +12 -41
  467. package/dist/workflows/exec/step-work.js +239 -205
  468. package/dist/workflows/exec/workflow-engine-gate.js +67 -0
  469. package/dist/workflows/ir/compile.js +141 -283
  470. package/dist/workflows/ir/freeze.js +233 -0
  471. package/dist/workflows/ir/plan-hash.js +40 -5
  472. package/dist/workflows/ir/schema.js +537 -1
  473. package/dist/workflows/parser.js +878 -306
  474. package/dist/workflows/program/expressions.js +20 -208
  475. package/dist/workflows/program/schema.js +7 -10
  476. package/dist/workflows/renderer.js +99 -121
  477. package/dist/workflows/resource-limits.js +22 -0
  478. package/dist/workflows/runtime/checkin.js +1 -1
  479. package/dist/workflows/runtime/plan-classifier.js +131 -0
  480. package/dist/workflows/runtime/runs.js +200 -113
  481. package/dist/workflows/runtime/unit-checkin.js +1 -1
  482. package/dist/workflows/runtime/unit-phases.js +20 -0
  483. package/dist/workflows/runtime/workflow-asset-loader.js +235 -97
  484. package/dist/workflows/schema.js +1 -11
  485. package/dist/workflows/validate-summary.js +4 -26
  486. package/dist/workflows/validator.js +52 -30
  487. package/docs/README.md +42 -78
  488. package/docs/migration/README.md +8 -0
  489. package/docs/migration/release-notes/0.6.0.md +1 -1
  490. package/docs/migration/release-notes/0.7.0.md +9 -8
  491. package/docs/migration/release-notes/0.9.0.md +158 -14
  492. package/docs/migration/v0.7-to-v0.8.md +46 -47
  493. package/docs/migration/v0.8-to-v0.9.md +844 -0
  494. package/docs/reference/README.md +12 -0
  495. package/docs/reference/data-and-telemetry.md +333 -0
  496. package/package.json +21 -17
  497. package/schemas/akm-asset-envelope.json +93 -0
  498. package/schemas/akm-config.json +4636 -0
  499. package/schemas/akm-task.json +87 -0
  500. package/{dist/schemas → schemas}/akm-workflow.json +127 -82
  501. package/dist/akm-migrate-storage +0 -38
  502. package/dist/assets/help/help-accept.md +0 -12
  503. package/dist/assets/help/help-improve.md +0 -84
  504. package/dist/assets/help/help-proposals.md +0 -17
  505. package/dist/assets/help/help-propose.md +0 -17
  506. package/dist/assets/help/help-reject.md +0 -11
  507. package/dist/assets/profiles/frequent.json +0 -13
  508. package/dist/assets/profiles/recombine-only.json +0 -21
  509. package/dist/assets/profiles/reflect-distill.json +0 -30
  510. package/dist/assets/profiles/synthesize.json +0 -15
  511. package/dist/assets/prompts/procedural-system.md +0 -44
  512. package/dist/assets/prompts/recombine-system.md +0 -40
  513. package/dist/assets/prompts/staleness-detect-system.md +0 -6
  514. package/dist/assets/tasks/core/backup.yml +0 -4
  515. package/dist/assets/tasks/graph-refresh-weekly.yml +0 -10
  516. package/dist/assets/templates/html/default.html +0 -78
  517. package/dist/assets/templates/html/vendor/echarts.min.js +0 -45
  518. package/dist/assets/wiki/index-template.md +0 -12
  519. package/dist/assets/wiki/ingest-workflow-template.md +0 -83
  520. package/dist/assets/wiki/log-template.md +0 -8
  521. package/dist/assets/wiki/schema-template.md +0 -61
  522. package/dist/cli/config-migrate.js +0 -150
  523. package/dist/cli/config-validate.js +0 -39
  524. package/dist/commands/graph/graph-cli.js +0 -124
  525. package/dist/commands/graph/graph.js +0 -487
  526. package/dist/commands/improve/calibration.js +0 -161
  527. package/dist/commands/improve/dedup.js +0 -482
  528. package/dist/commands/improve/extract-watch.js +0 -140
  529. package/dist/commands/improve/hot-probation.js +0 -45
  530. package/dist/commands/improve/improve-auto-accept.js +0 -276
  531. package/dist/commands/improve/improve-profiles.js +0 -168
  532. package/dist/commands/improve/procedural.js +0 -398
  533. package/dist/commands/improve/recombine.js +0 -818
  534. package/dist/commands/improve/schema-similarity-gate.js +0 -168
  535. package/dist/commands/lint/agent-linter.js +0 -44
  536. package/dist/commands/lint/command-linter.js +0 -44
  537. package/dist/commands/lint/default-linter.js +0 -16
  538. package/dist/commands/lint/fact-linter.js +0 -39
  539. package/dist/commands/lint/knowledge-linter.js +0 -16
  540. package/dist/commands/lint/memory-linter.js +0 -61
  541. package/dist/commands/lint/registry.js +0 -41
  542. package/dist/commands/lint/skill-linter.js +0 -45
  543. package/dist/commands/lint/task-linter.js +0 -50
  544. package/dist/commands/lint/workflow-linter.js +0 -81
  545. package/dist/commands/proposal/legacy-import.js +0 -115
  546. package/dist/commands/sources/history.js +0 -196
  547. package/dist/commands/tasks/default-tasks.js +0 -186
  548. package/dist/commands/wiki-cli.js +0 -292
  549. package/dist/core/asset/asset-registry.js +0 -76
  550. package/dist/core/asset/asset-spec.js +0 -316
  551. package/dist/core/config/config-migration.js +0 -602
  552. package/dist/core/deep-merge.js +0 -38
  553. package/dist/core/eval/rank-metrics.js +0 -113
  554. package/dist/core/ripgrep/install.js +0 -163
  555. package/dist/core/ripgrep/resolve.js +0 -81
  556. package/dist/indexer/db/db.js +0 -1414
  557. package/dist/indexer/manifest.js +0 -170
  558. package/dist/indexer/passes/metadata-contributors.js +0 -31
  559. package/dist/indexer/usage/unmigrated-vaults-guard.js +0 -94
  560. package/dist/integrations/harnesses/opencode-sdk/index.js +0 -25
  561. package/dist/llm/call-ai.js +0 -62
  562. package/dist/llm/memory-infer-impl.js +0 -138
  563. package/dist/output/shapes/distill.js +0 -14
  564. package/dist/output/shapes/history.js +0 -11
  565. package/dist/output/text/distill.js +0 -6
  566. package/dist/output/text/enable-disable.js +0 -8
  567. package/dist/output/text/history.js +0 -6
  568. package/dist/output/text/wiki.js +0 -16
  569. package/dist/registry/build-index.js +0 -386
  570. package/dist/schemas/akm-config.json +0 -14225
  571. package/dist/scripts/migrate-storage.js +0 -13169
  572. package/dist/scripts/migrations/import-fs-improve-runs-to-db.js +0 -10169
  573. package/dist/scripts/migrations/v16-to-v17.js +0 -141
  574. package/dist/setup/legacy-config.js +0 -106
  575. package/dist/storage/repositories/consolidation-repository.js +0 -38
  576. package/dist/storage/repositories/recombine-repository.js +0 -213
  577. package/dist/wiki/wiki-templates.js +0 -15
  578. package/dist/wiki/wiki.js +0 -1012
  579. package/dist/workflows/authoring/workflow-program-template.yaml +0 -31
  580. package/dist/workflows/db.js +0 -350
  581. package/dist/workflows/exec/watch.js +0 -116
  582. package/dist/workflows/program/parser.js +0 -760
  583. package/dist/workflows/program/project.js +0 -105
  584. package/docs/data-and-telemetry.md +0 -227
  585. package/docs/migration/release-notes/0.9.0-beta.60.md +0 -19
  586. /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/registry.js +0 -0
  587. /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/youtube.js +0 -0
@@ -5,6 +5,7 @@ import fs from "node:fs";
5
5
  import os from "node:os";
6
6
  import path from "node:path";
7
7
  import { extractInlineRefMentions } from "../../session-logs/inline-refs.js";
8
+ import { AbstractSessionLogProvider } from "../../session-logs/provider-base.js";
8
9
  /**
9
10
  * Root directory holding Claude Code's per-project JSONL session logs.
10
11
  *
@@ -100,22 +101,12 @@ function parseClaudeEvent(entry, sessionId, filePath, fallbackTsMs) {
100
101
  * (`getHarness`), and the `--type` flag accepts both, so the canonical id and
101
102
  * the persisted runtime string coexist without drift.
102
103
  */
103
- export class ClaudeCodeProvider {
104
+ export class ClaudeCodeProvider extends AbstractSessionLogProvider {
104
105
  // Runtime identity (NOT the canonical id) — see class doc. Equals
105
106
  // HARNESS_BY_ID.get("claude").runtimeId.
106
107
  name = "claude-code";
107
- isAvailable() {
108
- return fs.existsSync(claudeProjectsDir());
109
- }
110
- /**
111
- * Directory holding Claude Code's per-project session JSONL files
112
- * (`~/.claude/projects`, honoring `AKM_CLAUDE_PROJECTS_DIR`). Returns `[]`
113
- * when the directory does not exist on this machine. See {@link
114
- * SessionLogHarness.watchRoots}.
115
- */
116
- watchRoots() {
117
- const dir = claudeProjectsDir();
118
- return fs.existsSync(dir) ? [dir] : [];
108
+ availabilityRoot() {
109
+ return claudeProjectsDir();
119
110
  }
120
111
  *readEvents(input) {
121
112
  try {
@@ -124,25 +115,13 @@ export class ClaudeCodeProvider {
124
115
  if (stat.mtimeMs < input.sinceMs)
125
116
  continue;
126
117
  const lines = fs.readFileSync(jsonlPath, "utf8").split("\n").filter(Boolean);
127
- for (const line of lines) {
128
- try {
129
- const entry = JSON.parse(line);
130
- const text = entry?.message?.content ?? entry?.content ?? "";
131
- if (typeof text !== "string" || text.length < 10)
132
- continue;
133
- yield {
134
- harness: this.name,
135
- text,
136
- ts: typeof entry?.timestamp === "number" ? entry.timestamp : stat.mtimeMs,
137
- sessionId: typeof entry?.session_id === "string" ? entry.session_id : undefined,
138
- role: typeof entry?.role === "string" ? entry.role : "unknown",
139
- filePath: jsonlPath,
140
- };
141
- }
142
- catch {
143
- // skip malformed lines
144
- }
145
- }
118
+ yield* this.logLineEvents({
119
+ lines,
120
+ filePath: jsonlPath,
121
+ fallbackTsMs: stat.mtimeMs,
122
+ selectText: (entry) => entry?.message?.content ?? entry?.content ?? "",
123
+ selectSessionId: (entry) => entry?.session_id,
124
+ });
146
125
  }
147
126
  }
148
127
  catch {
@@ -151,39 +130,23 @@ export class ClaudeCodeProvider {
151
130
  }
152
131
  listSessions(input = {}) {
153
132
  const root = input.location ?? claudeProjectsDir();
154
- const sinceMs = input.sinceMs ?? 0;
155
- const summaries = [];
156
- try {
157
- for (const jsonlPath of this.#walkJsonl(root)) {
158
- let stat;
159
- try {
160
- stat = fs.statSync(jsonlPath);
161
- }
162
- catch {
163
- continue;
164
- }
165
- if (stat.mtimeMs < sinceMs)
166
- continue;
167
- const sessionId = path.basename(jsonlPath, ".jsonl");
168
- const projectHint = path.basename(path.dirname(jsonlPath));
133
+ return this.listSessionsFromFiles({
134
+ sinceMs: input.sinceMs ?? 0,
135
+ enumerate: () => this.#walkJsonl(root),
136
+ summarize: (jsonlPath, stat) => {
169
137
  // Peek first + last non-empty line to derive start/end timestamps and
170
138
  // title. Reading the whole file would be wasteful for listing.
171
139
  const peek = this.#peekJsonl(jsonlPath);
172
- summaries.push({
173
- harness: this.name,
174
- sessionId,
140
+ return this.sessionRef({
141
+ sessionId: path.basename(jsonlPath, ".jsonl"),
175
142
  filePath: jsonlPath,
176
143
  startedAt: peek.firstTsMs ?? stat.ctimeMs,
177
144
  endedAt: peek.lastTsMs ?? stat.mtimeMs,
178
- projectHint,
179
- ...(peek.title ? { title: peek.title } : {}),
145
+ projectHint: path.basename(path.dirname(jsonlPath)),
146
+ title: peek.title,
180
147
  });
181
- }
182
- }
183
- catch {
184
- // Root missing or unreadable — return what we have.
185
- }
186
- return summaries.sort((a, b) => (b.endedAt ?? 0) - (a.endedAt ?? 0));
148
+ },
149
+ });
187
150
  }
188
151
  readSession(ref) {
189
152
  const stat = fs.statSync(ref.filePath);
@@ -220,15 +183,14 @@ export class ClaudeCodeProvider {
220
183
  inlineRefs.push(...extractInlineRefMentions(parsed.text, parsed.ts));
221
184
  }
222
185
  return {
223
- ref: {
224
- harness: this.name,
186
+ ref: this.sessionRef({
225
187
  sessionId: ref.sessionId,
226
188
  filePath: ref.filePath,
227
189
  startedAt: firstTsMs ?? stat.ctimeMs,
228
190
  endedAt: lastTsMs ?? stat.mtimeMs,
229
191
  projectHint,
230
- ...(title ? { title } : {}),
231
- },
192
+ title,
193
+ }),
232
194
  events,
233
195
  inlineRefs,
234
196
  };
@@ -302,18 +264,8 @@ export class ClaudeCodeProvider {
302
264
  }
303
265
  return result;
304
266
  }
305
- *#walkJsonl(dir) {
306
- try {
307
- for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
308
- const full = path.join(dir, entry.name);
309
- if (entry.isDirectory())
310
- yield* this.#walkJsonl(full);
311
- else if (entry.name.endsWith(".jsonl") && entry.name !== "journal.jsonl")
312
- yield full;
313
- }
314
- }
315
- catch {
316
- // permission errors etc.
317
- }
267
+ /** Session JSONL files under `dir`, excluding the shared journal file. */
268
+ #walkJsonl(dir) {
269
+ return this.walkFiles(dir, (name) => name.endsWith(".jsonl") && name !== "journal.jsonl");
318
270
  }
319
271
  }
@@ -46,14 +46,16 @@
46
46
  * `-c model_reasoning_effort=<v>` — left to the integration task so the
47
47
  * shared request contract's "no builder consumes it yet" note stays true).
48
48
  *
49
- * NOT registered anywhere yet: `HARNESS_REGISTRY` / `BUILTIN_BUILDERS` wiring
50
- * is a follow-up integration task. Exported cleanly for that task to import.
49
+ * Registered: `codexBuilder` is `CodexHarness.agentBuilder` (`./index.ts`),
50
+ * one of the ten harnesses `HARNESS_REGISTRY` constructs
51
+ * (`harnesses/index.ts`); `agent/builders.ts` derives `BUILTIN_BUILDERS` from
52
+ * that registry, so this builder is reachable under the `"codex"` platform
53
+ * name without any further wiring.
51
54
  */
52
55
  import { mkdtempSync, writeFileSync } from "node:fs";
53
56
  import { tmpdir } from "node:os";
54
57
  import { join } from "node:path";
55
- import { assertNotFlag } from "../../agent/builder-shared.js";
56
- import { resolveModel } from "../../agent/model-aliases.js";
58
+ import { assertNotFlag, resolveDispatchModel } from "../../agent/builder-shared.js";
57
59
  /**
58
60
  * Write a node's JSON Schema to a fresh temp file for `--output-schema`.
59
61
  *
@@ -69,8 +71,7 @@ export function writeCodexOutputSchemaFile(schema) {
69
71
  }
70
72
  /**
71
73
  * Argv prefix that resumes a previous codex session: `exec resume <id>`.
72
- * Codex resume is a subcommand chain, not a flag — kept here so the flag-shaped
73
- * `HarnessResumeSupport` seam is not force-fitted. The harness-native session
74
+ * Codex resume is a subcommand chain, not a flag. The harness-native session
74
75
  * id comes from the unit row (stored opportunistically by the result
75
76
  * extractor); akm never depends on it (plan §"Session, MCP, and identity").
76
77
  */
@@ -119,7 +120,7 @@ export const codexBuilder = {
119
120
  const sandboxArgs = ensureSandboxFlags(extra);
120
121
  const args = ["exec", ...sandboxArgs];
121
122
  if (req.model) {
122
- const resolved = resolveModel(req.model, "codex", profile.modelAliases, profile.globalModelAliases);
123
+ const resolved = resolveDispatchModel(req, profile, "codex");
123
124
  args.push("--model", resolved);
124
125
  }
125
126
  // JSONL event stream on stdout — the codex result extractor's input.
@@ -12,22 +12,12 @@
12
12
  * `HARNESS_REGISTRY` registers. Dispatch-only: no native session-log reader or
13
13
  * config importer yet.
14
14
  */
15
+ import { caps } from "../shared.js";
15
16
  import { BaseHarness } from "../types.js";
16
17
  import { codexBuilder } from "./agent-builder.js";
17
18
  import { codexResultExtractor } from "./result-extractor.js";
18
19
  export { codexBuilder, codexResumeArgs, writeCodexOutputSchemaFile } from "./agent-builder.js";
19
20
  export { codexResultExtractor } from "./result-extractor.js";
20
- function caps(c) {
21
- return {
22
- sessionLogs: false,
23
- agentDispatch: false,
24
- detection: false,
25
- configImport: false,
26
- runtimeIdentity: false,
27
- v1Migration: false,
28
- ...c,
29
- };
30
- }
31
21
  /**
32
22
  * OpenAI Codex CLI.
33
23
  *
@@ -45,8 +35,7 @@ export class CodexHarness extends BaseHarness {
45
35
  // `--output-schema <file>` enforces a caller-supplied JSON schema natively.
46
36
  structuredOutput = "native-schema";
47
37
  // No flag-shaped resume: codex resume is the `exec resume <id>` SUBCOMMAND
48
- // chain (see `codexResumeArgs` in ./agent-builder.ts), which the flag-shaped
49
- // `HarnessResumeSupport` seam deliberately does not force-fit.
38
+ // chain (see `codexResumeArgs` in ./agent-builder.ts).
50
39
  // Presence flag: CODEX_SANDBOX is stamped only on processes codex itself
51
40
  // spawns inside its sandbox, so it genuinely means "running under codex" —
52
41
  // but its VALUE (e.g. "seatbelt") is a sandbox mode, not a session id, so it
@@ -12,9 +12,8 @@
12
12
  * copilot -p "<prompt>" --allow-all-tools
13
13
  *
14
14
  * with `--output-format json` for structured output, `--model <m>` for model
15
- * selection, and `--resume <id>` for resume (resume is registry-side —
16
- * `AkmHarness.resume` — not built here because `AgentDispatchRequest` carries
17
- * no session id).
15
+ * selection, and `--resume <id>` for resume (not built here because
16
+ * `AgentDispatchRequest` carries no session id).
18
17
  *
19
18
  * Platform-specific mapping decisions (all localized here, per the adapter
20
19
  * contract):
@@ -40,12 +39,13 @@
40
39
  * programmatic mode Copilot then denies unapproved tool calls, which is the
41
40
  * conservative failure mode.
42
41
  *
43
- * NOT registered anywhere: `builders.ts` / `harnesses/index.ts` wiring is a
44
- * follow-up integration task. Exported standalone so that task only adds a
45
- * registry entry.
42
+ * Registered: `copilotBuilder` is `CopilotHarness.agentBuilder`
43
+ * (`./index.ts`), one of the ten harnesses `HARNESS_REGISTRY` constructs
44
+ * (`harnesses/index.ts`); `agent/builders.ts` derives `BUILTIN_BUILDERS` from
45
+ * that registry, so this builder is reachable under the `"copilot"` platform
46
+ * name without any further wiring.
46
47
  */
47
- import { assertNotFlag } from "../../agent/builder-shared.js";
48
- import { resolveModel } from "../../agent/model-aliases.js";
48
+ import { assertNotFlag, resolveDispatchModel, } from "../../agent/builder-shared.js";
49
49
  /** Canonical harness/platform id used for model-alias resolution. */
50
50
  export const COPILOT_PLATFORM = "copilot";
51
51
  /**
@@ -94,7 +94,7 @@ export const copilotBuilder = {
94
94
  assertNotFlag(req.model, "model");
95
95
  const args = [...profile.args];
96
96
  if (req.model) {
97
- const resolved = resolveModel(req.model, COPILOT_PLATFORM, profile.modelAliases, profile.globalModelAliases);
97
+ const resolved = resolveDispatchModel(req, profile, COPILOT_PLATFORM);
98
98
  args.push("--model", resolved);
99
99
  }
100
100
  if (req.tools) {
@@ -13,22 +13,12 @@
13
13
  * (`copilot -p …`); the cloud "Copilot coding agent" is the plan's
14
14
  * cloud-delegate pattern and is a separate, future descriptor.
15
15
  */
16
+ import { caps } from "../shared.js";
16
17
  import { BaseHarness } from "../types.js";
17
18
  import { copilotBuilder } from "./agent-builder.js";
18
19
  import { copilotResultExtractor } from "./result-extractor.js";
19
20
  export { COPILOT_PLATFORM, copilotBuilder } from "./agent-builder.js";
20
21
  export { copilotResultExtractor } from "./result-extractor.js";
21
- function caps(c) {
22
- return {
23
- sessionLogs: false,
24
- agentDispatch: false,
25
- detection: false,
26
- configImport: false,
27
- runtimeIdentity: false,
28
- v1Migration: false,
29
- ...c,
30
- };
31
- }
32
22
  /**
33
23
  * GitHub Copilot CLI (local headless CLI, not the cloud coding agent).
34
24
  *
@@ -46,8 +36,6 @@ export class CopilotHarness extends BaseHarness {
46
36
  // `--output-format json` emits a documented JSON envelope akm parses, then
47
37
  // validates against the node schema ⇒ native-json tier.
48
38
  structuredOutput = "native-json";
49
- // `copilot --resume <sessionId>` replays a previous session.
50
- resume = { flag: "--resume", takesSessionId: true };
51
39
  // Session-id env marker only. The matrix's other candidates (GH_TOKEN,
52
40
  // bare COPILOT_* presence vars) are credential/presence flags that would
53
41
  // stamp identity onto manual runs, so they are deliberately NOT registered
@@ -12,9 +12,7 @@
12
12
  * gemini -p "<prompt>"
13
13
  *
14
14
  * with `--output-format json` for structured output, `--model <m>` for model
15
- * selection, and `--resume <id>` for resume. Resume is registry-side
16
- * (`AkmHarness.resume` — Gemini's resume IS flag-shaped, so the shared
17
- * `HarnessResumeSupport` seam covers it); it is not built here because
15
+ * selection, and `--resume <id>` for resume; resume is not built here because
18
16
  * `AgentDispatchRequest` carries no session id. The `GEMINI_CLI=1` identity
19
17
  * env marker is likewise registry-side (`AkmHarness.identityEnv` /
20
18
  * `agent-identity.ts`), not a builder concern.
@@ -45,12 +43,13 @@
45
43
  * `gemini -p "<p>"`; autonomy flags (`--yolo`, `--approval-mode`) belong in
46
44
  * `profile.args` where the operator opts in explicitly.
47
45
  *
48
- * NOT registered anywhere: `builders.ts` / `harnesses/index.ts` wiring is a
49
- * follow-up integration task. Exported standalone so that task only adds a
50
- * registry entry.
46
+ * Registered: `geminiBuilder` is `GeminiHarness.agentBuilder` (`./index.ts`),
47
+ * one of the ten harnesses `HARNESS_REGISTRY` constructs
48
+ * (`harnesses/index.ts`); `agent/builders.ts` derives `BUILTIN_BUILDERS` from
49
+ * that registry, so this builder is reachable under the `"gemini"` platform
50
+ * name without any further wiring.
51
51
  */
52
- import { assertNotFlag } from "../../agent/builder-shared.js";
53
- import { resolveModel } from "../../agent/model-aliases.js";
52
+ import { assertNotFlag, resolveDispatchModel, } from "../../agent/builder-shared.js";
54
53
  /** Canonical harness/platform id used for model-alias resolution. */
55
54
  export const GEMINI_PLATFORM = "gemini";
56
55
  /**
@@ -99,7 +98,7 @@ export const geminiBuilder = {
99
98
  assertNotFlag(req.model, "model");
100
99
  const args = [...profile.args];
101
100
  if (req.model) {
102
- const resolved = resolveModel(req.model, GEMINI_PLATFORM, profile.modelAliases, profile.globalModelAliases);
101
+ const resolved = resolveDispatchModel(req, profile, GEMINI_PLATFORM);
103
102
  args.push("--model", resolved);
104
103
  }
105
104
  if (req.tools) {
@@ -12,22 +12,12 @@
12
12
  * that `HARNESS_REGISTRY` registers. Dispatch-only: no native session-log
13
13
  * reader or config importer yet.
14
14
  */
15
+ import { caps } from "../shared.js";
15
16
  import { BaseHarness } from "../types.js";
16
17
  import { geminiBuilder } from "./agent-builder.js";
17
18
  import { geminiResultExtractor } from "./result-extractor.js";
18
19
  export { GEMINI_PLATFORM, geminiBuilder } from "./agent-builder.js";
19
20
  export { geminiResultExtractor } from "./result-extractor.js";
20
- function caps(c) {
21
- return {
22
- sessionLogs: false,
23
- agentDispatch: false,
24
- detection: false,
25
- configImport: false,
26
- runtimeIdentity: false,
27
- v1Migration: false,
28
- ...c,
29
- };
30
- }
31
21
  /**
32
22
  * Gemini CLI.
33
23
  *
@@ -45,8 +35,6 @@ export class GeminiHarness extends BaseHarness {
45
35
  // `--output-format json` emits a documented JSON envelope akm parses, then
46
36
  // validates against the node schema ⇒ native-json tier.
47
37
  structuredOutput = "native-json";
48
- // `gemini --resume <id>` replays a previous session.
49
- resume = { flag: "--resume", takesSessionId: true };
50
38
  // The matrix's identity marker: Gemini CLI stamps GEMINI_CLI=1 only on
51
39
  // processes it spawns, so it genuinely means "running under gemini" (it is
52
40
  // not a user-profile config var) — but its VALUE ("1") is a bare flag, not
@@ -0,0 +1,24 @@
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
+ export const HARNESS_ID_TABLE = [
5
+ { id: "opencode", agentDispatch: true },
6
+ { id: "claude", agentDispatch: true },
7
+ { id: "opencode-sdk", agentDispatch: true },
8
+ { id: "codex", agentDispatch: true },
9
+ { id: "copilot", agentDispatch: true },
10
+ { id: "pi", agentDispatch: true },
11
+ { id: "gemini", agentDispatch: true },
12
+ { id: "aider", agentDispatch: true },
13
+ { id: "amazonq", agentDispatch: true },
14
+ { id: "openhands", agentDispatch: true },
15
+ ];
16
+ /**
17
+ * Canonical, ordered list of valid harness / platform ids — the
18
+ * dependency-free counterpart of `./index.ts`'s `VALID_HARNESS_IDS` (which
19
+ * remains the barrel's own derivation for its own consumers). Both are
20
+ * asserted equal at `HARNESS_REGISTRY` construction time.
21
+ */
22
+ export const VALID_HARNESS_IDS = Object.freeze(HARNESS_ID_TABLE.map((h) => h.id));
23
+ /** Harness ids whose `capabilities.agentDispatch` is `true`. */
24
+ export const HARNESS_AGENT_DISPATCH_IDS = new Set(HARNESS_ID_TABLE.filter((h) => h.agentDispatch).map((h) => h.id));
@@ -12,10 +12,6 @@
12
12
  * This module is a dependency-graph LEAF: it imports nothing from
13
13
  * `core/config`. `core/config/config-types.ts` derives `VALID_HARNESS_IDS`
14
14
  * from here, which keeps the import direction acyclic (config ← harnesses).
15
- *
16
- * Implementations (session-log readers, agent profiles) are migrated under each
17
- * harness in #563/#564; this step only owns ids + capability membership and
18
- * wires the existing call sites to consult it (behaviour-preserving).
19
15
  */
20
16
  import { AiderHarness } from "./aider/index.js";
21
17
  import { AmazonqHarness } from "./amazonq/index.js";
@@ -23,6 +19,7 @@ import { ClaudeHarness } from "./claude/index.js";
23
19
  import { CodexHarness } from "./codex/index.js";
24
20
  import { CopilotHarness } from "./copilot/index.js";
25
21
  import { GeminiHarness } from "./gemini/index.js";
22
+ import { HARNESS_ID_TABLE } from "./ids.js";
26
23
  import { OpencodeHarness } from "./opencode/index.js";
27
24
  // Import the descriptor from its LEAF module, not the per-harness barrel: the
28
25
  // barrel re-exports `./sdk-runner` (which imports `core/config`, and
@@ -33,6 +30,8 @@ import { OpencodeHarness } from "./opencode/index.js";
33
30
  import { OpencodeSdkHarness } from "./opencode-sdk/harness.js";
34
31
  import { OpenhandsHarness } from "./openhands/index.js";
35
32
  import { PiHarness } from "./pi/index.js";
33
+ import { isSessionLogHarness } from "./types.js";
34
+ export { isSessionLogHarness } from "./types.js";
36
35
  // Each harness descriptor (ClaudeHarness, OpencodeHarness, OpencodeSdkHarness)
37
36
  // lives in its own per-harness directory alongside that harness's session-log
38
37
  // reader, agent builder, config importer, and/or SDK runner (#563/#564). They
@@ -48,9 +47,9 @@ import { PiHarness } from "./pi/index.js";
48
47
  // Order is significant: VALID_HARNESS_IDS derives from this array and feeds the
49
48
  // committed JSON-schema enum order. The original [opencode, claude,
50
49
  // opencode-sdk] prefix is preserved so the pre-unification portion of the
51
- // generated schema enum does not reorder (#562); the seven P2 harness adapters
52
- // (plan §"Capability matrix") are appended after it, which extends the enum
53
- // additively (schemas/akm-config.json is regenerated in lockstep).
50
+ // generated schema enum does not reorder; the seven P2 harness adapters are
51
+ // appended after it, which extends the enum additively (schemas/akm-config.json
52
+ // is regenerated in lockstep).
54
53
  export const HARNESS_REGISTRY = Object.freeze([
55
54
  new OpencodeHarness(),
56
55
  new ClaudeHarness(),
@@ -63,6 +62,23 @@ export const HARNESS_REGISTRY = Object.freeze([
63
62
  new AmazonqHarness(),
64
63
  new OpenhandsHarness(),
65
64
  ]);
65
+ // Construction-time drift guard (WI-9.8 KILL 3, D.3 edge B): ./ids.ts's
66
+ // HARNESS_ID_TABLE is config's dependency-free mirror of (id, agentDispatch)
67
+ // for every registered harness, kept out of core/config's import graph so
68
+ // config doesn't have to import this (heavier) barrel. Assert they match so
69
+ // the mirror can never silently drift — a new/reordered/recapability'd
70
+ // harness that forgets to update ./ids.ts fails loudly here instead of
71
+ // quietly breaking config's platform validation.
72
+ if (HARNESS_REGISTRY.length !== HARNESS_ID_TABLE.length) {
73
+ throw new Error(`harnesses/ids.ts HARNESS_ID_TABLE has ${HARNESS_ID_TABLE.length} entries but HARNESS_REGISTRY has ${HARNESS_REGISTRY.length} — update ids.ts to match.`);
74
+ }
75
+ HARNESS_REGISTRY.forEach((h, i) => {
76
+ const expected = HARNESS_ID_TABLE[i];
77
+ if (!expected || expected.id !== h.id || expected.agentDispatch !== h.capabilities.agentDispatch) {
78
+ throw new Error(`harnesses/ids.ts HARNESS_ID_TABLE[${i}] (${expected?.id ?? "<missing>"}, agentDispatch=${expected?.agentDispatch}) ` +
79
+ `does not match HARNESS_REGISTRY[${i}] (${h.id}, agentDispatch=${h.capabilities.agentDispatch}) — update ids.ts to match.`);
80
+ }
81
+ });
66
82
  /** Lookup by canonical id. */
67
83
  export const HARNESS_BY_ID = new Map(HARNESS_REGISTRY.map((h) => [h.id, h]));
68
84
  /**
@@ -82,12 +98,17 @@ const HARNESS_BY_ANY_ID = (() => {
82
98
  })();
83
99
  /**
84
100
  * Canonical, ordered list of valid harness / platform ids. The Zod
85
- * `AgentPlatformSchema` enum, the `AgentProfileConfig` platform union, and
101
+ * `AgentPlatformSchema` enum, the agent-engine platform union, and
86
102
  * setup's `DetectedHarness` union all derive from this so they cannot drift.
87
103
  */
88
104
  export const VALID_HARNESS_IDS = Object.freeze(HARNESS_REGISTRY.map((h) => h.id));
89
- /** Harnesses that expose readable native session logs. */
90
- export const SESSION_LOG_HARNESSES = HARNESS_REGISTRY.filter((h) => h.capabilities.sessionLogs);
105
+ /**
106
+ * Harnesses that expose readable native session logs. Narrowed via the
107
+ * {@link isSessionLogHarness} type-predicate (rather than a plain boolean
108
+ * callback) so `sessionLogProvider` is known-present on every element — see
109
+ * that function's doc comment for why a plain predicate doesn't narrow here.
110
+ */
111
+ export const SESSION_LOG_HARNESSES = HARNESS_REGISTRY.filter(isSessionLogHarness);
91
112
  /** Harnesses that can be dispatched as an agent CLI / SDK. */
92
113
  export const AGENT_DISPATCH_HARNESSES = HARNESS_REGISTRY.filter((h) => h.capabilities.agentDispatch);
93
114
  /** Harnesses that can import an existing harness config into akm. */
@@ -112,29 +133,6 @@ export function getHarness(id) {
112
133
  export function normalizeHarnessId(id) {
113
134
  return HARNESS_BY_ANY_ID.get(id)?.id ?? id;
114
135
  }
115
- /**
116
- * Resolve a legacy v1 agent-profile name to its v2 platform id (#566).
117
- *
118
- * v1 agent profiles never carried an explicit `platform`; it had to be inferred
119
- * from the profile name. This is the SINGLE registry-backed resolver that
120
- * replaces both the old standalone `guessAgentPlatform()` in config-migration
121
- * and the `name.includes("claude") ? "claude" : "opencode"` heuristic in setup.
122
- * Each harness owns its own `matchesV1ProfileName()`; an unknown name matches no
123
- * harness and returns `undefined`, so the caller drops it instead of silently
124
- * defaulting to `'opencode'`.
125
- *
126
- * Harnesses are consulted most-specific-id-first (longest id wins) so a
127
- * decorated name like `"opencode-sdk-fast"` resolves to `'opencode-sdk'` rather
128
- * than being over-matched by OpenCode's `"opencode"` prefix.
129
- */
130
- const V1_RESOLUTION_ORDER = [...HARNESS_REGISTRY].sort((a, b) => b.id.length - a.id.length);
131
- export function v1ProfilePlatform(name) {
132
- for (const h of V1_RESOLUTION_ORDER) {
133
- if (h.matchesV1ProfileName(name))
134
- return h.id;
135
- }
136
- return undefined;
137
- }
138
136
  /**
139
137
  * Default agent-profile name for a detected harness id (#566).
140
138
  *
@@ -14,8 +14,7 @@
14
14
  * pre-migration `opencodeBuilder`. The builder's `platform` stays `'opencode'`
15
15
  * (the canonical harness id).
16
16
  */
17
- import { assertNotFlag } from "../../agent/builder-shared.js";
18
- import { resolveModel } from "../../agent/model-aliases.js";
17
+ import { assertNotFlag, resolveDispatchModel } from "../../agent/builder-shared.js";
19
18
  /**
20
19
  * OpenCode builder.
21
20
  * Command shape: opencode run [--system-prompt "..."] [--model <m>] "<prompt>"
@@ -28,13 +27,32 @@ export const opencodeBuilder = {
28
27
  build(profile, req) {
29
28
  assertNotFlag(req.systemPrompt, "systemPrompt");
30
29
  assertNotFlag(req.model, "model");
31
- const args = [...profile.args]; // starts with ["run"]
30
+ let configuredModel;
31
+ const args = req.model ? [] : [...profile.args];
32
+ if (req.model) {
33
+ for (let index = 0; index < profile.args.length; index += 1) {
34
+ const arg = profile.args[index];
35
+ if (arg === undefined)
36
+ continue;
37
+ if (arg === "--model") {
38
+ configuredModel = profile.args[index + 1];
39
+ index += 1;
40
+ }
41
+ else if (arg.startsWith("--model=")) {
42
+ configuredModel = arg.slice("--model=".length);
43
+ }
44
+ else {
45
+ args.push(arg);
46
+ }
47
+ }
48
+ }
32
49
  if (req.systemPrompt) {
33
50
  args.push("--system-prompt", req.systemPrompt);
34
51
  }
35
52
  if (req.model) {
36
- const resolved = resolveModel(req.model, "opencode", profile.modelAliases, profile.globalModelAliases);
37
- args.push("--model", resolved);
53
+ const resolved = resolveDispatchModel(req, profile, "opencode");
54
+ const provider = configuredModel?.split("/", 1)[0];
55
+ args.push("--model", provider && !resolved.includes("/") ? `${provider}/${resolved}` : resolved);
38
56
  }
39
57
  args.push("--");
40
58
  args.push(req.prompt);
@@ -15,9 +15,7 @@
15
15
  */
16
16
  import fs from "node:fs";
17
17
  import path from "node:path";
18
- function homeDir() {
19
- return process.env.HOME ?? process.env.USERPROFILE ?? "";
20
- }
18
+ import { homeDir } from "../shared.js";
21
19
  /**
22
20
  * Imports LLM config from an OpenCode installation.
23
21
  *
@@ -1,23 +1,13 @@
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
+ import { caps } from "../shared.js";
4
5
  import { BaseHarness } from "../types.js";
5
6
  import { opencodeBuilder } from "./agent-builder.js";
6
7
  import { OpenCodeProvider } from "./session-log.js";
7
8
  export { opencodeBuilder } from "./agent-builder.js";
8
9
  export { openCodeImporter } from "./config-import.js";
9
10
  export { OpenCodeProvider } from "./session-log.js";
10
- function caps(c) {
11
- return {
12
- sessionLogs: false,
13
- agentDispatch: false,
14
- detection: false,
15
- configImport: false,
16
- runtimeIdentity: false,
17
- v1Migration: false,
18
- ...c,
19
- };
20
- }
21
11
  /**
22
12
  * OpenCode.
23
13
  *
@@ -30,10 +20,6 @@ export class OpencodeHarness extends BaseHarness {
30
20
  // Home-relative config dir scanned by `akm setup` (#567). OpenCode has a
31
21
  // session-log provider, so offering it as a stash source is functional.
32
22
  setupDetectionDir = ".config/opencode";
33
- // Decorated v1 profile names like "opencode-fast" still belong to OpenCode.
34
- // `v1ProfilePlatform()` resolves most-specific-id-first, so "opencode-sdk-*"
35
- // is claimed by OpencodeSdkHarness before this prefix can over-match it.
36
- v1ProfilePrefixes = ["opencode"];
37
23
  agentBuilder = opencodeBuilder;
38
24
  // ── Workflow-engine descriptor (plan §"Capability matrix", P2) ────────────
39
25
  // This entry is the CLI spawn path (`opencode run …`): akm launches the
@@ -44,8 +30,6 @@ export class OpencodeHarness extends BaseHarness {
44
30
  // engine uses the prompt-injected schema + embedded-JSON extraction tier
45
31
  // (the matrix's "via prompt+validate"). The SDK entry is native-json.
46
32
  structuredOutput = "none";
47
- // `opencode run --session <id>` continues a previous session.
48
- resume = { flag: "--session", takesSessionId: true };
49
33
  // Session-id env marker for run attribution.
50
34
  identityEnv = ["OPENCODE_SESSION_ID"];
51
35
  sessionLogProvider = () => new OpenCodeProvider();
@@ -55,6 +39,5 @@ export class OpencodeHarness extends BaseHarness {
55
39
  detection: true,
56
40
  configImport: true,
57
41
  runtimeIdentity: true,
58
- v1Migration: true,
59
42
  });
60
43
  }