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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (587) hide show
  1. package/CHANGELOG.md +1190 -52
  2. package/README.md +62 -37
  3. package/SECURITY.md +46 -31
  4. package/dist/akm +162 -38
  5. package/dist/akm-migrate +44 -0
  6. package/dist/assets/backends/schtasks-template.xml +2 -1
  7. package/dist/assets/hints/cli-hints-full.md +268 -118
  8. package/dist/assets/hints/cli-hints-short.md +87 -24
  9. package/dist/assets/{profiles → improve-strategies}/catchup.json +3 -1
  10. package/dist/assets/{profiles → improve-strategies}/consolidate.json +3 -1
  11. package/dist/assets/{profiles → improve-strategies}/default.json +6 -7
  12. package/dist/assets/improve-strategies/frequent.json +15 -0
  13. package/dist/assets/{profiles → improve-strategies}/graph-refresh.json +4 -2
  14. package/dist/assets/{profiles → improve-strategies}/memory-focus.json +4 -1
  15. package/dist/assets/{profiles → improve-strategies}/proactive-maintenance.json +5 -5
  16. package/dist/assets/{profiles → improve-strategies}/quick.json +4 -2
  17. package/dist/assets/improve-strategies/reflect-distill.json +30 -0
  18. package/dist/assets/{profiles → improve-strategies}/thorough.json +1 -1
  19. package/dist/assets/prompts/consolidate-system.md +5 -5
  20. package/dist/assets/prompts/extract-session.md +2 -6
  21. package/dist/assets/prompts/memory-infer-user.md +2 -3
  22. package/dist/assets/prompts/reflect-llm-framed-contract.md +11 -0
  23. package/dist/assets/prompts/reflect-llm-schema-contract.md +3 -0
  24. package/dist/assets/prompts/reflect-output-repair.md +3 -0
  25. package/dist/assets/stash-skeleton/README.md +38 -10
  26. package/dist/assets/stash-skeleton/facts/conventions/assets/agent.md +8 -0
  27. package/dist/assets/stash-skeleton/facts/conventions/assets/command.md +8 -0
  28. package/dist/assets/stash-skeleton/facts/conventions/assets/fact.md +14 -1
  29. package/dist/assets/stash-skeleton/facts/conventions/assets/knowledge.md +13 -1
  30. package/dist/assets/stash-skeleton/facts/conventions/assets/lesson.md +9 -1
  31. package/dist/assets/stash-skeleton/facts/conventions/assets/memory.md +11 -0
  32. package/dist/assets/stash-skeleton/facts/conventions/assets/script.md +9 -0
  33. package/dist/assets/stash-skeleton/facts/conventions/assets/skill.md +9 -0
  34. package/dist/assets/stash-skeleton/facts/conventions/assets/workflow.md +8 -0
  35. package/dist/assets/stash-skeleton/facts/conventions/backlinks.md +100 -0
  36. package/dist/assets/stash-skeleton/facts/conventions/domains.md +64 -0
  37. package/dist/assets/stash-skeleton/facts/conventions/organization.md +136 -0
  38. package/dist/assets/tasks/core/extract.yml +3 -2
  39. package/dist/assets/tasks/core/improve.yml +2 -1
  40. package/dist/assets/tasks/core/index-refresh.yml +1 -0
  41. package/dist/assets/tasks/core/sync.yml +1 -0
  42. package/dist/assets/tasks/core/version-check.yml +2 -1
  43. package/dist/assets/tasks/improve/akm-graph-refresh-weekly.yml +5 -0
  44. package/dist/assets/tasks/improve/akm-improve-catchup.yml +8 -0
  45. package/dist/assets/tasks/improve/akm-improve-consolidate.yml +5 -0
  46. package/dist/assets/tasks/improve/akm-improve-frequent.yml +5 -0
  47. package/dist/assets/tasks/improve/akm-improve-nightly.yml +5 -0
  48. package/dist/assets/templates/html/health.html +5 -4
  49. package/dist/assets/workflows/workflow-template.md +31 -15
  50. package/dist/cli/invocation.js +279 -0
  51. package/dist/cli/parse-args.js +5 -90
  52. package/dist/cli/retired-commands.js +78 -0
  53. package/dist/cli/shared.js +158 -48
  54. package/dist/cli-node.mjs +2 -1
  55. package/dist/cli.js +747 -293
  56. package/dist/commands/agent/agent-dispatch.js +19 -18
  57. package/dist/commands/agent/agent-support.js +0 -24
  58. package/dist/commands/agent/contribute-cli.js +43 -97
  59. package/dist/commands/completions.js +80 -23
  60. package/dist/commands/config-cli.js +44 -281
  61. package/dist/commands/env/env-binding.js +13 -9
  62. package/dist/commands/env/env-cli.js +76 -159
  63. package/dist/commands/env/env.js +12 -163
  64. package/dist/commands/env/marker-path.js +6 -0
  65. package/dist/commands/env/secret-cli.js +45 -61
  66. package/dist/commands/env/secret.js +32 -62
  67. package/dist/commands/feedback-cli.js +179 -85
  68. package/dist/commands/health/accept-rate.js +58 -0
  69. package/dist/commands/health/advisories.js +7 -8
  70. package/dist/commands/health/checks.js +279 -94
  71. package/dist/commands/health/html-report.js +197 -578
  72. package/dist/commands/health/improve-metrics.js +277 -246
  73. package/dist/commands/health/llm-usage.js +19 -19
  74. package/dist/commands/health/md-report.js +16 -7
  75. package/dist/commands/health/metrics.js +67 -32
  76. package/dist/commands/health/renderers.js +47 -0
  77. package/dist/commands/health/report-view-model.js +508 -0
  78. package/dist/commands/health/stash-exposure.js +1 -1
  79. package/dist/commands/health/surfaces.js +16 -56
  80. package/dist/commands/health/task-runs.js +3 -67
  81. package/dist/{migrate-storage-node.mjs → commands/health/types-checks.js} +1 -5
  82. package/dist/commands/health/types-improve.js +29 -0
  83. package/dist/{output/text/save.js → commands/health/types-metrics.js} +1 -2
  84. package/dist/commands/health/types-result.js +7 -0
  85. package/dist/commands/health/types-runs.js +4 -0
  86. package/dist/commands/health/types-session-log.js +4 -0
  87. package/dist/commands/health/types-windows.js +4 -0
  88. package/dist/commands/health/types.js +26 -21
  89. package/dist/commands/health/windows.js +2 -3
  90. package/dist/commands/health.js +296 -167
  91. package/dist/commands/improve/anti-collapse.js +5 -5
  92. package/dist/commands/improve/autonomy-gate.js +68 -0
  93. package/dist/commands/improve/collapse-detector.js +65 -52
  94. package/dist/commands/improve/consolidate/chunking.js +9 -7
  95. package/dist/commands/improve/consolidate/eligibility.js +1 -23
  96. package/dist/commands/improve/consolidate/merge.js +4 -0
  97. package/dist/commands/improve/consolidate.js +454 -1354
  98. package/dist/commands/improve/content-hash.js +39 -0
  99. package/dist/commands/improve/distill/content-repair.js +4 -10
  100. package/dist/commands/improve/distill/promote-memory.js +89 -64
  101. package/dist/commands/improve/distill/quality-gate.js +118 -42
  102. package/dist/commands/improve/distill-guards.js +1 -1
  103. package/dist/commands/improve/distill-promotion-policy.js +33 -888
  104. package/dist/commands/improve/distill.js +607 -363
  105. package/dist/commands/improve/eligibility.js +165 -79
  106. package/dist/commands/improve/extract-cli.js +35 -126
  107. package/dist/commands/improve/extract-prompt.js +6 -35
  108. package/dist/commands/improve/extract.js +640 -391
  109. package/dist/commands/improve/feedback-valence.js +2 -12
  110. package/dist/commands/improve/improve-cli.js +134 -135
  111. package/dist/commands/improve/improve-result-file.js +30 -50
  112. package/dist/commands/improve/improve-run-types.js +4 -0
  113. package/dist/commands/improve/improve-strategies.js +135 -0
  114. package/dist/commands/improve/improve.js +904 -701
  115. package/dist/commands/improve/locks.js +64 -111
  116. package/dist/commands/improve/loop-stages.js +1110 -923
  117. package/dist/commands/improve/memory/derived-ref.js +124 -0
  118. package/dist/commands/improve/memory/memory-belief.js +79 -7
  119. package/dist/commands/improve/memory/memory-contradiction-detect.js +49 -52
  120. package/dist/commands/improve/memory/memory-improve.js +25 -37
  121. package/dist/commands/improve/outcome-loop.js +25 -88
  122. package/dist/commands/improve/preparation.js +1034 -813
  123. package/dist/commands/improve/proactive-maintenance.js +34 -9
  124. package/dist/commands/improve/proposal-envelope.js +31 -0
  125. package/dist/commands/improve/reflect.js +983 -794
  126. package/dist/commands/improve/run-context.js +119 -0
  127. package/dist/commands/improve/salience.js +24 -127
  128. package/dist/commands/improve/session-asset.js +7 -3
  129. package/dist/commands/improve/shared.js +14 -34
  130. package/dist/commands/improve/source-identity.js +28 -0
  131. package/dist/commands/improve/triage.js +20 -17
  132. package/dist/commands/lint/base-linter.js +340 -313
  133. package/dist/commands/lint/env-key-rules.js +31 -47
  134. package/dist/commands/lint/index.js +185 -30
  135. package/dist/commands/{events.js → log.js} +28 -38
  136. package/dist/commands/migrate-cli.js +54 -0
  137. package/dist/commands/migration-tool.js +55 -0
  138. package/dist/commands/observability-cli.js +70 -208
  139. package/dist/commands/proposal/diff-format.js +50 -0
  140. package/dist/commands/proposal/drain-policies.js +0 -6
  141. package/dist/commands/proposal/drain.js +91 -40
  142. package/dist/commands/proposal/proposal-cli.js +134 -132
  143. package/dist/commands/proposal/proposal-types.js +56 -0
  144. package/dist/commands/proposal/proposal.js +83 -65
  145. package/dist/commands/proposal/propose-cli.js +88 -0
  146. package/dist/commands/proposal/propose.js +105 -88
  147. package/dist/commands/proposal/repository.js +1303 -278
  148. package/dist/commands/proposal/validators/proposal-quality-validators.js +16 -6
  149. package/dist/commands/proposal/validators/proposal-validators.js +61 -12
  150. package/dist/commands/proposal/validators/proposals.js +6 -8
  151. package/dist/commands/read/curate.js +78 -73
  152. package/dist/commands/read/knowledge.js +510 -13
  153. package/dist/commands/read/registry-search.js +2 -2
  154. package/dist/commands/read/remember-cli.js +84 -15
  155. package/dist/commands/read/search-cli.js +203 -96
  156. package/dist/commands/read/search.js +126 -94
  157. package/dist/commands/read/show.js +226 -250
  158. package/dist/commands/registry-cli.js +34 -60
  159. package/dist/commands/remember.js +18 -57
  160. package/dist/commands/sources/add-cli.js +104 -49
  161. package/dist/commands/sources/bundle-cli.js +166 -0
  162. package/dist/commands/sources/bundle-config-ops.js +63 -0
  163. package/dist/commands/sources/info.js +27 -15
  164. package/dist/commands/sources/init.js +30 -40
  165. package/dist/commands/sources/installed-stashes.js +469 -172
  166. package/dist/commands/sources/schema-repair.js +10 -9
  167. package/dist/commands/sources/self-update.js +182 -121
  168. package/dist/commands/sources/source-add.js +169 -178
  169. package/dist/commands/sources/source-clone.js +144 -41
  170. package/dist/commands/sources/source-manage.js +94 -59
  171. package/dist/commands/sources/sources-cli.js +64 -205
  172. package/dist/commands/sources/stash-cli.js +91 -54
  173. package/dist/commands/sources/stash-skeleton.js +1 -1
  174. package/dist/commands/tasks/tasks-cli.js +106 -104
  175. package/dist/commands/tasks/tasks.js +445 -262
  176. package/dist/commands/workflow-cli.js +75 -228
  177. package/dist/core/action-contributors.js +1 -1
  178. package/dist/core/activation-policy.js +49 -0
  179. package/dist/core/adapter/adapters/agent-skills-adapter.js +181 -0
  180. package/dist/core/adapter/adapters/akm-adapter.js +528 -0
  181. package/dist/core/adapter/adapters/akm-lint.js +392 -0
  182. package/dist/core/adapter/adapters/akm-metadata.js +387 -0
  183. package/dist/core/adapter/adapters/akm-task-adapter.js +149 -0
  184. package/dist/core/adapter/adapters/akm-workflow-adapter.js +180 -0
  185. package/dist/core/adapter/adapters/claude-adapter.js +61 -0
  186. package/dist/core/adapter/adapters/dotenv-adapter.js +187 -0
  187. package/dist/core/adapter/adapters/generic-files-adapter.js +119 -0
  188. package/dist/core/adapter/adapters/index.js +80 -0
  189. package/dist/core/adapter/adapters/llm-wiki-adapter.js +419 -0
  190. package/dist/core/adapter/adapters/okf-adapter.js +391 -0
  191. package/dist/core/adapter/adapters/opencode-adapter.js +68 -0
  192. package/dist/core/adapter/adapters/shared.js +286 -0
  193. package/dist/core/adapter/adapters/tool-dir-shared.js +217 -0
  194. package/dist/core/adapter/adapters/website-snapshot-adapter.js +155 -0
  195. package/dist/core/adapter/bundle-adapter.js +4 -0
  196. package/dist/core/adapter/detect-adapter.js +17 -0
  197. package/dist/core/adapter/recognize-match.js +44 -0
  198. package/dist/core/adapter/registry.js +56 -0
  199. package/dist/core/adapter/types.js +4 -0
  200. package/dist/core/asset/akm-markdown.js +30 -0
  201. package/dist/core/asset/asset-placement.js +243 -0
  202. package/dist/core/asset/asset-ref.js +110 -79
  203. package/dist/core/asset/asset-serialize.js +20 -0
  204. package/dist/core/asset/frontmatter.js +28 -12
  205. package/dist/core/asset/markdown.js +40 -51
  206. package/dist/core/asset/resolve-ref.js +274 -0
  207. package/dist/core/asset/stash-meta.js +2 -2
  208. package/dist/core/bundle-id.js +51 -0
  209. package/dist/core/common.js +281 -86
  210. package/dist/core/config/config-io.js +42 -128
  211. package/dist/core/config/config-schema.js +233 -855
  212. package/dist/core/config/config-sources.js +162 -39
  213. package/dist/core/config/config-types.js +16 -11
  214. package/dist/core/config/config-version.js +29 -0
  215. package/dist/core/config/config-walker.js +126 -37
  216. package/dist/core/config/config.js +154 -331
  217. package/dist/core/config/deep-merge.js +41 -0
  218. package/dist/core/config/engine-semantics.js +28 -0
  219. package/dist/core/config/experimental.js +21 -0
  220. package/dist/core/config/schema/embedding.js +38 -0
  221. package/dist/core/config/schema/engines.js +116 -0
  222. package/dist/core/config/schema/experimental.js +47 -0
  223. package/dist/core/config/schema/feedback.js +31 -0
  224. package/dist/core/config/schema/improve-processes.js +389 -0
  225. package/dist/core/config/schema/improve.js +94 -0
  226. package/dist/core/config/schema/index-config.js +176 -0
  227. package/dist/core/config/schema/output.js +18 -0
  228. package/dist/core/config/schema/primitives.js +94 -0
  229. package/dist/core/config/schema/search.js +30 -0
  230. package/dist/core/config/schema/setup.js +18 -0
  231. package/dist/core/config/schema/sources-bundles.js +169 -0
  232. package/dist/core/config/schema/workflow.js +29 -0
  233. package/dist/core/env-secret-ref.js +155 -20
  234. package/dist/core/errors.js +17 -15
  235. package/dist/core/events-types.js +4 -0
  236. package/dist/core/events.js +46 -128
  237. package/dist/core/extra-params.js +62 -0
  238. package/dist/core/file-change.js +17 -0
  239. package/dist/core/file-lock.js +202 -57
  240. package/dist/core/fs-txn.js +392 -0
  241. package/dist/core/git-message.js +59 -0
  242. package/dist/core/improve-result.js +167 -0
  243. package/dist/core/lesson-lint.js +1 -17
  244. package/dist/core/logs-db.js +1 -1
  245. package/dist/core/maintenance-barrier.js +135 -0
  246. package/dist/core/migration-operation.js +44 -0
  247. package/dist/core/mutation-target.js +78 -0
  248. package/dist/core/paths.js +22 -25
  249. package/dist/core/platform.js +10 -0
  250. package/dist/core/recognition-util.js +128 -0
  251. package/dist/core/redaction.js +392 -0
  252. package/dist/core/standards/resolve-standards-context.js +36 -65
  253. package/dist/core/standards/resolve-stash-standards.js +2 -2
  254. package/dist/core/standards/resolve-type-conventions.js +5 -5
  255. package/dist/core/state/migrations.js +242 -11
  256. package/dist/core/state-db.js +98 -10
  257. package/dist/core/structured.js +1 -1
  258. package/dist/core/subprocess.js +303 -0
  259. package/dist/core/text-truncation.js +9 -5
  260. package/dist/core/time.js +20 -0
  261. package/dist/core/type-presentation.js +130 -0
  262. package/dist/core/warn.js +0 -3
  263. package/dist/core/write-source.js +834 -118
  264. package/dist/indexer/bundle-identity-guard.js +92 -0
  265. package/dist/indexer/db/graph-db.js +1 -25
  266. package/dist/indexer/db/llm-cache.js +1 -1
  267. package/dist/indexer/ensure-index.js +30 -9
  268. package/dist/indexer/graph/graph-boost.js +9 -30
  269. package/dist/indexer/graph/graph-extraction.js +41 -27
  270. package/dist/indexer/graph/graph-types.js +4 -0
  271. package/dist/indexer/index-writer-lock.js +93 -49
  272. package/dist/indexer/index-written-assets.js +100 -53
  273. package/dist/indexer/indexer.js +746 -329
  274. package/dist/indexer/init.js +18 -25
  275. package/dist/indexer/installations.js +142 -0
  276. package/dist/indexer/passes/dir-staleness.js +18 -10
  277. package/dist/indexer/passes/memory-inference.js +25 -15
  278. package/dist/indexer/passes/metadata.js +412 -243
  279. package/dist/indexer/scan/doc-to-entry.js +160 -0
  280. package/dist/indexer/scan/drain-dir.js +134 -0
  281. package/dist/indexer/search/db-search.js +292 -108
  282. package/dist/indexer/search/fts-query.js +64 -0
  283. package/dist/indexer/search/ranking-contributors.js +145 -25
  284. package/dist/indexer/search/ranking-types.js +4 -0
  285. package/dist/indexer/search/ranking.js +28 -71
  286. package/dist/indexer/search/search-attribution.js +67 -0
  287. package/dist/indexer/search/search-fields.js +18 -3
  288. package/dist/indexer/search/search-hit-enrichers.js +30 -40
  289. package/dist/indexer/search/search-source.js +157 -111
  290. package/dist/indexer/search/semantic-status.js +4 -1
  291. package/dist/indexer/usage/usage-events.js +10 -30
  292. package/dist/indexer/walk/file-context.js +3 -45
  293. package/dist/indexer/walk/matchers.js +42 -73
  294. package/dist/indexer/walk/path-resolver.js +11 -5
  295. package/dist/indexer/walk/walker.js +42 -14
  296. package/dist/integrations/agent/builder-shared.js +7 -0
  297. package/dist/integrations/agent/builders.js +5 -58
  298. package/dist/integrations/agent/config.js +3 -143
  299. package/dist/integrations/agent/detect.js +17 -2
  300. package/dist/integrations/agent/engine-resolution.js +231 -0
  301. package/dist/integrations/agent/index.js +1 -2
  302. package/dist/integrations/agent/model-aliases.js +8 -3
  303. package/dist/integrations/agent/profiles.js +6 -99
  304. package/dist/integrations/agent/prompts.js +46 -18
  305. package/dist/integrations/agent/runner-dispatch.js +78 -13
  306. package/dist/integrations/agent/runner.js +76 -208
  307. package/dist/integrations/agent/spawn.js +48 -279
  308. package/dist/integrations/harnesses/aider/agent-builder.js +9 -8
  309. package/dist/integrations/harnesses/aider/index.js +2 -12
  310. package/dist/integrations/harnesses/amazonq/agent-builder.js +10 -16
  311. package/dist/integrations/harnesses/amazonq/index.js +3 -17
  312. package/dist/integrations/harnesses/claude/agent-builder.js +2 -3
  313. package/dist/integrations/harnesses/claude/config-import.js +1 -3
  314. package/dist/integrations/harnesses/claude/index.js +1 -14
  315. package/dist/integrations/harnesses/claude/session-log.js +27 -75
  316. package/dist/integrations/harnesses/codex/agent-builder.js +8 -7
  317. package/dist/integrations/harnesses/codex/index.js +2 -13
  318. package/dist/integrations/harnesses/copilot/agent-builder.js +9 -9
  319. package/dist/integrations/harnesses/copilot/index.js +1 -13
  320. package/dist/integrations/harnesses/gemini/agent-builder.js +8 -9
  321. package/dist/integrations/harnesses/gemini/index.js +1 -13
  322. package/dist/integrations/harnesses/ids.js +24 -0
  323. package/dist/integrations/harnesses/index.js +31 -33
  324. package/dist/integrations/harnesses/opencode/agent-builder.js +23 -5
  325. package/dist/integrations/harnesses/opencode/config-import.js +1 -3
  326. package/dist/integrations/harnesses/opencode/index.js +1 -18
  327. package/dist/integrations/harnesses/opencode/session-log.js +67 -125
  328. package/dist/integrations/harnesses/opencode-sdk/harness.js +3 -17
  329. package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +274 -191
  330. package/dist/integrations/harnesses/openhands/agent-builder.js +12 -10
  331. package/dist/integrations/harnesses/openhands/index.js +2 -12
  332. package/dist/integrations/harnesses/pi/agent-builder.js +11 -18
  333. package/dist/integrations/harnesses/pi/index.js +3 -16
  334. package/dist/integrations/harnesses/shared.js +17 -0
  335. package/dist/integrations/harnesses/types.js +38 -34
  336. package/dist/integrations/lockfile.js +211 -24
  337. package/dist/integrations/session-logs/index.js +24 -40
  338. package/dist/integrations/session-logs/provider-base.js +113 -0
  339. package/dist/llm/client.js +182 -110
  340. package/dist/llm/embedders/deterministic.js +2 -2
  341. package/dist/llm/embedders/remote.js +21 -9
  342. package/dist/llm/feature-gate.js +17 -57
  343. package/dist/llm/graph-extract.js +12 -13
  344. package/dist/llm/index-passes.js +8 -42
  345. package/dist/llm/memory-infer.js +144 -1
  346. package/dist/llm/metadata-enhance.js +45 -30
  347. package/dist/llm/structured-call.js +16 -8
  348. package/dist/llm/usage-persist.js +30 -5
  349. package/dist/llm/usage-telemetry.js +59 -6
  350. package/dist/output/cli-hints.js +1 -2
  351. package/dist/output/command-registry.js +27 -0
  352. package/dist/output/context.js +22 -7
  353. package/dist/output/format-exempt.js +80 -0
  354. package/dist/output/generic-render.js +251 -0
  355. package/dist/output/html-render.js +11 -16
  356. package/dist/output/render-registry.js +57 -0
  357. package/dist/output/renderers.js +15 -281
  358. package/dist/output/shapes/curate.js +10 -1
  359. package/dist/output/shapes/events.js +12 -7
  360. package/dist/output/shapes/helpers.js +58 -84
  361. package/dist/output/shapes/passthrough.js +8 -40
  362. package/dist/output/shapes/proposal/producer.js +15 -7
  363. package/dist/output/shapes/registry.js +12 -6
  364. package/dist/output/shapes.js +0 -9
  365. package/dist/output/text/{init.js → bundle-create.js} +3 -1
  366. package/dist/output/text/bundle-show.js +7 -0
  367. package/dist/output/text/command-format.js +562 -0
  368. package/dist/output/text/env.js +1 -3
  369. package/dist/output/text/events.js +8 -7
  370. package/dist/output/text/helpers.js +15 -1375
  371. package/dist/output/text/proposal/producer.js +4 -2
  372. package/dist/output/text/proposal-format.js +202 -0
  373. package/dist/output/text/registry-commands.js +1 -2
  374. package/dist/output/text/registry.js +12 -6
  375. package/dist/output/text/show-directives.js +117 -0
  376. package/dist/output/text/show-format.js +103 -0
  377. package/dist/output/text/sync.js +5 -0
  378. package/dist/output/text/workflow-format.js +332 -0
  379. package/dist/output/text/workflow.js +1 -2
  380. package/dist/output/text.js +10 -19
  381. package/dist/registry/factory.js +4 -6
  382. package/dist/registry/origin-resolve.js +16 -27
  383. package/dist/registry/providers/skills-sh.js +3 -3
  384. package/dist/registry/providers/static-index.js +15 -25
  385. package/dist/registry/resolve.js +43 -94
  386. package/dist/registry/semver.js +43 -0
  387. package/dist/runtime.js +81 -12
  388. package/dist/scripts/akm-migrate.js +35529 -0
  389. package/dist/setup/detect.js +5 -7
  390. package/dist/setup/detected-engines.js +136 -0
  391. package/dist/setup/engine-config.js +100 -0
  392. package/dist/setup/registry-stash-loader.js +3 -3
  393. package/dist/setup/semantic-assets.js +12 -9
  394. package/dist/setup/setup.js +444 -208
  395. package/dist/setup/steps/connection-shared.js +120 -0
  396. package/dist/setup/steps/connection.js +108 -305
  397. package/dist/setup/steps/platforms.js +13 -12
  398. package/dist/setup/steps/semantic.js +15 -3
  399. package/dist/setup/steps/sources.js +21 -15
  400. package/dist/setup/steps/stashdir.js +6 -4
  401. package/dist/setup/steps/tasks.js +236 -119
  402. package/dist/setup/steps.js +3 -2
  403. package/dist/sources/freshness.js +39 -0
  404. package/dist/sources/provider-factory.js +11 -17
  405. package/dist/sources/providers/filesystem.js +2 -3
  406. package/dist/sources/providers/git-install.js +278 -34
  407. package/dist/sources/providers/git-provider.js +54 -56
  408. package/dist/sources/providers/git-stash.js +420 -91
  409. package/dist/sources/providers/git.js +2 -2
  410. package/dist/sources/providers/npm.js +16 -19
  411. package/dist/sources/providers/provider-utils.js +47 -22
  412. package/dist/sources/providers/sync-from-ref.js +3 -9
  413. package/dist/sources/providers/website.js +2 -2
  414. package/dist/sources/resolve.js +11 -10
  415. package/dist/sources/snapshot-fetchers/types.js +4 -0
  416. package/dist/sources/{website-ingest.js → snapshot-fetchers/website-ingest.js} +110 -41
  417. package/dist/storage/database.js +60 -4
  418. package/dist/storage/engines/sqlite-migrations.js +156 -5
  419. package/dist/storage/locations.js +1 -2
  420. package/dist/storage/repositories/canaries-repository.js +1 -1
  421. package/dist/storage/repositories/events-repository.js +51 -11
  422. package/dist/storage/repositories/improve-runs-repository.js +6 -32
  423. package/dist/storage/repositories/index-connection.js +79 -0
  424. package/dist/storage/repositories/index-db.js +4 -3
  425. package/dist/storage/repositories/index-entries-repository.js +863 -0
  426. package/dist/{indexer/db/entry-mapper.js → storage/repositories/index-entry-mapper.js} +19 -2
  427. package/dist/storage/repositories/index-entry-types.js +4 -0
  428. package/dist/storage/repositories/index-fts-repository.js +167 -0
  429. package/dist/storage/repositories/index-llm-cache-repository.js +108 -0
  430. package/dist/storage/repositories/index-meta-repository.js +49 -0
  431. package/dist/{indexer/db/schema.js → storage/repositories/index-schema.js} +226 -100
  432. package/dist/storage/repositories/index-sql.js +12 -0
  433. package/dist/storage/repositories/index-utility-repository.js +356 -0
  434. package/dist/storage/repositories/index-vec-repository.js +250 -0
  435. package/dist/storage/repositories/outcome-repository.js +119 -0
  436. package/dist/storage/repositories/proposals-repository.js +317 -75
  437. package/dist/storage/repositories/registry-cache.js +1 -1
  438. package/dist/storage/repositories/salience-repository.js +172 -0
  439. package/dist/storage/repositories/task-history-repository.js +110 -3
  440. package/dist/storage/repositories/workflow-runs-repository.js +68 -35
  441. package/dist/tasks/backends/cron.js +169 -46
  442. package/dist/tasks/backends/exec-utils.js +76 -3
  443. package/dist/tasks/backends/index.js +6 -9
  444. package/dist/tasks/backends/launchd.js +292 -55
  445. package/dist/tasks/backends/schtasks.js +557 -70
  446. package/dist/tasks/backends/types.js +4 -0
  447. package/dist/tasks/command-executable.js +93 -0
  448. package/dist/tasks/embedded.js +56 -38
  449. package/dist/tasks/parser.js +156 -64
  450. package/dist/tasks/resolve-akm-bin.js +144 -51
  451. package/dist/tasks/runner.js +377 -209
  452. package/dist/tasks/schedule.js +108 -19
  453. package/dist/tasks/scheduler-invocation.js +296 -0
  454. package/dist/tasks/schema.js +1 -1
  455. package/dist/tasks/task-id.js +35 -0
  456. package/dist/tasks/validator.js +30 -16
  457. package/dist/workflows/authoring/authoring.js +96 -148
  458. package/dist/workflows/authoring/scope-key.js +1 -1
  459. package/dist/workflows/cli.js +0 -20
  460. package/dist/workflows/concurrency-policy.js +15 -0
  461. package/dist/workflows/exec/brief.js +25 -59
  462. package/dist/workflows/exec/frozen-judge.js +47 -0
  463. package/dist/workflows/exec/native-executor.js +157 -94
  464. package/dist/workflows/exec/report.js +365 -200
  465. package/dist/workflows/exec/run-workflow.js +46 -40
  466. package/dist/workflows/exec/scheduler.js +12 -41
  467. package/dist/workflows/exec/step-work.js +239 -205
  468. package/dist/workflows/exec/workflow-engine-gate.js +67 -0
  469. package/dist/workflows/ir/compile.js +141 -283
  470. package/dist/workflows/ir/freeze.js +233 -0
  471. package/dist/workflows/ir/plan-hash.js +40 -5
  472. package/dist/workflows/ir/schema.js +537 -1
  473. package/dist/workflows/parser.js +878 -306
  474. package/dist/workflows/program/expressions.js +20 -208
  475. package/dist/workflows/program/schema.js +7 -10
  476. package/dist/workflows/renderer.js +99 -121
  477. package/dist/workflows/resource-limits.js +22 -0
  478. package/dist/workflows/runtime/checkin.js +1 -1
  479. package/dist/workflows/runtime/plan-classifier.js +131 -0
  480. package/dist/workflows/runtime/runs.js +200 -113
  481. package/dist/workflows/runtime/unit-checkin.js +1 -1
  482. package/dist/workflows/runtime/unit-phases.js +20 -0
  483. package/dist/workflows/runtime/workflow-asset-loader.js +235 -97
  484. package/dist/workflows/schema.js +1 -11
  485. package/dist/workflows/validate-summary.js +4 -26
  486. package/dist/workflows/validator.js +52 -30
  487. package/docs/README.md +42 -78
  488. package/docs/migration/README.md +8 -0
  489. package/docs/migration/release-notes/0.6.0.md +1 -1
  490. package/docs/migration/release-notes/0.7.0.md +9 -8
  491. package/docs/migration/release-notes/0.9.0.md +158 -14
  492. package/docs/migration/v0.7-to-v0.8.md +46 -47
  493. package/docs/migration/v0.8-to-v0.9.md +844 -0
  494. package/docs/reference/README.md +12 -0
  495. package/docs/reference/data-and-telemetry.md +333 -0
  496. package/package.json +21 -17
  497. package/schemas/akm-asset-envelope.json +93 -0
  498. package/schemas/akm-config.json +4636 -0
  499. package/schemas/akm-task.json +87 -0
  500. package/{dist/schemas → schemas}/akm-workflow.json +127 -82
  501. package/dist/akm-migrate-storage +0 -38
  502. package/dist/assets/help/help-accept.md +0 -12
  503. package/dist/assets/help/help-improve.md +0 -84
  504. package/dist/assets/help/help-proposals.md +0 -17
  505. package/dist/assets/help/help-propose.md +0 -17
  506. package/dist/assets/help/help-reject.md +0 -11
  507. package/dist/assets/profiles/frequent.json +0 -13
  508. package/dist/assets/profiles/recombine-only.json +0 -21
  509. package/dist/assets/profiles/reflect-distill.json +0 -30
  510. package/dist/assets/profiles/synthesize.json +0 -15
  511. package/dist/assets/prompts/procedural-system.md +0 -44
  512. package/dist/assets/prompts/recombine-system.md +0 -40
  513. package/dist/assets/prompts/staleness-detect-system.md +0 -6
  514. package/dist/assets/tasks/core/backup.yml +0 -4
  515. package/dist/assets/tasks/graph-refresh-weekly.yml +0 -10
  516. package/dist/assets/templates/html/default.html +0 -78
  517. package/dist/assets/templates/html/vendor/echarts.min.js +0 -45
  518. package/dist/assets/wiki/index-template.md +0 -12
  519. package/dist/assets/wiki/ingest-workflow-template.md +0 -83
  520. package/dist/assets/wiki/log-template.md +0 -8
  521. package/dist/assets/wiki/schema-template.md +0 -61
  522. package/dist/cli/config-migrate.js +0 -150
  523. package/dist/cli/config-validate.js +0 -39
  524. package/dist/commands/graph/graph-cli.js +0 -124
  525. package/dist/commands/graph/graph.js +0 -487
  526. package/dist/commands/improve/calibration.js +0 -161
  527. package/dist/commands/improve/dedup.js +0 -482
  528. package/dist/commands/improve/extract-watch.js +0 -140
  529. package/dist/commands/improve/hot-probation.js +0 -45
  530. package/dist/commands/improve/improve-auto-accept.js +0 -276
  531. package/dist/commands/improve/improve-profiles.js +0 -168
  532. package/dist/commands/improve/procedural.js +0 -398
  533. package/dist/commands/improve/recombine.js +0 -818
  534. package/dist/commands/improve/schema-similarity-gate.js +0 -168
  535. package/dist/commands/lint/agent-linter.js +0 -44
  536. package/dist/commands/lint/command-linter.js +0 -44
  537. package/dist/commands/lint/default-linter.js +0 -16
  538. package/dist/commands/lint/fact-linter.js +0 -39
  539. package/dist/commands/lint/knowledge-linter.js +0 -16
  540. package/dist/commands/lint/memory-linter.js +0 -61
  541. package/dist/commands/lint/registry.js +0 -41
  542. package/dist/commands/lint/skill-linter.js +0 -45
  543. package/dist/commands/lint/task-linter.js +0 -50
  544. package/dist/commands/lint/workflow-linter.js +0 -81
  545. package/dist/commands/proposal/legacy-import.js +0 -115
  546. package/dist/commands/sources/history.js +0 -196
  547. package/dist/commands/tasks/default-tasks.js +0 -186
  548. package/dist/commands/wiki-cli.js +0 -292
  549. package/dist/core/asset/asset-registry.js +0 -76
  550. package/dist/core/asset/asset-spec.js +0 -316
  551. package/dist/core/config/config-migration.js +0 -602
  552. package/dist/core/deep-merge.js +0 -38
  553. package/dist/core/eval/rank-metrics.js +0 -113
  554. package/dist/core/ripgrep/install.js +0 -163
  555. package/dist/core/ripgrep/resolve.js +0 -81
  556. package/dist/indexer/db/db.js +0 -1414
  557. package/dist/indexer/manifest.js +0 -170
  558. package/dist/indexer/passes/metadata-contributors.js +0 -31
  559. package/dist/indexer/usage/unmigrated-vaults-guard.js +0 -94
  560. package/dist/integrations/harnesses/opencode-sdk/index.js +0 -25
  561. package/dist/llm/call-ai.js +0 -62
  562. package/dist/llm/memory-infer-impl.js +0 -138
  563. package/dist/output/shapes/distill.js +0 -14
  564. package/dist/output/shapes/history.js +0 -11
  565. package/dist/output/text/distill.js +0 -6
  566. package/dist/output/text/enable-disable.js +0 -8
  567. package/dist/output/text/history.js +0 -6
  568. package/dist/output/text/wiki.js +0 -16
  569. package/dist/registry/build-index.js +0 -386
  570. package/dist/schemas/akm-config.json +0 -14225
  571. package/dist/scripts/migrate-storage.js +0 -13169
  572. package/dist/scripts/migrations/import-fs-improve-runs-to-db.js +0 -10169
  573. package/dist/scripts/migrations/v16-to-v17.js +0 -141
  574. package/dist/setup/legacy-config.js +0 -106
  575. package/dist/storage/repositories/consolidation-repository.js +0 -38
  576. package/dist/storage/repositories/recombine-repository.js +0 -213
  577. package/dist/wiki/wiki-templates.js +0 -15
  578. package/dist/wiki/wiki.js +0 -1012
  579. package/dist/workflows/authoring/workflow-program-template.yaml +0 -31
  580. package/dist/workflows/db.js +0 -350
  581. package/dist/workflows/exec/watch.js +0 -116
  582. package/dist/workflows/program/parser.js +0 -760
  583. package/dist/workflows/program/project.js +0 -105
  584. package/docs/data-and-telemetry.md +0 -227
  585. package/docs/migration/release-notes/0.9.0-beta.60.md +0 -19
  586. /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/registry.js +0 -0
  587. /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/youtube.js +0 -0
@@ -0,0 +1,528 @@
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
+ * The AKM workspace's own `akm` adapter — akm 0.9.0 chunk-2, WI-B.
6
+ *
7
+ * Implements `docs/architecture/specs/akm-0.9.0-bundle-adapter-spec.md` §5.1 (BINDING) +
8
+ * §6 + §7 (the `akm` row) EXACTLY: a BEHAVIOR-PRESERVING PORT that reproduces
9
+ * TODAY'S classification and placement VERBATIM by REUSING the existing matcher
10
+ * stack. It is NOT re-derived onto frontmatter `type` (that is the sibling
11
+ * `okf` adapter's job, §5), NOT split per-`type` (the 14 AKM formats are `type`
12
+ * VALUES the single `akm` adapter emits, §6/§0.2), and introduces NO new
13
+ * positional/directory heuristics of its own.
14
+ *
15
+ * ── recognize (§5.1): the sync `runMatchers` reproduction ──
16
+ *
17
+ * `file-context.ts#runMatchers` (`:242-265`) is async ONLY because of its lazy
18
+ * `ensureBuiltinsRegistered()` dynamic import; its ARBITRATION is pure and
19
+ * synchronous. We reproduce it here by importing the SAME four builtin matcher
20
+ * functions (`matchers.ts` `extensionMatcher` / `directoryMatcher` /
21
+ * `parentDirHintMatcher` / `smartMdMatcher`) in the
22
+ * SAME order they are registered, collecting every non-null
23
+ * `MatchResult` and picking the winner by **specificity descending, ties broken
24
+ * by later-registered (higher index) winning** — byte-identical to
25
+ * `runMatchers`'s `b.specificity - a.specificity` then `b.index - a.index`.
26
+ * Because the matcher functions (which resolve renderer names via the static
27
+ * `TYPE_PRESENTATION` table in `type-presentation.ts`, all built-in types
28
+ * present at load) are the exact ones `runMatchers` uses, {@link recognizeMatch}
29
+ * agrees with the async `runMatchers` on `type` / `specificity` / `renderer` for
30
+ * every input. This is "use the existing matchers" literally — same functions,
31
+ * same arbitration.
32
+ *
33
+ * The winning `MatchResult.renderer` is carried on `documentJson.renderer` so
34
+ * WI-C can wire presentation via `TYPE_PRESENTATION` without a new
35
+ * `IndexDocument` field (WI-C owns presentation).
36
+ *
37
+ * ── conceptId (§5.1 + ref-grammar decision D-R2): the QUALIFIED spelling ──
38
+ *
39
+ * conceptId = `<stash-subdir>/<canonical-name>` — the placement stash-subdir
40
+ * (`stashDirFor(type)`) followed by the winning type's canonical name
41
+ * (`deriveCanonicalAssetNameFromStashRoot`: skill = its dir, script keeps its
42
+ * extension, markdown strips `.md`, env/task strip their ext, secret/session
43
+ * keep the natural path). For markdown types this IS the OKF concept ID
44
+ * (path − `.md`); it is the same spelling {@link placeNew} consumes, so
45
+ * recognize/place share one identity (D-R2 resolved the earlier split). The
46
+ * `type` is carried separately on `IndexDocument.type`, per §0.2 (type ≠
47
+ * identity), and `entry.name` keeps the BARE canonical name for FTS parity.
48
+ *
49
+ * ── placeNew / directoryList / looksLikeRoot: type-driven placement ──
50
+ *
51
+ * Placement is type-driven (`path-resolver.ts#buildDiskCandidates`: the primary
52
+ * candidate is `assetPathForName(ref.type, join(root, stashDirFor(ref.type)),
53
+ * ref.name)`). §5.1 removes `type` from the ref, so {@link placeNew} recovers
54
+ * it from the conceptId's LEADING path segment — the qualified `<stash-subdir>/
55
+ * <name>` form of §1.3 — reverse-mapping that segment against the placement
56
+ * stash-subdir map and then delegating to `assetPathForName`. See the method
57
+ * doc for the recognize/place conceptId-spelling note.
58
+ *
59
+ * ── validate: base checks only (WI-B) ──
60
+ *
61
+ * Base validate checks only for this WI (shared `validateChangesWithBaseChecks`
62
+ * — the ported unquoted-colon / missing-updated / stale-path / missing-ref).
63
+ * The per-type linters (SkillLinter/WorkflowLinter/TaskLinter/…) are WI-C.
64
+ *
65
+ * ── Cycle-safety (chunk-3 cutover, baseline 18) ──
66
+ *
67
+ * This module VALUE-imports `matchers.ts` (indexer/walk) for classification and
68
+ * `asset-placement.ts` (core/asset) for placement — delegating to the existing
69
+ * logic, not re-implementing it. Neither is a taxonomy import-cycle (SCC)
70
+ * participant: `matchers.ts` resolves renderers via `type-presentation.ts`, and
71
+ * `asset-placement.ts` is a pure leaf (only Node builtins + `recognition-util`).
72
+ * Nothing in `src/` imports this adapter back except the `adapters/index.ts`
73
+ * barrel — which is NOT test-only: `core/adapter/registry.ts:33` imports it
74
+ * in production for the frozen `BUILTIN_ADAPTERS` list
75
+ * (`installations.ts#detectAdapterId`, `provider-utils.ts#detectStashRoot`).
76
+ * The adapter is still itself a leaf, since neither the barrel nor the
77
+ * registry import anything that imports back into this file — verified: `bun
78
+ * scripts/lint-import-cycles.ts` reports 0 cycle participants and this module
79
+ * is NOT one.
80
+ */
81
+ import fs from "node:fs";
82
+ import path from "node:path";
83
+ import { parse as parseYaml } from "yaml";
84
+ import { applyPostContributorFields, applyPreContributorFields, extractPackageMetadata, } from "../../../indexer/passes/metadata.js";
85
+ import { assetPathForName, deriveCanonicalAssetNameFromStashRoot, placementTypes, stashDirFor, stashDirNames, } from "../../asset/asset-placement.js";
86
+ import { parseFrontmatter } from "../../asset/frontmatter.js";
87
+ import { recognizeMatch } from "../recognize-match.js";
88
+ import { perTypeValidateChecks, skillDirectoryDiagnostics } from "./akm-lint.js";
89
+ import { applyFoldedMetadata, foldRecognizedMetadata } from "./akm-metadata.js";
90
+ import { hashContent, runBaseValidateChecks } from "./shared.js";
91
+ // `recognizeMatch` + the builtin matcher list moved to the cycle-free leaf
92
+ // `../recognize-match` (Chunk 5 M-b) so both this adapter AND the indexer
93
+ // metadata pass import it without closing a metadata ↔ adapter cycle. Re-exported
94
+ // here so existing `akm-adapter` importers (tests, sibling modules) are
95
+ // unaffected.
96
+ export { recognizeMatch } from "../recognize-match.js";
97
+ /**
98
+ * OKF reserved structural files (ref-grammar decision D-R6, spec §5.1 /
99
+ * adapter-spec §5.1/§6): `index.md` (directory listing) and `log.md` (update
100
+ * history) are bundle structure at EVERY depth — never a concept document. The
101
+ * `okf` / `llm-wiki` adapters already exclude them (`okf-adapter.ts`
102
+ * `RESERVED_FILES`); this brings the `akm` adapter into conformance so a
103
+ * `knowledge/index.md` never classifies as a `knowledge` item. Case-insensitive,
104
+ * matched on the bare filename so the exclusion holds at any depth.
105
+ */
106
+ const RESERVED_FILES = new Set(["index.md", "log.md"]);
107
+ /** True when `name` (a bare file name) is an OKF reserved file, case-insensitively (D-R6). */
108
+ function isReservedFileName(name) {
109
+ return RESERVED_FILES.has(name.toLowerCase());
110
+ }
111
+ /** Wiki-directory infrastructure files excluded at a `wikis/<name>/` root (ported from the retired `shouldIndexStashFile`). */
112
+ const WIKI_INFRA_FILES = new Set(["schema.md", "index.md", "log.md"]);
113
+ /**
114
+ * AKM-stash indexing policy, moved here from the indexer's `shouldIndexStashFile`
115
+ * pre-filter (owner ruling 2026-07-21 — adapter-owned filtering). Each adapter
116
+ * abstains on its own bundle's files; the core walk keeps only universal hygiene.
117
+ *
118
+ * PATH/STAT-based ONLY — never reads `file.content()`, so the bytes-never-read
119
+ * invariant for sensitive env/secret files holds by construction. Returns `true`
120
+ * when the `akm` adapter must ABSTAIN (recognize → null):
121
+ * - an `env/…` `.env` file with a sibling `.sensitive` marker;
122
+ * - a `secrets/` `.sensitive`/`.lock` marker, or a secret with a sibling
123
+ * `<name>.sensitive` marker;
124
+ * - a `wikis/<name>/` root-level infra file (schema.md/index.md/log.md).
125
+ */
126
+ function akmStashAbstains(root, absPath) {
127
+ const relPath = path.relative(root, absPath);
128
+ if (!relPath || relPath.startsWith("..") || path.isAbsolute(relPath))
129
+ return false;
130
+ const segments = relPath.split(/[\\/]+/).filter(Boolean);
131
+ if (segments.length === 0)
132
+ return false;
133
+ // Skip env `.env` files that have a sibling `.sensitive` marker file.
134
+ if (segments[0] === "env" && (absPath.endsWith(".env") || path.basename(absPath) === ".env")) {
135
+ if (fs.existsSync(absPath.replace(/\.env$/, ".sensitive")))
136
+ return true;
137
+ }
138
+ // Skip secret files that are themselves a `.sensitive` marker, or that have a
139
+ // sibling `<name>.sensitive` marker. Secrets are otherwise indexed by name
140
+ // only (their bytes are never read for classification here).
141
+ if (segments[0] === "secrets") {
142
+ if (absPath.endsWith(".sensitive") || absPath.endsWith(".lock"))
143
+ return true;
144
+ if (fs.existsSync(`${absPath}.sensitive`))
145
+ return true;
146
+ }
147
+ // Inside a `wikis/<name>/` directory, the root-level infrastructure files
148
+ // schema.md / index.md / log.md are excluded.
149
+ const wikisIdx = segments.indexOf("wikis");
150
+ if (wikisIdx < 0 || wikisIdx + 1 >= segments.length)
151
+ return false;
152
+ const wikiRelativeSegments = segments.slice(wikisIdx + 2);
153
+ return wikiRelativeSegments.length === 1 && WIKI_INFRA_FILES.has(wikiRelativeSegments[0]);
154
+ }
155
+ /** Reverse the placement map (stash subdir → akm type). Built per call so a runtime-registered custom type is honored (live-delegation, not a snapshot). */
156
+ function stashDirToType(stashDir) {
157
+ for (const type of placementTypes()) {
158
+ if (stashDirFor(type) === stashDir)
159
+ return type;
160
+ }
161
+ return undefined;
162
+ }
163
+ /**
164
+ * The search-surface `IndexDocument` fields that have NO first-class `IndexDocument`
165
+ * home (spec §3) and therefore ride `documentJson` so the persist-time fold
166
+ * (`search-fields.ts:28-33`) can still reach them — the exact set
167
+ * `buildSearchFields` folds into the `hints`/`content` FTS columns beyond the
168
+ * first-class name/description/tags/aliases/searchHints, plus the provenance the
169
+ * WI-C tests read (renderer/source). Kept as a named list so the fold surface and
170
+ * the mapping stay in lockstep.
171
+ */
172
+ const DOCUMENT_JSON_CARRIED_FIELDS = [
173
+ "examples",
174
+ "usage",
175
+ "intent",
176
+ "xrefs",
177
+ "pageKind",
178
+ "whenToUse",
179
+ "toc",
180
+ "parameters",
181
+ "bodyOpening",
182
+ "source",
183
+ "category",
184
+ "supersededBy",
185
+ "contradictedBy",
186
+ "run",
187
+ "setup",
188
+ "cwd",
189
+ "wikiRole",
190
+ "sources",
191
+ "generation",
192
+ "evidenceSources",
193
+ // D2 (#730): the OKF v0.2 provenance `promoteProposal` stamps onto AKM-native
194
+ // writes (generated/verified/sources, namespaced — see `types.ts`'s
195
+ // `OkfProvenance` doc). Carried so the akm adapter rereads what it wrote and
196
+ // `akm show` surfaces it, exactly like every other field in this list.
197
+ "provenance",
198
+ ];
199
+ /**
200
+ * Map the fully-assembled `IndexDocument` (produced by the shared metadata
201
+ * pipeline) onto an `IndexDocument` (spec §3). First-class ranking/embedding
202
+ * fields land on named IndexDocument fields; every other search-surface or
203
+ * signal field rides `documentJson` (opaque adapter extras) so nothing the
204
+ * ranking/embedding/filter inputs read is lost — the M-b shadow-parity gate.
205
+ * The winning renderer name is carried on `documentJson.renderer` (WI-C contract).
206
+ */
207
+ function indexDocumentFromEntry(entry, base, rendererName) {
208
+ const extras = { renderer: rendererName };
209
+ for (const field of DOCUMENT_JSON_CARRIED_FIELDS) {
210
+ const value = entry[field];
211
+ if (value !== undefined)
212
+ extras[field] = value;
213
+ }
214
+ const doc = {
215
+ ...base,
216
+ name: entry.name,
217
+ documentJson: extras,
218
+ };
219
+ // First-class search + signal fields (only when present).
220
+ if (entry.description !== undefined)
221
+ doc.description = entry.description;
222
+ if (entry.tags !== undefined)
223
+ doc.tags = entry.tags;
224
+ if (entry.aliases !== undefined)
225
+ doc.aliases = entry.aliases;
226
+ if (entry.searchHints !== undefined)
227
+ doc.searchHints = entry.searchHints;
228
+ if (entry.quality !== undefined)
229
+ doc.quality = entry.quality;
230
+ if (entry.confidence !== undefined)
231
+ doc.confidence = entry.confidence;
232
+ if (entry.beliefState !== undefined)
233
+ doc.beliefState = entry.beliefState;
234
+ if (entry.currentBeliefRefs !== undefined)
235
+ doc.currentBeliefRefs = entry.currentBeliefRefs;
236
+ if (entry.scope !== undefined)
237
+ doc.scope = entry.scope;
238
+ if (entry.captureMode !== undefined)
239
+ doc.captureMode = entry.captureMode;
240
+ if (entry.lessonStrength !== undefined)
241
+ doc.lessonStrength = entry.lessonStrength;
242
+ if (entry.derivedFrom !== undefined)
243
+ doc.derivedFrom = entry.derivedFrom;
244
+ return doc;
245
+ }
246
+ function recognize(c, file) {
247
+ // D-R6 (spec §5.1): `index.md` / `log.md` are OKF reserved structural files at
248
+ // every depth — never items. Excluded BEFORE classification so a directory
249
+ // listing or update log never becomes a `knowledge` (or other) concept.
250
+ if (isReservedFileName(file.fileName))
251
+ return null;
252
+ // Adapter-owned filtering (owner ruling 2026-07-21): AKM-stash policy that used
253
+ // to live in the indexer's `shouldIndexStashFile` pre-filter. Path/stat-based —
254
+ // `file.content()` is never read to reach this abstention.
255
+ if (akmStashAbstains(c.root, file.absPath))
256
+ return null;
257
+ const match = recognizeMatch(file);
258
+ if (match === null)
259
+ return null;
260
+ // Canonical name = the winning type's per-type canonical name (§5.1).
261
+ // Invalid placements are not projected onto a different identity.
262
+ const derived = deriveCanonicalAssetNameFromStashRoot(match.type, c.root, file.absPath);
263
+ if (derived === undefined)
264
+ return null;
265
+ const canonicalName = derived;
266
+ // conceptId = the QUALIFIED `<stash-subdir>/<canonical-name>` spelling
267
+ // (ref-grammar decision D-R2): the same form `placeNew` consumes, and for
268
+ // markdown types the OKF concept ID (path − .md). Both branches now feed a
269
+ // BARE canonicalName (the abstain fallback is the basename, above), so the
270
+ // stash-subdir is prefixed uniformly — a flat `skills/x.md` yields
271
+ // `skills/x`, never the un-prefixed `x` or the double-prefixed
272
+ // `skills/skills/x`. `entry.name` below keeps the BARE canonical name —
273
+ // identity ≠ search text.
274
+ const stashDir = stashDirFor(match.type);
275
+ const conceptId = stashDir !== undefined ? `${stashDir}/${canonicalName}` : canonicalName;
276
+ const dirPath = path.dirname(file.absPath);
277
+ // Chunk 5 M-b: recognize now carries the FULL index-time metadata surface
278
+ // (spec §2/§3), reproducing `buildEntryFromFile`'s flat-walk metadata
279
+ // output by SHARING its P1/P2/P4 assembly and substituting the synchronous
280
+ // `foldRecognizedMetadata` (+ `applyFoldedMetadata`, which replicates the
281
+ // in-place contributor precedence) for the async P3 renderer contributors.
282
+ // `entry.name` = the BARE canonical name (conceptId minus the D-R2 stash-subdir
283
+ // prefix) so the FTS `name` column
284
+ // matches the pre-0.9.0 indexer (search-behavior parity), NOT the frontmatter
285
+ // title. Parity is by construction — the two paths differ only in the P3 step,
286
+ // pinned equal by the akm-adapter fold-parity test.
287
+ const entry = {
288
+ name: canonicalName,
289
+ type: match.type,
290
+ quality: "generated",
291
+ confidence: 0.55,
292
+ source: "filename",
293
+ };
294
+ applyPreContributorFields(entry, file.absPath, file, extractPackageMetadata(dirPath));
295
+ applyFoldedMetadata(entry, foldRecognizedMetadata(match.renderer, file));
296
+ applyPostContributorFields(entry, file.absPath, canonicalName, dirPath);
297
+ return indexDocumentFromEntry(entry, {
298
+ ref: `${c.id}//${conceptId}`,
299
+ bundle: c.id,
300
+ component: c.id,
301
+ conceptId,
302
+ path: file.absPath,
303
+ // Hash over the full raw bytes (incrementality/fingerprints, `types.ts`
304
+ // hash doc comment) — an opaque digest, not indexed content.
305
+ hash: hashContent(file.content()),
306
+ adapterId: "akm",
307
+ type: match.type,
308
+ }, match.renderer);
309
+ }
310
+ /**
311
+ * A read-only {@link FileContext} backed by an OVERLAY string (a pending
312
+ * change's content) instead of the live filesystem — the `validate` contract
313
+ * ({@link BundleAdapter.validate} doc comment / adapter-spec §12.1) forbids
314
+ * reading the live FS. It mirrors `buildFileContext`'s eager path-field
315
+ * derivation exactly (so the matchers classify identically) and serves the
316
+ * overlay bytes from `content()`/`frontmatter()`. `stat()` throws: no matcher
317
+ * calls it, and there is no snapshot mtime to serve.
318
+ */
319
+ function buildOverlayContext(root, relPathInput, raw) {
320
+ const absPath = path.join(root, relPathInput);
321
+ const relPath = path.relative(root, absPath).replace(/\\/g, "/");
322
+ const ext = path.extname(absPath).toLowerCase();
323
+ const fileName = path.basename(absPath);
324
+ const parentDirAbs = path.dirname(absPath);
325
+ const parentDir = path.basename(parentDirAbs);
326
+ const relDir = path.dirname(relPath).replace(/\\/g, "/");
327
+ const ancestorDirs = relDir === "." ? [] : relDir.split("/").filter((seg) => seg.length > 0);
328
+ let cachedFrontmatter;
329
+ let frontmatterComputed = false;
330
+ return {
331
+ absPath,
332
+ relPath,
333
+ ext,
334
+ fileName,
335
+ parentDir,
336
+ parentDirAbs,
337
+ ancestorDirs,
338
+ stashRoot: root,
339
+ content: () => raw,
340
+ frontmatter: () => {
341
+ if (!frontmatterComputed) {
342
+ const parsed = parseFrontmatter(raw);
343
+ cachedFrontmatter = Object.keys(parsed.data).length > 0 ? parsed.data : null;
344
+ frontmatterComputed = true;
345
+ }
346
+ return cachedFrontmatter ?? null;
347
+ },
348
+ stat: () => {
349
+ throw new Error("stat() is unavailable in a validate overlay FileContext");
350
+ },
351
+ };
352
+ }
353
+ /**
354
+ * `validate` (spec §6) = shared base checks + the winning `type`'s per-type
355
+ * extra checks, reproducing today's `akmLint`/`getLinterForType` dispatch
356
+ * byte-for-byte (the FROZEN `lint/all-types.json` `perType` golden is the gate).
357
+ *
358
+ * Per change (non-delete, readable): the `type` is recovered by running the
359
+ * SAME sync matcher arbitration ({@link recognizeMatch}) over an OVERLAY
360
+ * FileContext ({@link buildOverlayContext}) — no live-FS read. `task` files are
361
+ * parsed as pure YAML (mirroring `lint/index.ts`'s `subdir === "tasks"` branch)
362
+ * so the TaskLinter's field checks see real data and `missing-updated` never
363
+ * fires (frontmatter is `null`); everything else parses via `parseFrontmatter`.
364
+ * Base checks (shared) then the per-type extra checks run; a `skills/` directory
365
+ * pass reproduces `SkillLinter.lintDirectory` across the change set.
366
+ */
367
+ async function validate(c, changes, ctx) {
368
+ const diagnostics = [];
369
+ const seenSkillDirs = new Set();
370
+ for (const change of changes) {
371
+ if (change.op === "delete")
372
+ continue;
373
+ const raw = change.after ?? (await ctx.readFile(change.path));
374
+ if (typeof raw !== "string")
375
+ continue;
376
+ const overlay = buildOverlayContext(c.root, change.path, raw);
377
+ const match = recognizeMatch(overlay);
378
+ const type = match?.type;
379
+ // Parse strategy per `lint/index.ts`: `task` → pure YAML (frontmatter null),
380
+ // everything else → `parseFrontmatter`.
381
+ let parsed;
382
+ if (type === "task") {
383
+ let data = {};
384
+ try {
385
+ const doc = parseYaml(raw);
386
+ if (doc && typeof doc === "object" && !Array.isArray(doc))
387
+ data = doc;
388
+ }
389
+ catch {
390
+ data = {};
391
+ }
392
+ parsed = { data, content: raw, frontmatter: null };
393
+ }
394
+ else {
395
+ const p = parseFrontmatter(raw);
396
+ parsed = { data: p.data, content: p.content, frontmatter: p.frontmatter };
397
+ }
398
+ diagnostics.push(...(await runBaseValidateChecks(change.path, parsed, c.root, ctx)));
399
+ diagnostics.push(...(await perTypeValidateChecks({
400
+ type,
401
+ relPath: change.path,
402
+ raw,
403
+ data: parsed.data,
404
+ frontmatter: parsed.frontmatter,
405
+ body: parsed.content,
406
+ ext: overlay.ext,
407
+ ctx,
408
+ })));
409
+ diagnostics.push(...(await skillDirectoryDiagnostics(change.path, seenSkillDirs, ctx)));
410
+ }
411
+ return diagnostics;
412
+ }
413
+ export const akmAdapter = {
414
+ id: "akm",
415
+ version: "0.9.0",
416
+ // Recognized-extension HINT, derived from what the matchers accept (§6):
417
+ // `.md` (markdown types + skill), `.yaml`/`.yml` (task YAML), `.env` (env
418
+ // files), and the 16 SCRIPT_EXTENSIONS. This is a
419
+ // NON-EXHAUSTIVE hint for the akm adapter: recognition is directory-driven
420
+ // via `recognize()` (e.g. a bare `secrets/<anything>` file with no extension
421
+ // is a `secret`), so `recognize()` — not this list — is the source of truth.
422
+ extensions: [
423
+ ".md",
424
+ ".yaml",
425
+ ".yml",
426
+ ".env",
427
+ ".sh",
428
+ ".ts",
429
+ ".js",
430
+ ".ps1",
431
+ ".cmd",
432
+ ".bat",
433
+ ".py",
434
+ ".rb",
435
+ ".go",
436
+ ".pl",
437
+ ".php",
438
+ ".lua",
439
+ ".r",
440
+ ".swift",
441
+ ".kt",
442
+ ".kts",
443
+ ],
444
+ recognize,
445
+ validate,
446
+ /**
447
+ * Type-driven placement (§5.1), reproducing `path-resolver.ts#buildDiskCandidates`:
448
+ * the primary candidate is
449
+ * `assetPathForName(type, join(root, stashDirFor(type)), name)`.
450
+ *
451
+ * §5.1 removes `type` from the ref, so the winning type is recovered from the
452
+ * conceptId's LEADING path segment — the §1.3 qualified `<stash-subdir>/<name>`
453
+ * form (e.g. `knowledge/http-caching`, `workflows/release`, `skills/<dir>`).
454
+ * The leading segment is reverse-mapped against the placement stash-subdir map;
455
+ * the remainder is the per-type name handed to `assetPathForName`. An
456
+ * unqualified conceptId (no recognized leading stash-subdir) falls back to a
457
+ * direct `<root>/<conceptId>.md` — the same `${name}.md` fallback
458
+ * `buildDiskCandidates` carries (`preserveDirectNameFallback`).
459
+ *
460
+ * `recognize()` emits the SAME qualified spelling (ref-grammar decision
461
+ * D-R2), so recognize/place share one canonical identity — the earlier
462
+ * bare-vs-qualified split is resolved.
463
+ */
464
+ placeNew(c, conceptId) {
465
+ const posix = conceptId.replace(/\\/g, "/");
466
+ const slash = posix.indexOf("/");
467
+ if (slash > 0) {
468
+ const head = posix.slice(0, slash);
469
+ const rest = posix.slice(slash + 1);
470
+ const type = stashDirToType(head);
471
+ if (type !== undefined && rest.length > 0) {
472
+ const typeDir = path.join(c.root, head);
473
+ return assetPathForName(type, typeDir, rest);
474
+ }
475
+ }
476
+ return path.join(c.root, `${posix}.md`);
477
+ },
478
+ /** The AKM workspace's owned stash subdirs (§7): the placement stash-subdir names, feeding git exact-path staging. */
479
+ directoryList(_c) {
480
+ return [...new Set(stashDirNames())];
481
+ },
482
+ /**
483
+ * Install-time probe (§1.2), reproducing today's stash-root detection
484
+ * (`provider-utils.ts#detectStashRoot`/`hasStashDirs`): a root is an AKM
485
+ * workspace root when it carries a `.stash` marker, multiple native placement
486
+ * directories, or one native directory whose Markdown is absent or
487
+ * declares the matching AKM type. The final check prevents an OKF bundle with
488
+ * an unrelated open type under (for example) `knowledge/` from being claimed
489
+ * by AKM merely because the directory name overlaps.
490
+ */
491
+ looksLikeRoot(root) {
492
+ try {
493
+ if (fs.statSync(path.join(root, ".stash")).isDirectory())
494
+ return true;
495
+ }
496
+ catch {
497
+ // no .stash marker — fall through to the type-dir probe
498
+ }
499
+ const ownedDirNames = new Set(stashDirNames());
500
+ let entries;
501
+ try {
502
+ entries = fs.readdirSync(root, { withFileTypes: true });
503
+ }
504
+ catch {
505
+ return false;
506
+ }
507
+ const ownedDirs = entries.filter((entry) => entry.isDirectory() && ownedDirNames.has(entry.name));
508
+ if (ownedDirs.length >= 2)
509
+ return true;
510
+ const only = ownedDirs[0];
511
+ if (!only)
512
+ return false;
513
+ const expectedType = stashDirToType(only.name);
514
+ try {
515
+ const markdown = fs
516
+ .readdirSync(path.join(root, only.name), { withFileTypes: true })
517
+ .find((entry) => entry.isFile() && entry.name.toLowerCase().endsWith(".md"));
518
+ if (!markdown)
519
+ return true;
520
+ const data = parseFrontmatter(fs.readFileSync(path.join(root, only.name, markdown.name), "utf8")).data;
521
+ const declaredType = typeof data.type === "string" ? data.type.trim() : "";
522
+ return !declaredType || declaredType === expectedType;
523
+ }
524
+ catch {
525
+ return true;
526
+ }
527
+ },
528
+ };