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
@@ -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
+ };