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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (587) hide show
  1. package/CHANGELOG.md +1190 -52
  2. package/README.md +62 -37
  3. package/SECURITY.md +46 -31
  4. package/dist/akm +162 -38
  5. package/dist/akm-migrate +44 -0
  6. package/dist/assets/backends/schtasks-template.xml +2 -1
  7. package/dist/assets/hints/cli-hints-full.md +268 -118
  8. package/dist/assets/hints/cli-hints-short.md +87 -24
  9. package/dist/assets/{profiles → improve-strategies}/catchup.json +3 -1
  10. package/dist/assets/{profiles → improve-strategies}/consolidate.json +3 -1
  11. package/dist/assets/{profiles → improve-strategies}/default.json +6 -7
  12. package/dist/assets/improve-strategies/frequent.json +15 -0
  13. package/dist/assets/{profiles → improve-strategies}/graph-refresh.json +4 -2
  14. package/dist/assets/{profiles → improve-strategies}/memory-focus.json +4 -1
  15. package/dist/assets/{profiles → improve-strategies}/proactive-maintenance.json +5 -5
  16. package/dist/assets/{profiles → improve-strategies}/quick.json +4 -2
  17. package/dist/assets/improve-strategies/reflect-distill.json +30 -0
  18. package/dist/assets/{profiles → improve-strategies}/thorough.json +1 -1
  19. package/dist/assets/prompts/consolidate-system.md +5 -5
  20. package/dist/assets/prompts/extract-session.md +2 -6
  21. package/dist/assets/prompts/memory-infer-user.md +2 -3
  22. package/dist/assets/prompts/reflect-llm-framed-contract.md +11 -0
  23. package/dist/assets/prompts/reflect-llm-schema-contract.md +3 -0
  24. package/dist/assets/prompts/reflect-output-repair.md +3 -0
  25. package/dist/assets/stash-skeleton/README.md +38 -10
  26. package/dist/assets/stash-skeleton/facts/conventions/assets/agent.md +8 -0
  27. package/dist/assets/stash-skeleton/facts/conventions/assets/command.md +8 -0
  28. package/dist/assets/stash-skeleton/facts/conventions/assets/fact.md +14 -1
  29. package/dist/assets/stash-skeleton/facts/conventions/assets/knowledge.md +13 -1
  30. package/dist/assets/stash-skeleton/facts/conventions/assets/lesson.md +9 -1
  31. package/dist/assets/stash-skeleton/facts/conventions/assets/memory.md +11 -0
  32. package/dist/assets/stash-skeleton/facts/conventions/assets/script.md +9 -0
  33. package/dist/assets/stash-skeleton/facts/conventions/assets/skill.md +9 -0
  34. package/dist/assets/stash-skeleton/facts/conventions/assets/workflow.md +8 -0
  35. package/dist/assets/stash-skeleton/facts/conventions/backlinks.md +100 -0
  36. package/dist/assets/stash-skeleton/facts/conventions/domains.md +64 -0
  37. package/dist/assets/stash-skeleton/facts/conventions/organization.md +136 -0
  38. package/dist/assets/tasks/core/extract.yml +3 -2
  39. package/dist/assets/tasks/core/improve.yml +2 -1
  40. package/dist/assets/tasks/core/index-refresh.yml +1 -0
  41. package/dist/assets/tasks/core/sync.yml +1 -0
  42. package/dist/assets/tasks/core/version-check.yml +2 -1
  43. package/dist/assets/tasks/improve/akm-graph-refresh-weekly.yml +5 -0
  44. package/dist/assets/tasks/improve/akm-improve-catchup.yml +8 -0
  45. package/dist/assets/tasks/improve/akm-improve-consolidate.yml +5 -0
  46. package/dist/assets/tasks/improve/akm-improve-frequent.yml +5 -0
  47. package/dist/assets/tasks/improve/akm-improve-nightly.yml +5 -0
  48. package/dist/assets/templates/html/health.html +5 -4
  49. package/dist/assets/workflows/workflow-template.md +31 -15
  50. package/dist/cli/invocation.js +279 -0
  51. package/dist/cli/parse-args.js +5 -90
  52. package/dist/cli/retired-commands.js +78 -0
  53. package/dist/cli/shared.js +158 -48
  54. package/dist/cli-node.mjs +2 -1
  55. package/dist/cli.js +747 -293
  56. package/dist/commands/agent/agent-dispatch.js +19 -18
  57. package/dist/commands/agent/agent-support.js +0 -24
  58. package/dist/commands/agent/contribute-cli.js +43 -97
  59. package/dist/commands/completions.js +80 -23
  60. package/dist/commands/config-cli.js +44 -281
  61. package/dist/commands/env/env-binding.js +13 -9
  62. package/dist/commands/env/env-cli.js +76 -159
  63. package/dist/commands/env/env.js +12 -163
  64. package/dist/commands/env/marker-path.js +6 -0
  65. package/dist/commands/env/secret-cli.js +45 -61
  66. package/dist/commands/env/secret.js +32 -62
  67. package/dist/commands/feedback-cli.js +179 -85
  68. package/dist/commands/health/accept-rate.js +58 -0
  69. package/dist/commands/health/advisories.js +7 -8
  70. package/dist/commands/health/checks.js +279 -94
  71. package/dist/commands/health/html-report.js +197 -578
  72. package/dist/commands/health/improve-metrics.js +277 -246
  73. package/dist/commands/health/llm-usage.js +19 -19
  74. package/dist/commands/health/md-report.js +16 -7
  75. package/dist/commands/health/metrics.js +67 -32
  76. package/dist/commands/health/renderers.js +47 -0
  77. package/dist/commands/health/report-view-model.js +508 -0
  78. package/dist/commands/health/stash-exposure.js +1 -1
  79. package/dist/commands/health/surfaces.js +16 -56
  80. package/dist/commands/health/task-runs.js +3 -67
  81. package/dist/{migrate-storage-node.mjs → commands/health/types-checks.js} +1 -5
  82. package/dist/commands/health/types-improve.js +29 -0
  83. package/dist/{output/text/save.js → commands/health/types-metrics.js} +1 -2
  84. package/dist/commands/health/types-result.js +7 -0
  85. package/dist/commands/health/types-runs.js +4 -0
  86. package/dist/commands/health/types-session-log.js +4 -0
  87. package/dist/commands/health/types-windows.js +4 -0
  88. package/dist/commands/health/types.js +26 -21
  89. package/dist/commands/health/windows.js +2 -3
  90. package/dist/commands/health.js +296 -167
  91. package/dist/commands/improve/anti-collapse.js +5 -5
  92. package/dist/commands/improve/autonomy-gate.js +68 -0
  93. package/dist/commands/improve/collapse-detector.js +65 -52
  94. package/dist/commands/improve/consolidate/chunking.js +9 -7
  95. package/dist/commands/improve/consolidate/eligibility.js +1 -23
  96. package/dist/commands/improve/consolidate/merge.js +4 -0
  97. package/dist/commands/improve/consolidate.js +454 -1354
  98. package/dist/commands/improve/content-hash.js +39 -0
  99. package/dist/commands/improve/distill/content-repair.js +4 -10
  100. package/dist/commands/improve/distill/promote-memory.js +89 -64
  101. package/dist/commands/improve/distill/quality-gate.js +118 -42
  102. package/dist/commands/improve/distill-guards.js +1 -1
  103. package/dist/commands/improve/distill-promotion-policy.js +33 -888
  104. package/dist/commands/improve/distill.js +607 -363
  105. package/dist/commands/improve/eligibility.js +165 -79
  106. package/dist/commands/improve/extract-cli.js +35 -126
  107. package/dist/commands/improve/extract-prompt.js +6 -35
  108. package/dist/commands/improve/extract.js +640 -391
  109. package/dist/commands/improve/feedback-valence.js +2 -12
  110. package/dist/commands/improve/improve-cli.js +134 -135
  111. package/dist/commands/improve/improve-result-file.js +30 -50
  112. package/dist/commands/improve/improve-run-types.js +4 -0
  113. package/dist/commands/improve/improve-strategies.js +135 -0
  114. package/dist/commands/improve/improve.js +904 -701
  115. package/dist/commands/improve/locks.js +64 -111
  116. package/dist/commands/improve/loop-stages.js +1110 -923
  117. package/dist/commands/improve/memory/derived-ref.js +124 -0
  118. package/dist/commands/improve/memory/memory-belief.js +79 -7
  119. package/dist/commands/improve/memory/memory-contradiction-detect.js +49 -52
  120. package/dist/commands/improve/memory/memory-improve.js +25 -37
  121. package/dist/commands/improve/outcome-loop.js +25 -88
  122. package/dist/commands/improve/preparation.js +1034 -813
  123. package/dist/commands/improve/proactive-maintenance.js +34 -9
  124. package/dist/commands/improve/proposal-envelope.js +31 -0
  125. package/dist/commands/improve/reflect.js +983 -794
  126. package/dist/commands/improve/run-context.js +119 -0
  127. package/dist/commands/improve/salience.js +24 -127
  128. package/dist/commands/improve/session-asset.js +7 -3
  129. package/dist/commands/improve/shared.js +14 -34
  130. package/dist/commands/improve/source-identity.js +28 -0
  131. package/dist/commands/improve/triage.js +20 -17
  132. package/dist/commands/lint/base-linter.js +340 -313
  133. package/dist/commands/lint/env-key-rules.js +31 -47
  134. package/dist/commands/lint/index.js +185 -30
  135. package/dist/commands/{events.js → log.js} +28 -38
  136. package/dist/commands/migrate-cli.js +54 -0
  137. package/dist/commands/migration-tool.js +55 -0
  138. package/dist/commands/observability-cli.js +70 -208
  139. package/dist/commands/proposal/diff-format.js +50 -0
  140. package/dist/commands/proposal/drain-policies.js +0 -6
  141. package/dist/commands/proposal/drain.js +91 -40
  142. package/dist/commands/proposal/proposal-cli.js +134 -132
  143. package/dist/commands/proposal/proposal-types.js +56 -0
  144. package/dist/commands/proposal/proposal.js +83 -65
  145. package/dist/commands/proposal/propose-cli.js +88 -0
  146. package/dist/commands/proposal/propose.js +105 -88
  147. package/dist/commands/proposal/repository.js +1303 -278
  148. package/dist/commands/proposal/validators/proposal-quality-validators.js +16 -6
  149. package/dist/commands/proposal/validators/proposal-validators.js +61 -12
  150. package/dist/commands/proposal/validators/proposals.js +6 -8
  151. package/dist/commands/read/curate.js +78 -73
  152. package/dist/commands/read/knowledge.js +510 -13
  153. package/dist/commands/read/registry-search.js +2 -2
  154. package/dist/commands/read/remember-cli.js +84 -15
  155. package/dist/commands/read/search-cli.js +203 -96
  156. package/dist/commands/read/search.js +126 -94
  157. package/dist/commands/read/show.js +226 -250
  158. package/dist/commands/registry-cli.js +34 -60
  159. package/dist/commands/remember.js +18 -57
  160. package/dist/commands/sources/add-cli.js +104 -49
  161. package/dist/commands/sources/bundle-cli.js +166 -0
  162. package/dist/commands/sources/bundle-config-ops.js +63 -0
  163. package/dist/commands/sources/info.js +27 -15
  164. package/dist/commands/sources/init.js +30 -40
  165. package/dist/commands/sources/installed-stashes.js +469 -172
  166. package/dist/commands/sources/schema-repair.js +10 -9
  167. package/dist/commands/sources/self-update.js +182 -121
  168. package/dist/commands/sources/source-add.js +169 -178
  169. package/dist/commands/sources/source-clone.js +144 -41
  170. package/dist/commands/sources/source-manage.js +94 -59
  171. package/dist/commands/sources/sources-cli.js +64 -205
  172. package/dist/commands/sources/stash-cli.js +91 -54
  173. package/dist/commands/sources/stash-skeleton.js +1 -1
  174. package/dist/commands/tasks/tasks-cli.js +106 -104
  175. package/dist/commands/tasks/tasks.js +445 -262
  176. package/dist/commands/workflow-cli.js +75 -228
  177. package/dist/core/action-contributors.js +1 -1
  178. package/dist/core/activation-policy.js +49 -0
  179. package/dist/core/adapter/adapters/agent-skills-adapter.js +181 -0
  180. package/dist/core/adapter/adapters/akm-adapter.js +528 -0
  181. package/dist/core/adapter/adapters/akm-lint.js +392 -0
  182. package/dist/core/adapter/adapters/akm-metadata.js +387 -0
  183. package/dist/core/adapter/adapters/akm-task-adapter.js +149 -0
  184. package/dist/core/adapter/adapters/akm-workflow-adapter.js +180 -0
  185. package/dist/core/adapter/adapters/claude-adapter.js +61 -0
  186. package/dist/core/adapter/adapters/dotenv-adapter.js +187 -0
  187. package/dist/core/adapter/adapters/generic-files-adapter.js +119 -0
  188. package/dist/core/adapter/adapters/index.js +80 -0
  189. package/dist/core/adapter/adapters/llm-wiki-adapter.js +419 -0
  190. package/dist/core/adapter/adapters/okf-adapter.js +391 -0
  191. package/dist/core/adapter/adapters/opencode-adapter.js +68 -0
  192. package/dist/core/adapter/adapters/shared.js +286 -0
  193. package/dist/core/adapter/adapters/tool-dir-shared.js +217 -0
  194. package/dist/core/adapter/adapters/website-snapshot-adapter.js +155 -0
  195. package/dist/core/adapter/bundle-adapter.js +4 -0
  196. package/dist/core/adapter/detect-adapter.js +17 -0
  197. package/dist/core/adapter/recognize-match.js +44 -0
  198. package/dist/core/adapter/registry.js +56 -0
  199. package/dist/core/adapter/types.js +4 -0
  200. package/dist/core/asset/akm-markdown.js +30 -0
  201. package/dist/core/asset/asset-placement.js +243 -0
  202. package/dist/core/asset/asset-ref.js +110 -79
  203. package/dist/core/asset/asset-serialize.js +20 -0
  204. package/dist/core/asset/frontmatter.js +28 -12
  205. package/dist/core/asset/markdown.js +40 -51
  206. package/dist/core/asset/resolve-ref.js +274 -0
  207. package/dist/core/asset/stash-meta.js +2 -2
  208. package/dist/core/bundle-id.js +51 -0
  209. package/dist/core/common.js +281 -86
  210. package/dist/core/config/config-io.js +42 -128
  211. package/dist/core/config/config-schema.js +233 -855
  212. package/dist/core/config/config-sources.js +162 -39
  213. package/dist/core/config/config-types.js +16 -11
  214. package/dist/core/config/config-version.js +29 -0
  215. package/dist/core/config/config-walker.js +126 -37
  216. package/dist/core/config/config.js +154 -331
  217. package/dist/core/config/deep-merge.js +41 -0
  218. package/dist/core/config/engine-semantics.js +28 -0
  219. package/dist/core/config/experimental.js +21 -0
  220. package/dist/core/config/schema/embedding.js +38 -0
  221. package/dist/core/config/schema/engines.js +116 -0
  222. package/dist/core/config/schema/experimental.js +47 -0
  223. package/dist/core/config/schema/feedback.js +31 -0
  224. package/dist/core/config/schema/improve-processes.js +389 -0
  225. package/dist/core/config/schema/improve.js +94 -0
  226. package/dist/core/config/schema/index-config.js +176 -0
  227. package/dist/core/config/schema/output.js +18 -0
  228. package/dist/core/config/schema/primitives.js +94 -0
  229. package/dist/core/config/schema/search.js +30 -0
  230. package/dist/core/config/schema/setup.js +18 -0
  231. package/dist/core/config/schema/sources-bundles.js +169 -0
  232. package/dist/core/config/schema/workflow.js +29 -0
  233. package/dist/core/env-secret-ref.js +155 -20
  234. package/dist/core/errors.js +17 -15
  235. package/dist/core/events-types.js +4 -0
  236. package/dist/core/events.js +46 -128
  237. package/dist/core/extra-params.js +62 -0
  238. package/dist/core/file-change.js +17 -0
  239. package/dist/core/file-lock.js +202 -57
  240. package/dist/core/fs-txn.js +392 -0
  241. package/dist/core/git-message.js +59 -0
  242. package/dist/core/improve-result.js +167 -0
  243. package/dist/core/lesson-lint.js +1 -17
  244. package/dist/core/logs-db.js +1 -1
  245. package/dist/core/maintenance-barrier.js +135 -0
  246. package/dist/core/migration-operation.js +44 -0
  247. package/dist/core/mutation-target.js +78 -0
  248. package/dist/core/paths.js +22 -25
  249. package/dist/core/platform.js +10 -0
  250. package/dist/core/recognition-util.js +128 -0
  251. package/dist/core/redaction.js +392 -0
  252. package/dist/core/standards/resolve-standards-context.js +36 -65
  253. package/dist/core/standards/resolve-stash-standards.js +2 -2
  254. package/dist/core/standards/resolve-type-conventions.js +5 -5
  255. package/dist/core/state/migrations.js +242 -11
  256. package/dist/core/state-db.js +98 -10
  257. package/dist/core/structured.js +1 -1
  258. package/dist/core/subprocess.js +303 -0
  259. package/dist/core/text-truncation.js +9 -5
  260. package/dist/core/time.js +20 -0
  261. package/dist/core/type-presentation.js +130 -0
  262. package/dist/core/warn.js +0 -3
  263. package/dist/core/write-source.js +834 -118
  264. package/dist/indexer/bundle-identity-guard.js +92 -0
  265. package/dist/indexer/db/graph-db.js +1 -25
  266. package/dist/indexer/db/llm-cache.js +1 -1
  267. package/dist/indexer/ensure-index.js +30 -9
  268. package/dist/indexer/graph/graph-boost.js +9 -30
  269. package/dist/indexer/graph/graph-extraction.js +41 -27
  270. package/dist/indexer/graph/graph-types.js +4 -0
  271. package/dist/indexer/index-writer-lock.js +93 -49
  272. package/dist/indexer/index-written-assets.js +100 -53
  273. package/dist/indexer/indexer.js +746 -329
  274. package/dist/indexer/init.js +18 -25
  275. package/dist/indexer/installations.js +142 -0
  276. package/dist/indexer/passes/dir-staleness.js +18 -10
  277. package/dist/indexer/passes/memory-inference.js +25 -15
  278. package/dist/indexer/passes/metadata.js +412 -243
  279. package/dist/indexer/scan/doc-to-entry.js +160 -0
  280. package/dist/indexer/scan/drain-dir.js +134 -0
  281. package/dist/indexer/search/db-search.js +292 -108
  282. package/dist/indexer/search/fts-query.js +64 -0
  283. package/dist/indexer/search/ranking-contributors.js +145 -25
  284. package/dist/indexer/search/ranking-types.js +4 -0
  285. package/dist/indexer/search/ranking.js +28 -71
  286. package/dist/indexer/search/search-attribution.js +67 -0
  287. package/dist/indexer/search/search-fields.js +18 -3
  288. package/dist/indexer/search/search-hit-enrichers.js +30 -40
  289. package/dist/indexer/search/search-source.js +157 -111
  290. package/dist/indexer/search/semantic-status.js +4 -1
  291. package/dist/indexer/usage/usage-events.js +10 -30
  292. package/dist/indexer/walk/file-context.js +3 -45
  293. package/dist/indexer/walk/matchers.js +42 -73
  294. package/dist/indexer/walk/path-resolver.js +11 -5
  295. package/dist/indexer/walk/walker.js +42 -14
  296. package/dist/integrations/agent/builder-shared.js +7 -0
  297. package/dist/integrations/agent/builders.js +5 -58
  298. package/dist/integrations/agent/config.js +3 -143
  299. package/dist/integrations/agent/detect.js +17 -2
  300. package/dist/integrations/agent/engine-resolution.js +231 -0
  301. package/dist/integrations/agent/index.js +1 -2
  302. package/dist/integrations/agent/model-aliases.js +8 -3
  303. package/dist/integrations/agent/profiles.js +6 -99
  304. package/dist/integrations/agent/prompts.js +46 -18
  305. package/dist/integrations/agent/runner-dispatch.js +78 -13
  306. package/dist/integrations/agent/runner.js +76 -208
  307. package/dist/integrations/agent/spawn.js +48 -279
  308. package/dist/integrations/harnesses/aider/agent-builder.js +9 -8
  309. package/dist/integrations/harnesses/aider/index.js +2 -12
  310. package/dist/integrations/harnesses/amazonq/agent-builder.js +10 -16
  311. package/dist/integrations/harnesses/amazonq/index.js +3 -17
  312. package/dist/integrations/harnesses/claude/agent-builder.js +2 -3
  313. package/dist/integrations/harnesses/claude/config-import.js +1 -3
  314. package/dist/integrations/harnesses/claude/index.js +1 -14
  315. package/dist/integrations/harnesses/claude/session-log.js +27 -75
  316. package/dist/integrations/harnesses/codex/agent-builder.js +8 -7
  317. package/dist/integrations/harnesses/codex/index.js +2 -13
  318. package/dist/integrations/harnesses/copilot/agent-builder.js +9 -9
  319. package/dist/integrations/harnesses/copilot/index.js +1 -13
  320. package/dist/integrations/harnesses/gemini/agent-builder.js +8 -9
  321. package/dist/integrations/harnesses/gemini/index.js +1 -13
  322. package/dist/integrations/harnesses/ids.js +24 -0
  323. package/dist/integrations/harnesses/index.js +31 -33
  324. package/dist/integrations/harnesses/opencode/agent-builder.js +23 -5
  325. package/dist/integrations/harnesses/opencode/config-import.js +1 -3
  326. package/dist/integrations/harnesses/opencode/index.js +1 -18
  327. package/dist/integrations/harnesses/opencode/session-log.js +67 -125
  328. package/dist/integrations/harnesses/opencode-sdk/harness.js +3 -17
  329. package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +274 -191
  330. package/dist/integrations/harnesses/openhands/agent-builder.js +12 -10
  331. package/dist/integrations/harnesses/openhands/index.js +2 -12
  332. package/dist/integrations/harnesses/pi/agent-builder.js +11 -18
  333. package/dist/integrations/harnesses/pi/index.js +3 -16
  334. package/dist/integrations/harnesses/shared.js +17 -0
  335. package/dist/integrations/harnesses/types.js +38 -34
  336. package/dist/integrations/lockfile.js +211 -24
  337. package/dist/integrations/session-logs/index.js +24 -40
  338. package/dist/integrations/session-logs/provider-base.js +113 -0
  339. package/dist/llm/client.js +182 -110
  340. package/dist/llm/embedders/deterministic.js +2 -2
  341. package/dist/llm/embedders/remote.js +21 -9
  342. package/dist/llm/feature-gate.js +17 -57
  343. package/dist/llm/graph-extract.js +12 -13
  344. package/dist/llm/index-passes.js +8 -42
  345. package/dist/llm/memory-infer.js +144 -1
  346. package/dist/llm/metadata-enhance.js +45 -30
  347. package/dist/llm/structured-call.js +16 -8
  348. package/dist/llm/usage-persist.js +30 -5
  349. package/dist/llm/usage-telemetry.js +59 -6
  350. package/dist/output/cli-hints.js +1 -2
  351. package/dist/output/command-registry.js +27 -0
  352. package/dist/output/context.js +22 -7
  353. package/dist/output/format-exempt.js +80 -0
  354. package/dist/output/generic-render.js +251 -0
  355. package/dist/output/html-render.js +11 -16
  356. package/dist/output/render-registry.js +57 -0
  357. package/dist/output/renderers.js +15 -281
  358. package/dist/output/shapes/curate.js +10 -1
  359. package/dist/output/shapes/events.js +12 -7
  360. package/dist/output/shapes/helpers.js +58 -84
  361. package/dist/output/shapes/passthrough.js +8 -40
  362. package/dist/output/shapes/proposal/producer.js +15 -7
  363. package/dist/output/shapes/registry.js +12 -6
  364. package/dist/output/shapes.js +0 -9
  365. package/dist/output/text/{init.js → bundle-create.js} +3 -1
  366. package/dist/output/text/bundle-show.js +7 -0
  367. package/dist/output/text/command-format.js +562 -0
  368. package/dist/output/text/env.js +1 -3
  369. package/dist/output/text/events.js +8 -7
  370. package/dist/output/text/helpers.js +15 -1375
  371. package/dist/output/text/proposal/producer.js +4 -2
  372. package/dist/output/text/proposal-format.js +202 -0
  373. package/dist/output/text/registry-commands.js +1 -2
  374. package/dist/output/text/registry.js +12 -6
  375. package/dist/output/text/show-directives.js +117 -0
  376. package/dist/output/text/show-format.js +103 -0
  377. package/dist/output/text/sync.js +5 -0
  378. package/dist/output/text/workflow-format.js +332 -0
  379. package/dist/output/text/workflow.js +1 -2
  380. package/dist/output/text.js +10 -19
  381. package/dist/registry/factory.js +4 -6
  382. package/dist/registry/origin-resolve.js +16 -27
  383. package/dist/registry/providers/skills-sh.js +3 -3
  384. package/dist/registry/providers/static-index.js +15 -25
  385. package/dist/registry/resolve.js +43 -94
  386. package/dist/registry/semver.js +43 -0
  387. package/dist/runtime.js +81 -12
  388. package/dist/scripts/akm-migrate.js +35529 -0
  389. package/dist/setup/detect.js +5 -7
  390. package/dist/setup/detected-engines.js +136 -0
  391. package/dist/setup/engine-config.js +100 -0
  392. package/dist/setup/registry-stash-loader.js +3 -3
  393. package/dist/setup/semantic-assets.js +12 -9
  394. package/dist/setup/setup.js +444 -208
  395. package/dist/setup/steps/connection-shared.js +120 -0
  396. package/dist/setup/steps/connection.js +108 -305
  397. package/dist/setup/steps/platforms.js +13 -12
  398. package/dist/setup/steps/semantic.js +15 -3
  399. package/dist/setup/steps/sources.js +21 -15
  400. package/dist/setup/steps/stashdir.js +6 -4
  401. package/dist/setup/steps/tasks.js +236 -119
  402. package/dist/setup/steps.js +3 -2
  403. package/dist/sources/freshness.js +39 -0
  404. package/dist/sources/provider-factory.js +11 -17
  405. package/dist/sources/providers/filesystem.js +2 -3
  406. package/dist/sources/providers/git-install.js +278 -34
  407. package/dist/sources/providers/git-provider.js +54 -56
  408. package/dist/sources/providers/git-stash.js +420 -91
  409. package/dist/sources/providers/git.js +2 -2
  410. package/dist/sources/providers/npm.js +16 -19
  411. package/dist/sources/providers/provider-utils.js +47 -22
  412. package/dist/sources/providers/sync-from-ref.js +3 -9
  413. package/dist/sources/providers/website.js +2 -2
  414. package/dist/sources/resolve.js +11 -10
  415. package/dist/sources/snapshot-fetchers/types.js +4 -0
  416. package/dist/sources/{website-ingest.js → snapshot-fetchers/website-ingest.js} +110 -41
  417. package/dist/storage/database.js +60 -4
  418. package/dist/storage/engines/sqlite-migrations.js +156 -5
  419. package/dist/storage/locations.js +1 -2
  420. package/dist/storage/repositories/canaries-repository.js +1 -1
  421. package/dist/storage/repositories/events-repository.js +51 -11
  422. package/dist/storage/repositories/improve-runs-repository.js +6 -32
  423. package/dist/storage/repositories/index-connection.js +79 -0
  424. package/dist/storage/repositories/index-db.js +4 -3
  425. package/dist/storage/repositories/index-entries-repository.js +863 -0
  426. package/dist/{indexer/db/entry-mapper.js → storage/repositories/index-entry-mapper.js} +19 -2
  427. package/dist/storage/repositories/index-entry-types.js +4 -0
  428. package/dist/storage/repositories/index-fts-repository.js +167 -0
  429. package/dist/storage/repositories/index-llm-cache-repository.js +108 -0
  430. package/dist/storage/repositories/index-meta-repository.js +49 -0
  431. package/dist/{indexer/db/schema.js → storage/repositories/index-schema.js} +226 -100
  432. package/dist/storage/repositories/index-sql.js +12 -0
  433. package/dist/storage/repositories/index-utility-repository.js +356 -0
  434. package/dist/storage/repositories/index-vec-repository.js +250 -0
  435. package/dist/storage/repositories/outcome-repository.js +119 -0
  436. package/dist/storage/repositories/proposals-repository.js +317 -75
  437. package/dist/storage/repositories/registry-cache.js +1 -1
  438. package/dist/storage/repositories/salience-repository.js +172 -0
  439. package/dist/storage/repositories/task-history-repository.js +110 -3
  440. package/dist/storage/repositories/workflow-runs-repository.js +68 -35
  441. package/dist/tasks/backends/cron.js +169 -46
  442. package/dist/tasks/backends/exec-utils.js +76 -3
  443. package/dist/tasks/backends/index.js +6 -9
  444. package/dist/tasks/backends/launchd.js +292 -55
  445. package/dist/tasks/backends/schtasks.js +557 -70
  446. package/dist/tasks/backends/types.js +4 -0
  447. package/dist/tasks/command-executable.js +93 -0
  448. package/dist/tasks/embedded.js +56 -38
  449. package/dist/tasks/parser.js +156 -64
  450. package/dist/tasks/resolve-akm-bin.js +144 -51
  451. package/dist/tasks/runner.js +377 -209
  452. package/dist/tasks/schedule.js +108 -19
  453. package/dist/tasks/scheduler-invocation.js +296 -0
  454. package/dist/tasks/schema.js +1 -1
  455. package/dist/tasks/task-id.js +35 -0
  456. package/dist/tasks/validator.js +30 -16
  457. package/dist/workflows/authoring/authoring.js +96 -148
  458. package/dist/workflows/authoring/scope-key.js +1 -1
  459. package/dist/workflows/cli.js +0 -20
  460. package/dist/workflows/concurrency-policy.js +15 -0
  461. package/dist/workflows/exec/brief.js +25 -59
  462. package/dist/workflows/exec/frozen-judge.js +47 -0
  463. package/dist/workflows/exec/native-executor.js +157 -94
  464. package/dist/workflows/exec/report.js +365 -200
  465. package/dist/workflows/exec/run-workflow.js +46 -40
  466. package/dist/workflows/exec/scheduler.js +12 -41
  467. package/dist/workflows/exec/step-work.js +239 -205
  468. package/dist/workflows/exec/workflow-engine-gate.js +67 -0
  469. package/dist/workflows/ir/compile.js +141 -283
  470. package/dist/workflows/ir/freeze.js +233 -0
  471. package/dist/workflows/ir/plan-hash.js +40 -5
  472. package/dist/workflows/ir/schema.js +537 -1
  473. package/dist/workflows/parser.js +878 -306
  474. package/dist/workflows/program/expressions.js +20 -208
  475. package/dist/workflows/program/schema.js +7 -10
  476. package/dist/workflows/renderer.js +99 -121
  477. package/dist/workflows/resource-limits.js +22 -0
  478. package/dist/workflows/runtime/checkin.js +1 -1
  479. package/dist/workflows/runtime/plan-classifier.js +131 -0
  480. package/dist/workflows/runtime/runs.js +200 -113
  481. package/dist/workflows/runtime/unit-checkin.js +1 -1
  482. package/dist/workflows/runtime/unit-phases.js +20 -0
  483. package/dist/workflows/runtime/workflow-asset-loader.js +235 -97
  484. package/dist/workflows/schema.js +1 -11
  485. package/dist/workflows/validate-summary.js +4 -26
  486. package/dist/workflows/validator.js +52 -30
  487. package/docs/README.md +42 -78
  488. package/docs/migration/README.md +8 -0
  489. package/docs/migration/release-notes/0.6.0.md +1 -1
  490. package/docs/migration/release-notes/0.7.0.md +9 -8
  491. package/docs/migration/release-notes/0.9.0.md +158 -14
  492. package/docs/migration/v0.7-to-v0.8.md +46 -47
  493. package/docs/migration/v0.8-to-v0.9.md +844 -0
  494. package/docs/reference/README.md +12 -0
  495. package/docs/reference/data-and-telemetry.md +333 -0
  496. package/package.json +21 -17
  497. package/schemas/akm-asset-envelope.json +93 -0
  498. package/schemas/akm-config.json +4636 -0
  499. package/schemas/akm-task.json +87 -0
  500. package/{dist/schemas → schemas}/akm-workflow.json +127 -82
  501. package/dist/akm-migrate-storage +0 -38
  502. package/dist/assets/help/help-accept.md +0 -12
  503. package/dist/assets/help/help-improve.md +0 -84
  504. package/dist/assets/help/help-proposals.md +0 -17
  505. package/dist/assets/help/help-propose.md +0 -17
  506. package/dist/assets/help/help-reject.md +0 -11
  507. package/dist/assets/profiles/frequent.json +0 -13
  508. package/dist/assets/profiles/recombine-only.json +0 -21
  509. package/dist/assets/profiles/reflect-distill.json +0 -30
  510. package/dist/assets/profiles/synthesize.json +0 -15
  511. package/dist/assets/prompts/procedural-system.md +0 -44
  512. package/dist/assets/prompts/recombine-system.md +0 -40
  513. package/dist/assets/prompts/staleness-detect-system.md +0 -6
  514. package/dist/assets/tasks/core/backup.yml +0 -4
  515. package/dist/assets/tasks/graph-refresh-weekly.yml +0 -10
  516. package/dist/assets/templates/html/default.html +0 -78
  517. package/dist/assets/templates/html/vendor/echarts.min.js +0 -45
  518. package/dist/assets/wiki/index-template.md +0 -12
  519. package/dist/assets/wiki/ingest-workflow-template.md +0 -83
  520. package/dist/assets/wiki/log-template.md +0 -8
  521. package/dist/assets/wiki/schema-template.md +0 -61
  522. package/dist/cli/config-migrate.js +0 -150
  523. package/dist/cli/config-validate.js +0 -39
  524. package/dist/commands/graph/graph-cli.js +0 -124
  525. package/dist/commands/graph/graph.js +0 -487
  526. package/dist/commands/improve/calibration.js +0 -161
  527. package/dist/commands/improve/dedup.js +0 -482
  528. package/dist/commands/improve/extract-watch.js +0 -140
  529. package/dist/commands/improve/hot-probation.js +0 -45
  530. package/dist/commands/improve/improve-auto-accept.js +0 -276
  531. package/dist/commands/improve/improve-profiles.js +0 -168
  532. package/dist/commands/improve/procedural.js +0 -398
  533. package/dist/commands/improve/recombine.js +0 -818
  534. package/dist/commands/improve/schema-similarity-gate.js +0 -168
  535. package/dist/commands/lint/agent-linter.js +0 -44
  536. package/dist/commands/lint/command-linter.js +0 -44
  537. package/dist/commands/lint/default-linter.js +0 -16
  538. package/dist/commands/lint/fact-linter.js +0 -39
  539. package/dist/commands/lint/knowledge-linter.js +0 -16
  540. package/dist/commands/lint/memory-linter.js +0 -61
  541. package/dist/commands/lint/registry.js +0 -41
  542. package/dist/commands/lint/skill-linter.js +0 -45
  543. package/dist/commands/lint/task-linter.js +0 -50
  544. package/dist/commands/lint/workflow-linter.js +0 -81
  545. package/dist/commands/proposal/legacy-import.js +0 -115
  546. package/dist/commands/sources/history.js +0 -196
  547. package/dist/commands/tasks/default-tasks.js +0 -186
  548. package/dist/commands/wiki-cli.js +0 -292
  549. package/dist/core/asset/asset-registry.js +0 -76
  550. package/dist/core/asset/asset-spec.js +0 -316
  551. package/dist/core/config/config-migration.js +0 -602
  552. package/dist/core/deep-merge.js +0 -38
  553. package/dist/core/eval/rank-metrics.js +0 -113
  554. package/dist/core/ripgrep/install.js +0 -163
  555. package/dist/core/ripgrep/resolve.js +0 -81
  556. package/dist/indexer/db/db.js +0 -1414
  557. package/dist/indexer/manifest.js +0 -170
  558. package/dist/indexer/passes/metadata-contributors.js +0 -31
  559. package/dist/indexer/usage/unmigrated-vaults-guard.js +0 -94
  560. package/dist/integrations/harnesses/opencode-sdk/index.js +0 -25
  561. package/dist/llm/call-ai.js +0 -62
  562. package/dist/llm/memory-infer-impl.js +0 -138
  563. package/dist/output/shapes/distill.js +0 -14
  564. package/dist/output/shapes/history.js +0 -11
  565. package/dist/output/text/distill.js +0 -6
  566. package/dist/output/text/enable-disable.js +0 -8
  567. package/dist/output/text/history.js +0 -6
  568. package/dist/output/text/wiki.js +0 -16
  569. package/dist/registry/build-index.js +0 -386
  570. package/dist/schemas/akm-config.json +0 -14225
  571. package/dist/scripts/migrate-storage.js +0 -13169
  572. package/dist/scripts/migrations/import-fs-improve-runs-to-db.js +0 -10169
  573. package/dist/scripts/migrations/v16-to-v17.js +0 -141
  574. package/dist/setup/legacy-config.js +0 -106
  575. package/dist/storage/repositories/consolidation-repository.js +0 -38
  576. package/dist/storage/repositories/recombine-repository.js +0 -213
  577. package/dist/wiki/wiki-templates.js +0 -15
  578. package/dist/wiki/wiki.js +0 -1012
  579. package/dist/workflows/authoring/workflow-program-template.yaml +0 -31
  580. package/dist/workflows/db.js +0 -350
  581. package/dist/workflows/exec/watch.js +0 -116
  582. package/dist/workflows/program/parser.js +0 -760
  583. package/dist/workflows/program/project.js +0 -105
  584. package/docs/data-and-telemetry.md +0 -227
  585. package/docs/migration/release-notes/0.9.0-beta.60.md +0 -19
  586. /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/registry.js +0 -0
  587. /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/youtube.js +0 -0
@@ -8,12 +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 { looksLikeWorkflowProgram } from "../../workflows/program/parser.js";
15
- import { WORKFLOW_PROGRAM_RENDERER_NAME } from "../../workflows/program/project.js";
16
- import { registerMatcher } from "./file-context.js";
11
+ import { SCRIPT_EXTENSIONS } from "../../core/recognition-util.js";
12
+ import { presentationFor } from "../../core/type-presentation.js";
17
13
  // ---------------------------------------------------------------------------
18
14
  // Private data
19
15
  // ---------------------------------------------------------------------------
@@ -38,6 +34,18 @@ const DIR_TYPE_MAP = [
38
34
  type: "knowledge",
39
35
  test: (ext) => ext === ".md",
40
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
+ },
41
49
  {
42
50
  dir: "workflows",
43
51
  type: "workflow",
@@ -69,7 +77,10 @@ const DIR_TYPE_MAP = [
69
77
  {
70
78
  dir: "tasks",
71
79
  type: "task",
72
- 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",
73
84
  },
74
85
  {
75
86
  // #561 — agent session assets live under `sessions/<harness>/<id>.md`.
@@ -100,6 +111,9 @@ const TYPED_DIR_DOC_FILES = new Set(["readme.md"]);
100
111
  function isTypedDirDocFile(fileName) {
101
112
  return TYPED_DIR_DOC_FILES.has(fileName.toLowerCase());
102
113
  }
114
+ function isNestedSkillResource(ctx) {
115
+ return ctx.ancestorDirs[0] === "skills" && ctx.ancestorDirs.length > 1 && ctx.fileName !== "SKILL.md";
116
+ }
103
117
  // ---------------------------------------------------------------------------
104
118
  // Private helpers
105
119
  // ---------------------------------------------------------------------------
@@ -121,7 +135,7 @@ function matchDirectoryHint(dirName, ctx, specificity) {
121
135
  return null;
122
136
  }
123
137
  function classifyByExtension(ctx) {
124
- if (ctx.fileName === "SKILL.md" && !ctx.ancestorDirs.includes("wikis")) {
138
+ if (ctx.fileName === "SKILL.md") {
125
139
  return { type: "skill", specificity: 25 };
126
140
  }
127
141
  if (SCRIPT_EXTENSIONS.has(ctx.ext)) {
@@ -130,6 +144,8 @@ function classifyByExtension(ctx) {
130
144
  return null;
131
145
  }
132
146
  function classifyByDirectory(ctx) {
147
+ if (isNestedSkillResource(ctx))
148
+ return null;
133
149
  for (const dir of ctx.ancestorDirs) {
134
150
  const result = matchDirectoryHint(dir, ctx, 10);
135
151
  if (result)
@@ -139,6 +155,8 @@ function classifyByDirectory(ctx) {
139
155
  }
140
156
  function classifyByParentDirHint(ctx) {
141
157
  const { parentDir, ext, fileName } = ctx;
158
+ if (isNestedSkillResource(ctx))
159
+ return null;
142
160
  if (parentDir === "skills" && (fileName === "SKILL.md" || ext === ".md")) {
143
161
  return { type: "skill", specificity: 15 };
144
162
  }
@@ -160,10 +178,15 @@ function classifyBySmartMd(ctx) {
160
178
  return { type: "knowledge", specificity: 5 };
161
179
  }
162
180
  const body = ctx.content();
163
- 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") {
164
188
  return { type: "workflow", specificity: 19 };
165
189
  }
166
- const fm = ctx.frontmatter();
167
190
  if (fm) {
168
191
  if ("toolPolicy" in fm || "tools" in fm) {
169
192
  return { type: "agent", specificity: 20 };
@@ -180,45 +203,6 @@ function classifyBySmartMd(ctx) {
180
203
  }
181
204
  return { type: "knowledge", specificity: 5 };
182
205
  }
183
- /** YAML workflow *programs* (redesign addendum, R1): `.yaml`/`.yml` files. */
184
- const WORKFLOW_PROGRAM_EXTENSIONS = new Set([".yaml", ".yml"]);
185
- /**
186
- * Classify YAML workflow programs. Two claims, mirroring the markdown rules:
187
- *
188
- * - any `.yaml`/`.yml` under a `workflows/` dir (the directory rule —
189
- * specificity 15 when `workflows` is the immediate parent, 10 for a
190
- * deeper ancestor, same ladder as `matchDirectoryHint`);
191
- * - anywhere else, a content probe via `looksLikeWorkflowProgram`
192
- * (`version: 1` + `steps:` at column 0) at specificity 19, the same
193
- * level as `classifyBySmartMd`'s `looksLikeWorkflow` claim.
194
- *
195
- * The fact does NOT go through `toMatchResult` — the workflow TYPE maps to
196
- * the markdown renderer by default, so this classifier names the
197
- * `workflow-program-yaml` renderer on its result directly.
198
- */
199
- function classifyByWorkflowProgram(ctx) {
200
- if (!WORKFLOW_PROGRAM_EXTENSIONS.has(ctx.ext))
201
- return null;
202
- if (isTypedDirDocFile(ctx.fileName))
203
- return null;
204
- if (ctx.parentDir === "workflows")
205
- return { type: "workflow", specificity: 15 };
206
- if (ctx.ancestorDirs.includes("workflows"))
207
- return { type: "workflow", specificity: 10 };
208
- if (looksLikeWorkflowProgram(ctx.content()))
209
- return { type: "workflow", specificity: 19 };
210
- return null;
211
- }
212
- function classifyByWiki(ctx) {
213
- if (ctx.ext !== ".md")
214
- return null;
215
- const idx = ctx.ancestorDirs.indexOf("wikis");
216
- if (idx < 0)
217
- return null;
218
- if (idx + 1 >= ctx.ancestorDirs.length)
219
- return null;
220
- return { type: "wiki", specificity: 20 };
221
- }
222
206
  // ---------------------------------------------------------------------------
223
207
  // Adapter: MatchFact → MatchResult
224
208
  // ---------------------------------------------------------------------------
@@ -226,7 +210,10 @@ function toMatchResult(ctx, classify) {
226
210
  const fact = classify(ctx);
227
211
  if (!fact)
228
212
  return null;
229
- 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;
230
217
  if (!renderer)
231
218
  return null;
232
219
  return {
@@ -251,26 +238,8 @@ export function parentDirHintMatcher(ctx) {
251
238
  export function smartMdMatcher(ctx) {
252
239
  return toMatchResult(ctx, classifyBySmartMd);
253
240
  }
254
- export function wikiMatcher(ctx) {
255
- return toMatchResult(ctx, classifyByWiki);
256
- }
257
- export function workflowProgramMatcher(ctx) {
258
- const fact = classifyByWorkflowProgram(ctx);
259
- if (!fact)
260
- return null;
261
- // Named directly (not via rendererNameFor) — see classifyByWorkflowProgram.
262
- return { type: fact.type, specificity: fact.specificity, renderer: WORKFLOW_PROGRAM_RENDERER_NAME };
263
- }
264
- const builtinMatchers = [
265
- extensionMatcher,
266
- directoryMatcher,
267
- parentDirHintMatcher,
268
- smartMdMatcher,
269
- wikiMatcher,
270
- workflowProgramMatcher,
271
- ];
272
- export function registerBuiltinMatchers() {
273
- for (const matcher of builtinMatchers) {
274
- registerMatcher(matcher);
275
- }
276
- }
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,32 +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 is a loud `ConfigError` instead: the default flag shape
81
- * is wrong for those CLIs (aider, for one, treats positionals as file names),
82
- * so the old silent fallback produced a broken command that "ran" and failed
83
- * downstream. As of the P2 harness-adapter integration every built-in profile
84
- * has a registry-derived builder, so this branch only fires if a future
85
- * builtin profile ships without one. Custom builders injected via tests can
86
- * 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`.
87
37
  */
88
38
  export function getCommandBuilder(platform, registry = BUILTIN_BUILDERS) {
89
39
  const found = registry[platform];
90
40
  if (found)
91
41
  return found;
92
- if (getBuiltinAgentProfile(platform)) {
93
- 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".');
94
- }
95
- 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.");
96
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) {