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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (598) hide show
  1. package/CHANGELOG.md +1283 -22
  2. package/README.md +62 -37
  3. package/SECURITY.md +46 -31
  4. package/dist/akm +162 -38
  5. package/dist/akm-migrate +44 -0
  6. package/dist/assets/backends/schtasks-template.xml +2 -1
  7. package/dist/assets/hints/cli-hints-full.md +268 -118
  8. package/dist/assets/hints/cli-hints-short.md +87 -24
  9. package/dist/assets/{profiles → improve-strategies}/catchup.json +3 -1
  10. package/dist/assets/{profiles → improve-strategies}/consolidate.json +3 -1
  11. package/dist/assets/{profiles → improve-strategies}/default.json +6 -7
  12. package/dist/assets/improve-strategies/frequent.json +15 -0
  13. package/dist/assets/{profiles → improve-strategies}/graph-refresh.json +4 -2
  14. package/dist/assets/{profiles → improve-strategies}/memory-focus.json +4 -1
  15. package/dist/assets/{profiles → improve-strategies}/proactive-maintenance.json +5 -5
  16. package/dist/assets/{profiles → improve-strategies}/quick.json +4 -2
  17. package/dist/assets/improve-strategies/reflect-distill.json +30 -0
  18. package/dist/assets/{profiles → improve-strategies}/thorough.json +1 -1
  19. package/dist/assets/prompts/consolidate-system.md +5 -5
  20. package/dist/assets/prompts/extract-session.md +2 -6
  21. package/dist/assets/prompts/memory-infer-user.md +2 -3
  22. package/dist/assets/prompts/reflect-llm-framed-contract.md +11 -0
  23. package/dist/assets/prompts/reflect-llm-schema-contract.md +3 -0
  24. package/dist/assets/prompts/reflect-output-repair.md +3 -0
  25. package/dist/assets/prompts/workflow-unit-preamble.md +26 -0
  26. package/dist/assets/stash-skeleton/README.md +38 -10
  27. package/dist/assets/stash-skeleton/facts/conventions/assets/agent.md +8 -0
  28. package/dist/assets/stash-skeleton/facts/conventions/assets/command.md +8 -0
  29. package/dist/assets/stash-skeleton/facts/conventions/assets/fact.md +14 -1
  30. package/dist/assets/stash-skeleton/facts/conventions/assets/knowledge.md +13 -1
  31. package/dist/assets/stash-skeleton/facts/conventions/assets/lesson.md +9 -1
  32. package/dist/assets/stash-skeleton/facts/conventions/assets/memory.md +11 -0
  33. package/dist/assets/stash-skeleton/facts/conventions/assets/script.md +9 -0
  34. package/dist/assets/stash-skeleton/facts/conventions/assets/skill.md +9 -0
  35. package/dist/assets/stash-skeleton/facts/conventions/assets/workflow.md +8 -0
  36. package/dist/assets/stash-skeleton/facts/conventions/backlinks.md +100 -0
  37. package/dist/assets/stash-skeleton/facts/conventions/domains.md +64 -0
  38. package/dist/assets/stash-skeleton/facts/conventions/organization.md +136 -0
  39. package/dist/assets/tasks/core/extract.yml +3 -2
  40. package/dist/assets/tasks/core/improve.yml +2 -1
  41. package/dist/assets/tasks/core/index-refresh.yml +1 -0
  42. package/dist/assets/tasks/core/sync.yml +1 -0
  43. package/dist/assets/tasks/core/version-check.yml +2 -1
  44. package/dist/assets/tasks/improve/akm-graph-refresh-weekly.yml +5 -0
  45. package/dist/assets/tasks/improve/akm-improve-catchup.yml +8 -0
  46. package/dist/assets/tasks/improve/akm-improve-consolidate.yml +5 -0
  47. package/dist/assets/tasks/improve/akm-improve-frequent.yml +5 -0
  48. package/dist/assets/tasks/improve/akm-improve-nightly.yml +5 -0
  49. package/dist/assets/templates/html/health.html +5 -4
  50. package/dist/assets/workflows/workflow-template.md +31 -15
  51. package/dist/cli/invocation.js +279 -0
  52. package/dist/cli/parse-args.js +5 -90
  53. package/dist/cli/retired-commands.js +78 -0
  54. package/dist/cli/shared.js +158 -48
  55. package/dist/cli-node.mjs +2 -1
  56. package/dist/cli.js +747 -293
  57. package/dist/commands/agent/agent-dispatch.js +19 -18
  58. package/dist/commands/agent/agent-support.js +0 -24
  59. package/dist/commands/agent/contribute-cli.js +43 -97
  60. package/dist/commands/completions.js +80 -23
  61. package/dist/commands/config-cli.js +44 -281
  62. package/dist/commands/env/env-binding.js +99 -0
  63. package/dist/commands/env/env-cli.js +84 -224
  64. package/dist/commands/env/env.js +12 -163
  65. package/dist/commands/env/marker-path.js +6 -0
  66. package/dist/commands/env/secret-cli.js +45 -61
  67. package/dist/commands/env/secret.js +32 -62
  68. package/dist/commands/feedback-cli.js +179 -85
  69. package/dist/commands/health/accept-rate.js +58 -0
  70. package/dist/commands/health/advisories.js +7 -8
  71. package/dist/commands/health/checks.js +279 -94
  72. package/dist/commands/health/html-report.js +197 -578
  73. package/dist/commands/health/improve-metrics.js +277 -246
  74. package/dist/commands/health/llm-usage.js +19 -19
  75. package/dist/commands/health/md-report.js +16 -7
  76. package/dist/commands/health/metrics.js +67 -32
  77. package/dist/commands/health/renderers.js +47 -0
  78. package/dist/commands/health/report-view-model.js +508 -0
  79. package/dist/commands/health/stash-exposure.js +1 -1
  80. package/dist/commands/health/surfaces.js +16 -56
  81. package/dist/commands/health/task-runs.js +3 -67
  82. package/dist/{migrate-storage-node.mjs → commands/health/types-checks.js} +1 -5
  83. package/dist/commands/health/types-improve.js +29 -0
  84. package/dist/{output/text/save.js → commands/health/types-metrics.js} +1 -2
  85. package/dist/commands/health/types-result.js +7 -0
  86. package/dist/commands/health/types-runs.js +4 -0
  87. package/dist/commands/health/types-session-log.js +4 -0
  88. package/dist/commands/health/types-windows.js +4 -0
  89. package/dist/commands/health/types.js +26 -21
  90. package/dist/commands/health/windows.js +2 -3
  91. package/dist/commands/health.js +296 -167
  92. package/dist/commands/improve/anti-collapse.js +5 -5
  93. package/dist/commands/improve/autonomy-gate.js +68 -0
  94. package/dist/commands/improve/collapse-detector.js +65 -52
  95. package/dist/commands/improve/consolidate/chunking.js +9 -7
  96. package/dist/commands/improve/consolidate/eligibility.js +1 -23
  97. package/dist/commands/improve/consolidate/merge.js +4 -0
  98. package/dist/commands/improve/consolidate.js +454 -1354
  99. package/dist/commands/improve/content-hash.js +39 -0
  100. package/dist/commands/improve/distill/content-repair.js +4 -10
  101. package/dist/commands/improve/distill/promote-memory.js +89 -64
  102. package/dist/commands/improve/distill/quality-gate.js +118 -42
  103. package/dist/commands/improve/distill-guards.js +1 -1
  104. package/dist/commands/improve/distill-promotion-policy.js +33 -888
  105. package/dist/commands/improve/distill.js +607 -363
  106. package/dist/commands/improve/eligibility.js +165 -79
  107. package/dist/commands/improve/extract-cli.js +35 -126
  108. package/dist/commands/improve/extract-prompt.js +6 -35
  109. package/dist/commands/improve/extract.js +640 -391
  110. package/dist/commands/improve/feedback-valence.js +2 -12
  111. package/dist/commands/improve/improve-cli.js +134 -135
  112. package/dist/commands/improve/improve-result-file.js +30 -50
  113. package/dist/commands/improve/improve-run-types.js +4 -0
  114. package/dist/commands/improve/improve-strategies.js +135 -0
  115. package/dist/commands/improve/improve.js +904 -701
  116. package/dist/commands/improve/locks.js +64 -111
  117. package/dist/commands/improve/loop-stages.js +1110 -923
  118. package/dist/commands/improve/memory/derived-ref.js +124 -0
  119. package/dist/commands/improve/memory/memory-belief.js +79 -7
  120. package/dist/commands/improve/memory/memory-contradiction-detect.js +49 -52
  121. package/dist/commands/improve/memory/memory-improve.js +25 -37
  122. package/dist/commands/improve/outcome-loop.js +25 -88
  123. package/dist/commands/improve/preparation.js +1034 -813
  124. package/dist/commands/improve/proactive-maintenance.js +34 -9
  125. package/dist/commands/improve/proposal-envelope.js +31 -0
  126. package/dist/commands/improve/reflect.js +983 -794
  127. package/dist/commands/improve/run-context.js +119 -0
  128. package/dist/commands/improve/salience.js +24 -127
  129. package/dist/commands/improve/session-asset.js +7 -3
  130. package/dist/commands/improve/shared.js +14 -34
  131. package/dist/commands/improve/source-identity.js +28 -0
  132. package/dist/commands/improve/triage.js +20 -17
  133. package/dist/commands/lint/base-linter.js +340 -313
  134. package/dist/commands/lint/env-key-rules.js +31 -47
  135. package/dist/commands/lint/index.js +185 -30
  136. package/dist/commands/{events.js → log.js} +28 -38
  137. package/dist/commands/migrate-cli.js +54 -0
  138. package/dist/commands/migration-tool.js +55 -0
  139. package/dist/commands/observability-cli.js +70 -208
  140. package/dist/commands/proposal/diff-format.js +50 -0
  141. package/dist/commands/proposal/drain-policies.js +0 -6
  142. package/dist/commands/proposal/drain.js +91 -40
  143. package/dist/commands/proposal/proposal-cli.js +134 -132
  144. package/dist/commands/proposal/proposal-types.js +56 -0
  145. package/dist/commands/proposal/proposal.js +83 -65
  146. package/dist/commands/proposal/propose-cli.js +88 -0
  147. package/dist/commands/proposal/propose.js +105 -88
  148. package/dist/commands/proposal/repository.js +1303 -278
  149. package/dist/commands/proposal/validators/proposal-quality-validators.js +16 -6
  150. package/dist/commands/proposal/validators/proposal-validators.js +61 -12
  151. package/dist/commands/proposal/validators/proposals.js +6 -8
  152. package/dist/commands/read/curate.js +78 -73
  153. package/dist/commands/read/knowledge.js +510 -13
  154. package/dist/commands/read/registry-search.js +2 -2
  155. package/dist/commands/read/remember-cli.js +84 -15
  156. package/dist/commands/read/search-cli.js +203 -96
  157. package/dist/commands/read/search.js +126 -94
  158. package/dist/commands/read/show.js +226 -250
  159. package/dist/commands/registry-cli.js +34 -60
  160. package/dist/commands/remember.js +18 -57
  161. package/dist/commands/sources/add-cli.js +104 -49
  162. package/dist/commands/sources/bundle-cli.js +166 -0
  163. package/dist/commands/sources/bundle-config-ops.js +63 -0
  164. package/dist/commands/sources/info.js +27 -15
  165. package/dist/commands/sources/init.js +30 -40
  166. package/dist/commands/sources/installed-stashes.js +469 -172
  167. package/dist/commands/sources/migration-help.js +7 -4
  168. package/dist/commands/sources/schema-repair.js +10 -9
  169. package/dist/commands/sources/self-update.js +182 -121
  170. package/dist/commands/sources/source-add.js +169 -178
  171. package/dist/commands/sources/source-clone.js +144 -41
  172. package/dist/commands/sources/source-manage.js +94 -59
  173. package/dist/commands/sources/sources-cli.js +64 -205
  174. package/dist/commands/sources/stash-cli.js +91 -54
  175. package/dist/commands/sources/stash-skeleton.js +1 -1
  176. package/dist/commands/tasks/tasks-cli.js +106 -104
  177. package/dist/commands/tasks/tasks.js +445 -262
  178. package/dist/commands/workflow-cli.js +232 -121
  179. package/dist/core/action-contributors.js +1 -1
  180. package/dist/core/activation-policy.js +49 -0
  181. package/dist/core/adapter/adapters/agent-skills-adapter.js +181 -0
  182. package/dist/core/adapter/adapters/akm-adapter.js +528 -0
  183. package/dist/core/adapter/adapters/akm-lint.js +392 -0
  184. package/dist/core/adapter/adapters/akm-metadata.js +387 -0
  185. package/dist/core/adapter/adapters/akm-task-adapter.js +149 -0
  186. package/dist/core/adapter/adapters/akm-workflow-adapter.js +180 -0
  187. package/dist/core/adapter/adapters/claude-adapter.js +61 -0
  188. package/dist/core/adapter/adapters/dotenv-adapter.js +187 -0
  189. package/dist/core/adapter/adapters/generic-files-adapter.js +119 -0
  190. package/dist/core/adapter/adapters/index.js +80 -0
  191. package/dist/core/adapter/adapters/llm-wiki-adapter.js +419 -0
  192. package/dist/core/adapter/adapters/okf-adapter.js +391 -0
  193. package/dist/core/adapter/adapters/opencode-adapter.js +68 -0
  194. package/dist/core/adapter/adapters/shared.js +286 -0
  195. package/dist/core/adapter/adapters/tool-dir-shared.js +217 -0
  196. package/dist/core/adapter/adapters/website-snapshot-adapter.js +155 -0
  197. package/dist/core/adapter/bundle-adapter.js +4 -0
  198. package/dist/core/adapter/detect-adapter.js +17 -0
  199. package/dist/core/adapter/recognize-match.js +44 -0
  200. package/dist/core/adapter/registry.js +56 -0
  201. package/dist/core/adapter/types.js +4 -0
  202. package/dist/core/asset/akm-markdown.js +30 -0
  203. package/dist/core/asset/asset-placement.js +243 -0
  204. package/dist/core/asset/asset-ref.js +110 -79
  205. package/dist/core/asset/asset-serialize.js +20 -0
  206. package/dist/core/asset/frontmatter.js +28 -12
  207. package/dist/core/asset/markdown.js +40 -51
  208. package/dist/core/asset/resolve-ref.js +274 -0
  209. package/dist/core/asset/stash-meta.js +2 -2
  210. package/dist/core/bundle-id.js +51 -0
  211. package/dist/core/common.js +281 -86
  212. package/dist/core/config/config-io.js +42 -128
  213. package/dist/core/config/config-schema.js +233 -834
  214. package/dist/core/config/config-sources.js +162 -39
  215. package/dist/core/config/config-types.js +16 -11
  216. package/dist/core/config/config-version.js +29 -0
  217. package/dist/core/config/config-walker.js +126 -37
  218. package/dist/core/config/config.js +154 -331
  219. package/dist/core/config/deep-merge.js +41 -0
  220. package/dist/core/config/engine-semantics.js +28 -0
  221. package/dist/core/config/experimental.js +21 -0
  222. package/dist/core/config/schema/embedding.js +38 -0
  223. package/dist/core/config/schema/engines.js +116 -0
  224. package/dist/core/config/schema/experimental.js +47 -0
  225. package/dist/core/config/schema/feedback.js +31 -0
  226. package/dist/core/config/schema/improve-processes.js +389 -0
  227. package/dist/core/config/schema/improve.js +94 -0
  228. package/dist/core/config/schema/index-config.js +176 -0
  229. package/dist/core/config/schema/output.js +18 -0
  230. package/dist/core/config/schema/primitives.js +94 -0
  231. package/dist/core/config/schema/search.js +30 -0
  232. package/dist/core/config/schema/setup.js +18 -0
  233. package/dist/core/config/schema/sources-bundles.js +169 -0
  234. package/dist/core/config/schema/workflow.js +29 -0
  235. package/dist/core/env-secret-ref.js +155 -20
  236. package/dist/core/errors.js +17 -15
  237. package/dist/core/events-types.js +4 -0
  238. package/dist/core/events.js +46 -128
  239. package/dist/core/extra-params.js +62 -0
  240. package/dist/core/file-change.js +17 -0
  241. package/dist/core/file-lock.js +202 -57
  242. package/dist/core/fs-txn.js +392 -0
  243. package/dist/core/git-message.js +59 -0
  244. package/dist/core/improve-result.js +167 -0
  245. package/dist/core/json-schema.js +142 -0
  246. package/dist/core/lesson-lint.js +1 -17
  247. package/dist/core/logs-db.js +1 -1
  248. package/dist/core/maintenance-barrier.js +135 -0
  249. package/dist/core/migration-operation.js +44 -0
  250. package/dist/core/mutation-target.js +78 -0
  251. package/dist/core/paths.js +22 -25
  252. package/dist/core/platform.js +10 -0
  253. package/dist/core/recognition-util.js +128 -0
  254. package/dist/core/redaction.js +392 -0
  255. package/dist/core/standards/resolve-standards-context.js +36 -65
  256. package/dist/core/standards/resolve-stash-standards.js +2 -2
  257. package/dist/core/standards/resolve-type-conventions.js +5 -5
  258. package/dist/core/state/migrations.js +242 -11
  259. package/dist/core/state-db.js +98 -10
  260. package/dist/core/structured.js +1 -1
  261. package/dist/core/subprocess.js +303 -0
  262. package/dist/core/text-truncation.js +9 -5
  263. package/dist/core/time.js +20 -0
  264. package/dist/core/type-presentation.js +130 -0
  265. package/dist/core/warn.js +0 -3
  266. package/dist/core/write-source.js +834 -118
  267. package/dist/indexer/bundle-identity-guard.js +92 -0
  268. package/dist/indexer/db/graph-db.js +1 -25
  269. package/dist/indexer/db/llm-cache.js +1 -1
  270. package/dist/indexer/ensure-index.js +30 -9
  271. package/dist/indexer/graph/graph-boost.js +9 -30
  272. package/dist/indexer/graph/graph-extraction.js +41 -27
  273. package/dist/indexer/graph/graph-types.js +4 -0
  274. package/dist/indexer/index-writer-lock.js +93 -49
  275. package/dist/indexer/index-written-assets.js +100 -53
  276. package/dist/indexer/indexer.js +746 -329
  277. package/dist/indexer/init.js +18 -25
  278. package/dist/indexer/installations.js +142 -0
  279. package/dist/indexer/passes/dir-staleness.js +18 -10
  280. package/dist/indexer/passes/memory-inference.js +25 -15
  281. package/dist/indexer/passes/metadata.js +412 -243
  282. package/dist/indexer/scan/doc-to-entry.js +160 -0
  283. package/dist/indexer/scan/drain-dir.js +134 -0
  284. package/dist/indexer/search/db-search.js +292 -108
  285. package/dist/indexer/search/fts-query.js +64 -0
  286. package/dist/indexer/search/ranking-contributors.js +145 -25
  287. package/dist/indexer/search/ranking-types.js +4 -0
  288. package/dist/indexer/search/ranking.js +28 -71
  289. package/dist/indexer/search/search-attribution.js +67 -0
  290. package/dist/indexer/search/search-fields.js +18 -3
  291. package/dist/indexer/search/search-hit-enrichers.js +30 -40
  292. package/dist/indexer/search/search-source.js +157 -111
  293. package/dist/indexer/search/semantic-status.js +4 -1
  294. package/dist/indexer/usage/usage-events.js +10 -30
  295. package/dist/indexer/walk/file-context.js +3 -45
  296. package/dist/indexer/walk/matchers.js +42 -34
  297. package/dist/indexer/walk/path-resolver.js +11 -5
  298. package/dist/indexer/walk/walker.js +42 -14
  299. package/dist/integrations/agent/builder-shared.js +7 -0
  300. package/dist/integrations/agent/builders.js +5 -56
  301. package/dist/integrations/agent/config.js +3 -143
  302. package/dist/integrations/agent/detect.js +17 -2
  303. package/dist/integrations/agent/engine-resolution.js +231 -0
  304. package/dist/integrations/agent/index.js +1 -2
  305. package/dist/integrations/agent/model-aliases.js +16 -2
  306. package/dist/integrations/agent/profiles.js +36 -62
  307. package/dist/integrations/agent/prompts.js +46 -18
  308. package/dist/integrations/agent/runner-dispatch.js +93 -4
  309. package/dist/integrations/agent/runner.js +76 -208
  310. package/dist/integrations/agent/spawn.js +88 -196
  311. package/dist/integrations/harnesses/aider/agent-builder.js +114 -0
  312. package/dist/integrations/harnesses/aider/index.js +48 -0
  313. package/dist/integrations/harnesses/aider/result-extractor.js +53 -0
  314. package/dist/integrations/harnesses/amazonq/agent-builder.js +147 -0
  315. package/dist/integrations/harnesses/amazonq/index.js +45 -0
  316. package/dist/integrations/harnesses/amazonq/result-extractor.js +48 -0
  317. package/dist/integrations/harnesses/claude/agent-builder.js +46 -8
  318. package/dist/integrations/harnesses/claude/config-import.js +1 -3
  319. package/dist/integrations/harnesses/claude/index.js +24 -35
  320. package/dist/integrations/harnesses/claude/result-extractor.js +52 -0
  321. package/dist/integrations/harnesses/claude/session-log.js +27 -75
  322. package/dist/integrations/harnesses/codex/agent-builder.js +138 -0
  323. package/dist/integrations/harnesses/codex/index.js +52 -0
  324. package/dist/integrations/harnesses/codex/result-extractor.js +73 -0
  325. package/dist/integrations/harnesses/copilot/agent-builder.js +122 -0
  326. package/dist/integrations/harnesses/copilot/index.js +48 -0
  327. package/dist/integrations/harnesses/copilot/result-extractor.js +151 -0
  328. package/dist/integrations/harnesses/gemini/agent-builder.js +120 -0
  329. package/dist/integrations/harnesses/gemini/index.js +48 -0
  330. package/dist/integrations/harnesses/gemini/result-extractor.js +121 -0
  331. package/dist/integrations/harnesses/ids.js +24 -0
  332. package/dist/integrations/harnesses/index.js +54 -34
  333. package/dist/integrations/harnesses/opencode/agent-builder.js +23 -5
  334. package/dist/integrations/harnesses/opencode/config-import.js +1 -3
  335. package/dist/integrations/harnesses/opencode/index.js +14 -32
  336. package/dist/integrations/harnesses/opencode/session-log.js +67 -125
  337. package/dist/integrations/harnesses/opencode-sdk/harness.js +51 -0
  338. package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +681 -108
  339. package/dist/integrations/harnesses/openhands/agent-builder.js +128 -0
  340. package/dist/integrations/harnesses/openhands/index.js +48 -0
  341. package/dist/integrations/harnesses/openhands/result-extractor.js +103 -0
  342. package/dist/integrations/harnesses/pi/agent-builder.js +97 -0
  343. package/dist/integrations/harnesses/pi/index.js +45 -0
  344. package/dist/integrations/harnesses/pi/result-extractor.js +135 -0
  345. package/dist/integrations/harnesses/shared.js +17 -0
  346. package/dist/integrations/harnesses/types.js +43 -32
  347. package/dist/integrations/lockfile.js +211 -24
  348. package/dist/integrations/session-logs/index.js +36 -39
  349. package/dist/integrations/session-logs/provider-base.js +113 -0
  350. package/dist/llm/client.js +182 -110
  351. package/dist/llm/embedders/deterministic.js +2 -2
  352. package/dist/llm/embedders/remote.js +21 -9
  353. package/dist/llm/feature-gate.js +17 -57
  354. package/dist/llm/graph-extract.js +12 -13
  355. package/dist/llm/index-passes.js +8 -42
  356. package/dist/llm/memory-infer.js +144 -1
  357. package/dist/llm/metadata-enhance.js +45 -30
  358. package/dist/llm/structured-call.js +16 -8
  359. package/dist/llm/usage-persist.js +30 -5
  360. package/dist/llm/usage-telemetry.js +59 -6
  361. package/dist/output/cli-hints.js +1 -2
  362. package/dist/output/command-registry.js +27 -0
  363. package/dist/output/context.js +22 -7
  364. package/dist/output/format-exempt.js +80 -0
  365. package/dist/output/generic-render.js +251 -0
  366. package/dist/output/html-render.js +11 -16
  367. package/dist/output/render-registry.js +57 -0
  368. package/dist/output/renderers.js +14 -279
  369. package/dist/output/shapes/curate.js +10 -1
  370. package/dist/output/shapes/events.js +12 -7
  371. package/dist/output/shapes/helpers.js +58 -84
  372. package/dist/output/shapes/passthrough.js +11 -39
  373. package/dist/output/shapes/proposal/producer.js +15 -7
  374. package/dist/output/shapes/registry.js +12 -6
  375. package/dist/output/shapes.js +0 -9
  376. package/dist/output/text/{init.js → bundle-create.js} +3 -1
  377. package/dist/output/text/bundle-show.js +7 -0
  378. package/dist/output/text/command-format.js +562 -0
  379. package/dist/output/text/env.js +1 -3
  380. package/dist/output/text/events.js +8 -7
  381. package/dist/output/text/helpers.js +15 -1164
  382. package/dist/output/text/proposal/producer.js +4 -2
  383. package/dist/output/text/proposal-format.js +202 -0
  384. package/dist/output/text/registry-commands.js +1 -2
  385. package/dist/output/text/registry.js +12 -6
  386. package/dist/output/text/show-directives.js +117 -0
  387. package/dist/output/text/show-format.js +103 -0
  388. package/dist/output/text/sync.js +5 -0
  389. package/dist/output/text/workflow-format.js +332 -0
  390. package/dist/output/text/workflow.js +3 -2
  391. package/dist/output/text.js +10 -19
  392. package/dist/registry/factory.js +4 -6
  393. package/dist/registry/origin-resolve.js +16 -27
  394. package/dist/registry/providers/skills-sh.js +3 -3
  395. package/dist/registry/providers/static-index.js +15 -25
  396. package/dist/registry/resolve.js +43 -94
  397. package/dist/registry/semver.js +43 -0
  398. package/dist/runtime.js +81 -12
  399. package/dist/scripts/akm-migrate.js +35529 -0
  400. package/dist/setup/detect.js +5 -7
  401. package/dist/setup/detected-engines.js +136 -0
  402. package/dist/setup/engine-config.js +100 -0
  403. package/dist/setup/registry-stash-loader.js +3 -3
  404. package/dist/setup/semantic-assets.js +12 -9
  405. package/dist/setup/setup.js +444 -208
  406. package/dist/setup/steps/connection-shared.js +120 -0
  407. package/dist/setup/steps/connection.js +108 -305
  408. package/dist/setup/steps/platforms.js +13 -12
  409. package/dist/setup/steps/semantic.js +15 -3
  410. package/dist/setup/steps/sources.js +21 -15
  411. package/dist/setup/steps/stashdir.js +6 -4
  412. package/dist/setup/steps/tasks.js +236 -119
  413. package/dist/setup/steps.js +3 -2
  414. package/dist/sources/freshness.js +39 -0
  415. package/dist/sources/provider-factory.js +11 -17
  416. package/dist/sources/providers/filesystem.js +2 -3
  417. package/dist/sources/providers/git-install.js +278 -34
  418. package/dist/sources/providers/git-provider.js +54 -56
  419. package/dist/sources/providers/git-stash.js +420 -91
  420. package/dist/sources/providers/git.js +2 -2
  421. package/dist/sources/providers/npm.js +16 -19
  422. package/dist/sources/providers/provider-utils.js +47 -22
  423. package/dist/sources/providers/sync-from-ref.js +3 -9
  424. package/dist/sources/providers/website.js +2 -2
  425. package/dist/sources/resolve.js +11 -10
  426. package/dist/sources/snapshot-fetchers/types.js +4 -0
  427. package/dist/sources/{website-ingest.js → snapshot-fetchers/website-ingest.js} +110 -41
  428. package/dist/storage/database.js +60 -4
  429. package/dist/storage/engines/sqlite-migrations.js +156 -5
  430. package/dist/storage/locations.js +1 -2
  431. package/dist/storage/repositories/canaries-repository.js +1 -1
  432. package/dist/storage/repositories/events-repository.js +51 -11
  433. package/dist/storage/repositories/improve-runs-repository.js +6 -32
  434. package/dist/storage/repositories/index-connection.js +79 -0
  435. package/dist/storage/repositories/index-db.js +4 -3
  436. package/dist/storage/repositories/index-entries-repository.js +863 -0
  437. package/dist/{indexer/db/entry-mapper.js → storage/repositories/index-entry-mapper.js} +19 -2
  438. package/dist/storage/repositories/index-entry-types.js +4 -0
  439. package/dist/storage/repositories/index-fts-repository.js +167 -0
  440. package/dist/storage/repositories/index-llm-cache-repository.js +108 -0
  441. package/dist/storage/repositories/index-meta-repository.js +49 -0
  442. package/dist/{indexer/db/schema.js → storage/repositories/index-schema.js} +226 -100
  443. package/dist/storage/repositories/index-sql.js +12 -0
  444. package/dist/storage/repositories/index-utility-repository.js +356 -0
  445. package/dist/storage/repositories/index-vec-repository.js +250 -0
  446. package/dist/storage/repositories/outcome-repository.js +119 -0
  447. package/dist/storage/repositories/proposals-repository.js +317 -75
  448. package/dist/storage/repositories/registry-cache.js +1 -1
  449. package/dist/storage/repositories/salience-repository.js +172 -0
  450. package/dist/storage/repositories/task-history-repository.js +110 -3
  451. package/dist/storage/repositories/workflow-runs-repository.js +240 -19
  452. package/dist/tasks/backends/cron.js +169 -46
  453. package/dist/tasks/backends/exec-utils.js +76 -3
  454. package/dist/tasks/backends/index.js +6 -9
  455. package/dist/tasks/backends/launchd.js +292 -55
  456. package/dist/tasks/backends/schtasks.js +557 -70
  457. package/dist/tasks/backends/types.js +4 -0
  458. package/dist/tasks/command-executable.js +93 -0
  459. package/dist/tasks/embedded.js +56 -38
  460. package/dist/tasks/parser.js +156 -64
  461. package/dist/tasks/resolve-akm-bin.js +144 -51
  462. package/dist/tasks/runner.js +377 -209
  463. package/dist/tasks/schedule.js +108 -19
  464. package/dist/tasks/scheduler-invocation.js +296 -0
  465. package/dist/tasks/schema.js +1 -1
  466. package/dist/tasks/task-id.js +35 -0
  467. package/dist/tasks/validator.js +30 -16
  468. package/dist/text-import-hook.mjs +1 -1
  469. package/dist/workflows/authoring/authoring.js +104 -43
  470. package/dist/workflows/authoring/scope-key.js +1 -1
  471. package/dist/workflows/cli.js +0 -16
  472. package/dist/workflows/concurrency-policy.js +15 -0
  473. package/dist/workflows/exec/brief.js +450 -0
  474. package/dist/workflows/exec/frozen-judge.js +47 -0
  475. package/dist/workflows/exec/native-executor.js +1038 -0
  476. package/dist/workflows/exec/param-secrets.js +115 -0
  477. package/dist/workflows/exec/report.js +1460 -0
  478. package/dist/workflows/exec/run-workflow.js +602 -0
  479. package/dist/workflows/exec/scheduler.js +71 -0
  480. package/dist/workflows/exec/step-work.js +1190 -0
  481. package/dist/workflows/exec/unit-writer.js +23 -0
  482. package/dist/workflows/exec/workflow-engine-gate.js +67 -0
  483. package/dist/workflows/exec/worktree.js +171 -0
  484. package/dist/workflows/ir/compile.js +246 -0
  485. package/dist/workflows/ir/freeze.js +233 -0
  486. package/dist/workflows/ir/params.js +54 -0
  487. package/dist/workflows/ir/plan-hash.js +68 -0
  488. package/dist/workflows/ir/schema.js +540 -0
  489. package/dist/workflows/parser.js +878 -304
  490. package/dist/workflows/program/expressions.js +181 -0
  491. package/dist/workflows/program/schema.js +51 -0
  492. package/dist/workflows/renderer.js +100 -45
  493. package/dist/workflows/resource-limits.js +22 -0
  494. package/dist/workflows/runtime/agent-identity.js +59 -14
  495. package/dist/workflows/runtime/checkin.js +1 -1
  496. package/dist/workflows/runtime/plan-classifier.js +131 -0
  497. package/dist/workflows/runtime/runs.js +376 -119
  498. package/dist/workflows/runtime/unit-checkin.js +45 -0
  499. package/dist/workflows/runtime/unit-phases.js +20 -0
  500. package/dist/workflows/runtime/workflow-asset-loader.js +241 -40
  501. package/dist/workflows/schema.js +1 -11
  502. package/dist/workflows/validate-summary.js +2 -3
  503. package/dist/workflows/validator.js +52 -30
  504. package/docs/README.md +42 -78
  505. package/docs/migration/README.md +8 -0
  506. package/docs/migration/release-notes/0.6.0.md +1 -1
  507. package/docs/migration/release-notes/0.7.0.md +9 -8
  508. package/docs/migration/release-notes/0.9.0.md +158 -14
  509. package/docs/migration/v0.7-to-v0.8.md +46 -47
  510. package/docs/migration/v0.8-to-v0.9.md +844 -0
  511. package/docs/reference/README.md +12 -0
  512. package/docs/reference/data-and-telemetry.md +333 -0
  513. package/package.json +21 -17
  514. package/schemas/akm-asset-envelope.json +93 -0
  515. package/schemas/akm-config.json +4636 -0
  516. package/schemas/akm-task.json +87 -0
  517. package/schemas/akm-workflow.json +373 -0
  518. package/dist/akm-migrate-storage +0 -38
  519. package/dist/assets/help/help-accept.md +0 -12
  520. package/dist/assets/help/help-improve.md +0 -84
  521. package/dist/assets/help/help-proposals.md +0 -17
  522. package/dist/assets/help/help-propose.md +0 -17
  523. package/dist/assets/help/help-reject.md +0 -11
  524. package/dist/assets/profiles/frequent.json +0 -13
  525. package/dist/assets/profiles/recombine-only.json +0 -21
  526. package/dist/assets/profiles/reflect-distill.json +0 -30
  527. package/dist/assets/profiles/synthesize.json +0 -15
  528. package/dist/assets/prompts/procedural-system.md +0 -44
  529. package/dist/assets/prompts/recombine-system.md +0 -40
  530. package/dist/assets/prompts/staleness-detect-system.md +0 -6
  531. package/dist/assets/tasks/core/backup.yml +0 -4
  532. package/dist/assets/tasks/graph-refresh-weekly.yml +0 -10
  533. package/dist/assets/templates/html/default.html +0 -78
  534. package/dist/assets/templates/html/vendor/echarts.min.js +0 -45
  535. package/dist/assets/wiki/index-template.md +0 -12
  536. package/dist/assets/wiki/ingest-workflow-template.md +0 -83
  537. package/dist/assets/wiki/log-template.md +0 -8
  538. package/dist/assets/wiki/schema-template.md +0 -61
  539. package/dist/cli/config-migrate.js +0 -150
  540. package/dist/cli/config-validate.js +0 -39
  541. package/dist/commands/graph/graph-cli.js +0 -124
  542. package/dist/commands/graph/graph.js +0 -487
  543. package/dist/commands/improve/calibration.js +0 -161
  544. package/dist/commands/improve/dedup.js +0 -482
  545. package/dist/commands/improve/extract-watch.js +0 -140
  546. package/dist/commands/improve/hot-probation.js +0 -45
  547. package/dist/commands/improve/improve-auto-accept.js +0 -276
  548. package/dist/commands/improve/improve-profiles.js +0 -168
  549. package/dist/commands/improve/procedural.js +0 -398
  550. package/dist/commands/improve/recombine.js +0 -818
  551. package/dist/commands/improve/schema-similarity-gate.js +0 -168
  552. package/dist/commands/lint/agent-linter.js +0 -44
  553. package/dist/commands/lint/command-linter.js +0 -44
  554. package/dist/commands/lint/default-linter.js +0 -16
  555. package/dist/commands/lint/fact-linter.js +0 -39
  556. package/dist/commands/lint/knowledge-linter.js +0 -16
  557. package/dist/commands/lint/memory-linter.js +0 -61
  558. package/dist/commands/lint/registry.js +0 -41
  559. package/dist/commands/lint/skill-linter.js +0 -45
  560. package/dist/commands/lint/task-linter.js +0 -50
  561. package/dist/commands/lint/workflow-linter.js +0 -81
  562. package/dist/commands/proposal/legacy-import.js +0 -115
  563. package/dist/commands/sources/history.js +0 -196
  564. package/dist/commands/tasks/default-tasks.js +0 -186
  565. package/dist/commands/wiki-cli.js +0 -292
  566. package/dist/core/asset/asset-registry.js +0 -76
  567. package/dist/core/asset/asset-spec.js +0 -259
  568. package/dist/core/config/config-migration.js +0 -602
  569. package/dist/core/deep-merge.js +0 -38
  570. package/dist/core/eval/rank-metrics.js +0 -113
  571. package/dist/core/ripgrep/install.js +0 -163
  572. package/dist/core/ripgrep/resolve.js +0 -81
  573. package/dist/indexer/db/db.js +0 -1413
  574. package/dist/indexer/manifest.js +0 -170
  575. package/dist/indexer/passes/metadata-contributors.js +0 -31
  576. package/dist/indexer/usage/unmigrated-vaults-guard.js +0 -94
  577. package/dist/integrations/harnesses/opencode-sdk/index.js +0 -49
  578. package/dist/llm/call-ai.js +0 -62
  579. package/dist/llm/memory-infer-impl.js +0 -138
  580. package/dist/output/shapes/distill.js +0 -14
  581. package/dist/output/shapes/history.js +0 -11
  582. package/dist/output/text/distill.js +0 -6
  583. package/dist/output/text/enable-disable.js +0 -8
  584. package/dist/output/text/history.js +0 -6
  585. package/dist/output/text/wiki.js +0 -16
  586. package/dist/registry/build-index.js +0 -386
  587. package/dist/scripts/migrate-storage.js +0 -19108
  588. package/dist/scripts/migrations/import-fs-improve-runs-to-db.js +0 -9411
  589. package/dist/scripts/migrations/v16-to-v17.js +0 -141
  590. package/dist/setup/legacy-config.js +0 -106
  591. package/dist/storage/repositories/consolidation-repository.js +0 -38
  592. package/dist/storage/repositories/recombine-repository.js +0 -213
  593. package/dist/wiki/wiki-templates.js +0 -15
  594. package/dist/wiki/wiki.js +0 -1012
  595. package/dist/workflows/db.js +0 -215
  596. package/docs/data-and-telemetry.md +0 -226
  597. /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/registry.js +0 -0
  598. /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/youtube.js +0 -0
@@ -1,487 +0,0 @@
1
- // This Source Code Form is subject to the terms of the Mozilla Public
2
- // License, v. 2.0. If a copy of the MPL was not distributed with this
3
- // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
- import fs from "node:fs";
5
- import path from "node:path";
6
- import { parseAssetRef } from "../../core/asset/asset-ref.js";
7
- import { loadConfig } from "../../core/config/config.js";
8
- import { NotFoundError, UsageError } from "../../core/errors.js";
9
- import { getDbPath } from "../../core/paths.js";
10
- import { warn } from "../../core/warn.js";
11
- import { closeDatabase, findEntryIdByRef, getEntryById, getEntryRefRowsForStashRoot, openExistingDatabase, openIndexDatabase, } from "../../indexer/db/db.js";
12
- import { loadStoredGraphSnapshot } from "../../indexer/db/graph-db.js";
13
- import { listRelatedPathsForFile } from "../../indexer/graph/graph-boost.js";
14
- import { runGraphExtractionPass } from "../../indexer/graph/graph-extraction.js";
15
- import { withIndexWriterLease } from "../../indexer/index-writer-lock.js";
16
- import { lookup } from "../../indexer/indexer.js";
17
- import { findSourceForPath, resolveSourceEntries } from "../../indexer/search/search-source.js";
18
- import { resolveAssetPath } from "../../indexer/walk/path-resolver.js";
19
- function resolveGraphStashPath(source) {
20
- const sources = resolveSourceEntries(undefined, loadConfig());
21
- if (sources.length === 0) {
22
- throw new NotFoundError("No stash sources are configured.", "STASH_NOT_FOUND");
23
- }
24
- if (!source || source === "primary")
25
- return sources[0].path;
26
- const matched = sources.find((entry) => entry.registryId === source || entry.path === source);
27
- if (!matched) {
28
- throw new NotFoundError(`Source not found: ${source}`, "SOURCE_NOT_FOUND", "Run `akm list` to see source names.");
29
- }
30
- return matched.path;
31
- }
32
- function loadGraph(source) {
33
- const stashPath = resolveGraphStashPath(source);
34
- let db;
35
- try {
36
- db = openExistingDatabase();
37
- const snapshot = loadStoredGraphSnapshot(stashPath, db);
38
- if (!snapshot) {
39
- throw new NotFoundError(`Graph data not found for source ${stashPath}.`, "FILE_NOT_FOUND", "Run the improvement flow that refreshes graph extraction data.");
40
- }
41
- return {
42
- graph: {
43
- schemaVersion: snapshot.schemaVersion,
44
- generatedAt: snapshot.generatedAt,
45
- stashRoot: snapshot.stashPath,
46
- files: snapshot.files,
47
- entities: snapshot.entities,
48
- relations: snapshot.relations,
49
- ...(snapshot.quality ? { quality: snapshot.quality } : {}),
50
- ...(snapshot.telemetry ? { telemetry: snapshot.telemetry } : {}),
51
- },
52
- stashPath,
53
- graphPath: snapshot.graphPath,
54
- };
55
- }
56
- finally {
57
- if (db)
58
- closeDatabase(db);
59
- }
60
- }
61
- function countEntitiesByFile(nodes) {
62
- const counts = new Map();
63
- for (const node of nodes) {
64
- const seen = new Set();
65
- for (const entity of node.entities) {
66
- if (seen.has(entity))
67
- continue;
68
- seen.add(entity);
69
- counts.set(entity, (counts.get(entity) ?? 0) + 1);
70
- }
71
- }
72
- return counts;
73
- }
74
- function aggregateEntityStats(nodes) {
75
- const stats = new Map();
76
- for (const node of nodes) {
77
- const seen = new Set();
78
- for (const entity of node.entities) {
79
- if (seen.has(entity))
80
- continue;
81
- seen.add(entity);
82
- const existing = stats.get(entity);
83
- const nodeConf = typeof node.confidence === "number" && Number.isFinite(node.confidence) ? node.confidence : undefined;
84
- if (existing) {
85
- existing.fileCount += 1;
86
- if (nodeConf !== undefined && (existing.confidence === undefined || nodeConf > existing.confidence)) {
87
- existing.confidence = nodeConf;
88
- }
89
- }
90
- else {
91
- stats.set(entity, { fileCount: 1, ...(nodeConf !== undefined ? { confidence: nodeConf } : {}) });
92
- }
93
- }
94
- }
95
- return stats;
96
- }
97
- export function akmGraphSummary(options) {
98
- const { graph, stashPath, graphPath } = loadGraph(options?.source);
99
- return {
100
- schemaVersion: 1,
101
- shape: "graph-summary",
102
- stashPath,
103
- graphPath,
104
- generatedAt: graph.generatedAt,
105
- fileCount: graph.files.length,
106
- entityCount: Array.isArray(graph.entities) ? graph.entities.length : countEntitiesByFile(graph.files).size,
107
- relationCount: Array.isArray(graph.relations)
108
- ? graph.relations.length
109
- : graph.files.reduce((sum, node) => sum + node.relations.length, 0),
110
- ...(graph.quality ? { quality: graph.quality } : {}),
111
- ...(graph.telemetry ? { telemetry: graph.telemetry } : {}),
112
- };
113
- }
114
- export function akmGraphEntities(options) {
115
- const { graph, stashPath, graphPath } = loadGraph(options?.source);
116
- const limit = options?.limit;
117
- if (limit !== undefined && (!Number.isFinite(limit) || limit <= 0)) {
118
- throw new UsageError("--limit must be a positive integer.", "INVALID_FLAG_VALUE");
119
- }
120
- const stats = aggregateEntityStats(graph.files);
121
- const entities = [...stats.entries()]
122
- .map(([name, info]) => ({
123
- name,
124
- fileCount: info.fileCount,
125
- ...(info.confidence !== undefined ? { confidence: info.confidence } : {}),
126
- }))
127
- .sort((a, b) => b.fileCount - a.fileCount || a.name.localeCompare(b.name));
128
- const sliced = typeof limit === "number" ? entities.slice(0, limit) : entities;
129
- return {
130
- schemaVersion: 1,
131
- shape: "graph-entities",
132
- stashPath,
133
- graphPath,
134
- generatedAt: graph.generatedAt,
135
- total: entities.length,
136
- entities: sliced,
137
- };
138
- }
139
- export function akmGraphRelations(options) {
140
- const { graph, stashPath, graphPath } = loadGraph(options?.source);
141
- const limit = options?.limit;
142
- if (limit !== undefined && (!Number.isFinite(limit) || limit <= 0)) {
143
- throw new UsageError("--limit must be a positive integer.", "INVALID_FLAG_VALUE");
144
- }
145
- const counts = new Map();
146
- for (const node of graph.files) {
147
- for (const rel of node.relations) {
148
- const key = `${rel.from}\u0000${rel.to}\u0000${rel.type ?? ""}`;
149
- const relConf = typeof rel.confidence === "number" && Number.isFinite(rel.confidence) ? rel.confidence : undefined;
150
- const existing = counts.get(key);
151
- if (existing) {
152
- existing.count += 1;
153
- if (relConf !== undefined && (existing.confidence === undefined || relConf > existing.confidence)) {
154
- existing.confidence = relConf;
155
- }
156
- }
157
- else {
158
- counts.set(key, {
159
- from: rel.from,
160
- to: rel.to,
161
- ...(rel.type ? { type: rel.type } : {}),
162
- count: 1,
163
- ...(relConf !== undefined ? { confidence: relConf } : {}),
164
- });
165
- }
166
- }
167
- }
168
- const relations = [...counts.values()].sort((a, b) => b.count - a.count || a.from.localeCompare(b.from) || a.to.localeCompare(b.to));
169
- const sliced = typeof limit === "number" ? relations.slice(0, limit) : relations;
170
- return {
171
- schemaVersion: 1,
172
- shape: "graph-relations",
173
- stashPath,
174
- graphPath,
175
- generatedAt: graph.generatedAt,
176
- total: relations.length,
177
- relations: sliced,
178
- };
179
- }
180
- export function akmGraphExport(options) {
181
- if (!options.out?.trim()) {
182
- throw new UsageError("`akm graph export` requires --out <path>.", "MISSING_REQUIRED_ARGUMENT");
183
- }
184
- const format = options.format ?? "json";
185
- if (format !== "json" && format !== "jsonl") {
186
- throw new UsageError("--format must be one of: json, jsonl.", "INVALID_FLAG_VALUE");
187
- }
188
- const { graph, stashPath, graphPath } = loadGraph(options.source);
189
- const outPath = path.resolve(options.out);
190
- fs.mkdirSync(path.dirname(outPath), { recursive: true });
191
- const payload = format === "json"
192
- ? `${JSON.stringify(graph, null, 2)}\n`
193
- : `${[
194
- ...graph.files.flatMap((file) => file.entities.map((entity) => JSON.stringify({ kind: "entity", entity, file: file.path }))),
195
- ...graph.files.flatMap((file) => file.relations.map((relation) => JSON.stringify({ kind: "relation", ...relation, file: file.path }))),
196
- ].join("\n")}\n`;
197
- fs.writeFileSync(outPath, payload, "utf8");
198
- return {
199
- schemaVersion: 1,
200
- shape: "graph-export",
201
- stashPath,
202
- graphPath,
203
- outPath,
204
- format,
205
- bytes: Buffer.byteLength(payload, "utf8"),
206
- };
207
- }
208
- export async function akmGraphRelated(options) {
209
- const ref = options.ref.trim();
210
- if (!ref) {
211
- throw new UsageError("`akm graph related` requires <ref>.", "MISSING_REQUIRED_ARGUMENT");
212
- }
213
- const limit = options.limit;
214
- if (limit !== undefined && (!Number.isFinite(limit) || limit <= 0)) {
215
- throw new UsageError("--limit must be a positive integer.", "INVALID_FLAG_VALUE");
216
- }
217
- const target = await resolveGraphTarget(ref, options.source);
218
- const { graph, stashPath, graphPath } = loadGraph(target.stashPath);
219
- let db;
220
- const related = (() => {
221
- try {
222
- db = openExistingDatabase();
223
- return listRelatedPathsForFile(stashPath, target.filePath, limit ?? 5, db);
224
- }
225
- finally {
226
- if (db)
227
- closeDatabase(db);
228
- }
229
- })();
230
- return {
231
- schemaVersion: 1,
232
- shape: "graph-related",
233
- stashPath,
234
- graphPath,
235
- generatedAt: graph.generatedAt,
236
- ref: target.ref,
237
- path: target.filePath,
238
- total: related.length,
239
- related,
240
- ...(related.length === 0 ? { tip: "No related graph neighbors were found for this asset." } : {}),
241
- };
242
- }
243
- function normalizeGraphName(value) {
244
- return value.trim().toLowerCase();
245
- }
246
- function buildRefByPath(stashRoot, db) {
247
- const rows = getEntryRefRowsForStashRoot(db, stashRoot);
248
- const map = new Map();
249
- for (const row of rows) {
250
- if (map.has(row.file_path))
251
- continue;
252
- try {
253
- const entry = JSON.parse(row.entry_json);
254
- if (typeof entry.type === "string" && typeof entry.name === "string") {
255
- map.set(row.file_path, { ref: `${entry.type}:${entry.name}`, type: entry.type });
256
- }
257
- }
258
- catch {
259
- // ignore corrupt entry_json
260
- }
261
- }
262
- return map;
263
- }
264
- export function akmGraphEntity(options) {
265
- const name = options.name?.trim();
266
- if (!name) {
267
- throw new UsageError("`akm graph entity` requires <name>.", "MISSING_REQUIRED_ARGUMENT");
268
- }
269
- const limit = options.limit;
270
- if (limit !== undefined && (!Number.isFinite(limit) || limit <= 0)) {
271
- throw new UsageError("--limit must be a positive integer.", "INVALID_FLAG_VALUE");
272
- }
273
- const { graph, stashPath, graphPath } = loadGraph(options.source);
274
- const target = normalizeGraphName(name);
275
- let db;
276
- let refByPath;
277
- try {
278
- db = openExistingDatabase();
279
- refByPath = buildRefByPath(stashPath, db);
280
- }
281
- finally {
282
- if (db)
283
- closeDatabase(db);
284
- }
285
- const matches = [];
286
- for (const node of graph.files) {
287
- const found = node.entities.some((entity) => normalizeGraphName(entity) === target);
288
- if (!found)
289
- continue;
290
- const lookup = refByPath.get(node.path);
291
- const conf = typeof node.confidence === "number" && Number.isFinite(node.confidence) ? node.confidence : undefined;
292
- matches.push({
293
- ...(lookup?.ref ? { ref: lookup.ref } : {}),
294
- path: node.path,
295
- type: node.type,
296
- ...(conf !== undefined ? { confidence: conf } : {}),
297
- });
298
- }
299
- matches.sort((a, b) => {
300
- const ca = a.confidence ?? 0;
301
- const cb = b.confidence ?? 0;
302
- if (cb !== ca)
303
- return cb - ca;
304
- return a.path.localeCompare(b.path);
305
- });
306
- const sliced = typeof limit === "number" ? matches.slice(0, limit) : matches;
307
- return {
308
- schemaVersion: 1,
309
- shape: "graph-entity",
310
- stashPath,
311
- graphPath,
312
- generatedAt: graph.generatedAt,
313
- entity: name,
314
- total: matches.length,
315
- matches: sliced,
316
- };
317
- }
318
- export function akmGraphOrphans(options) {
319
- const limit = options?.limit;
320
- if (limit !== undefined && (!Number.isFinite(limit) || limit <= 0)) {
321
- throw new UsageError("--limit must be a positive integer.", "INVALID_FLAG_VALUE");
322
- }
323
- const { graph, stashPath, graphPath } = loadGraph(options?.source);
324
- let db;
325
- let refByPath;
326
- try {
327
- db = openExistingDatabase();
328
- refByPath = buildRefByPath(stashPath, db);
329
- }
330
- finally {
331
- if (db)
332
- closeDatabase(db);
333
- }
334
- const orphans = [];
335
- for (const node of graph.files) {
336
- if ((node.status ?? (node.entities.length > 0 ? "extracted" : "empty")) === "extracted")
337
- continue;
338
- const lookup = refByPath.get(node.path);
339
- orphans.push({
340
- ...(lookup?.ref ? { ref: lookup.ref } : {}),
341
- path: node.path,
342
- type: node.type,
343
- ...(node.status ? { status: node.status } : {}),
344
- ...(node.reason ? { reason: node.reason } : {}),
345
- });
346
- }
347
- orphans.sort((a, b) => a.type.localeCompare(b.type) || a.path.localeCompare(b.path));
348
- const sliced = typeof limit === "number" ? orphans.slice(0, limit) : orphans;
349
- return {
350
- schemaVersion: 1,
351
- shape: "graph-orphans",
352
- stashPath,
353
- graphPath,
354
- generatedAt: graph.generatedAt,
355
- totalConsidered: graph.files.length,
356
- total: orphans.length,
357
- orphans: sliced,
358
- };
359
- }
360
- /**
361
- * Re-run graph extraction, optionally scoped to specific asset refs.
362
- *
363
- * When `refs` is provided, only those files are re-extracted (incremental).
364
- * When no refs are given, the full eligible set is re-extracted.
365
- */
366
- export async function akmGraphUpdate(options) {
367
- const config = options.config ?? loadConfig();
368
- const sources = resolveSourceEntries(options.stashDir, config);
369
- if (sources.length === 0) {
370
- throw new NotFoundError("No stash sources are configured.", "STASH_NOT_FOUND");
371
- }
372
- if (options.source && options.source !== "primary") {
373
- const matched = sources.find((s) => s.registryId === options.source || s.path === options.source);
374
- if (!matched) {
375
- throw new NotFoundError(`Source not found: ${options.source}`, "SOURCE_NOT_FOUND", "Run `akm list` to see source names.");
376
- }
377
- }
378
- const scoped = Array.isArray(options.refs) && options.refs.length > 0;
379
- return withIndexWriterLease({ purpose: "graph-update" }, async () => {
380
- let candidatePaths;
381
- if (scoped && options.refs) {
382
- // Resolve each ref to an absolute file path while the writer lease is held
383
- // so the scoped graph write sees the same index snapshot it resolved from.
384
- const dbPath = getDbPath();
385
- let db;
386
- const resolvedPaths = new Set();
387
- try {
388
- db = openIndexDatabase(dbPath);
389
- for (const ref of options.refs) {
390
- const trimmed = ref.trim();
391
- if (!trimmed)
392
- continue;
393
- const entryId = findEntryIdByRef(db, trimmed);
394
- if (entryId === undefined) {
395
- warn(`[graph] ref not found in index, skipping: ${trimmed}`);
396
- continue;
397
- }
398
- const row = getEntryById(db, entryId);
399
- if (!row?.filePath) {
400
- warn(`[graph] could not resolve path for ref, skipping: ${trimmed}`);
401
- continue;
402
- }
403
- resolvedPaths.add(row.filePath);
404
- }
405
- }
406
- finally {
407
- if (db)
408
- closeDatabase(db);
409
- }
410
- if (resolvedPaths.size === 0) {
411
- warn("[graph] none of the provided refs resolved to indexed paths — no extraction performed.");
412
- return {
413
- shape: "graph-update",
414
- ok: true,
415
- filesExtracted: 0,
416
- entitiesUpserted: 0,
417
- relationsUpserted: 0,
418
- durationMs: 0,
419
- scoped: true,
420
- };
421
- }
422
- candidatePaths = resolvedPaths;
423
- }
424
- const extractionFn = options.graphExtractionFn ?? runGraphExtractionPass;
425
- const passOptions = candidatePaths ? { candidatePaths } : {};
426
- let db;
427
- const startMs = Date.now();
428
- try {
429
- db = openIndexDatabase(getDbPath());
430
- const onProgress = (event) => {
431
- if (!event.currentPath)
432
- return;
433
- const file = path.basename(event.currentPath);
434
- warn(`[graph] extracting ${event.processed}/${event.total} ${file}`);
435
- };
436
- const result = await extractionFn({
437
- config,
438
- sources,
439
- signal: undefined,
440
- db,
441
- reEnrich: false,
442
- onProgress,
443
- options: passOptions,
444
- });
445
- const durationMs = Date.now() - startMs;
446
- return {
447
- shape: "graph-update",
448
- ok: true,
449
- filesExtracted: result.quality.extractedFiles,
450
- entitiesUpserted: result.quality.entityCount,
451
- relationsUpserted: result.quality.relationCount,
452
- durationMs,
453
- scoped,
454
- };
455
- }
456
- finally {
457
- if (db)
458
- closeDatabase(db);
459
- }
460
- });
461
- }
462
- async function resolveGraphTarget(ref, source) {
463
- const parsedRef = parseAssetRef(ref);
464
- const filePath = (await resolveAssetPath(parsedRef, {
465
- mode: "index-first",
466
- honorOrigin: true,
467
- })) ?? (await lookup(parsedRef))?.filePath;
468
- if (!filePath) {
469
- throw new NotFoundError(`Asset not found for ref: ${ref}`);
470
- }
471
- const allSources = resolveSourceEntries(undefined, loadConfig());
472
- const matchedSource = findSourceForPath(filePath, allSources);
473
- const inferredStashPath = matchedSource?.path;
474
- const stashPath = source ? resolveGraphStashPath(source) : inferredStashPath;
475
- if (!stashPath) {
476
- throw new NotFoundError(`Could not determine stash source for ref: ${ref}`, "SOURCE_NOT_FOUND");
477
- }
478
- if (!filePath.startsWith(path.resolve(stashPath) + path.sep) && path.resolve(filePath) !== path.resolve(stashPath)) {
479
- throw new UsageError(`Resolved asset ${ref} is not inside source ${source ?? stashPath}.`, "INVALID_SOURCE_VALUE", "Pass --source for the asset's source, or omit it to infer from the resolved asset path.");
480
- }
481
- return {
482
- ref,
483
- parsedRef,
484
- filePath,
485
- stashPath,
486
- };
487
- }
@@ -1,161 +0,0 @@
1
- // This Source Code Form is subject to the terms of the Mozilla Public
2
- // License, v. 2.0. If a copy of the MPL was not distributed with this
3
- // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
- // ---------------------------------------------------------------------------
5
- // Reliability computation
6
- // ---------------------------------------------------------------------------
7
- /** Number of fixed-width reliability buckets over [0, 1]. */
8
- export const CALIBRATION_BUCKET_COUNT = 10;
9
- function roundRate(value) {
10
- return Number(value.toFixed(4));
11
- }
12
- /**
13
- * Assign a confidence in [0, 1] to one of {@link CALIBRATION_BUCKET_COUNT}
14
- * fixed-width buckets. The final bucket is closed on the right so confidence
15
- * === 1 lands in the top bucket rather than overflowing.
16
- */
17
- function bucketIndex(confidence) {
18
- const clamped = Math.min(1, Math.max(0, confidence));
19
- const idx = Math.floor(clamped * CALIBRATION_BUCKET_COUNT);
20
- return Math.min(CALIBRATION_BUCKET_COUNT - 1, idx);
21
- }
22
- /**
23
- * Compute a deterministic calibration summary from a list of acted-on gate
24
- * decisions. Pure: identical input always yields identical output, with no
25
- * dependency on wall-clock time or randomness.
26
- */
27
- export function summarizeCalibration(samples) {
28
- const buckets = [];
29
- const bucketCounts = new Array(CALIBRATION_BUCKET_COUNT).fill(0);
30
- const bucketAccepted = new Array(CALIBRATION_BUCKET_COUNT).fill(0);
31
- const bucketConfSum = new Array(CALIBRATION_BUCKET_COUNT).fill(0);
32
- let accepted = 0;
33
- let confSum = 0;
34
- for (const sample of samples) {
35
- const idx = bucketIndex(sample.confidence);
36
- bucketCounts[idx] = (bucketCounts[idx] ?? 0) + 1;
37
- bucketConfSum[idx] = (bucketConfSum[idx] ?? 0) + sample.confidence;
38
- confSum += sample.confidence;
39
- if (sample.outcome === "auto-accepted") {
40
- accepted += 1;
41
- bucketAccepted[idx] = (bucketAccepted[idx] ?? 0) + 1;
42
- }
43
- }
44
- const total = samples.length;
45
- const width = 1 / CALIBRATION_BUCKET_COUNT;
46
- for (let i = 0; i < CALIBRATION_BUCKET_COUNT; i += 1) {
47
- const count = bucketCounts[i] ?? 0;
48
- const acc = bucketAccepted[i] ?? 0;
49
- buckets.push({
50
- lower: roundRate(i * width),
51
- upper: roundRate((i + 1) * width),
52
- count,
53
- accepted: acc,
54
- acceptRate: count > 0 ? roundRate(acc / count) : 0,
55
- meanConfidence: count > 0 ? roundRate((bucketConfSum[i] ?? 0) / count) : 0,
56
- });
57
- }
58
- const overallAcceptRate = total > 0 ? roundRate(accepted / total) : 0;
59
- const meanConfidence = total > 0 ? roundRate(confSum / total) : 0;
60
- return {
61
- samples: total,
62
- accepted,
63
- rejected: total - accepted,
64
- overallAcceptRate,
65
- meanConfidence,
66
- calibrationGap: total > 0 ? roundRate(meanConfidence - overallAcceptRate) : 0,
67
- buckets,
68
- };
69
- }
70
- /**
71
- * Project a list of `gateDecision` records (read from the proposal store) into
72
- * the acted-on calibration samples within an optional `[since, until)` window.
73
- *
74
- * Only `auto-accepted` / `auto-rejected` decisions with a finite confidence in
75
- * [0, 1] contribute. `deferred` decisions and decisions missing a confidence
76
- * are excluded (no realized accept/reject signal). The window filter uses each
77
- * decision's `decidedAt` timestamp; decisions with an unparseable timestamp are
78
- * kept only when no window is supplied.
79
- *
80
- * Exploration-budget promotions (`reason === "exploration-budget"`) are EXCLUDED:
81
- * they are accepted regardless of confidence, so they carry no reliability signal
82
- * about the gate threshold. Counting them would inflate the apparent accept-rate
83
- * and bias the auto-tuner downward — they are exempt from auto-tune by design
84
- * (WS-4 exploration budget).
85
- */
86
- export function gateDecisionsToSamples(decisions, window) {
87
- const sinceMs = window?.since ? new Date(window.since).getTime() : undefined;
88
- const untilMs = window?.until ? new Date(window.until).getTime() : undefined;
89
- const samples = [];
90
- for (const decision of decisions) {
91
- if (!decision)
92
- continue;
93
- if (decision.outcome !== "auto-accepted" && decision.outcome !== "auto-rejected")
94
- continue;
95
- if (decision.reason === "exploration-budget")
96
- continue;
97
- const confidence = decision.confidence;
98
- if (typeof confidence !== "number" || !Number.isFinite(confidence) || confidence < 0 || confidence > 1)
99
- continue;
100
- if (sinceMs !== undefined || untilMs !== undefined) {
101
- const ts = new Date(decision.decidedAt).getTime();
102
- if (!Number.isFinite(ts))
103
- continue;
104
- if (sinceMs !== undefined && ts < sinceMs)
105
- continue;
106
- if (untilMs !== undefined && ts >= untilMs)
107
- continue;
108
- }
109
- samples.push({ confidence, outcome: decision.outcome });
110
- }
111
- return samples;
112
- }
113
- /**
114
- * Compute a bounded, opt-in threshold adjustment from a calibration summary.
115
- * PURE and deterministic — does not mutate config or read the clock. The
116
- * caller is responsible for persisting `newThreshold` and logging the result.
117
- *
118
- * Algorithm (deliberately simple and bounded):
119
- * - When `autoTune` is false → no-op (`disabled`).
120
- * - When samples < `minSamples` → no-op (`insufficient-samples`).
121
- * - Otherwise nudge by at most `maxStep` toward `targetAcceptRate`, then
122
- * clamp into `[minThreshold, maxThreshold]`. The step size scales with the
123
- * gap from target but is capped, so a single run can never make a large
124
- * swing.
125
- */
126
- export function computeThresholdAutoTune(currentThreshold, summary, config) {
127
- const previousThreshold = Math.round(currentThreshold);
128
- const noop = (reason) => ({
129
- adjusted: false,
130
- previousThreshold,
131
- newThreshold: previousThreshold,
132
- delta: 0,
133
- reason,
134
- });
135
- if (!config.autoTune)
136
- return noop("disabled");
137
- if (summary.samples < config.minSamples)
138
- return noop("insufficient-samples");
139
- const gap = config.targetAcceptRate - summary.overallAcceptRate;
140
- // A small dead-band so tiny noise doesn't churn the threshold every run.
141
- const DEAD_BAND = 0.01;
142
- if (Math.abs(gap) <= DEAD_BAND)
143
- return noop("within-target");
144
- // gap > 0 ⇒ realized below target ⇒ raise threshold (be stricter).
145
- // gap < 0 ⇒ realized above target ⇒ lower threshold (be more permissive).
146
- const direction = gap > 0 ? 1 : -1;
147
- // Scale the step with the gap magnitude (in points) but cap at maxStep.
148
- const desiredMagnitude = Math.min(config.maxStep, Math.max(1, Math.round(Math.abs(gap) * 100)));
149
- const proposed = previousThreshold + direction * desiredMagnitude;
150
- const clamped = Math.min(config.maxThreshold, Math.max(config.minThreshold, proposed));
151
- const delta = clamped - previousThreshold;
152
- if (delta === 0)
153
- return noop("clamped-at-bound");
154
- return {
155
- adjusted: true,
156
- previousThreshold,
157
- newThreshold: clamped,
158
- delta,
159
- reason: direction > 0 ? "below-target-raise" : "above-target-lower",
160
- };
161
- }