akm-cli 0.10.261012-beta → 0.10.261014-beta

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 (518) hide show
  1. package/CHANGELOG.md +710 -3
  2. package/README.md +15 -0
  3. package/SECURITY.md +11 -10
  4. package/STABILITY.md +47 -51
  5. package/dist/assets/hints/cli-hints-full.md +21 -19
  6. package/dist/assets/hints/cli-hints-short.md +3 -4
  7. package/dist/assets/opencode/akm-plugin.js +177 -0
  8. package/dist/assets/stash-skeleton/README.md +1 -1
  9. package/dist/assets/tasks/core/improve.yml +1 -1
  10. package/dist/assets/tasks/improve/akm-improve-consolidate.yml +1 -1
  11. package/dist/assets/ui/config.js +27 -10
  12. package/dist/assets/workflows/workflow-template.md +2 -2
  13. package/dist/cli/clack.js +3 -1
  14. package/dist/cli/selection.js +33 -0
  15. package/dist/cli/shared.js +14 -1
  16. package/dist/cli/unknown-flags.js +6 -37
  17. package/dist/cli.js +69 -48
  18. package/dist/commands/agent/agent-dispatch.js +17 -25
  19. package/dist/commands/agent/contribute-cli.js +9 -8
  20. package/dist/commands/command/command-cli.js +4 -8
  21. package/dist/commands/command/command-execution.js +25 -39
  22. package/dist/commands/command/execution-source-loader.js +10 -14
  23. package/dist/commands/completions.js +1 -1
  24. package/dist/commands/config-cli.js +14 -5
  25. package/dist/commands/env/child-env.js +12 -14
  26. package/dist/commands/env/env-binding.js +47 -58
  27. package/dist/commands/env/env-cli.js +22 -24
  28. package/dist/commands/env/env.js +10 -58
  29. package/dist/commands/env/secret-cli.js +11 -29
  30. package/dist/commands/env/secret.js +3 -10
  31. package/dist/commands/health/checks.js +10 -849
  32. package/dist/commands/health/connections-and-harnesses-check.js +109 -0
  33. package/dist/commands/health/egress.js +3 -3
  34. package/dist/commands/health/html-report.js +9 -10
  35. package/dist/commands/health/plugin-staleness.js +18 -11
  36. package/dist/commands/health/report-view-model.js +16 -12
  37. package/dist/commands/health/scheduler-binary.js +1 -1
  38. package/dist/commands/health/semantic-search-check.js +85 -0
  39. package/dist/commands/health/type-directory-check.js +0 -3
  40. package/dist/commands/health.js +30 -42
  41. package/dist/commands/improve/consolidate/pair-pass.js +10 -25
  42. package/dist/commands/improve/consolidate.js +10 -15
  43. package/dist/commands/improve/distill.js +5 -17
  44. package/dist/commands/improve/eligibility.js +1 -3
  45. package/dist/commands/improve/execution.js +37 -40
  46. package/dist/commands/improve/extract-cli.js +6 -11
  47. package/dist/commands/improve/extract-prompt.js +2 -2
  48. package/dist/commands/improve/extract.js +67 -97
  49. package/dist/commands/improve/improve-cli.js +22 -128
  50. package/dist/commands/improve/improve-report.js +1 -1
  51. package/dist/commands/improve/improve-strategies.js +25 -108
  52. package/dist/commands/improve/improve.js +10 -14
  53. package/dist/commands/improve/loop-stages.js +3 -0
  54. package/dist/commands/improve/memory/memory-improve.js +1 -1
  55. package/dist/commands/improve/preparation.js +8 -13
  56. package/dist/commands/improve/reflect.js +203 -332
  57. package/dist/commands/improve/retrieval-scope.js +1 -1
  58. package/dist/commands/improve/session-asset.js +3 -2
  59. package/dist/commands/improve/stage.js +87 -115
  60. package/dist/commands/lint/base-linter.js +3 -3
  61. package/dist/commands/lint/env-key-rules.js +7 -6
  62. package/dist/commands/lint/index.js +3 -3
  63. package/dist/commands/models-cli.js +103 -63
  64. package/dist/commands/proposal/drain.js +26 -39
  65. package/dist/commands/proposal/proposal-cli.js +14 -18
  66. package/dist/commands/proposal/propose-cli.js +4 -2
  67. package/dist/commands/proposal/propose.js +37 -64
  68. package/dist/commands/proposal/repository.js +17 -17
  69. package/dist/commands/proposal/validators/proposal-validators.js +3 -6
  70. package/dist/commands/read/curate.js +10 -6
  71. package/dist/commands/read/registry-search.js +2 -48
  72. package/dist/commands/read/search-cli.js +1 -8
  73. package/dist/commands/read/search.js +5 -6
  74. package/dist/commands/read/show.js +6 -29
  75. package/dist/commands/remember.js +25 -40
  76. package/dist/commands/sources/add-cli.js +8 -63
  77. package/dist/commands/sources/bundle-cli.js +8 -9
  78. package/dist/commands/sources/bundle-config-ops.js +2 -2
  79. package/dist/commands/sources/info.js +12 -1
  80. package/dist/commands/sources/init.js +1 -1
  81. package/dist/commands/sources/installed-stashes.js +119 -63
  82. package/dist/commands/sources/migration-help.js +1 -1
  83. package/dist/commands/sources/plugin-upgrade.js +8 -15
  84. package/dist/commands/sources/schema-repair.js +4 -10
  85. package/dist/commands/sources/source-add.js +2 -2
  86. package/dist/commands/sources/source-clone.js +31 -7
  87. package/dist/commands/sources/source-manage.js +4 -4
  88. package/dist/commands/targets.js +175 -0
  89. package/dist/commands/tasks/explain.js +104 -69
  90. package/dist/commands/tasks/tasks-cli.js +9 -11
  91. package/dist/commands/tasks/tasks.js +75 -97
  92. package/dist/commands/ui/api.js +11 -3
  93. package/dist/commands/ui/redact.js +5 -31
  94. package/dist/commands/ui/workspace-actions.js +1 -1
  95. package/dist/commands/workflow/plan.js +48 -9
  96. package/dist/commands/workflow-cli.js +40 -45
  97. package/dist/core/adapter/adapters/agent-skills-adapter.js +10 -11
  98. package/dist/core/adapter/adapters/akm-adapter.js +36 -41
  99. package/dist/core/adapter/adapters/akm-lint.js +10 -12
  100. package/dist/core/adapter/adapters/akm-metadata.js +2 -2
  101. package/dist/core/adapter/adapters/akm-task-adapter.js +8 -9
  102. package/dist/core/adapter/adapters/akm-workflow-adapter.js +5 -5
  103. package/dist/core/adapter/adapters/claude-adapter.js +1 -1
  104. package/dist/core/adapter/adapters/dotenv-adapter.js +7 -6
  105. package/dist/core/adapter/adapters/generic-files-adapter.js +5 -5
  106. package/dist/core/adapter/adapters/index.js +3 -4
  107. package/dist/core/adapter/adapters/llm-wiki-adapter.js +12 -14
  108. package/dist/core/adapter/adapters/okf-adapter.js +8 -10
  109. package/dist/core/adapter/adapters/opencode-adapter.js +1 -1
  110. package/dist/core/adapter/adapters/shared.js +3 -3
  111. package/dist/core/adapter/adapters/tool-dir-shared.js +7 -25
  112. package/dist/core/adapter/adapters/website-snapshot-adapter.js +3 -3
  113. package/dist/core/adapter/detect-adapter.js +1 -1
  114. package/dist/core/adapter/execution-source.js +13 -35
  115. package/dist/core/adapter/registry.js +1 -1
  116. package/dist/core/adapter/validate-context.js +2 -4
  117. package/dist/core/asset/asset-placement.js +1 -1
  118. package/dist/core/asset/asset-ref.js +3 -3
  119. package/dist/core/asset/resolve-ref.js +5 -0
  120. package/dist/core/bundle-rename.js +12 -4
  121. package/dist/core/closest-match.js +37 -0
  122. package/dist/core/common.js +37 -57
  123. package/dist/core/config/config-io.js +26 -18
  124. package/dist/core/config/config-schema.js +19 -106
  125. package/dist/core/config/config-sources.js +3 -3
  126. package/dist/core/config/config-types.js +4 -4
  127. package/dist/core/config/config-walker.js +50 -77
  128. package/dist/core/config/config.js +438 -109
  129. package/dist/core/config/convert-engine-references.js +114 -0
  130. package/dist/core/config/convert-engines-shared.js +40 -0
  131. package/dist/core/config/convert-engines.js +300 -0
  132. package/dist/core/config/convert-models-overlay.js +137 -0
  133. package/dist/core/config/credentials.js +304 -0
  134. package/dist/core/config/engine-semantics.js +3 -3
  135. package/dist/core/config/migrate-keys.js +222 -0
  136. package/dist/core/config/model-aliases.js +37 -0
  137. package/dist/core/config/models-file.js +34 -0
  138. package/dist/core/config/retired-engines.js +53 -0
  139. package/dist/core/config/schema/connections.js +41 -0
  140. package/dist/core/config/schema/embedding.js +2 -2
  141. package/dist/core/config/schema/harnesses.js +41 -0
  142. package/dist/core/config/schema/improve-processes.js +9 -28
  143. package/dist/core/config/schema/improve.js +36 -1
  144. package/dist/core/config/schema/index-config.js +18 -20
  145. package/dist/core/config/schema/primitives.js +42 -17
  146. package/dist/core/config/schema/search.js +6 -11
  147. package/dist/core/config/schema/sources-bundles.js +9 -9
  148. package/dist/core/config/schema/workflow.js +2 -6
  149. package/dist/core/config/unusable-entries.js +66 -0
  150. package/dist/core/content-safety.js +3 -6
  151. package/dist/core/endpoint-url.js +47 -0
  152. package/dist/core/env-secret-ref.js +84 -73
  153. package/dist/core/errors.js +10 -16
  154. package/dist/core/extra-params.js +3 -3
  155. package/dist/core/improve-result.js +8 -9
  156. package/dist/core/json-schema.js +1 -1
  157. package/dist/core/lesson-lint.js +1 -1
  158. package/dist/core/llm-inference.js +80 -0
  159. package/dist/core/parse.js +2 -2
  160. package/dist/core/paths.js +33 -10
  161. package/dist/core/recognition-util.js +8 -10
  162. package/dist/core/redaction.js +94 -55
  163. package/dist/core/ref-token.js +82 -0
  164. package/dist/core/secret-value.js +14 -0
  165. package/dist/core/state/migrations.js +17 -22
  166. package/dist/core/structured.js +2 -68
  167. package/dist/core/subprocess.js +63 -22
  168. package/dist/core/type-presentation.js +10 -14
  169. package/dist/core/write-source.js +20 -4
  170. package/dist/execution/input-contract.js +3 -6
  171. package/dist/execution/notices.js +49 -0
  172. package/dist/execution/resolved-request.js +24 -40
  173. package/dist/execution/source.js +21 -45
  174. package/dist/execution/target-ref.js +2 -2
  175. package/dist/indexer/bundle-identity-guard.js +6 -5
  176. package/dist/indexer/ensure-index.js +1 -1
  177. package/dist/indexer/index-writer-lock.js +1 -1
  178. package/dist/indexer/indexer.js +46 -42
  179. package/dist/indexer/installations.js +12 -22
  180. package/dist/indexer/lookup/adapter-concept-owner.js +40 -14
  181. package/dist/indexer/materialize-embeddings.js +20 -16
  182. package/dist/indexer/passes/memory-inference.js +21 -50
  183. package/dist/indexer/passes/metadata.js +5 -5
  184. package/dist/indexer/scan/doc-to-entry.js +1 -1
  185. package/dist/indexer/scan/drain-dir.js +9 -11
  186. package/dist/indexer/search/db-search.js +9 -7
  187. package/dist/indexer/search/search-source.js +42 -22
  188. package/dist/indexer/usage/usage-events.js +2 -3
  189. package/dist/indexer/walk/index-context.js +2 -1
  190. package/dist/indexer/walk/matchers.js +3 -11
  191. package/dist/indexer/walk/path-resolver.js +13 -68
  192. package/dist/indexer/walk/walker.js +32 -26
  193. package/dist/integrations/agent/akm-read-tools.js +81 -0
  194. package/dist/integrations/agent/config.js +1 -1
  195. package/dist/integrations/agent/detect.js +32 -36
  196. package/dist/integrations/agent/execution.js +130 -428
  197. package/dist/integrations/agent/index.js +1 -1
  198. package/dist/integrations/agent/profiles.js +24 -28
  199. package/dist/integrations/agent/prompts.js +17 -30
  200. package/dist/integrations/agent/request-lowering.js +67 -101
  201. package/dist/integrations/agent/resolution.js +332 -0
  202. package/dist/integrations/agent/runner-dispatch.js +156 -181
  203. package/dist/integrations/agent/runner.js +20 -70
  204. package/dist/integrations/agent/runtime-port.js +4 -0
  205. package/dist/integrations/agent/runtime.js +10 -0
  206. package/dist/integrations/agent/spawn.js +65 -190
  207. package/dist/integrations/harnesses/aider/index.js +19 -39
  208. package/dist/integrations/harnesses/amazonq/index.js +17 -32
  209. package/dist/integrations/harnesses/claude/index.js +59 -28
  210. package/dist/integrations/harnesses/claude/session-log.js +7 -5
  211. package/dist/integrations/harnesses/codex/index.js +19 -31
  212. package/dist/integrations/harnesses/copilot/index.js +17 -35
  213. package/dist/integrations/harnesses/gemini/index.js +18 -34
  214. package/dist/integrations/harnesses/harness.js +36 -0
  215. package/dist/integrations/harnesses/index.js +20 -51
  216. package/dist/integrations/harnesses/opencode/agent-builder.js +132 -100
  217. package/dist/integrations/harnesses/opencode/index.js +11 -33
  218. package/dist/integrations/harnesses/opencode/roots.js +50 -0
  219. package/dist/integrations/harnesses/opencode/runtime/binary.js +206 -0
  220. package/dist/integrations/harnesses/opencode/runtime/command.js +152 -0
  221. package/dist/integrations/harnesses/opencode/runtime/index.js +177 -0
  222. package/dist/integrations/harnesses/opencode/runtime/tar.js +107 -0
  223. package/dist/integrations/harnesses/opencode/session-log-v1.js +15 -7
  224. package/dist/integrations/harnesses/opencode/session-log-v2.js +72 -48
  225. package/dist/integrations/harnesses/opencode/session-log.js +58 -137
  226. package/dist/integrations/harnesses/opencode/version.js +34 -53
  227. package/dist/integrations/harnesses/openhands/index.js +13 -37
  228. package/dist/integrations/harnesses/pi/index.js +21 -32
  229. package/dist/integrations/lockfile.js +1 -1
  230. package/dist/integrations/session-logs/index.js +11 -31
  231. package/dist/llm/client.js +93 -111
  232. package/dist/llm/embedder.js +19 -34
  233. package/dist/llm/embedders/connection.js +31 -0
  234. package/dist/llm/embedders/local-model-files.js +56 -0
  235. package/dist/llm/embedders/local.js +146 -115
  236. package/dist/llm/embedders/remote.js +26 -23
  237. package/dist/llm/embedders/types.js +1 -1
  238. package/dist/llm/index-passes.js +33 -39
  239. package/dist/llm/memory-infer.js +67 -77
  240. package/dist/llm/model-list.js +35 -0
  241. package/dist/llm/rerank-client.js +8 -14
  242. package/dist/llm/structured-call.js +45 -99
  243. package/dist/llm/structured.js +60 -0
  244. package/dist/output/renderers.js +2 -8
  245. package/dist/output/shapes/helpers.js +18 -44
  246. package/dist/output/shapes/passthrough.js +1 -0
  247. package/dist/output/shapes.js +1 -7
  248. package/dist/output/text/command-format.js +41 -39
  249. package/dist/output/text/health-format.js +8 -2
  250. package/dist/output/text/helpers.js +1 -1
  251. package/dist/output/text/migrate.js +12 -0
  252. package/dist/output/text/models.js +3 -2
  253. package/dist/output/text/registry-commands.js +1 -2
  254. package/dist/output/text/show-directives.js +16 -28
  255. package/dist/output/text/show-format.js +0 -2
  256. package/dist/output/text/targets-table.js +70 -0
  257. package/dist/output/text/workflow-format.js +44 -15
  258. package/dist/output/text.js +1 -1
  259. package/dist/registry/providers/skills-sh.js +1 -28
  260. package/dist/registry/providers/static-index.js +1 -71
  261. package/dist/runtime.js +6 -2
  262. package/dist/scripts/akm-migrate-node.js +47095 -44905
  263. package/dist/scripts/akm-migrate.js +46946 -44755
  264. package/dist/setup/detect.js +28 -273
  265. package/dist/setup/endpoint.js +36 -0
  266. package/dist/setup/semantic-assets.js +13 -19
  267. package/dist/setup/setup-flags.js +77 -0
  268. package/dist/setup/setup-plan.js +144 -0
  269. package/dist/setup/setup.js +134 -358
  270. package/dist/setup/steps/connection-shared.js +49 -101
  271. package/dist/setup/steps/connection.js +121 -524
  272. package/dist/setup/steps/embeddings.js +151 -0
  273. package/dist/setup/steps/harnesses.js +118 -0
  274. package/dist/setup/steps/platforms.js +2 -81
  275. package/dist/setup/steps/tasks.js +1 -2
  276. package/dist/setup/steps.js +10 -0
  277. package/dist/setup/summary.js +67 -0
  278. package/dist/sources/freshness.js +16 -21
  279. package/dist/sources/providers/git-provider.js +2 -9
  280. package/dist/sources/providers/provider-utils.js +13 -5
  281. package/dist/sources/resolve.js +12 -16
  282. package/dist/sources/snapshot-fetchers/robots.js +11 -12
  283. package/dist/sources/snapshot-fetchers/secret-seam.js +2 -4
  284. package/dist/sources/snapshot-fetchers/website-ingest.js +8 -15
  285. package/dist/sources/snapshot-fetchers/x.js +1 -1
  286. package/dist/standalone/onnxruntime-library.js +52 -0
  287. package/dist/storage/repositories/improve-ledger-repository.js +1 -1
  288. package/dist/storage/repositories/improve-runs-repository.js +0 -13
  289. package/dist/storage/repositories/index-entries-repository.js +2 -2
  290. package/dist/storage/repositories/proposals-repository.js +2 -2
  291. package/dist/storage/repositories/task-history-repository.js +2 -2
  292. package/dist/storage/repositories/workflow-runs-repository.js +44 -129
  293. package/dist/storage/sqlite-read-snapshot.js +33 -29
  294. package/dist/tasks/embedded.js +1 -1
  295. package/dist/tasks/log-redaction.js +7 -119
  296. package/dist/tasks/prepare/prepare-support.js +8 -7
  297. package/dist/tasks/prepare/prepare.js +8 -9
  298. package/dist/tasks/prepare/script-capture.js +9 -25
  299. package/dist/tasks/run/attempt-lifecycle.js +17 -35
  300. package/dist/tasks/run/load-task.js +54 -27
  301. package/dist/tasks/run/run-command-task.js +15 -10
  302. package/dist/tasks/run/run-native-task.js +8 -21
  303. package/dist/tasks/run/run-task.js +5 -8
  304. package/dist/tasks/run/run-workflow-task.js +14 -21
  305. package/dist/tasks/run/task-history.js +9 -17
  306. package/dist/tasks/run/task-log.js +1 -5
  307. package/dist/tasks/scheduler-invocation.js +13 -18
  308. package/dist/tasks/scheduler-sync.js +0 -1
  309. package/dist/tasks/source/bounded-document.js +31 -117
  310. package/dist/tasks/source/parse-task-source.js +0 -1
  311. package/dist/tasks/source/project-v4.js +5 -3
  312. package/dist/tasks/source/task-input-diagnostics.js +3 -4
  313. package/dist/tasks/source/task-source-v4.js +48 -72
  314. package/dist/tasks/source-v3.js +2 -5
  315. package/dist/tasks/task-run-reserved-flags.js +1 -2
  316. package/dist/workflows/authoring/authoring.js +2 -7
  317. package/dist/workflows/compile.js +1 -15
  318. package/dist/workflows/concurrency-policy.js +4 -4
  319. package/dist/workflows/exec/child-workflow.js +1 -4
  320. package/dist/workflows/exec/dispatch-redaction.js +35 -86
  321. package/dist/workflows/exec/environment.js +13 -77
  322. package/dist/workflows/exec/exec-unit.js +14 -55
  323. package/dist/workflows/exec/frozen-judge.js +26 -28
  324. package/dist/workflows/exec/native-executor.js +126 -71
  325. package/dist/workflows/exec/run-workflow.js +38 -42
  326. package/dist/workflows/exec/step-work.js +13 -17
  327. package/dist/workflows/exec/unit-dispatch.js +7 -21
  328. package/dist/workflows/freeze/environment.js +14 -119
  329. package/dist/workflows/freeze/freeze.js +14 -33
  330. package/dist/workflows/freeze/step-values.js +6 -13
  331. package/dist/workflows/freeze/targets/child-workflow.js +3 -5
  332. package/dist/workflows/freeze/targets/command.js +9 -15
  333. package/dist/workflows/freeze/targets/shell.js +0 -3
  334. package/dist/workflows/freeze/task-bindings.js +0 -1
  335. package/dist/workflows/parser.js +50 -59
  336. package/dist/workflows/plan.js +8 -2
  337. package/dist/workflows/renderer.js +83 -9
  338. package/dist/workflows/resource-limits.js +2 -2
  339. package/dist/workflows/runtime/run-plan.js +38 -23
  340. package/dist/workflows/runtime/runs.js +55 -93
  341. package/dist/workflows/runtime/workflow-asset-loader.js +55 -86
  342. package/dist/workflows/source-files.js +7 -19
  343. package/docs/README.md +10 -16
  344. package/docs/architecture/README.md +2 -37
  345. package/docs/architecture/adapters.md +2 -2
  346. package/docs/architecture/akm-core-principles.md +256 -118
  347. package/docs/architecture/architecture.md +283 -99
  348. package/docs/architecture/improvement.md +8 -2
  349. package/docs/architecture/internals/classification.md +1 -3
  350. package/docs/architecture/internals/fresh-host-rebuild-runbook.md +7 -6
  351. package/docs/architecture/internals/health-advisories.md +35 -74
  352. package/docs/architecture/internals/improve-workflow.md +27 -26
  353. package/docs/architecture/internals/indexing.md +3 -3
  354. package/docs/architecture/internals/storage-locations.md +48 -15
  355. package/docs/architecture/persisted-data-compat.md +10 -6
  356. package/docs/architecture/specs/okf-support.md +9 -11
  357. package/docs/architecture/specs/ref.md +7 -9
  358. package/docs/architecture/testing/testing-workflow.md +172 -52
  359. package/docs/architecture/workflow-engine.md +51 -34
  360. package/docs/guides/README.md +0 -1
  361. package/docs/guides/author-bundles.md +15 -20
  362. package/docs/guides/author-workflows.md +93 -71
  363. package/docs/guides/bundles.md +20 -16
  364. package/docs/guides/discover-and-load.md +1 -1
  365. package/docs/guides/getting-started.md +49 -3
  366. package/docs/guides/improve-the-library.md +10 -4
  367. package/docs/guides/recipes/headless-install.md +11 -16
  368. package/docs/guides/run-workflows.md +29 -20
  369. package/docs/guides/scheduling.md +2 -2
  370. package/docs/guides/use-with-any-agent.md +20 -22
  371. package/docs/integration/bundling-akm.md +19 -9
  372. package/docs/maintainers/README.md +2 -6
  373. package/docs/maintainers/release-checklist.md +73 -126
  374. package/docs/migration/README.md +10 -3
  375. package/docs/migration/release-notes/0.10.0.md +81 -16
  376. package/docs/migration/release-notes/0.6.0.md +1 -1
  377. package/docs/migration/release-notes/0.7.0.md +1 -1
  378. package/docs/migration/release-notes/0.9.0.md +1 -1
  379. package/docs/migration/release-notes/README.md +1 -1
  380. package/docs/migration/v0.9-to-v0.10.md +300 -60
  381. package/docs/migration/v0.9.1-to-v0.9.2.md +6 -5
  382. package/docs/posts/config-v2-lessons-16.md +1 -1
  383. package/docs/posts/llm-mode-reflect-13.md +1 -1
  384. package/docs/posts/release-0.6.0.md +11 -11
  385. package/docs/posts/release-0.8.0.md +4 -4
  386. package/docs/posts/workflows-vaults-09.md +1 -1
  387. package/docs/reference/README.md +1 -1
  388. package/docs/reference/asset-types.md +2 -2
  389. package/docs/reference/cli.md +477 -388
  390. package/docs/reference/configuration.md +569 -550
  391. package/docs/reference/data-and-telemetry.md +9 -6
  392. package/docs/reference/env-and-secrets.md +72 -15
  393. package/docs/reference/refs.md +3 -20
  394. package/docs/reference/registry.md +12 -38
  395. package/docs/reference/supported-formats.md +1 -1
  396. package/docs/reference/tasks.md +22 -11
  397. package/docs/reference/ui-api.md +14 -9
  398. package/docs/reference/workflow-schema.md +199 -154
  399. package/docs/reference/workflows.md +4 -6
  400. package/package.json +9 -11
  401. package/schemas/akm-config.json +1696 -2922
  402. package/schemas/akm-task.json +4 -4
  403. package/schemas/akm-workflow.json +36 -9
  404. package/ROADMAP.md +0 -112
  405. package/dist/assets/models.json +0 -35
  406. package/dist/commands/health/engine-usage.js +0 -45
  407. package/dist/commands/sources/dangerous-env-audit.js +0 -134
  408. package/dist/core/activation-policy.js +0 -67
  409. package/dist/core/config/schema/engines.js +0 -160
  410. package/dist/core/config/schema/execution.js +0 -23
  411. package/dist/core/spawn-env.js +0 -268
  412. package/dist/execution/directory-identity.js +0 -78
  413. package/dist/integrations/agent/builder-shared.js +0 -33
  414. package/dist/integrations/agent/builders.js +0 -43
  415. package/dist/integrations/agent/engine-fallback.js +0 -59
  416. package/dist/integrations/agent/engine-resolution.js +0 -333
  417. package/dist/integrations/agent/model-map.js +0 -475
  418. package/dist/integrations/harnesses/aider/agent-builder.js +0 -107
  419. package/dist/integrations/harnesses/aider/result-extractor.js +0 -53
  420. package/dist/integrations/harnesses/amazonq/agent-builder.js +0 -138
  421. package/dist/integrations/harnesses/amazonq/result-extractor.js +0 -48
  422. package/dist/integrations/harnesses/claude/agent-builder.js +0 -106
  423. package/dist/integrations/harnesses/claude/config-import.js +0 -67
  424. package/dist/integrations/harnesses/claude/result-extractor.js +0 -67
  425. package/dist/integrations/harnesses/codex/agent-builder.js +0 -150
  426. package/dist/integrations/harnesses/codex/result-extractor.js +0 -110
  427. package/dist/integrations/harnesses/copilot/agent-builder.js +0 -117
  428. package/dist/integrations/harnesses/copilot/result-extractor.js +0 -178
  429. package/dist/integrations/harnesses/gemini/agent-builder.js +0 -114
  430. package/dist/integrations/harnesses/gemini/result-extractor.js +0 -149
  431. package/dist/integrations/harnesses/opencode/config-import.js +0 -149
  432. package/dist/integrations/harnesses/opencode/model-config.js +0 -33
  433. package/dist/integrations/harnesses/opencode/model-work-agent.js +0 -115
  434. package/dist/integrations/harnesses/opencode/session-log-types.js +0 -12
  435. package/dist/integrations/harnesses/opencode-sdk/index.js +0 -44
  436. package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +0 -1052
  437. package/dist/integrations/harnesses/opencode-sdk/v1-adapter.js +0 -199
  438. package/dist/integrations/harnesses/opencode-sdk/v2-adapter.js +0 -254
  439. package/dist/integrations/harnesses/opencode-sdk/wire.js +0 -66
  440. package/dist/integrations/harnesses/openhands/agent-builder.js +0 -120
  441. package/dist/integrations/harnesses/openhands/result-extractor.js +0 -135
  442. package/dist/integrations/harnesses/pi/agent-builder.js +0 -89
  443. package/dist/integrations/harnesses/pi/result-extractor.js +0 -168
  444. package/dist/integrations/harnesses/shared.js +0 -18
  445. package/dist/integrations/harnesses/types.js +0 -55
  446. package/dist/llm/feature-gate.js +0 -115
  447. package/dist/output/shapes/models-list.js +0 -16
  448. package/dist/output/shapes/registry-search.js +0 -10
  449. package/dist/setup/detected-engines.js +0 -136
  450. package/dist/setup/engine-config.js +0 -97
  451. package/dist/setup/harness-config-import.js +0 -47
  452. package/dist/setup/providers.js +0 -14
  453. package/dist/setup/steps/semantic.js +0 -39
  454. package/dist/workflows/authoring/scope-key.js +0 -79
  455. package/dist/workflows/exec/lowering-notices.js +0 -23
  456. package/dist/workflows/source-semantics.js +0 -110
  457. package/docs/architecture/0.10-process-rules.md +0 -832
  458. package/docs/architecture/akm-architecture-decision-history.md +0 -2055
  459. package/docs/architecture/comparisons/claude-code-vs-akm-workflows-full.md +0 -550
  460. package/docs/architecture/decisions/0001-no-interpolation-attached-structured-context.md +0 -72
  461. package/docs/architecture/decisions/0002-unit-reuse-and-input-hash-scope.md +0 -142
  462. package/docs/architecture/decisions/0003-child-env-allowlist-and-provenance.md +0 -189
  463. package/docs/architecture/decisions/0004-task-input-contract-and-flag-coercion.md +0 -97
  464. package/docs/architecture/decisions/0005-task-result-vocabulary-and-legacy-read-mapping.md +0 -108
  465. package/docs/architecture/decisions/0006-task-source-version-routing.md +0 -124
  466. package/docs/architecture/decisions/0007-workflow-composition-bounds.md +0 -83
  467. package/docs/architecture/decisions/0008-task-binding-normalization.md +0 -88
  468. package/docs/architecture/decisions/0009-child-run-publication-column-parity.md +0 -80
  469. package/docs/architecture/decisions/0010-driver-protocol-cut.md +0 -36
  470. package/docs/architecture/decisions/0011-engine-run-loop-invariants.md +0 -125
  471. package/docs/architecture/decisions/README.md +0 -62
  472. package/docs/architecture/internals/functional-contract-patterns.md +0 -340
  473. package/docs/architecture/internals/registry-network-boundary.md +0 -57
  474. package/docs/architecture/internals/search.md +0 -248
  475. package/docs/architecture/reviews/env-secret-access.md +0 -319
  476. package/docs/architecture/runtime-boundary-design.md +0 -153
  477. package/docs/architecture/specs/0.9.0-close-out-plan.md +0 -361
  478. package/docs/architecture/specs/0.9.0-decisions.md +0 -532
  479. package/docs/architecture/specs/0.9.0-docs-code-drift-register.md +0 -745
  480. package/docs/architecture/specs/0.9.0-open-items-register.md +0 -135
  481. package/docs/architecture/specs/0.9.0-public-api-issue-backlog.md +0 -740
  482. package/docs/architecture/specs/0.9.0-release-surface-review.md +0 -636
  483. package/docs/architecture/specs/agent-command-engine-model-design.md +0 -513
  484. package/docs/architecture/specs/akm-0.9.0-bundle-adapter-spec.md +0 -501
  485. package/docs/architecture/specs/akm-0.9.0-ref-grammar-decision.md +0 -291
  486. package/docs/architecture/specs/akm-format-neutral-bundle-workspace-spec.md +0 -2059
  487. package/docs/architecture/specs/di-seams-plan.md +0 -539
  488. package/docs/architecture/specs/driver-protocol-keep-or-cut.md +0 -275
  489. package/docs/architecture/specs/fact-asset-type.md +0 -142
  490. package/docs/architecture/specs/improve-collapse-churn-detector-design.md +0 -634
  491. package/docs/architecture/specs/reviews/task-workflow-unification/README.md +0 -72
  492. package/docs/architecture/specs/reviews/task-workflow-unification/findings-consolidated.md +0 -152
  493. package/docs/architecture/specs/reviews/task-workflow-unification/library-eval-alternatives.md +0 -352
  494. package/docs/architecture/specs/reviews/task-workflow-unification/library-eval-bunqueue.md +0 -300
  495. package/docs/architecture/specs/reviews/task-workflow-unification/library-eval-openworkflow.md +0 -402
  496. package/docs/architecture/specs/reviews/task-workflow-unification/opus-review-1.md +0 -758
  497. package/docs/architecture/specs/reviews/task-workflow-unification/opus-review-2.md +0 -645
  498. package/docs/architecture/specs/reviews/task-workflow-unification/opus-review-3.md +0 -602
  499. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-adversarial.md +0 -27
  500. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-architecture.md +0 -27
  501. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-coverage.md +0 -74
  502. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-security.md +0 -15
  503. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r2-adversarial.md +0 -132
  504. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r2-verification.md +0 -147
  505. package/docs/architecture/specs/stash-conventions-code-spec.md +0 -275
  506. package/docs/architecture/specs/stash-organization-conventions.md +0 -377
  507. package/docs/architecture/specs/task-workflow-format-unification.md +0 -721
  508. package/docs/architecture/specs/workflow-engine-buy-vs-build.md +0 -231
  509. package/docs/architecture/specs/workflow-format-unification.md +0 -432
  510. package/docs/architecture/testing/manual-testing-checklist.md +0 -3411
  511. package/docs/architecture/testing/okf-v0.2-conformance-runbook.md +0 -924
  512. package/docs/architecture/testing/task-workflow-manual-tests.md +0 -1720
  513. package/docs/guides/claude-code-vs-akm-workflows.md +0 -29
  514. package/docs/guides/knowledge-management.md +0 -18
  515. package/docs/maintainers/curate-workmap.md +0 -335
  516. package/docs/migration/v0.5-to-v0.6.md +0 -759
  517. package/docs/migration/v0.7-to-v0.8.md +0 -1378
  518. package/docs/plans/0.9.2-agent-command-workflow-plan.md +0 -423
@@ -1,340 +0,0 @@
1
- # Functional Contract Patterns
2
-
3
- Quick reference for the repeated design patterns used in akm's refactor away
4
- from type-centric behavior.
5
-
6
- ---
7
-
8
- ## 1. Core Rule
9
-
10
- Model behavior around core processes, not around one large `asset type` object.
11
-
12
- Use:
13
-
14
- - `type` as data
15
- - small contracts as extension seams
16
- - fixed-stage pipelines as orchestrators
17
-
18
- Do not use:
19
-
20
- - one mega interface with many optional methods
21
- - open-ended plugin graphs
22
- - process logic hidden behind global type switches
23
-
24
- ---
25
-
26
- ## 2. Repeated Pattern
27
-
28
- For each process:
29
-
30
- 1. define a small context object
31
- 2. define a narrow contributor interface
32
- 3. register ordered contributors
33
- 4. let each contributor decide `appliesTo(...)`
34
- 5. keep one central orchestrator for stage order
35
-
36
- This is the standard pattern to repeat across the codebase.
37
-
38
- Contributor invariants:
39
-
40
- 1. registration is static and in-process only
41
- 2. ordering is deterministic
42
- 3. composition semantics are declared once per seam
43
- 4. execution is sequential by default
44
- 5. contributors do not dispatch into other registries directly
45
- 6. if a seam needs more machinery than this, it is probably too abstract
46
-
47
- ---
48
-
49
- ## 3. Pattern Catalog
50
-
51
- ## 3.1 Fixed-Stage Pipeline
52
-
53
- Use when a process already has a clear top-down flow.
54
-
55
- Examples:
56
-
57
- - search
58
- - improve
59
- - indexing
60
-
61
- Shape:
62
-
63
- ```ts
64
- for (const stage of stages) {
65
- for (const contributor of contributorsFor(stage)) {
66
- if (!contributor.appliesTo(ctx)) continue;
67
- contributor.run(ctx);
68
- }
69
- }
70
- ```
71
-
72
- Why:
73
-
74
- - preserves readability
75
- - makes order explicit
76
- - prevents plugin soup
77
-
78
- ---
79
-
80
- ## 3.2 Ordered Contributor Registry
81
-
82
- Use when one stage needs several isolated policies.
83
-
84
- Examples:
85
-
86
- - ranking signals
87
- - proposal validators
88
-
89
- Shape:
90
-
91
- ```ts
92
- interface Contributor<TContext> {
93
- name: string;
94
- order?: number;
95
- appliesTo?(ctx: TContext): boolean;
96
- }
97
- ```
98
-
99
- Why:
100
-
101
- - testable in isolation
102
- - easy to add behavior without editing the orchestrator
103
-
104
- ---
105
-
106
- ## 3.3 Structural Contract
107
-
108
- Use for stable physical concerns such as refs and paths.
109
-
110
- Example:
111
-
112
- - `PathResolver`
113
-
114
- Why:
115
-
116
- - storage layout is real and durable
117
- - should not be mixed with ranking, rendering, or validation
118
-
119
- Rule:
120
-
121
- - keep structural contracts small and boring
122
-
123
- ---
124
-
125
- ## 3.4 Classification As Facts
126
-
127
- Classification should produce facts, not choose downstream behavior too early.
128
-
129
- Good output:
130
-
131
- - `type`
132
- - `specificity`
133
- - annotations or reasons
134
-
135
- Avoid:
136
-
137
- - coupling classification directly to renderer names or search policy
138
-
139
- ---
140
-
141
- ## 3.5 Process-Local Validation
142
-
143
- Validation belongs to the process that needs it.
144
-
145
- Examples:
146
-
147
- - proposal validation
148
- - lint validation
149
- - improve preflight validation
150
-
151
- Avoid one shared validator that tries to know every process.
152
-
153
- ---
154
-
155
- ## 3.6 One Pipeline, Many Signals
156
-
157
- Search must remain one pipeline.
158
-
159
- Use contributors for:
160
-
161
- - exact-match boosts
162
- - type preference boosts
163
- - belief-state boosts
164
- - graph boosts
165
- - utility boosts
166
-
167
- Do not create separate per-type scoring pipelines.
168
-
169
- ---
170
-
171
- ## 3.7 Adapters Before Rewrites
172
-
173
- First move existing behavior behind the new seam.
174
-
175
- Only after parity is proven should behavior be reorganized.
176
-
177
- Why:
178
-
179
- - lower risk
180
- - easier regression testing
181
- - architectural progress without feature churn
182
-
183
- ---
184
-
185
- ## 3.8 Refactor-Only Safety Rule
186
-
187
- When the work is explicitly architectural cleanup:
188
-
189
- - no functionality changes
190
- - all tests must pass with the same validation expectations
191
- - the only allowed test edits are import-path or symbol-import updates caused by file moves
192
- - do not rewrite assertions, fixtures, or expected outputs to accommodate the refactor
193
-
194
- This keeps architectural cleanup separate from feature or bug-fix work.
195
-
196
- ---
197
-
198
- ## 3.8a Non-goals
199
-
200
- This pattern guide is **not** permission to:
201
-
202
- 1. build a framework
203
- 2. add complexity for its own sake
204
- 3. create registries everywhere by default
205
- 4. replace simple code with abstract dispatch when no real hotspot exists
206
- 5. introduce dynamic plugin systems or runtime discovery
207
- 6. change runtime behavior under the banner of refactoring
208
-
209
- The purpose of these patterns is to remove concrete duplication and switchboard logic while keeping the system simpler to reason about than it is today.
210
-
211
- ---
212
-
213
- ## 3.9 Execution Pipeline Contract
214
-
215
- Every execution crosses the same plain functions:
216
-
217
- 1. `resolveExecution()` selects the engine (nearest layer, `defaults.engine`,
218
- then the `opencode-sdk` fallback), merges the engine's defaults with the
219
- caller's layers (nearest wins), expands a `models.json` alias once,
220
- authorizes tools against `execution.allowedTools`, and returns the
221
- `ResolvedExecutionRequestV1`, the engine's `RunnerSpec` with the request
222
- applied, and per-field provenance. Credentials stay symbolic.
223
- 2. `buildExecution()` hands the request to the harness's own builder (derived
224
- from `HARNESS_REGISTRY`), or builds chat messages for a direct LLM. A field
225
- the transport cannot carry becomes a secret-free notice; a tool policy it
226
- cannot enforce, or a denied tool selection, is a pre-dispatch error.
227
- 3. `buildExecutionFromWire()` does the same from a journaled
228
- `{ request, runner }` without reading config, aliases, environment
229
- variables, or credentials — workflow resume.
230
- 4. `runExecution()` reads credentials for the call, runs the agent CLI, the
231
- OpenCode SDK, or the chat transport (an exhaustive switch over
232
- `llm | agent | sdk`), and redacts every secret the child could have seen.
233
-
234
- A prompt-free interactive native-agent launch (`akm agent`) resolves its
235
- engine directly; it carries no request to build.
236
-
237
- Diagnostic provenance is field metadata (`field`, `layer`, `kind`, `via`), not
238
- resolved values or content. Lowering notices are secret-free records with a
239
- fixed public vocabulary; arbitrary authored inference keys are represented by
240
- wildcard field names rather than copied into diagnostics.
241
-
242
- ---
243
-
244
- ## 3.10 Session Log Harness Contract
245
-
246
- Use one narrow raw-event ingestion seam for harness logs and session histories.
247
-
248
- Rule:
249
-
250
- 1. harness adapters discover files and parse raw events
251
- 2. shared AKM logic performs normalization, fingerprinting, aggregation, and de-duplication
252
- 3. new harnesses should not require edits to shared unions or duplicated aggregation logic
253
-
254
- ---
255
-
256
- ## 4. Implemented Contracts
257
-
258
- **[0.9.0 change, ruled Q-06/Q-16]** This section previously listed twelve
259
- "recommended" contracts; seven had no implementation anywhere in `src/`
260
- (`PathResolver`, `MatchContributor`, `MetadataContributor`,
261
- `LintContributor`, `ImproveContributor`, `IndexPostProcessor`,
262
- `AgentRunner`) and were aspirational, not a contract any code followed.
263
- Trimmed to the contributor contracts below. `SearchHitEnricher` and
264
- `ActionContributor` were later folded into direct calls
265
- (`src/indexer/search/search-hit-enrichers.ts`, `buildLocalAction` in
266
- `src/indexer/search/db-search.ts`) — each had one implementation. The engine-owned
267
- `AgentRequestLowerer` is the separate structural boundary documented in
268
- §3.9, not a revival of the removed generic `AgentRunner`. See the [drift
269
- register](../specs/0.9.0-docs-code-drift-register.md#q-16--functional-contract-patternsmd-4-aspiration-or-contract)
270
- if a removed entry needs reviving; add it back only alongside a real
271
- implementation.
272
-
273
- ## 4.1 `RankingContributor`
274
-
275
- For search score adjustments and explanations.
276
-
277
- ## 4.2 `ProposalValidator`
278
-
279
- For proposal acceptance checks.
280
-
281
- ## 4.3 `SessionLogHarness`
282
-
283
- For raw session-log or history ingestion from external harnesses.
284
-
285
- ---
286
-
287
- ## 5. What Stays Centralized
288
-
289
- - source/provider model
290
- - CLI command contracts
291
- - DB schema and persistence boundaries
292
- - write-target resolution
293
- - search stage order
294
- - final score normalization and clamping
295
- - proposal storage
296
-
297
- If these become pluggable, the system becomes harder to reason about.
298
-
299
- ---
300
-
301
- ## 6. What Gets Delegated
302
-
303
- - heuristics
304
- - enrichment
305
- - validation rules
306
- - process-specific side-effects
307
- - applicability logic
308
- - search explanations
309
-
310
- If these stay centralized, switchboards keep growing.
311
-
312
- ---
313
-
314
- ## 7. Smells To Avoid
315
-
316
- 1. One large interface with many optional methods
317
- 2. Registries keyed only by `type`
318
- 3. Matching logic that also chooses presentation names
319
- 4. Renderers that also own indexing and search policy
320
- 5. Ad hoc per-command path lookup logic
321
- 6. Open-ended capability graphs with unclear precedence
322
- 7. Hidden special cases spread across callers instead of isolated behind one seam
323
- 8. Architectural cleanup that changes behavior or rewrites tests to fit the refactor
324
-
325
- ---
326
-
327
- ## 8. Review Checklist
328
-
329
- When adding a new seam, ask:
330
-
331
- 1. Is this a stable process boundary?
332
- 2. Can the contributor be tested in isolation?
333
- 3. Does orchestration remain readable top-down?
334
- 4. Is ordering explicit?
335
- 5. Is `type` only an input, not the behavior object?
336
- 6. Can existing behavior be adapted before rewriting it?
337
- 7. Is this a refactor-only change with behavior preserved?
338
- 8. Does onboarding a new external harness require only one narrow adapter?
339
-
340
- If the answer is no to several of these, the abstraction is probably too large.
@@ -1,57 +0,0 @@
1
- # Registry network boundary
2
-
3
- All HTTP(S) traffic used to discover or install registry content passes
4
- through `fetchRegistry` / `fetchRegistryJson` in `src/registry/network.ts`.
5
- The boundary is plain `fetch()` plus a request timeout, bounded retries on
6
- network failure / timeout / 429 / 5xx (honoring a capped `Retry-After`), a
7
- byte cap on the response body, and classified errors: a request that fails
8
- after retries, or whose body can't be used, always leaves as an `AkmError` —
9
- never a raw, unclassified exit 70.
10
-
11
- - Not found / unusable response (HTTP 404/410, or a body that isn't valid
12
- JSON / isn't shaped as expected) -> `NotFoundError` (exit 1).
13
- - Every other non-2xx status, and connection failure / timeout after retries
14
- are exhausted -> `TransientError` (`REGISTRY_UNREACHABLE`, exit 75).
15
- - A malformed registry URL, an embedded `user:pass@`, or a non-http(s) scheme
16
- -> `ConfigError` (`REGISTRY_URL_INVALID`, exit 78).
17
-
18
- Callers: `src/registry/providers/static-index.ts`, `providers/skills-sh.ts`,
19
- `src/registry/resolve.ts` (npm and GitHub metadata), `src/setup/registry-stash-loader.ts`,
20
- and `src/sources/providers/provider-utils.ts`'s `downloadArchive` (npm tarball
21
- download, used by `sources/providers/npm.ts`). Credentials (a resolved GitHub
22
- token, etc.) are injected by the caller as ordinary `headers` on the request —
23
- this module does not resolve credentials itself. HTTPS is not required by
24
- `fetchRegistry` itself: `--allow-insecure-transport`/HTTPS enforcement happens
25
- once, where a URL enters configuration (`akm registry add`, `akm bundle add`),
26
- per `AGENTS.md`'s "Unsafe CLI overrides" policy.
27
-
28
- ## What this boundary does *not* do
29
-
30
- Earlier releases pinned every registry request's DNS resolution: they
31
- resolved and classified the hostname's A/AAAA answers, rejected loopback /
32
- private / link-local / cloud-metadata / reserved addresses, connected to the
33
- one validated numeric address (never re-resolving at connect time), and
34
- re-validated on every retry and redirect hop. Because Bun's fetch client
35
- cannot pin a TLS connection to a literal address while retaining SNI, that
36
- DNS-pinned transport spawned a short-lived Node child process per request to
37
- do the actual connect, over a bounded stdin/stdout framing protocol.
38
-
39
- That pinning, and the subprocess that implemented it
40
- (`pinned-transport.ts`, `pinned-request-helper.ts`), were deleted as
41
- over-engineering for this codebase's actual threat model: registry URLs are
42
- either the built-in registry or a URL an operator explicitly configured
43
- (`akm registry add`, `AKM_REGISTRY_URL`, `AKM_NPM_REGISTRY`) — a deliberate
44
- human command, not third-party input akm fetches on an untrusted caller's
45
- behalf (see `AGENTS.md`'s "Defensive Code" test 3). The subprocess-per-request
46
- design was also the direct cause of registry network failures surfacing as an
47
- unclassified exit 70 instead of a typed error, a symptom fixed repeatedly
48
- before this simplification (see CHANGELOG history around the registry HTTP
49
- stack). `src/core/network-policy.ts`'s address classifier is unrelated to this
50
- boundary now; it still backs the `website` source provider's own SSRF guard
51
- (`src/sources/snapshot-fetchers/host-guard.ts`), which fetches arbitrary
52
- operator-pasted URLs and keeps its own justification for that guard.
53
-
54
- Registry-derived `source: git` entries are still rejected before an install
55
- ref can reach `git ls-remote` or clone — that check lives in
56
- `src/registry/providers/static-index.ts` and is independent of the network
57
- boundary.
@@ -1,248 +0,0 @@
1
- # Search Architecture
2
-
3
- Search uses a multi-signal scoring pipeline combining lexical matching, semantic
4
- similarity, and relevance boosts to find the most useful assets for a query.
5
-
6
- ## Pipeline Overview
7
-
8
- ```
9
- Query
10
- │
11
- ├─ FTS5 (lexical) ──────────────┐
12
- │ Multi-column BM25 with │
13
- │ field weighting │ Normalize + combine
14
- │ ├──────────────────────── Score + Boost ── Sort ── Return
15
- └─ Vector (semantic) ───────────┘ 0.7 FTS │
16
- Cosine similarity, exact 0.3 Vec │
17
- scan of stored vectors │
18
- │
19
- Boosts applied:
20
- • exact name match
21
- • type relevance
22
- • tag/alias/hint match
23
- • description match
24
- • metadata quality
25
- • usage history (M-2)
26
- ```
27
-
28
- ## Indexed Search (primary)
29
-
30
- When an index exists (`~/.local/share/akm/index.db`), local search uses two
31
- ranking signals:
32
-
33
- ### 1. FTS5 (lexical)
34
-
35
- SQLite full-text search with Porter stemming, using **multi-column field
36
- weighting**. The FTS5 table has separate columns for different metadata fields,
37
- each weighted differently in the BM25 scoring:
38
-
39
- | Column | BM25 Weight | Contents |
40
- | --- | --- | --- |
41
- | `name` | 10.0 | Asset name |
42
- | `description` | 5.0 | Description text |
43
- | `tags` | 3.0 | Tags and aliases |
44
- | `hints` | 2.0 | Search hints and examples |
45
- | `content` | 1.0 | bounded body projection, TOC headings, parameters |
46
-
47
- A name match is weighted 10x higher than a content match. This ensures that
48
- searching "docker" ranks the `docker-homelab` skill above a knowledge doc that
49
- merely mentions Docker in its table of contents.
50
-
51
- **Progressive fallback:** Search runs strict AND, then prefix-AND, then one
52
- OR/prefix-OR recovery only if both strict forms return no candidates. Unicode
53
- letter/number tokens are deduplicated and capped; callers do not strip
54
- stopwords or maintain separate result collections.
55
-
56
- **`matchStage`:** Each hit that has an FTS component reports which rung of
57
- the ladder produced it via `matchStage`: `"exact"` (strict AND), `"prefix"`
58
- (prefix AND), or `"relaxed"` (OR/prefix-OR recovery). The field is omitted
59
- for hits with no FTS contribution (e.g. a pure-semantic hybrid match) and for
60
- hits that never go through the lexical ladder (registry/browse hits). Because
61
- the ladder stops at the first non-empty stage, all FTS-only hits in a single
62
- response share one stage; in `hybrid` ranking mode a response can legitimately
63
- mix hits that carry `matchStage` with hits that omit it.
64
-
65
- ### 2. Semantic (vector)
66
-
67
- Cosine similarity between query embedding and stored entry embeddings.
68
- Requires an embedding model — either the declared external
69
- `@huggingface/transformers` dependency (default model
70
- `bge-small-en-v1.5`) or a remote OpenAI-compatible endpoint. AKM imports the
71
- package directly and does not copy, wrap, alias, or hash a second runtime under
72
- `src/` or `dist/`. Dependency installation and platform support remain the
73
- upstream package manager's responsibility. Users who need a different runtime
74
- or native/GPU-class throughput can configure a remote embedding endpoint.
75
-
76
- An LRU cache (100 entries) avoids redundant embedding computation for repeated
77
- queries.
78
-
79
- Query-time semantic failure is not conflated with configured keyword search.
80
- FTS still serves the request, while `searchMode: "fts-fallback"` and one
81
- sanitized warning name the normalized endpoint without URL userinfo, query
82
- parameters, fragments, API keys, or raw runtime error text. Curate deduplicates
83
- that warning across its internal fallback queries. `searchMode: "keyword"`
84
- means no ready semantic attempt failed for this request.
85
-
86
- ### Score Normalization
87
-
88
- FTS5 BM25 scores are negative (lower = better match). They are normalized to
89
- a **0.3–1.0 range** using min-max normalization across the result set:
90
-
91
- - Best FTS match → 1.0
92
- - Worst FTS match → 0.3 (floor prevents zero-score entries)
93
-
94
- When vector search is also active, scores are combined with weighted addition:
95
-
96
- ```
97
- base_score = 0.7 × normalized_bm25 + 0.3 × cosine_similarity
98
- ```
99
-
100
- **Design decision — why not RRF?** An earlier version used Reciprocal Rank
101
- Fusion (RRF) to merge FTS and vector results. RRF uses rank positions instead
102
- of raw scores, which avoids scale mismatch but destroys score differentiation.
103
- With RRF (K=60), the best result scores 1/61 = 0.0164 and the 5th result
104
- scores 1/65 = 0.0154 — a 6% difference that makes all results look equally
105
- relevant. Normalized BM25 + weighted combination preserves the actual relevance
106
- signal: the best match might score 1.0 while the 5th scores 0.45 — a 55%
107
- difference that enables meaningful ranking. See the
108
- [Scoring Design](#scoring-design) section below for the full rationale.
109
-
110
- ## Scoring Design
111
-
112
- After normalization, multiplicative boosts are applied in a single pass:
113
-
114
- ```
115
- final_score = base_score × (1 + sum_of_boosts)
116
- ```
117
-
118
- ### Boost signals (ordered by strength)
119
-
120
- | Signal | Boost | When it fires |
121
- | --- | --- | --- |
122
- | Exact name match | +2.0 | Query exactly equals the asset's base name |
123
- | Alias exact match | +1.5 | Query exactly matches a defined alias |
124
- | Near-exact name | +1.0 | Query is a substring of the name or vice versa |
125
- | Name token overlap | +0.3/token (max 0.9) | Individual query tokens found in name |
126
- | Type: skill | +0.4 | Asset is a skill |
127
- | Type: command / workflow | +0.35 | Asset is a command or workflow |
128
- | Type: agent | +0.3 | Asset is an agent |
129
- | Type: knowledge / fact / instruction | +0.22 | Asset is a knowledge doc, fact, or project instruction file |
130
- | Type: script | +0.2 | Asset is a script |
131
- | Type: memory | -0.02 | Asset is a memory (slight demotion) |
132
- | Tag exact match | +0.15/tag (max 0.3) | Query token exactly matches a tag |
133
- | All-token description | +0.25 | Every query token appears in description |
134
- | Partial description | +0.1 | Some query tokens in description |
135
- | Search hint match | +0.12/hint (max 0.24) | Query token found in a search hint |
136
- | Alias token match | +0.3 | Query token found in any alias |
137
- | Curated metadata | +0.05 | Non-generated metadata (quality signal) |
138
- | Confidence | up to +0.05 | Based on metadata source reliability |
139
- | Usage history (M-2) | up to +0.5 (capped 1.5×) | Utility score from usage telemetry |
140
-
141
- ### Design principles
142
-
143
- **Exact name match is the strongest signal.** If a user types "docker-homelab",
144
- the asset named `docker-homelab` must rank first with a decisive score gap.
145
- This is the single most predictable and important ranking behavior.
146
-
147
- **Actionable assets rank above reference material.** Skills, commands, and
148
- agents are things you can execute or dispatch. Knowledge docs are reference
149
- material — valuable but secondary when a user is searching for something to
150
- use. The type boost encodes this hierarchy.
151
-
152
- **Author-curated signals are stronger than auto-generated ones.** Tags,
153
- aliases, and search hints are explicitly chosen by the asset author. They
154
- carry more intent than terms that happen to appear in file content.
155
-
156
- **Boosts are multiplicative on the base score.** This means a high base score
157
- (strong FTS match) amplified by boosts produces a much larger gap than a low
158
- base score with the same boosts. Highly relevant assets separate clearly from
159
- marginally relevant ones.
160
-
161
- ### Worked example
162
-
163
- Query: `"docker homelab"` → asset: `skills/docker-homelab`
164
-
165
- ```
166
- Base BM25 (normalized): 1.0 (best FTS match in result set)
167
- + Name token overlap: +0.6 (2 tokens match: "docker", "homelab")
168
- + Type boost (skill): +0.4
169
- + Tag exact match: +0.3 (tags "docker" and "homelab" both match)
170
- + Alias token match: +0.3 (alias "docker-compose" contains "docker")
171
- + Search hint match: +0.24 (hints contain "docker" and "homelab")
172
- + All-token description: +0.25 (all query tokens in description)
173
- + Curated quality: +0.05
174
- ─────────────────────────────
175
- BoostSum: 2.14
176
- Final score: 1.0 × (1 + 2.14) = 3.14
177
- ```
178
-
179
- Compare to a sub-reference knowledge doc for the same query:
180
-
181
- ```
182
- Base BM25 (normalized): 0.85 (good FTS match but not the best)
183
- + Name token overlap: +0.3 (1 token "homelab" in path-derived name)
184
- + Type boost: +0.0 (knowledge docs get no type boost)
185
- + Tag match: +0.15 (1 tag matches)
186
- ─────────────────────────────
187
- BoostSum: 0.45
188
- Final score: 0.85 × (1 + 0.45) = 1.23
189
- ```
190
-
191
- The skill scores 3.14 vs the sub-reference at 1.23 — a 2.6× gap that clearly
192
- communicates which result is more useful.
193
-
194
- ## Result Merging
195
-
196
- There is one scoring pipeline because there is one data store. All sources —
197
- filesystem, git, website, npm — are materialised to local directories and
198
- indexed together. The indexer holds every searchable asset, so source results
199
- do not need cross-merging.
200
-
201
- ### Source + registry results (`--from all`)
202
-
203
- When registry results (static-index, skills.sh) are included:
204
-
205
- - Source hits and registry hits stay in **separate response fields**:
206
- `hits` and `registryHits`
207
- - Registry results are never rank-merged into `hits`
208
- - Registry raw scores (which may be on a 0-100 scale) do not leak through
209
-
210
- ## Substring Fallback
211
-
212
- When no index is available, search falls back to scanning the primary bundle
213
- and installed bundle roots, filtering by substring match. This ensures search
214
- always works, even before `akm index` has been run.
215
-
216
- ## Output Modes
217
-
218
- ### Standard output
219
-
220
- By default (`--format json`, `--detail brief`), search emits minimal fields:
221
- `type`, `name`, `ref`, `action`, and `estimatedTokens`.
222
-
223
- `--detail normal` emits `type`, `name`, `description`, `action`, `score`, and
224
- `estimatedTokens`, plus optional warning, quality, or env-key fields.
225
- `--detail full` adds `whyMatched`, `origin`, `path`, and timing data.
226
-
227
- ### Agent-optimized output
228
-
229
- For each materialized local hit, `--detail agent` includes `name`, canonical
230
- `ref`, `type`, absolute `path`, current-policy `editable`, `description`,
231
- `action`, `score`, and optional `estimatedTokens`/env keys. `editHint` appears
232
- only when `editable` is `false`. The hint is supplemental: `action` remains the
233
- normal show, run, or use action. Registry-only hits do not acquire local access
234
- fields.
235
-
236
- `--format jsonl` outputs one JSON object per line for streaming consumption.
237
-
238
- ## Explainability
239
-
240
- `whyMatched` explains which signals contributed to a hit's ranking. Examples:
241
-
242
- - `"exact name match"` — query matched the asset name exactly
243
- - `"skill type boost"` — asset is a skill (actionable)
244
- - `"matched tags"` — query token matched a tag
245
- - `"near-exact name match"` — query is a substring of the name
246
- - `"usage history boost"` — utility score from M-2 telemetry
247
-
248
- Visible in `--detail full` output.