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
@@ -8,10 +8,8 @@
8
8
  * one heuristic. The public `*Matcher` exports compose those facts into the
9
9
  * `MatchResult` shape expected by the rest of the indexer.
10
10
  */
11
- import { defaultRendererRegistry } from "../../core/asset/asset-registry.js";
12
- import { SCRIPT_EXTENSIONS } from "../../core/asset/asset-spec.js";
13
- import { looksLikeWorkflow } from "../../workflows/parser.js";
14
- import { registerMatcher } from "./file-context.js";
11
+ import { SCRIPT_EXTENSIONS } from "../../core/recognition-util.js";
12
+ import { presentationFor } from "../../core/type-presentation.js";
15
13
  // ---------------------------------------------------------------------------
16
14
  // Private data
17
15
  // ---------------------------------------------------------------------------
@@ -36,6 +34,18 @@ const DIR_TYPE_MAP = [
36
34
  type: "knowledge",
37
35
  test: (ext) => ext === ".md",
38
36
  },
37
+ {
38
+ // R-045 / Q-18 second half (owner ruling 11) — stash-resident `instruction`
39
+ // assets live under `instructions/`, mirroring the `knowledge` rule. This
40
+ // is a walker discovery rule for FILES ON DISK under a stash's
41
+ // `instructions/` dir; it is unrelated to the adapter-emitted root
42
+ // CLAUDE.md/AGENTS.md instruction docs (`tool-dir-shared.ts`), which are
43
+ // synthesized by format-family adapters, carry `ownsPresentation: true`,
44
+ // and never pass through this matcher at all.
45
+ dir: "instructions",
46
+ type: "instruction",
47
+ test: (ext) => ext === ".md",
48
+ },
39
49
  {
40
50
  dir: "workflows",
41
51
  type: "workflow",
@@ -67,7 +77,10 @@ const DIR_TYPE_MAP = [
67
77
  {
68
78
  dir: "tasks",
69
79
  type: "task",
70
- test: (ext) => ext === ".md",
80
+ // Tasks migrated from `.md` to `.yml` in 0.8.0 (commit 031c659f updated
81
+ // the placement specs, renderers, and the task-linter, but missed this
82
+ // matcher — tasks/*.yml were unrecognized until this fix).
83
+ test: (ext) => ext === ".yml",
71
84
  },
72
85
  {
73
86
  // #561 — agent session assets live under `sessions/<harness>/<id>.md`.
@@ -98,6 +111,9 @@ const TYPED_DIR_DOC_FILES = new Set(["readme.md"]);
98
111
  function isTypedDirDocFile(fileName) {
99
112
  return TYPED_DIR_DOC_FILES.has(fileName.toLowerCase());
100
113
  }
114
+ function isNestedSkillResource(ctx) {
115
+ return ctx.ancestorDirs[0] === "skills" && ctx.ancestorDirs.length > 1 && ctx.fileName !== "SKILL.md";
116
+ }
101
117
  // ---------------------------------------------------------------------------
102
118
  // Private helpers
103
119
  // ---------------------------------------------------------------------------
@@ -119,7 +135,7 @@ function matchDirectoryHint(dirName, ctx, specificity) {
119
135
  return null;
120
136
  }
121
137
  function classifyByExtension(ctx) {
122
- if (ctx.fileName === "SKILL.md" && !ctx.ancestorDirs.includes("wikis")) {
138
+ if (ctx.fileName === "SKILL.md") {
123
139
  return { type: "skill", specificity: 25 };
124
140
  }
125
141
  if (SCRIPT_EXTENSIONS.has(ctx.ext)) {
@@ -128,6 +144,8 @@ function classifyByExtension(ctx) {
128
144
  return null;
129
145
  }
130
146
  function classifyByDirectory(ctx) {
147
+ if (isNestedSkillResource(ctx))
148
+ return null;
131
149
  for (const dir of ctx.ancestorDirs) {
132
150
  const result = matchDirectoryHint(dir, ctx, 10);
133
151
  if (result)
@@ -137,6 +155,8 @@ function classifyByDirectory(ctx) {
137
155
  }
138
156
  function classifyByParentDirHint(ctx) {
139
157
  const { parentDir, ext, fileName } = ctx;
158
+ if (isNestedSkillResource(ctx))
159
+ return null;
140
160
  if (parentDir === "skills" && (fileName === "SKILL.md" || ext === ".md")) {
141
161
  return { type: "skill", specificity: 15 };
142
162
  }
@@ -158,10 +178,15 @@ function classifyBySmartMd(ctx) {
158
178
  return { type: "knowledge", specificity: 5 };
159
179
  }
160
180
  const body = ctx.content();
161
- if (looksLikeWorkflow(body)) {
181
+ const fm = ctx.frontmatter();
182
+ // Recognition is frontmatter `type: workflow` or residence under `workflows/`
183
+ // (workflow-format-unification, spec §2.5) — no content sniffing. The
184
+ // directory rule is `classifyByDirectory`/`classifyByParentDirHint`'s job;
185
+ // this only catches a workflow living OUTSIDE `workflows/` that still
186
+ // declares its type explicitly.
187
+ if (fm && fm.type === "workflow") {
162
188
  return { type: "workflow", specificity: 19 };
163
189
  }
164
- const fm = ctx.frontmatter();
165
190
  if (fm) {
166
191
  if ("toolPolicy" in fm || "tools" in fm) {
167
192
  return { type: "agent", specificity: 20 };
@@ -178,16 +203,6 @@ function classifyBySmartMd(ctx) {
178
203
  }
179
204
  return { type: "knowledge", specificity: 5 };
180
205
  }
181
- function classifyByWiki(ctx) {
182
- if (ctx.ext !== ".md")
183
- return null;
184
- const idx = ctx.ancestorDirs.indexOf("wikis");
185
- if (idx < 0)
186
- return null;
187
- if (idx + 1 >= ctx.ancestorDirs.length)
188
- return null;
189
- return { type: "wiki", specificity: 20 };
190
- }
191
206
  // ---------------------------------------------------------------------------
192
207
  // Adapter: MatchFact → MatchResult
193
208
  // ---------------------------------------------------------------------------
@@ -195,7 +210,10 @@ function toMatchResult(ctx, classify) {
195
210
  const fact = classify(ctx);
196
211
  if (!fact)
197
212
  return null;
198
- const renderer = defaultRendererRegistry.rendererNameFor(fact.type);
213
+ // Renderer name resolved via TYPE_PRESENTATION (core leaf), so matchers.ts
214
+ // carries no edge into the taxonomy SCC (chunk-3 cutover enabler).
215
+ // TYPE_PRESENTATION.renderer is the single source of truth for renderer names.
216
+ const renderer = presentationFor(fact.type).renderer;
199
217
  if (!renderer)
200
218
  return null;
201
219
  return {
@@ -220,18 +238,8 @@ export function parentDirHintMatcher(ctx) {
220
238
  export function smartMdMatcher(ctx) {
221
239
  return toMatchResult(ctx, classifyBySmartMd);
222
240
  }
223
- export function wikiMatcher(ctx) {
224
- return toMatchResult(ctx, classifyByWiki);
225
- }
226
- const builtinMatchers = [
227
- extensionMatcher,
228
- directoryMatcher,
229
- parentDirHintMatcher,
230
- smartMdMatcher,
231
- wikiMatcher,
232
- ];
233
- export function registerBuiltinMatchers() {
234
- for (const matcher of builtinMatchers) {
235
- registerMatcher(matcher);
236
- }
237
- }
241
+ // The four matcher functions above are consumed directly by the akm adapter's
242
+ // synchronous `recognizeMatch()` (`core/adapter/adapters/akm-adapter.ts`, which
243
+ // holds the same registration-order array for tie-breaking). The chunk-3 cutover
244
+ // removed the file-context matcher registry, so there is no `registerBuiltinMatchers`
245
+ // glue any more — recognition is adapter-driven, not registry-driven.
@@ -3,19 +3,25 @@
3
3
  // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
4
  import fs from "node:fs";
5
5
  import path from "node:path";
6
- import { parseAssetRef } from "../../core/asset/asset-ref.js";
7
- import { resolveAssetPathFromName, TYPE_DIRS } from "../../core/asset/asset-spec.js";
6
+ import { assetPathForName, stashDirFor } from "../../core/asset/asset-placement.js";
7
+ import { parseRefInput } from "../../core/asset/resolve-ref.js";
8
8
  import { isWithin } from "../../core/common.js";
9
9
  import { resolveSourcesForOrigin } from "../../registry/origin-resolve.js";
10
10
  import { lookup } from "../indexer.js";
11
11
  import { resolveSourceEntries } from "../search/search-source.js";
12
12
  function normalizeRef(ref) {
13
- return typeof ref === "string" ? parseAssetRef(ref) : ref;
13
+ // String inputs use the current `[bundle//]conceptId` grammar.
14
+ return typeof ref === "string" ? parseRefInput(ref) : ref;
14
15
  }
15
16
  function buildDiskCandidates(sourcePath, ref, preserveDirectNameFallback) {
16
- const typeDir = path.join(sourcePath, TYPE_DIRS[ref.type] ?? `${ref.type}s`);
17
+ const placementStashDir = stashDirFor(ref.type);
18
+ // Opaque adapter conceptIds are index-resolved. Core cannot infer their
19
+ // adapter-owned serialization or path extension before indexing.
20
+ if (placementStashDir === undefined)
21
+ return [];
22
+ const typeDir = path.join(sourcePath, placementStashDir);
17
23
  const candidates = [
18
- resolveAssetPathFromName(ref.type, typeDir, ref.name),
24
+ assetPathForName(ref.type, typeDir, ref.name),
19
25
  path.join(sourcePath, ref.type, `${ref.name}.md`),
20
26
  path.join(sourcePath, ref.type, ref.name),
21
27
  ];
@@ -10,10 +10,11 @@
10
10
  */
11
11
  import fs from "node:fs";
12
12
  import path from "node:path";
13
- import { isRelevantAssetFile } from "../../core/asset/asset-spec.js";
13
+ import { isRelevantAssetFile } from "../../core/asset/asset-placement.js";
14
14
  import { spawnSync } from "../../runtime.js";
15
15
  import { buildFileContext } from "./file-context.js";
16
- const SKIP_DIRS = new Set([".git", "node_modules", "bin", ".cache"]);
16
+ const ALWAYS_SKIP_DIRS = new Set([".git"]);
17
+ const AKM_SKIP_DIRS = new Set(["node_modules", "bin", ".cache"]);
17
18
  /**
18
19
  * Walk a type root directory and return files grouped by their parent directory.
19
20
  *
@@ -60,23 +61,26 @@ export function walkStash(typeRoot, assetType) {
60
61
  *
61
62
  * If the directory is a git repo, uses `git ls-files` to respect .gitignore.
62
63
  * Otherwise falls back to a manual walk that skips .git, node_modules, bin,
63
- * .cache, dot-directories, and .stash.json files.
64
+ * .cache, dot-directories, and the legacy metadata sidecar.
64
65
  */
65
- export function walkStashFlat(stashRoot) {
66
+ export function walkStashFlat(stashRoot, options = {}) {
67
+ return walkStashFlatWithStatus(stashRoot, options).files;
68
+ }
69
+ export function walkStashFlatWithStatus(stashRoot, options = {}) {
66
70
  if (!fs.existsSync(stashRoot))
67
- return [];
71
+ return { files: [], complete: false };
68
72
  // Try git-based walk first (respects .gitignore)
69
- const gitResult = walkStashGit(stashRoot);
73
+ const gitResult = walkStashGit(stashRoot, options);
70
74
  if (gitResult)
71
75
  return gitResult;
72
76
  // Fallback: manual walk
73
- return walkStashManual(stashRoot);
77
+ return walkStashManual(stashRoot, options);
74
78
  }
75
79
  /**
76
80
  * Walk using `git ls-files` to respect .gitignore.
77
81
  * Returns null if the directory is not a git repo or git fails.
78
82
  */
79
- function walkStashGit(stashRoot) {
83
+ function walkStashGit(stashRoot, options) {
80
84
  // Quick check: is this a git repo? Look for .git in this dir or parents.
81
85
  if (!isInsideGitRepo(stashRoot))
82
86
  return null;
@@ -87,21 +91,35 @@ function walkStashGit(stashRoot) {
87
91
  // result.success is false if the process exited non-zero OR git was not found
88
92
  if (!result.success)
89
93
  return null;
94
+ // `--cached` includes tracked files deleted from the worktree. They are not
95
+ // scan failures and must not make an otherwise complete snapshot look stale.
96
+ const deletedResult = spawnSync(["git", "ls-files", "--deleted", "-z", "--", "."], { cwd: stashRoot });
97
+ if (!deletedResult.success)
98
+ return null;
99
+ const deletedStdout = Buffer.isBuffer(deletedResult.stdout)
100
+ ? deletedResult.stdout.toString("utf8")
101
+ : String(deletedResult.stdout ?? "");
102
+ const deletedFiles = new Set(deletedStdout.split("\0").filter(Boolean));
103
+ // Data-hygiene filename skips: the legacy metadata sidecar (never indexed as
104
+ // content — Chunk-8 folds it into the bundle format) plus git dot-files.
90
105
  const SKIP_FILES = new Set([".stash.json", ".gitignore", ".gitattributes"]);
91
106
  const stdout = Buffer.isBuffer(result.stdout) ? result.stdout.toString("utf8") : String(result.stdout ?? "");
92
107
  const files = stdout
93
108
  .split("\0")
94
109
  .filter((f) => f.length > 0)
110
+ .filter((f) => !deletedFiles.has(f))
95
111
  .filter((f) => !f.startsWith("..") && !path.isAbsolute(f))
96
112
  .filter((f) => {
97
113
  const dirParts = path
98
114
  .dirname(f)
99
115
  .split(/[\\/]+/)
100
116
  .filter(Boolean);
101
- return !dirParts.some((part) => SKIP_DIRS.has(part) || part.startsWith("."));
117
+ return !dirParts.some((part) => ALWAYS_SKIP_DIRS.has(part) ||
118
+ (!options.includeAllDirectories && (AKM_SKIP_DIRS.has(part) || part.startsWith("."))));
102
119
  })
103
120
  .filter((f) => !SKIP_FILES.has(path.basename(f)));
104
121
  const results = [];
122
+ let complete = true;
105
123
  for (const relFile of files) {
106
124
  const absPath = path.join(stashRoot, relFile);
107
125
  try {
@@ -111,9 +129,10 @@ function walkStashGit(stashRoot) {
111
129
  }
112
130
  catch {
113
131
  // File may have been deleted since git ls-files ran
132
+ complete = false;
114
133
  }
115
134
  }
116
- return results;
135
+ return { files: results, complete };
117
136
  }
118
137
  /**
119
138
  * Check if a directory is inside a git repository by walking up to find .git.
@@ -174,14 +193,22 @@ export function* walkMarkdownFiles(root) {
174
193
  }
175
194
  }
176
195
  /** Manual walk for non-git directories. */
177
- function walkStashManual(stashRoot) {
196
+ function walkStashManual(stashRoot, options) {
178
197
  const results = [];
198
+ let complete = true;
179
199
  const stack = [stashRoot];
180
200
  while (stack.length > 0) {
181
201
  const current = stack.pop();
182
202
  if (!current)
183
203
  continue;
184
- const entries = fs.readdirSync(current, { withFileTypes: true });
204
+ let entries;
205
+ try {
206
+ entries = fs.readdirSync(current, { withFileTypes: true });
207
+ }
208
+ catch {
209
+ complete = false;
210
+ continue;
211
+ }
185
212
  for (const entry of entries) {
186
213
  if (entry.name === ".stash.json")
187
214
  continue;
@@ -191,7 +218,8 @@ function walkStashManual(stashRoot) {
191
218
  continue;
192
219
  }
193
220
  if (entry.isDirectory()) {
194
- if (SKIP_DIRS.has(entry.name) || entry.name.startsWith("."))
221
+ if (ALWAYS_SKIP_DIRS.has(entry.name) ||
222
+ (!options.includeAllDirectories && (AKM_SKIP_DIRS.has(entry.name) || entry.name.startsWith("."))))
195
223
  continue;
196
224
  stack.push(fullPath);
197
225
  }
@@ -200,5 +228,5 @@ function walkStashManual(stashRoot) {
200
228
  }
201
229
  }
202
230
  }
203
- return results;
231
+ return { files: results, complete };
204
232
  }
@@ -14,6 +14,13 @@
14
14
  * their previous home in `builders.ts`.
15
15
  */
16
16
  import { UsageError } from "../../core/errors.js";
17
+ import { resolveModel } from "./model-aliases.js";
18
+ /** Resolve a raw dispatch model once, while preserving frozen/lowered models verbatim. */
19
+ export function resolveDispatchModel(request, profile, platform) {
20
+ if (!request.model || request.modelIsExact)
21
+ return request.model;
22
+ return resolveModel(request.model, platform, profile.modelAliases, profile.globalModelAliases);
23
+ }
17
24
  /**
18
25
  * Guard against values that start with `--`, which would be mis-interpreted as
19
26
  * CLI flags by the spawned process when used as flag values (model, systemPrompt).
@@ -14,50 +14,11 @@
14
14
  */
15
15
  import { ConfigError } from "../../core/errors.js";
16
16
  import { HARNESS_REGISTRY } from "../harnesses/index.js";
17
- // Types + shared validation helpers live in the leaf module `builder-shared.ts`
18
- // so per-harness builders (harnesses/claude/agent-builder.ts) can depend on them
19
- // without importing this file back — avoiding an init-order cycle through
20
- // BUILTIN_BUILDERS (#563). Re-exported here so existing `agent/builders` import
21
- // sites keep working.
22
- import { assertNotFlag } from "./builder-shared.js";
23
- import { resolveModel } from "./model-aliases.js";
24
- import { getBuiltinAgentProfile } from "./profiles.js";
25
- export { assertNotFlag, normalizeTools } from "./builder-shared.js";
26
- // ── Platform builders ─────────────────────────────────────────────────────────
27
- // The OpenCode builder was migrated to its harness directory in #564
28
- // (`harnesses/opencode/agent-builder.ts`) and the Claude Code builder in #563
29
- // (`harnesses/claude/agent-builder.ts`). Both are imported back into
30
- // BUILTIN_BUILDERS below so platform routing is unchanged.
31
- /**
32
- * Default builder — used for custom profiles and any platform without a
33
- * dedicated builder. Passes systemPrompt and model via the same flags as
34
- * the builtin builders so custom profiles benefit from agent asset metadata.
35
- * Tools are omitted — no standard cross-platform flag exists.
36
- */
37
- const defaultBuilder = {
38
- platform: "default",
39
- build(profile, req) {
40
- assertNotFlag(req.systemPrompt, "systemPrompt");
41
- assertNotFlag(req.model, "model");
42
- const args = [...profile.args];
43
- if (req.systemPrompt) {
44
- args.push("--system-prompt", req.systemPrompt);
45
- }
46
- if (req.model) {
47
- const resolved = resolveModel(req.model, profile.name, profile.modelAliases, profile.globalModelAliases);
48
- args.push("--model", resolved);
49
- }
50
- args.push("--");
51
- args.push(req.prompt);
52
- return { argv: [profile.bin, ...args] };
53
- },
54
- };
55
17
  // ── Registry ──────────────────────────────────────────────────────────────────
56
18
  /**
57
19
  * DERIVED from `HARNESS_REGISTRY` (P0.5 registry-drift fix): each harness that
58
- * owns an `agentBuilder` is registered under its canonical id, its
59
- * `<id>-headless` profile variant, and every alias. Previously this was a
60
- * hand-maintained map that could (and did) drift from the harness registry.
20
+ * owns an `agentBuilder` is registered under its canonical id. Named engines
21
+ * are schema-validated to canonical harness ids before reaching this boundary.
61
22
  */
62
23
  const BUILTIN_BUILDERS = (() => {
63
24
  const registry = {};
@@ -65,30 +26,18 @@ const BUILTIN_BUILDERS = (() => {
65
26
  if (!harness.agentBuilder)
66
27
  continue;
67
28
  registry[harness.id] = harness.agentBuilder;
68
- registry[`${harness.id}-headless`] = harness.agentBuilder;
69
- for (const alias of harness.aliases)
70
- registry[alias] = harness.agentBuilder;
71
29
  }
72
30
  return Object.freeze(registry);
73
31
  })();
74
32
  /**
75
33
  * Return the builder for the given platform name.
76
34
  *
77
- * A *custom* profile (unknown platform) falls back to the default builder —
78
- * that generic `--system-prompt`/`--model`/`--` shape is the documented
79
- * contract for user-defined wrappers. A *known built-in agent CLI* with no
80
- * dedicated builder (codex, gemini, aider + their `-headless` variants) is a
81
- * loud `ConfigError` instead: the default flag shape is wrong for those CLIs
82
- * (aider, for one, treats positionals as file names), so the old silent
83
- * fallback produced a broken command that "ran" and failed downstream.
84
- * Custom builders injected via tests can be passed as `registry`.
35
+ * Unknown platforms are rejected: there is no safe generic CLI flag shape.
36
+ * Custom builders injected by tests can be passed as `registry`.
85
37
  */
86
38
  export function getCommandBuilder(platform, registry = BUILTIN_BUILDERS) {
87
39
  const found = registry[platform];
88
40
  if (found)
89
41
  return found;
90
- if (getBuiltinAgentProfile(platform)) {
91
- throw new ConfigError(`agent dispatch for "${platform}" is not supported yet: no command builder exists for this CLI, and the generic flag shape would produce a broken command.`, "INVALID_CONFIG_FILE", 'Use an "opencode" or "claude" profile, or — if your CLI is flag-compatible with one of those — set `profiles.agent.<name>.commandBuilder` to "opencode" or "claude".');
92
- }
93
- return defaultBuilder;
42
+ throw new ConfigError(`Agent platform "${platform}" has no registered command builder.`, "INVALID_CONFIG_FILE", "Select a canonical agent platform in engines.<name>.platform.");
94
43
  }
@@ -1,147 +1,7 @@
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 { ConfigError } from "../../core/errors.js";
5
- import { BUILTIN_AGENT_PROFILE_NAMES, getBuiltinAgentProfile, listBuiltinAgentProfiles, } from "./profiles.js";
6
- /**
7
- * Default hard timeout for an agent CLI (60s — matches the value used in
8
- * `docs/configuration.md`).
9
- */
4
+ /** Default hard timeout for an agent CLI when neither engine nor call overrides it. */
10
5
  export const DEFAULT_AGENT_TIMEOUT_MS = 60_000;
11
- /**
12
- * Resolve the effective `AgentProfile` for `name` by merging the optional
13
- * user override (`profiles.agent[name]`) on top of the built-in profile (if
14
- * any). Returns `undefined` when neither yields a usable profile.
15
- */
16
- export function resolveAgentProfile(name, overrides, globalModelAliases) {
17
- const builtin = getBuiltinAgentProfile(name);
18
- const platform = overrides?.platform;
19
- // For opencode-sdk profiles, allow synthesizing without a built-in.
20
- const sdkMode = platform === "opencode-sdk";
21
- if (!builtin && !overrides?.bin && !sdkMode)
22
- return undefined;
23
- const base = builtin ??
24
- {
25
- name,
26
- bin: overrides?.bin ?? name,
27
- args: [],
28
- stdio: "captured",
29
- envPassthrough: [],
30
- parseOutput: "text",
31
- ...(sdkMode ? { sdkMode: true } : {}),
32
- };
33
- if (!overrides) {
34
- return globalModelAliases ? { ...base, globalModelAliases } : base;
35
- }
36
- // Per-profile aliases from config extend (and shadow) the built-in
37
- // profile's own entries. (Previously always used base.modelAliases, so the
38
- // documented `profiles.agent.<name>.modelAliases` config was silently
39
- // dropped — same bug class as the timeoutMs override below.)
40
- const modelAliases = overrides.modelAliases || base.modelAliases ? { ...base.modelAliases, ...overrides.modelAliases } : undefined;
41
- return {
42
- name,
43
- bin: overrides.bin ?? base.bin,
44
- args: overrides.args ?? base.args,
45
- stdio: base.stdio,
46
- env: base.env,
47
- envPassthrough: base.envPassthrough,
48
- // Honor a user-configured `profiles.agent.<name>.timeoutMs` override; fall
49
- // back to the built-in profile's value. (Previously always used base, so
50
- // the documented config override was silently ignored — callers had to pass
51
- // a CLI flag like `--timeout-ms`.) runAgent (spawn.ts) reads profile.timeoutMs
52
- // when no per-call timeout is supplied, so this makes the config knob work.
53
- timeoutMs: overrides.timeoutMs ?? base.timeoutMs,
54
- parseOutput: base.parseOutput,
55
- ...(sdkMode ? { sdkMode: true } : {}),
56
- model: overrides.model ?? base.model,
57
- endpoint: base.endpoint,
58
- apiKey: base.apiKey,
59
- commandBuilder: base.commandBuilder,
60
- modelAliases,
61
- ...(globalModelAliases ? { globalModelAliases } : {}),
62
- };
63
- }
64
- /**
65
- * Resolve the runnable profile for `name`, or `undefined` if none is
66
- * available (no built-in and no user override). Threads the config-root
67
- * `modelAliases` tier table onto the resolved profile.
68
- */
69
- export function resolveProfileFromConfig(name, config) {
70
- return resolveAgentProfile(name, config?.profiles?.agent?.[name], config?.modelAliases);
71
- }
72
- /**
73
- * Return the names of every agent profile available in `config` — built-ins
74
- * plus any user-defined entries under `profiles.agent`. Sorted, deduplicated.
75
- */
76
- export function listAgentProfileNames(config) {
77
- const seen = new Set(BUILTIN_AGENT_PROFILE_NAMES);
78
- for (const name of Object.keys(config?.profiles?.agent ?? {}))
79
- seen.add(name);
80
- return [...seen].sort();
81
- }
82
- /**
83
- * Resolve the default agent profile name. Order: explicit `requested` arg →
84
- * `config.defaults.agent` → undefined.
85
- */
86
- export function resolveDefaultProfileName(config, requested) {
87
- if (requested?.trim())
88
- return requested.trim();
89
- const def = config?.defaults?.agent;
90
- if (typeof def === "string" && def.trim())
91
- return def.trim();
92
- return undefined;
93
- }
94
- /**
95
- * Throw a stable `ConfigError` when the caller needs an agent profile but
96
- * none can be resolved.
97
- */
98
- export function requireAgentProfile(config, requested) {
99
- if (!config) {
100
- throw new ConfigError("agent commands are disabled: no agent configuration in config.json.", "INVALID_CONFIG_FILE", "Run `akm setup` to detect and configure an agent CLI, or add an entry under `profiles.agent` and set `defaults.agent`.");
101
- }
102
- const name = resolveDefaultProfileName(config, requested);
103
- if (!name) {
104
- throw new ConfigError("agent commands require a profile: pass --profile or set `defaults.agent` in config.json.", "INVALID_CONFIG_FILE", `Available profiles: ${listAgentProfileNames(config).join(", ")}.`);
105
- }
106
- const profile = resolveProfileFromConfig(name, config);
107
- if (!profile) {
108
- throw new ConfigError(`agent profile "${name}" is not built-in and has no \`bin\` override.`, "INVALID_CONFIG_FILE", `Define profiles.agent."${name}".bin in config.json, or pick one of: ${listAgentProfileNames(config).join(", ")}.`);
109
- }
110
- return profile;
111
- }
112
- /**
113
- * Resolve the agent profile bound to a named improve process. Reads from
114
- * `profiles.improve.default.processes.<processName>` for the profile binding,
115
- * then falls back to `defaults.agent`.
116
- */
117
- export function resolveProcessAgentProfile(processName, config) {
118
- const processEntry = config?.profiles?.improve?.default?.processes;
119
- const entry = processEntry?.[processName];
120
- const profileName = entry?.profile;
121
- const profile = requireAgentProfile(config, profileName);
122
- let resolvedTimeoutMs;
123
- if (entry?.timeoutMs === null) {
124
- resolvedTimeoutMs = null;
125
- }
126
- else if (typeof entry?.timeoutMs === "number") {
127
- resolvedTimeoutMs = entry.timeoutMs;
128
- }
129
- else if (profile.timeoutMs !== undefined) {
130
- resolvedTimeoutMs = profile.timeoutMs;
131
- }
132
- return { profile, timeoutMs: resolvedTimeoutMs };
133
- }
134
- /**
135
- * Convenience: list every fully-resolved profile (built-ins merged with
136
- * user overrides). Used by setup detection to enumerate candidates.
137
- */
138
- export function listResolvedAgentProfiles(config) {
139
- const resolved = [];
140
- const builtins = listBuiltinAgentProfiles();
141
- for (const name of listAgentProfileNames(config)) {
142
- const profile = resolveProfileFromConfig(name, config) ?? builtins[name];
143
- if (profile)
144
- resolved.push(profile);
145
- }
146
- return resolved;
147
- }
6
+ /** Default hard timeout for direct LLM calls when no engine/use override exists. */
7
+ export const DEFAULT_LLM_TIMEOUT_MS = 600_000;
@@ -15,7 +15,7 @@
15
15
  */
16
16
  import fs from "node:fs";
17
17
  import path from "node:path";
18
- import { listResolvedAgentProfiles } from "./config.js";
18
+ import { getBuiltinAgentProfile, listBuiltinAgentProfiles } from "./profiles.js";
19
19
  /**
20
20
  * Default PATH lookup. Walks `process.env.PATH` and returns the first
21
21
  * existing executable file. Returns `undefined` when the bin is not on
@@ -71,7 +71,22 @@ export function _setAgentDetectForTests(fakes) {
71
71
  export function detectAgentCliProfiles(agent, whichFn = defaultWhich) {
72
72
  if (detectOverrides?.detectAgentCliProfiles)
73
73
  return detectOverrides.detectAgentCliProfiles(agent, whichFn);
74
- const profiles = listResolvedAgentProfiles(agent);
74
+ const profilesByName = new Map(Object.values(listBuiltinAgentProfiles()).map((profile) => [profile.name, profile]));
75
+ for (const [name, engine] of Object.entries(agent?.engines ?? {})) {
76
+ if (engine.kind !== "agent")
77
+ continue;
78
+ const builtin = getBuiltinAgentProfile(engine.platform);
79
+ profilesByName.set(name, {
80
+ name,
81
+ platform: engine.platform,
82
+ bin: engine.bin ?? builtin?.bin ?? (engine.platform === "opencode-sdk" ? "opencode" : engine.platform),
83
+ args: engine.args ?? builtin?.args ?? [],
84
+ stdio: "captured",
85
+ envPassthrough: builtin?.envPassthrough ?? [],
86
+ parseOutput: "text",
87
+ });
88
+ }
89
+ const profiles = [...profilesByName.values()];
75
90
  return profiles.map((profile) => probeProfile(profile, whichFn));
76
91
  }
77
92
  function probeProfile(profile, whichFn) {