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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (598) hide show
  1. package/CHANGELOG.md +1283 -22
  2. package/README.md +62 -37
  3. package/SECURITY.md +46 -31
  4. package/dist/akm +162 -38
  5. package/dist/akm-migrate +44 -0
  6. package/dist/assets/backends/schtasks-template.xml +2 -1
  7. package/dist/assets/hints/cli-hints-full.md +268 -118
  8. package/dist/assets/hints/cli-hints-short.md +87 -24
  9. package/dist/assets/{profiles → improve-strategies}/catchup.json +3 -1
  10. package/dist/assets/{profiles → improve-strategies}/consolidate.json +3 -1
  11. package/dist/assets/{profiles → improve-strategies}/default.json +6 -7
  12. package/dist/assets/improve-strategies/frequent.json +15 -0
  13. package/dist/assets/{profiles → improve-strategies}/graph-refresh.json +4 -2
  14. package/dist/assets/{profiles → improve-strategies}/memory-focus.json +4 -1
  15. package/dist/assets/{profiles → improve-strategies}/proactive-maintenance.json +5 -5
  16. package/dist/assets/{profiles → improve-strategies}/quick.json +4 -2
  17. package/dist/assets/improve-strategies/reflect-distill.json +30 -0
  18. package/dist/assets/{profiles → improve-strategies}/thorough.json +1 -1
  19. package/dist/assets/prompts/consolidate-system.md +5 -5
  20. package/dist/assets/prompts/extract-session.md +2 -6
  21. package/dist/assets/prompts/memory-infer-user.md +2 -3
  22. package/dist/assets/prompts/reflect-llm-framed-contract.md +11 -0
  23. package/dist/assets/prompts/reflect-llm-schema-contract.md +3 -0
  24. package/dist/assets/prompts/reflect-output-repair.md +3 -0
  25. package/dist/assets/prompts/workflow-unit-preamble.md +26 -0
  26. package/dist/assets/stash-skeleton/README.md +38 -10
  27. package/dist/assets/stash-skeleton/facts/conventions/assets/agent.md +8 -0
  28. package/dist/assets/stash-skeleton/facts/conventions/assets/command.md +8 -0
  29. package/dist/assets/stash-skeleton/facts/conventions/assets/fact.md +14 -1
  30. package/dist/assets/stash-skeleton/facts/conventions/assets/knowledge.md +13 -1
  31. package/dist/assets/stash-skeleton/facts/conventions/assets/lesson.md +9 -1
  32. package/dist/assets/stash-skeleton/facts/conventions/assets/memory.md +11 -0
  33. package/dist/assets/stash-skeleton/facts/conventions/assets/script.md +9 -0
  34. package/dist/assets/stash-skeleton/facts/conventions/assets/skill.md +9 -0
  35. package/dist/assets/stash-skeleton/facts/conventions/assets/workflow.md +8 -0
  36. package/dist/assets/stash-skeleton/facts/conventions/backlinks.md +100 -0
  37. package/dist/assets/stash-skeleton/facts/conventions/domains.md +64 -0
  38. package/dist/assets/stash-skeleton/facts/conventions/organization.md +136 -0
  39. package/dist/assets/tasks/core/extract.yml +3 -2
  40. package/dist/assets/tasks/core/improve.yml +2 -1
  41. package/dist/assets/tasks/core/index-refresh.yml +1 -0
  42. package/dist/assets/tasks/core/sync.yml +1 -0
  43. package/dist/assets/tasks/core/version-check.yml +2 -1
  44. package/dist/assets/tasks/improve/akm-graph-refresh-weekly.yml +5 -0
  45. package/dist/assets/tasks/improve/akm-improve-catchup.yml +8 -0
  46. package/dist/assets/tasks/improve/akm-improve-consolidate.yml +5 -0
  47. package/dist/assets/tasks/improve/akm-improve-frequent.yml +5 -0
  48. package/dist/assets/tasks/improve/akm-improve-nightly.yml +5 -0
  49. package/dist/assets/templates/html/health.html +5 -4
  50. package/dist/assets/workflows/workflow-template.md +31 -15
  51. package/dist/cli/invocation.js +279 -0
  52. package/dist/cli/parse-args.js +5 -90
  53. package/dist/cli/retired-commands.js +78 -0
  54. package/dist/cli/shared.js +158 -48
  55. package/dist/cli-node.mjs +2 -1
  56. package/dist/cli.js +747 -293
  57. package/dist/commands/agent/agent-dispatch.js +19 -18
  58. package/dist/commands/agent/agent-support.js +0 -24
  59. package/dist/commands/agent/contribute-cli.js +43 -97
  60. package/dist/commands/completions.js +80 -23
  61. package/dist/commands/config-cli.js +44 -281
  62. package/dist/commands/env/env-binding.js +99 -0
  63. package/dist/commands/env/env-cli.js +84 -224
  64. package/dist/commands/env/env.js +12 -163
  65. package/dist/commands/env/marker-path.js +6 -0
  66. package/dist/commands/env/secret-cli.js +45 -61
  67. package/dist/commands/env/secret.js +32 -62
  68. package/dist/commands/feedback-cli.js +179 -85
  69. package/dist/commands/health/accept-rate.js +58 -0
  70. package/dist/commands/health/advisories.js +7 -8
  71. package/dist/commands/health/checks.js +279 -94
  72. package/dist/commands/health/html-report.js +197 -578
  73. package/dist/commands/health/improve-metrics.js +277 -246
  74. package/dist/commands/health/llm-usage.js +19 -19
  75. package/dist/commands/health/md-report.js +16 -7
  76. package/dist/commands/health/metrics.js +67 -32
  77. package/dist/commands/health/renderers.js +47 -0
  78. package/dist/commands/health/report-view-model.js +508 -0
  79. package/dist/commands/health/stash-exposure.js +1 -1
  80. package/dist/commands/health/surfaces.js +16 -56
  81. package/dist/commands/health/task-runs.js +3 -67
  82. package/dist/{migrate-storage-node.mjs → commands/health/types-checks.js} +1 -5
  83. package/dist/commands/health/types-improve.js +29 -0
  84. package/dist/{output/text/save.js → commands/health/types-metrics.js} +1 -2
  85. package/dist/commands/health/types-result.js +7 -0
  86. package/dist/commands/health/types-runs.js +4 -0
  87. package/dist/commands/health/types-session-log.js +4 -0
  88. package/dist/commands/health/types-windows.js +4 -0
  89. package/dist/commands/health/types.js +26 -21
  90. package/dist/commands/health/windows.js +2 -3
  91. package/dist/commands/health.js +296 -167
  92. package/dist/commands/improve/anti-collapse.js +5 -5
  93. package/dist/commands/improve/autonomy-gate.js +68 -0
  94. package/dist/commands/improve/collapse-detector.js +65 -52
  95. package/dist/commands/improve/consolidate/chunking.js +9 -7
  96. package/dist/commands/improve/consolidate/eligibility.js +1 -23
  97. package/dist/commands/improve/consolidate/merge.js +4 -0
  98. package/dist/commands/improve/consolidate.js +454 -1354
  99. package/dist/commands/improve/content-hash.js +39 -0
  100. package/dist/commands/improve/distill/content-repair.js +4 -10
  101. package/dist/commands/improve/distill/promote-memory.js +89 -64
  102. package/dist/commands/improve/distill/quality-gate.js +118 -42
  103. package/dist/commands/improve/distill-guards.js +1 -1
  104. package/dist/commands/improve/distill-promotion-policy.js +33 -888
  105. package/dist/commands/improve/distill.js +607 -363
  106. package/dist/commands/improve/eligibility.js +165 -79
  107. package/dist/commands/improve/extract-cli.js +35 -126
  108. package/dist/commands/improve/extract-prompt.js +6 -35
  109. package/dist/commands/improve/extract.js +640 -391
  110. package/dist/commands/improve/feedback-valence.js +2 -12
  111. package/dist/commands/improve/improve-cli.js +134 -135
  112. package/dist/commands/improve/improve-result-file.js +30 -50
  113. package/dist/commands/improve/improve-run-types.js +4 -0
  114. package/dist/commands/improve/improve-strategies.js +135 -0
  115. package/dist/commands/improve/improve.js +904 -701
  116. package/dist/commands/improve/locks.js +64 -111
  117. package/dist/commands/improve/loop-stages.js +1110 -923
  118. package/dist/commands/improve/memory/derived-ref.js +124 -0
  119. package/dist/commands/improve/memory/memory-belief.js +79 -7
  120. package/dist/commands/improve/memory/memory-contradiction-detect.js +49 -52
  121. package/dist/commands/improve/memory/memory-improve.js +25 -37
  122. package/dist/commands/improve/outcome-loop.js +25 -88
  123. package/dist/commands/improve/preparation.js +1034 -813
  124. package/dist/commands/improve/proactive-maintenance.js +34 -9
  125. package/dist/commands/improve/proposal-envelope.js +31 -0
  126. package/dist/commands/improve/reflect.js +983 -794
  127. package/dist/commands/improve/run-context.js +119 -0
  128. package/dist/commands/improve/salience.js +24 -127
  129. package/dist/commands/improve/session-asset.js +7 -3
  130. package/dist/commands/improve/shared.js +14 -34
  131. package/dist/commands/improve/source-identity.js +28 -0
  132. package/dist/commands/improve/triage.js +20 -17
  133. package/dist/commands/lint/base-linter.js +340 -313
  134. package/dist/commands/lint/env-key-rules.js +31 -47
  135. package/dist/commands/lint/index.js +185 -30
  136. package/dist/commands/{events.js → log.js} +28 -38
  137. package/dist/commands/migrate-cli.js +54 -0
  138. package/dist/commands/migration-tool.js +55 -0
  139. package/dist/commands/observability-cli.js +70 -208
  140. package/dist/commands/proposal/diff-format.js +50 -0
  141. package/dist/commands/proposal/drain-policies.js +0 -6
  142. package/dist/commands/proposal/drain.js +91 -40
  143. package/dist/commands/proposal/proposal-cli.js +134 -132
  144. package/dist/commands/proposal/proposal-types.js +56 -0
  145. package/dist/commands/proposal/proposal.js +83 -65
  146. package/dist/commands/proposal/propose-cli.js +88 -0
  147. package/dist/commands/proposal/propose.js +105 -88
  148. package/dist/commands/proposal/repository.js +1303 -278
  149. package/dist/commands/proposal/validators/proposal-quality-validators.js +16 -6
  150. package/dist/commands/proposal/validators/proposal-validators.js +61 -12
  151. package/dist/commands/proposal/validators/proposals.js +6 -8
  152. package/dist/commands/read/curate.js +78 -73
  153. package/dist/commands/read/knowledge.js +510 -13
  154. package/dist/commands/read/registry-search.js +2 -2
  155. package/dist/commands/read/remember-cli.js +84 -15
  156. package/dist/commands/read/search-cli.js +203 -96
  157. package/dist/commands/read/search.js +126 -94
  158. package/dist/commands/read/show.js +226 -250
  159. package/dist/commands/registry-cli.js +34 -60
  160. package/dist/commands/remember.js +18 -57
  161. package/dist/commands/sources/add-cli.js +104 -49
  162. package/dist/commands/sources/bundle-cli.js +166 -0
  163. package/dist/commands/sources/bundle-config-ops.js +63 -0
  164. package/dist/commands/sources/info.js +27 -15
  165. package/dist/commands/sources/init.js +30 -40
  166. package/dist/commands/sources/installed-stashes.js +469 -172
  167. package/dist/commands/sources/migration-help.js +7 -4
  168. package/dist/commands/sources/schema-repair.js +10 -9
  169. package/dist/commands/sources/self-update.js +182 -121
  170. package/dist/commands/sources/source-add.js +169 -178
  171. package/dist/commands/sources/source-clone.js +144 -41
  172. package/dist/commands/sources/source-manage.js +94 -59
  173. package/dist/commands/sources/sources-cli.js +64 -205
  174. package/dist/commands/sources/stash-cli.js +91 -54
  175. package/dist/commands/sources/stash-skeleton.js +1 -1
  176. package/dist/commands/tasks/tasks-cli.js +106 -104
  177. package/dist/commands/tasks/tasks.js +445 -262
  178. package/dist/commands/workflow-cli.js +232 -121
  179. package/dist/core/action-contributors.js +1 -1
  180. package/dist/core/activation-policy.js +49 -0
  181. package/dist/core/adapter/adapters/agent-skills-adapter.js +181 -0
  182. package/dist/core/adapter/adapters/akm-adapter.js +528 -0
  183. package/dist/core/adapter/adapters/akm-lint.js +392 -0
  184. package/dist/core/adapter/adapters/akm-metadata.js +387 -0
  185. package/dist/core/adapter/adapters/akm-task-adapter.js +149 -0
  186. package/dist/core/adapter/adapters/akm-workflow-adapter.js +180 -0
  187. package/dist/core/adapter/adapters/claude-adapter.js +61 -0
  188. package/dist/core/adapter/adapters/dotenv-adapter.js +187 -0
  189. package/dist/core/adapter/adapters/generic-files-adapter.js +119 -0
  190. package/dist/core/adapter/adapters/index.js +80 -0
  191. package/dist/core/adapter/adapters/llm-wiki-adapter.js +419 -0
  192. package/dist/core/adapter/adapters/okf-adapter.js +391 -0
  193. package/dist/core/adapter/adapters/opencode-adapter.js +68 -0
  194. package/dist/core/adapter/adapters/shared.js +286 -0
  195. package/dist/core/adapter/adapters/tool-dir-shared.js +217 -0
  196. package/dist/core/adapter/adapters/website-snapshot-adapter.js +155 -0
  197. package/dist/core/adapter/bundle-adapter.js +4 -0
  198. package/dist/core/adapter/detect-adapter.js +17 -0
  199. package/dist/core/adapter/recognize-match.js +44 -0
  200. package/dist/core/adapter/registry.js +56 -0
  201. package/dist/core/adapter/types.js +4 -0
  202. package/dist/core/asset/akm-markdown.js +30 -0
  203. package/dist/core/asset/asset-placement.js +243 -0
  204. package/dist/core/asset/asset-ref.js +110 -79
  205. package/dist/core/asset/asset-serialize.js +20 -0
  206. package/dist/core/asset/frontmatter.js +28 -12
  207. package/dist/core/asset/markdown.js +40 -51
  208. package/dist/core/asset/resolve-ref.js +274 -0
  209. package/dist/core/asset/stash-meta.js +2 -2
  210. package/dist/core/bundle-id.js +51 -0
  211. package/dist/core/common.js +281 -86
  212. package/dist/core/config/config-io.js +42 -128
  213. package/dist/core/config/config-schema.js +233 -834
  214. package/dist/core/config/config-sources.js +162 -39
  215. package/dist/core/config/config-types.js +16 -11
  216. package/dist/core/config/config-version.js +29 -0
  217. package/dist/core/config/config-walker.js +126 -37
  218. package/dist/core/config/config.js +154 -331
  219. package/dist/core/config/deep-merge.js +41 -0
  220. package/dist/core/config/engine-semantics.js +28 -0
  221. package/dist/core/config/experimental.js +21 -0
  222. package/dist/core/config/schema/embedding.js +38 -0
  223. package/dist/core/config/schema/engines.js +116 -0
  224. package/dist/core/config/schema/experimental.js +47 -0
  225. package/dist/core/config/schema/feedback.js +31 -0
  226. package/dist/core/config/schema/improve-processes.js +389 -0
  227. package/dist/core/config/schema/improve.js +94 -0
  228. package/dist/core/config/schema/index-config.js +176 -0
  229. package/dist/core/config/schema/output.js +18 -0
  230. package/dist/core/config/schema/primitives.js +94 -0
  231. package/dist/core/config/schema/search.js +30 -0
  232. package/dist/core/config/schema/setup.js +18 -0
  233. package/dist/core/config/schema/sources-bundles.js +169 -0
  234. package/dist/core/config/schema/workflow.js +29 -0
  235. package/dist/core/env-secret-ref.js +155 -20
  236. package/dist/core/errors.js +17 -15
  237. package/dist/core/events-types.js +4 -0
  238. package/dist/core/events.js +46 -128
  239. package/dist/core/extra-params.js +62 -0
  240. package/dist/core/file-change.js +17 -0
  241. package/dist/core/file-lock.js +202 -57
  242. package/dist/core/fs-txn.js +392 -0
  243. package/dist/core/git-message.js +59 -0
  244. package/dist/core/improve-result.js +167 -0
  245. package/dist/core/json-schema.js +142 -0
  246. package/dist/core/lesson-lint.js +1 -17
  247. package/dist/core/logs-db.js +1 -1
  248. package/dist/core/maintenance-barrier.js +135 -0
  249. package/dist/core/migration-operation.js +44 -0
  250. package/dist/core/mutation-target.js +78 -0
  251. package/dist/core/paths.js +22 -25
  252. package/dist/core/platform.js +10 -0
  253. package/dist/core/recognition-util.js +128 -0
  254. package/dist/core/redaction.js +392 -0
  255. package/dist/core/standards/resolve-standards-context.js +36 -65
  256. package/dist/core/standards/resolve-stash-standards.js +2 -2
  257. package/dist/core/standards/resolve-type-conventions.js +5 -5
  258. package/dist/core/state/migrations.js +242 -11
  259. package/dist/core/state-db.js +98 -10
  260. package/dist/core/structured.js +1 -1
  261. package/dist/core/subprocess.js +303 -0
  262. package/dist/core/text-truncation.js +9 -5
  263. package/dist/core/time.js +20 -0
  264. package/dist/core/type-presentation.js +130 -0
  265. package/dist/core/warn.js +0 -3
  266. package/dist/core/write-source.js +834 -118
  267. package/dist/indexer/bundle-identity-guard.js +92 -0
  268. package/dist/indexer/db/graph-db.js +1 -25
  269. package/dist/indexer/db/llm-cache.js +1 -1
  270. package/dist/indexer/ensure-index.js +30 -9
  271. package/dist/indexer/graph/graph-boost.js +9 -30
  272. package/dist/indexer/graph/graph-extraction.js +41 -27
  273. package/dist/indexer/graph/graph-types.js +4 -0
  274. package/dist/indexer/index-writer-lock.js +93 -49
  275. package/dist/indexer/index-written-assets.js +100 -53
  276. package/dist/indexer/indexer.js +746 -329
  277. package/dist/indexer/init.js +18 -25
  278. package/dist/indexer/installations.js +142 -0
  279. package/dist/indexer/passes/dir-staleness.js +18 -10
  280. package/dist/indexer/passes/memory-inference.js +25 -15
  281. package/dist/indexer/passes/metadata.js +412 -243
  282. package/dist/indexer/scan/doc-to-entry.js +160 -0
  283. package/dist/indexer/scan/drain-dir.js +134 -0
  284. package/dist/indexer/search/db-search.js +292 -108
  285. package/dist/indexer/search/fts-query.js +64 -0
  286. package/dist/indexer/search/ranking-contributors.js +145 -25
  287. package/dist/indexer/search/ranking-types.js +4 -0
  288. package/dist/indexer/search/ranking.js +28 -71
  289. package/dist/indexer/search/search-attribution.js +67 -0
  290. package/dist/indexer/search/search-fields.js +18 -3
  291. package/dist/indexer/search/search-hit-enrichers.js +30 -40
  292. package/dist/indexer/search/search-source.js +157 -111
  293. package/dist/indexer/search/semantic-status.js +4 -1
  294. package/dist/indexer/usage/usage-events.js +10 -30
  295. package/dist/indexer/walk/file-context.js +3 -45
  296. package/dist/indexer/walk/matchers.js +42 -34
  297. package/dist/indexer/walk/path-resolver.js +11 -5
  298. package/dist/indexer/walk/walker.js +42 -14
  299. package/dist/integrations/agent/builder-shared.js +7 -0
  300. package/dist/integrations/agent/builders.js +5 -56
  301. package/dist/integrations/agent/config.js +3 -143
  302. package/dist/integrations/agent/detect.js +17 -2
  303. package/dist/integrations/agent/engine-resolution.js +231 -0
  304. package/dist/integrations/agent/index.js +1 -2
  305. package/dist/integrations/agent/model-aliases.js +16 -2
  306. package/dist/integrations/agent/profiles.js +36 -62
  307. package/dist/integrations/agent/prompts.js +46 -18
  308. package/dist/integrations/agent/runner-dispatch.js +93 -4
  309. package/dist/integrations/agent/runner.js +76 -208
  310. package/dist/integrations/agent/spawn.js +88 -196
  311. package/dist/integrations/harnesses/aider/agent-builder.js +114 -0
  312. package/dist/integrations/harnesses/aider/index.js +48 -0
  313. package/dist/integrations/harnesses/aider/result-extractor.js +53 -0
  314. package/dist/integrations/harnesses/amazonq/agent-builder.js +147 -0
  315. package/dist/integrations/harnesses/amazonq/index.js +45 -0
  316. package/dist/integrations/harnesses/amazonq/result-extractor.js +48 -0
  317. package/dist/integrations/harnesses/claude/agent-builder.js +46 -8
  318. package/dist/integrations/harnesses/claude/config-import.js +1 -3
  319. package/dist/integrations/harnesses/claude/index.js +24 -35
  320. package/dist/integrations/harnesses/claude/result-extractor.js +52 -0
  321. package/dist/integrations/harnesses/claude/session-log.js +27 -75
  322. package/dist/integrations/harnesses/codex/agent-builder.js +138 -0
  323. package/dist/integrations/harnesses/codex/index.js +52 -0
  324. package/dist/integrations/harnesses/codex/result-extractor.js +73 -0
  325. package/dist/integrations/harnesses/copilot/agent-builder.js +122 -0
  326. package/dist/integrations/harnesses/copilot/index.js +48 -0
  327. package/dist/integrations/harnesses/copilot/result-extractor.js +151 -0
  328. package/dist/integrations/harnesses/gemini/agent-builder.js +120 -0
  329. package/dist/integrations/harnesses/gemini/index.js +48 -0
  330. package/dist/integrations/harnesses/gemini/result-extractor.js +121 -0
  331. package/dist/integrations/harnesses/ids.js +24 -0
  332. package/dist/integrations/harnesses/index.js +54 -34
  333. package/dist/integrations/harnesses/opencode/agent-builder.js +23 -5
  334. package/dist/integrations/harnesses/opencode/config-import.js +1 -3
  335. package/dist/integrations/harnesses/opencode/index.js +14 -32
  336. package/dist/integrations/harnesses/opencode/session-log.js +67 -125
  337. package/dist/integrations/harnesses/opencode-sdk/harness.js +51 -0
  338. package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +681 -108
  339. package/dist/integrations/harnesses/openhands/agent-builder.js +128 -0
  340. package/dist/integrations/harnesses/openhands/index.js +48 -0
  341. package/dist/integrations/harnesses/openhands/result-extractor.js +103 -0
  342. package/dist/integrations/harnesses/pi/agent-builder.js +97 -0
  343. package/dist/integrations/harnesses/pi/index.js +45 -0
  344. package/dist/integrations/harnesses/pi/result-extractor.js +135 -0
  345. package/dist/integrations/harnesses/shared.js +17 -0
  346. package/dist/integrations/harnesses/types.js +43 -32
  347. package/dist/integrations/lockfile.js +211 -24
  348. package/dist/integrations/session-logs/index.js +36 -39
  349. package/dist/integrations/session-logs/provider-base.js +113 -0
  350. package/dist/llm/client.js +182 -110
  351. package/dist/llm/embedders/deterministic.js +2 -2
  352. package/dist/llm/embedders/remote.js +21 -9
  353. package/dist/llm/feature-gate.js +17 -57
  354. package/dist/llm/graph-extract.js +12 -13
  355. package/dist/llm/index-passes.js +8 -42
  356. package/dist/llm/memory-infer.js +144 -1
  357. package/dist/llm/metadata-enhance.js +45 -30
  358. package/dist/llm/structured-call.js +16 -8
  359. package/dist/llm/usage-persist.js +30 -5
  360. package/dist/llm/usage-telemetry.js +59 -6
  361. package/dist/output/cli-hints.js +1 -2
  362. package/dist/output/command-registry.js +27 -0
  363. package/dist/output/context.js +22 -7
  364. package/dist/output/format-exempt.js +80 -0
  365. package/dist/output/generic-render.js +251 -0
  366. package/dist/output/html-render.js +11 -16
  367. package/dist/output/render-registry.js +57 -0
  368. package/dist/output/renderers.js +14 -279
  369. package/dist/output/shapes/curate.js +10 -1
  370. package/dist/output/shapes/events.js +12 -7
  371. package/dist/output/shapes/helpers.js +58 -84
  372. package/dist/output/shapes/passthrough.js +11 -39
  373. package/dist/output/shapes/proposal/producer.js +15 -7
  374. package/dist/output/shapes/registry.js +12 -6
  375. package/dist/output/shapes.js +0 -9
  376. package/dist/output/text/{init.js → bundle-create.js} +3 -1
  377. package/dist/output/text/bundle-show.js +7 -0
  378. package/dist/output/text/command-format.js +562 -0
  379. package/dist/output/text/env.js +1 -3
  380. package/dist/output/text/events.js +8 -7
  381. package/dist/output/text/helpers.js +15 -1164
  382. package/dist/output/text/proposal/producer.js +4 -2
  383. package/dist/output/text/proposal-format.js +202 -0
  384. package/dist/output/text/registry-commands.js +1 -2
  385. package/dist/output/text/registry.js +12 -6
  386. package/dist/output/text/show-directives.js +117 -0
  387. package/dist/output/text/show-format.js +103 -0
  388. package/dist/output/text/sync.js +5 -0
  389. package/dist/output/text/workflow-format.js +332 -0
  390. package/dist/output/text/workflow.js +3 -2
  391. package/dist/output/text.js +10 -19
  392. package/dist/registry/factory.js +4 -6
  393. package/dist/registry/origin-resolve.js +16 -27
  394. package/dist/registry/providers/skills-sh.js +3 -3
  395. package/dist/registry/providers/static-index.js +15 -25
  396. package/dist/registry/resolve.js +43 -94
  397. package/dist/registry/semver.js +43 -0
  398. package/dist/runtime.js +81 -12
  399. package/dist/scripts/akm-migrate.js +35529 -0
  400. package/dist/setup/detect.js +5 -7
  401. package/dist/setup/detected-engines.js +136 -0
  402. package/dist/setup/engine-config.js +100 -0
  403. package/dist/setup/registry-stash-loader.js +3 -3
  404. package/dist/setup/semantic-assets.js +12 -9
  405. package/dist/setup/setup.js +444 -208
  406. package/dist/setup/steps/connection-shared.js +120 -0
  407. package/dist/setup/steps/connection.js +108 -305
  408. package/dist/setup/steps/platforms.js +13 -12
  409. package/dist/setup/steps/semantic.js +15 -3
  410. package/dist/setup/steps/sources.js +21 -15
  411. package/dist/setup/steps/stashdir.js +6 -4
  412. package/dist/setup/steps/tasks.js +236 -119
  413. package/dist/setup/steps.js +3 -2
  414. package/dist/sources/freshness.js +39 -0
  415. package/dist/sources/provider-factory.js +11 -17
  416. package/dist/sources/providers/filesystem.js +2 -3
  417. package/dist/sources/providers/git-install.js +278 -34
  418. package/dist/sources/providers/git-provider.js +54 -56
  419. package/dist/sources/providers/git-stash.js +420 -91
  420. package/dist/sources/providers/git.js +2 -2
  421. package/dist/sources/providers/npm.js +16 -19
  422. package/dist/sources/providers/provider-utils.js +47 -22
  423. package/dist/sources/providers/sync-from-ref.js +3 -9
  424. package/dist/sources/providers/website.js +2 -2
  425. package/dist/sources/resolve.js +11 -10
  426. package/dist/sources/snapshot-fetchers/types.js +4 -0
  427. package/dist/sources/{website-ingest.js → snapshot-fetchers/website-ingest.js} +110 -41
  428. package/dist/storage/database.js +60 -4
  429. package/dist/storage/engines/sqlite-migrations.js +156 -5
  430. package/dist/storage/locations.js +1 -2
  431. package/dist/storage/repositories/canaries-repository.js +1 -1
  432. package/dist/storage/repositories/events-repository.js +51 -11
  433. package/dist/storage/repositories/improve-runs-repository.js +6 -32
  434. package/dist/storage/repositories/index-connection.js +79 -0
  435. package/dist/storage/repositories/index-db.js +4 -3
  436. package/dist/storage/repositories/index-entries-repository.js +863 -0
  437. package/dist/{indexer/db/entry-mapper.js → storage/repositories/index-entry-mapper.js} +19 -2
  438. package/dist/storage/repositories/index-entry-types.js +4 -0
  439. package/dist/storage/repositories/index-fts-repository.js +167 -0
  440. package/dist/storage/repositories/index-llm-cache-repository.js +108 -0
  441. package/dist/storage/repositories/index-meta-repository.js +49 -0
  442. package/dist/{indexer/db/schema.js → storage/repositories/index-schema.js} +226 -100
  443. package/dist/storage/repositories/index-sql.js +12 -0
  444. package/dist/storage/repositories/index-utility-repository.js +356 -0
  445. package/dist/storage/repositories/index-vec-repository.js +250 -0
  446. package/dist/storage/repositories/outcome-repository.js +119 -0
  447. package/dist/storage/repositories/proposals-repository.js +317 -75
  448. package/dist/storage/repositories/registry-cache.js +1 -1
  449. package/dist/storage/repositories/salience-repository.js +172 -0
  450. package/dist/storage/repositories/task-history-repository.js +110 -3
  451. package/dist/storage/repositories/workflow-runs-repository.js +240 -19
  452. package/dist/tasks/backends/cron.js +169 -46
  453. package/dist/tasks/backends/exec-utils.js +76 -3
  454. package/dist/tasks/backends/index.js +6 -9
  455. package/dist/tasks/backends/launchd.js +292 -55
  456. package/dist/tasks/backends/schtasks.js +557 -70
  457. package/dist/tasks/backends/types.js +4 -0
  458. package/dist/tasks/command-executable.js +93 -0
  459. package/dist/tasks/embedded.js +56 -38
  460. package/dist/tasks/parser.js +156 -64
  461. package/dist/tasks/resolve-akm-bin.js +144 -51
  462. package/dist/tasks/runner.js +377 -209
  463. package/dist/tasks/schedule.js +108 -19
  464. package/dist/tasks/scheduler-invocation.js +296 -0
  465. package/dist/tasks/schema.js +1 -1
  466. package/dist/tasks/task-id.js +35 -0
  467. package/dist/tasks/validator.js +30 -16
  468. package/dist/text-import-hook.mjs +1 -1
  469. package/dist/workflows/authoring/authoring.js +104 -43
  470. package/dist/workflows/authoring/scope-key.js +1 -1
  471. package/dist/workflows/cli.js +0 -16
  472. package/dist/workflows/concurrency-policy.js +15 -0
  473. package/dist/workflows/exec/brief.js +450 -0
  474. package/dist/workflows/exec/frozen-judge.js +47 -0
  475. package/dist/workflows/exec/native-executor.js +1038 -0
  476. package/dist/workflows/exec/param-secrets.js +115 -0
  477. package/dist/workflows/exec/report.js +1460 -0
  478. package/dist/workflows/exec/run-workflow.js +602 -0
  479. package/dist/workflows/exec/scheduler.js +71 -0
  480. package/dist/workflows/exec/step-work.js +1190 -0
  481. package/dist/workflows/exec/unit-writer.js +23 -0
  482. package/dist/workflows/exec/workflow-engine-gate.js +67 -0
  483. package/dist/workflows/exec/worktree.js +171 -0
  484. package/dist/workflows/ir/compile.js +246 -0
  485. package/dist/workflows/ir/freeze.js +233 -0
  486. package/dist/workflows/ir/params.js +54 -0
  487. package/dist/workflows/ir/plan-hash.js +68 -0
  488. package/dist/workflows/ir/schema.js +540 -0
  489. package/dist/workflows/parser.js +878 -304
  490. package/dist/workflows/program/expressions.js +181 -0
  491. package/dist/workflows/program/schema.js +51 -0
  492. package/dist/workflows/renderer.js +100 -45
  493. package/dist/workflows/resource-limits.js +22 -0
  494. package/dist/workflows/runtime/agent-identity.js +59 -14
  495. package/dist/workflows/runtime/checkin.js +1 -1
  496. package/dist/workflows/runtime/plan-classifier.js +131 -0
  497. package/dist/workflows/runtime/runs.js +376 -119
  498. package/dist/workflows/runtime/unit-checkin.js +45 -0
  499. package/dist/workflows/runtime/unit-phases.js +20 -0
  500. package/dist/workflows/runtime/workflow-asset-loader.js +241 -40
  501. package/dist/workflows/schema.js +1 -11
  502. package/dist/workflows/validate-summary.js +2 -3
  503. package/dist/workflows/validator.js +52 -30
  504. package/docs/README.md +42 -78
  505. package/docs/migration/README.md +8 -0
  506. package/docs/migration/release-notes/0.6.0.md +1 -1
  507. package/docs/migration/release-notes/0.7.0.md +9 -8
  508. package/docs/migration/release-notes/0.9.0.md +158 -14
  509. package/docs/migration/v0.7-to-v0.8.md +46 -47
  510. package/docs/migration/v0.8-to-v0.9.md +844 -0
  511. package/docs/reference/README.md +12 -0
  512. package/docs/reference/data-and-telemetry.md +333 -0
  513. package/package.json +21 -17
  514. package/schemas/akm-asset-envelope.json +93 -0
  515. package/schemas/akm-config.json +4636 -0
  516. package/schemas/akm-task.json +87 -0
  517. package/schemas/akm-workflow.json +373 -0
  518. package/dist/akm-migrate-storage +0 -38
  519. package/dist/assets/help/help-accept.md +0 -12
  520. package/dist/assets/help/help-improve.md +0 -84
  521. package/dist/assets/help/help-proposals.md +0 -17
  522. package/dist/assets/help/help-propose.md +0 -17
  523. package/dist/assets/help/help-reject.md +0 -11
  524. package/dist/assets/profiles/frequent.json +0 -13
  525. package/dist/assets/profiles/recombine-only.json +0 -21
  526. package/dist/assets/profiles/reflect-distill.json +0 -30
  527. package/dist/assets/profiles/synthesize.json +0 -15
  528. package/dist/assets/prompts/procedural-system.md +0 -44
  529. package/dist/assets/prompts/recombine-system.md +0 -40
  530. package/dist/assets/prompts/staleness-detect-system.md +0 -6
  531. package/dist/assets/tasks/core/backup.yml +0 -4
  532. package/dist/assets/tasks/graph-refresh-weekly.yml +0 -10
  533. package/dist/assets/templates/html/default.html +0 -78
  534. package/dist/assets/templates/html/vendor/echarts.min.js +0 -45
  535. package/dist/assets/wiki/index-template.md +0 -12
  536. package/dist/assets/wiki/ingest-workflow-template.md +0 -83
  537. package/dist/assets/wiki/log-template.md +0 -8
  538. package/dist/assets/wiki/schema-template.md +0 -61
  539. package/dist/cli/config-migrate.js +0 -150
  540. package/dist/cli/config-validate.js +0 -39
  541. package/dist/commands/graph/graph-cli.js +0 -124
  542. package/dist/commands/graph/graph.js +0 -487
  543. package/dist/commands/improve/calibration.js +0 -161
  544. package/dist/commands/improve/dedup.js +0 -482
  545. package/dist/commands/improve/extract-watch.js +0 -140
  546. package/dist/commands/improve/hot-probation.js +0 -45
  547. package/dist/commands/improve/improve-auto-accept.js +0 -276
  548. package/dist/commands/improve/improve-profiles.js +0 -168
  549. package/dist/commands/improve/procedural.js +0 -398
  550. package/dist/commands/improve/recombine.js +0 -818
  551. package/dist/commands/improve/schema-similarity-gate.js +0 -168
  552. package/dist/commands/lint/agent-linter.js +0 -44
  553. package/dist/commands/lint/command-linter.js +0 -44
  554. package/dist/commands/lint/default-linter.js +0 -16
  555. package/dist/commands/lint/fact-linter.js +0 -39
  556. package/dist/commands/lint/knowledge-linter.js +0 -16
  557. package/dist/commands/lint/memory-linter.js +0 -61
  558. package/dist/commands/lint/registry.js +0 -41
  559. package/dist/commands/lint/skill-linter.js +0 -45
  560. package/dist/commands/lint/task-linter.js +0 -50
  561. package/dist/commands/lint/workflow-linter.js +0 -81
  562. package/dist/commands/proposal/legacy-import.js +0 -115
  563. package/dist/commands/sources/history.js +0 -196
  564. package/dist/commands/tasks/default-tasks.js +0 -186
  565. package/dist/commands/wiki-cli.js +0 -292
  566. package/dist/core/asset/asset-registry.js +0 -76
  567. package/dist/core/asset/asset-spec.js +0 -259
  568. package/dist/core/config/config-migration.js +0 -602
  569. package/dist/core/deep-merge.js +0 -38
  570. package/dist/core/eval/rank-metrics.js +0 -113
  571. package/dist/core/ripgrep/install.js +0 -163
  572. package/dist/core/ripgrep/resolve.js +0 -81
  573. package/dist/indexer/db/db.js +0 -1413
  574. package/dist/indexer/manifest.js +0 -170
  575. package/dist/indexer/passes/metadata-contributors.js +0 -31
  576. package/dist/indexer/usage/unmigrated-vaults-guard.js +0 -94
  577. package/dist/integrations/harnesses/opencode-sdk/index.js +0 -49
  578. package/dist/llm/call-ai.js +0 -62
  579. package/dist/llm/memory-infer-impl.js +0 -138
  580. package/dist/output/shapes/distill.js +0 -14
  581. package/dist/output/shapes/history.js +0 -11
  582. package/dist/output/text/distill.js +0 -6
  583. package/dist/output/text/enable-disable.js +0 -8
  584. package/dist/output/text/history.js +0 -6
  585. package/dist/output/text/wiki.js +0 -16
  586. package/dist/registry/build-index.js +0 -386
  587. package/dist/scripts/migrate-storage.js +0 -19108
  588. package/dist/scripts/migrations/import-fs-improve-runs-to-db.js +0 -9411
  589. package/dist/scripts/migrations/v16-to-v17.js +0 -141
  590. package/dist/setup/legacy-config.js +0 -106
  591. package/dist/storage/repositories/consolidation-repository.js +0 -38
  592. package/dist/storage/repositories/recombine-repository.js +0 -213
  593. package/dist/wiki/wiki-templates.js +0 -15
  594. package/dist/wiki/wiki.js +0 -1012
  595. package/dist/workflows/db.js +0 -215
  596. package/docs/data-and-telemetry.md +0 -226
  597. /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/registry.js +0 -0
  598. /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/youtube.js +0 -0
@@ -0,0 +1,147 @@
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
+ * Amazon Q Developer CLI agent command builder (P2, plan §"The adapter
6
+ * contract" step 2 / §"Capability matrix").
7
+ *
8
+ * Translates a platform-agnostic {@link AgentDispatchRequest} into the exact
9
+ * headless argv the `q` CLI expects. Per the capability matrix the headless
10
+ * invocation is:
11
+ *
12
+ * q chat --no-interactive --trust-all-tools "<prompt>"
13
+ *
14
+ * with `--model <m>` for model selection and `--resume` for resume — NOTE:
15
+ * unlike every other harness's resume, Q's `--resume` is a bare flag that
16
+ * replays the previous conversation *of the working directory*; it takes no
17
+ * session id. There is nothing to thread from `workflow_run_units` — akm's own
18
+ * unit rows remain the durable resume source of truth regardless (plan
19
+ * §"Session, MCP, and identity across harnesses").
20
+ *
21
+ * Platform-specific mapping decisions (all localized here, per the adapter
22
+ * contract):
23
+ *
24
+ * - **subcommand** — headless dispatch is the `chat` subcommand. The builder
25
+ * prepends `chat` itself (mirroring the codex builder's `exec` handling); a
26
+ * user profile that already pins `chat` as its first arg is not doubled.
27
+ * - **prompt** — the trailing positional `[INPUT]` argument of `q chat`,
28
+ * preceded by the `--` end-of-options separator (mirroring the
29
+ * claude/codex/pi builders) so a prompt whose text begins with `-`/`--` can
30
+ * never be parsed as flags. `--no-interactive` makes Q print the response
31
+ * and exit instead of opening the REPL.
32
+ * - **systemPrompt** — `q chat` has no system-prompt flag (persona/context
33
+ * comes from Q's own agent config files), so the system prompt is folded
34
+ * into the positional payload ahead of the task prompt, separated by a
35
+ * blank line. `assertNotFlag` still guards it.
36
+ * - **schema** — the matrix places Q in the NO-structured-output tier
37
+ * ("via prompt+validate": *(none documented)* — there is no `--json` or
38
+ * `--output-format` to ask for). The JSON Schema is therefore passed
39
+ * through the prompt: a directive matching the engine's wording
40
+ * (`step-work.ts` `buildUnitPrompt`) is appended to the payload.
41
+ * Stdout stays plain text; `./result-extractor.ts` strips terminal framing
42
+ * and the engine's shared embedded-JSON parse + retry-until-valid loop does
43
+ * the rest. No schema temp file is written — that seam is codex-only
44
+ * (`--output-schema`); inventing a flag here would produce a silently
45
+ * broken command.
46
+ * - **tools** — a string/array tool policy maps to Q's documented
47
+ * `--trust-tools=<t1,t2>` allowlist flag (equals-joined, per `q chat
48
+ * --help`). With no policy at all, headless runs need autonomy, so
49
+ * `--trust-all-tools` is emitted per the matrix. A *structured* policy
50
+ * object is NOT expressible as Q flags; it is deliberately dropped without
51
+ * falling back to `--trust-all-tools` (never silently widen a restriction)
52
+ * — Q then refuses untrusted tool actions in non-interactive mode, which is
53
+ * the conservative failure mode.
54
+ * - **effort** — stays unconsumed (reserved; the shared request contract's
55
+ * "no builder consumes it yet" note stays true).
56
+ *
57
+ * Registered: `amazonqBuilder` is `AmazonqHarness.agentBuilder`
58
+ * (`./index.ts`), one of the ten harnesses `HARNESS_REGISTRY` constructs
59
+ * (`harnesses/index.ts`); `agent/builders.ts` derives `BUILTIN_BUILDERS` from
60
+ * that registry, so this builder is reachable under the `"amazonq"` platform
61
+ * name without any further wiring. The registry-side capability entry —
62
+ * pattern `local-runner`, structuredOutput `none` — is declared alongside it
63
+ * (`./index.ts`).
64
+ */
65
+ import { assertNotFlag, resolveDispatchModel, } from "../../agent/builder-shared.js";
66
+ /** Canonical harness/platform id used for model-alias resolution. */
67
+ export const AMAZONQ_PLATFORM = "amazonq";
68
+ /**
69
+ * Split a tool policy into individual tool names for `--trust-tools`.
70
+ * Strings are comma-separated lists; arrays are taken as-is. Structured
71
+ * policy objects return `undefined` (not expressible as Q flags — see
72
+ * module doc).
73
+ */
74
+ function toolPolicyEntries(tools) {
75
+ if (typeof tools === "string") {
76
+ return tools
77
+ .split(",")
78
+ .map((t) => t.trim())
79
+ .filter(Boolean);
80
+ }
81
+ if (Array.isArray(tools)) {
82
+ return tools.map((t) => t.trim()).filter(Boolean);
83
+ }
84
+ return undefined;
85
+ }
86
+ /**
87
+ * Assemble the positional prompt payload: optional system prompt, the task
88
+ * prompt, and — when a schema is requested — the same schema directive the
89
+ * workflow engine's prompt assembly uses, so both dispatch paths speak one
90
+ * dialect.
91
+ */
92
+ function buildPromptPayload(req) {
93
+ const sections = [];
94
+ if (req.systemPrompt)
95
+ sections.push(req.systemPrompt);
96
+ sections.push(req.prompt);
97
+ if (req.schema) {
98
+ sections.push(`Respond with ONLY a JSON value matching this JSON Schema (no prose, no code fences):\n${JSON.stringify(req.schema)}`);
99
+ }
100
+ return sections.join("\n\n");
101
+ }
102
+ /**
103
+ * Amazon Q Developer CLI builder.
104
+ * Command shape:
105
+ * q chat --no-interactive (--trust-all-tools | --trust-tools=<t1,t2>)
106
+ * [--model <m>] -- "<systemPrompt?\n\nprompt\n\nschema directive?>"
107
+ */
108
+ export const amazonqBuilder = {
109
+ platform: AMAZONQ_PLATFORM,
110
+ build(profile, req) {
111
+ assertNotFlag(req.systemPrompt, "systemPrompt");
112
+ assertNotFlag(req.model, "model");
113
+ // Built-in q profiles would ship `args: []`; headless dispatch is the
114
+ // `chat` subcommand. Don't double it when a user profile already pins it.
115
+ const extra = profile.args[0] === "chat" ? profile.args.slice(1) : [...profile.args];
116
+ const args = ["chat", ...extra];
117
+ // Print the response and exit — required for captured dispatch.
118
+ args.push("--no-interactive");
119
+ if (req.tools) {
120
+ // Structured policy objects (entries === undefined) emit NO trust
121
+ // flags: dropping a restriction must never widen to --trust-all-tools.
122
+ const entries = toolPolicyEntries(req.tools);
123
+ if (entries !== undefined) {
124
+ for (const tool of entries) {
125
+ assertNotFlag(tool, "tools entry");
126
+ }
127
+ // Q's documented allowlist form is equals-joined and comma-separated
128
+ // (`--trust-tools=fs_read,fs_write`); an empty list trusts no tools.
129
+ args.push(`--trust-tools=${entries.join(",")}`);
130
+ }
131
+ }
132
+ else {
133
+ // Headless default per the capability matrix: units must run without
134
+ // interactive tool-approval prompts.
135
+ args.push("--trust-all-tools");
136
+ }
137
+ if (req.model) {
138
+ const resolved = resolveDispatchModel(req, profile, AMAZONQ_PLATFORM);
139
+ args.push("--model", resolved);
140
+ }
141
+ // No system-prompt / schema flags exist on `q chat` — both travel in the
142
+ // positional payload, after the end-of-options separator.
143
+ args.push("--");
144
+ args.push(buildPromptPayload(req));
145
+ return { argv: [profile.bin, ...args] };
146
+ },
147
+ };
@@ -0,0 +1,45 @@
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
+ * Amazon Q Developer CLI harness (P2 integration, plan §"The adapter
6
+ * contract").
7
+ *
8
+ * Per-harness barrel gathering the Amazon Q integration surfaces:
9
+ * - agent command builder → ./agent-builder.ts (amazonqBuilder)
10
+ * - result extractor → ./result-extractor.ts (amazonqResultExtractor)
11
+ *
12
+ * It also defines {@link AmazonqHarness}, the {@link AkmHarness} descriptor
13
+ * that `HARNESS_REGISTRY` registers. Dispatch-only: no native session-log
14
+ * reader or config importer yet.
15
+ */
16
+ import { caps } from "../shared.js";
17
+ import { BaseHarness } from "../types.js";
18
+ import { amazonqBuilder } from "./agent-builder.js";
19
+ import { amazonqResultExtractor } from "./result-extractor.js";
20
+ export { AMAZONQ_PLATFORM, amazonqBuilder } from "./agent-builder.js";
21
+ export { amazonqResultExtractor, stripTerminalFraming } from "./result-extractor.js";
22
+ /**
23
+ * Amazon Q Developer CLI (`q`).
24
+ *
25
+ * Canonical id is `'amazonq'`; no alias or distinct runtime identity.
26
+ */
27
+ export class AmazonqHarness extends BaseHarness {
28
+ id = "amazonq";
29
+ displayName = "Amazon Q Developer CLI";
30
+ aliases = [];
31
+ agentBuilder = amazonqBuilder;
32
+ resultExtractor = amazonqResultExtractor;
33
+ // ── Workflow-engine descriptor (plan §"Capability matrix", P2) ────────────
34
+ // akm spawns `q chat` locally per unit ⇒ local-runner.
35
+ pattern = "local-runner";
36
+ // No documented structured output: akm injects the schema into the prompt
37
+ // and extracts embedded JSON from plain-text stdout.
38
+ structuredOutput = "none";
39
+ // No `identityEnv`: the matrix lists Q's identity markers as uncertain, and
40
+ // Q stamps no session var onto child processes.
41
+ capabilities = caps({
42
+ agentDispatch: true,
43
+ detection: true,
44
+ });
45
+ }
@@ -0,0 +1,48 @@
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
+ const ESC = "\u001B";
5
+ const BEL = "\u0007";
6
+ /**
7
+ * Matches ANSI CSI sequences (colors, cursor movement, erase-line) and OSC
8
+ * sequences (title, hyperlink) terminated by BEL or ST. Built via the RegExp
9
+ * constructor so the control characters live in named string constants
10
+ * instead of regex-literal escapes.
11
+ */
12
+ const ANSI_SEQUENCE = new RegExp(`${ESC}\\[[0-9;?]*[ -/]*[@-~]` + `|${ESC}\\][^${BEL}${ESC}]*(?:${BEL}|${ESC}\\\\)`, "g");
13
+ /**
14
+ * Resolve carriage-return overwrites within one physical line: a terminal
15
+ * would redraw from column 0 at each `\r`, so only the segment after the last
16
+ * `\r` survives (spinner frames like "⠋ Thinking..." disappear exactly as
17
+ * they do on screen). A trailing bare `\r` (CRLF line endings) is handled by
18
+ * splitting on `\r?\n` before this runs.
19
+ */
20
+ function resolveCarriageReturns(line) {
21
+ const lastCr = line.lastIndexOf("\r");
22
+ return lastCr === -1 ? line : line.slice(lastCr + 1);
23
+ }
24
+ /** Strip terminal framing from raw captured stdout. See module doc, rule 1. */
25
+ export function stripTerminalFraming(raw) {
26
+ const lines = raw.split(/\r?\n/).map((line) => resolveCarriageReturns(line).replace(ANSI_SEQUENCE, ""));
27
+ // Drop Q's "> " response marker from the first non-empty line only — deeper
28
+ // occurrences may be legitimate content (markdown blockquotes).
29
+ for (let i = 0; i < lines.length; i++) {
30
+ const line = lines[i] ?? "";
31
+ if (line.trim().length === 0)
32
+ continue;
33
+ if (line.startsWith("> "))
34
+ lines[i] = line.slice(2);
35
+ break;
36
+ }
37
+ return lines.join("\n").trim();
38
+ }
39
+ /**
40
+ * Normalize a raw Amazon Q run result into `{ text, sessionId? }`.
41
+ * See the module doc for the rules.
42
+ */
43
+ export const amazonqResultExtractor = (result) => {
44
+ const sessionId = result.sessionId;
45
+ // Rule 2: a pre-parsed whole-stdout JSON *string* is the answer itself.
46
+ const text = typeof result.parsed === "string" ? result.parsed.trim() : stripTerminalFraming(result.stdout);
47
+ return { text, ...(sessionId ? { sessionId } : {}) };
48
+ };
@@ -11,15 +11,48 @@
11
11
  * in `agent/builders.ts`, which imports this builder back into
12
12
  * `BUILTIN_BUILDERS`.
13
13
  *
14
- * Behaviour-preserving relocation: the produced argv is byte-identical to the
15
- * pre-migration `claudeBuilder`. The builder's `platform` stays `'claude'` (the
16
- * canonical harness id).
14
+ * ## Structured output (Codex round-3 finding A)
15
+ *
16
+ * The headless `claude -p` (`--print`) CLI has NO native output-SCHEMA flag
17
+ * (unlike Codex's `--output-schema <file>`). Its documented structured path is
18
+ * `--output-format json`, which wraps the run in a RESULT ENVELOPE
19
+ * (`{"type":"result","result":"<final answer>","session_id":"…", …}`) — the
20
+ * "native-json" tier, NOT "native-schema". (The registry's earlier
21
+ * `native-schema` claim described Claude Code's IN-HARNESS `Workflow`/`agent()`
22
+ * tool-input-schema path, which is a different execution surface than the
23
+ * agentBuilder dispatch akm's local-runner uses; the descriptor is aligned to
24
+ * `native-json` to match this builder honestly.)
25
+ *
26
+ * So for a schema-bearing unit this builder emits `--output-format json` and
27
+ * appends the SAME schema directive the engine's prompt assembly uses
28
+ * (`step-work.ts` `buildUnitPrompt`) so a direct (non-workflow) dispatch is
29
+ * self-sufficient — matching the copilot/gemini native-json builders. The
30
+ * result envelope is unwrapped by `./result-extractor.ts`, and the engine's
31
+ * shared `runStructured` retry-until-valid loop still validates the extracted
32
+ * text against the node schema (constrained/hinted output is trusted but
33
+ * verified). Without a schema the argv is byte-identical to the pre-fix shape.
34
+ *
35
+ * The builder's `platform` stays `'claude'` (the canonical harness id).
17
36
  */
18
- import { assertNotFlag, normalizeTools } from "../../agent/builder-shared.js";
19
- import { resolveModel } from "../../agent/model-aliases.js";
37
+ import { assertNotFlag, normalizeTools, resolveDispatchModel, } from "../../agent/builder-shared.js";
38
+ /**
39
+ * Assemble the positional prompt: the task prompt and — when a schema is
40
+ * requested — the same schema directive the workflow engine's prompt assembly
41
+ * uses (`step-work.ts` `buildUnitPrompt`), so both dispatch paths speak one
42
+ * dialect. Claude Code takes the system prompt as a `--system-prompt` FLAG (it
43
+ * has one, unlike copilot/gemini), so only the schema directive is folded in
44
+ * here.
45
+ */
46
+ function buildPromptPayload(req) {
47
+ if (!req.schema)
48
+ return req.prompt;
49
+ return `${req.prompt}\n\nRespond with ONLY a JSON value matching this JSON Schema (no prose, no code fences):\n${JSON.stringify(req.schema)}`;
50
+ }
20
51
  /**
21
52
  * Claude Code builder.
22
- * Command shape: claude [--system-prompt "..."] [--model <m>] [--allowedTools <t>] --print "<prompt>"
53
+ * Command shape:
54
+ * claude [--system-prompt "..."] [--model <m>] [--allowedTools <t>]
55
+ * [--output-format json] --print -- "<prompt (+ schema directive)>"
23
56
  *
24
57
  * --print switches Claude Code to non-interactive captured output mode.
25
58
  */
@@ -33,16 +66,21 @@ export const claudeBuilder = {
33
66
  args.push("--system-prompt", req.systemPrompt);
34
67
  }
35
68
  if (req.model) {
36
- const resolved = resolveModel(req.model, "claude", profile.modelAliases, profile.globalModelAliases);
69
+ const resolved = resolveDispatchModel(req, profile, "claude");
37
70
  args.push("--model", resolved);
38
71
  }
39
72
  if (req.tools) {
40
73
  args.push("--allowedTools", normalizeTools(req.tools));
41
74
  }
75
+ if (req.schema) {
76
+ // Structured unit: request the documented JSON result envelope so
77
+ // `./result-extractor.ts` can pull the final answer + session id.
78
+ args.push("--output-format", "json");
79
+ }
42
80
  // --print = non-interactive, outputs to stdout — required for captured mode
43
81
  args.push("--print");
44
82
  args.push("--");
45
- args.push(req.prompt);
83
+ args.push(buildPromptPayload(req));
46
84
  return { argv: [profile.bin, ...args] };
47
85
  },
48
86
  };
@@ -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 a Claude Code installation.
23
21
  *
@@ -1,45 +1,15 @@
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
- /**
5
- * Claude Code harness (#563).
6
- *
7
- * This is the per-harness barrel that gathers the Claude Code integration
8
- * surfaces that were previously scattered across the codebase:
9
- * - session-log reader → ./session-log.ts (ClaudeCodeProvider)
10
- * - agent command builder → ./agent-builder.ts (claudeBuilder)
11
- * - config importer → ./config-import.ts (claudeCodeImporter)
12
- *
13
- * It also defines {@link ClaudeHarness}, the {@link AkmHarness} descriptor that
14
- * `HARNESS_REGISTRY` registers.
15
- *
16
- * ## id normalization bridge ('claude' vs 'claude-code')
17
- *
18
- * The canonical, persisted id is `'claude'` (used by the agent runner, agent
19
- * profiles, the Zod config schema and `--type` resolution after normalization).
20
- * `'claude-code'` is the historical RUNTIME identity — the string stamped on
21
- * session-log events/refs, the extracted-session dedup key, and the value
22
- * `resolveAgentIdentity` reports. It is registered as an `alias` and exposed as
23
- * `runtimeId` so BOTH directions round-trip via `normalizeHarnessId()` /
24
- * `denormalizeRuntimeIdentity()`. Existing persisted configs and session logs
25
- * that say `'claude-code'` keep working unchanged.
26
- */
4
+ import { caps } from "../shared.js";
27
5
  import { BaseHarness } from "../types.js";
28
6
  import { claudeBuilder } from "./agent-builder.js";
7
+ import { claudeResultExtractor } from "./result-extractor.js";
8
+ import { ClaudeCodeProvider } from "./session-log.js";
29
9
  export { claudeBuilder } from "./agent-builder.js";
30
10
  export { claudeCodeImporter } from "./config-import.js";
11
+ export { claudeResultExtractor } from "./result-extractor.js";
31
12
  export { ClaudeCodeProvider } from "./session-log.js";
32
- function caps(c) {
33
- return {
34
- sessionLogs: false,
35
- agentDispatch: false,
36
- detection: false,
37
- configImport: false,
38
- runtimeIdentity: false,
39
- v1Migration: false,
40
- ...c,
41
- };
42
- }
43
13
  /**
44
14
  * Claude Code.
45
15
  *
@@ -55,12 +25,31 @@ export class ClaudeHarness extends BaseHarness {
55
25
  // session-log provider, so offering it as a stash source is functional.
56
26
  setupDetectionDir = ".claude";
57
27
  agentBuilder = claudeBuilder;
28
+ resultExtractor = claudeResultExtractor;
29
+ // ── Workflow-engine descriptor (plan §"Capability matrix", P2) ────────────
30
+ // Claude Code is the in-harness pattern: the orchestrating session itself
31
+ // drives units via the `akm workflow` gate spine (`claude -p` headless
32
+ // dispatch also exists via `agentBuilder`, but the pattern classification
33
+ // follows the matrix row).
34
+ pattern = "in-harness";
35
+ // Structured output tier for the AGENT-DISPATCH (`claude -p`) path akm's
36
+ // local runner uses (Codex round-3 finding A). The headless CLI has NO
37
+ // output-schema flag — its documented structured path is `--output-format
38
+ // json`, a RESULT ENVELOPE akm parses (`./result-extractor.ts`) and then
39
+ // validates against the node schema ⇒ the "native-json" tier. (Claude Code's
40
+ // in-harness `Workflow`/`agent()` tool-input-schema path IS native-schema,
41
+ // but that is a different surface than the dispatch builder — the descriptor
42
+ // is aligned to what the builder honestly does.)
43
+ structuredOutput = "native-json";
44
+ // Session-id env marker: presence of a concrete session id (not the bare
45
+ // "running under Claude Code" flag) attributes a run to this harness.
46
+ identityEnv = ["CLAUDE_SESSION_ID"];
47
+ sessionLogProvider = () => new ClaudeCodeProvider();
58
48
  capabilities = caps({
59
49
  sessionLogs: true,
60
50
  agentDispatch: true,
61
51
  detection: true,
62
52
  configImport: true,
63
53
  runtimeIdentity: true,
64
- v1Migration: true,
65
54
  });
66
55
  }
@@ -0,0 +1,52 @@
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
+ function isRecord(value) {
5
+ return typeof value === "object" && value !== null && !Array.isArray(value);
6
+ }
7
+ function asNonEmptyString(value) {
8
+ return typeof value === "string" && value.length > 0 ? value : undefined;
9
+ }
10
+ /** JSON.parse that returns undefined instead of throwing. */
11
+ function tryParseJson(raw) {
12
+ try {
13
+ return JSON.parse(raw);
14
+ }
15
+ catch {
16
+ return undefined;
17
+ }
18
+ }
19
+ /**
20
+ * Is this parsed object Claude Code's `--output-format json` RESULT ENVELOPE
21
+ * (rather than a bare JSON answer a schema unit produced without the flag)? A
22
+ * genuine envelope declares `type: "result"`, or carries the two envelope-only
23
+ * fields together (a string `result` AND a `session_id`). A bare structured
24
+ * answer — `{"result":"ok"}` — carries neither marker, so it is passed through
25
+ * raw and the engine's schema validator sees the whole object.
26
+ */
27
+ function isResultEnvelope(value) {
28
+ if (value.type === "result")
29
+ return true;
30
+ return typeof value.result === "string" && asNonEmptyString(value.session_id) !== undefined;
31
+ }
32
+ /**
33
+ * Normalize a raw claude run result into `{ text, sessionId? }`. See the module
34
+ * doc for the two stdout shapes (JSON result envelope vs plain text).
35
+ */
36
+ export const claudeResultExtractor = (result) => {
37
+ const fallbackSessionId = result.sessionId;
38
+ const raw = result.stdout;
39
+ const trimmed = raw.trim();
40
+ // Only attempt an envelope parse when stdout looks like a single JSON object
41
+ // (`--output-format json`). A plain-text run is passed through UNCHANGED
42
+ // (untrimmed) so schemaless dispatch stays byte-identical to today.
43
+ if (trimmed.startsWith("{")) {
44
+ const whole = result.parsed !== undefined ? result.parsed : tryParseJson(trimmed);
45
+ if (isRecord(whole) && isResultEnvelope(whole)) {
46
+ const text = typeof whole.result === "string" ? whole.result : trimmed;
47
+ const sessionId = asNonEmptyString(whole.session_id) ?? fallbackSessionId;
48
+ return { text, ...(sessionId ? { sessionId } : {}) };
49
+ }
50
+ }
51
+ return { text: raw, ...(fallbackSessionId ? { sessionId: fallbackSessionId } : {}) };
52
+ };
@@ -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
  }