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,419 @@
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 first-class `llm-wiki` adapter — akm 0.9.0 chunk-4 (DEV-7 restore).
6
+ *
7
+ * The `wiki` ASSET-TYPE dies in chunk 4 (plan §11 Chunk 4 / §7.4), but the LLM
8
+ * Wiki structure stays first-class as its OWN adapter. This relocates the
9
+ * native wiki semantics from the retired `src/wiki/` module into a
10
+ * `BundleAdapter` implementing `docs/architecture/specs/akm-0.9.0-bundle-adapter-spec.md` §7
11
+ * (llm-wiki row), §6 (wiki-page row), §0.2 (the `wiki` asset-type is retired;
12
+ * the adapter is first-class), §1.2 (probe = schema.md + pages/), §9 (links).
13
+ *
14
+ * Conformance oracle (authored, DO NOT modify): fixture
15
+ * `tests/fixtures/bundles/llm-wiki/` + goldens
16
+ * `tests/fixtures/format-family-goldens/llm-wiki/{recognition,placement,renderer,lint}.json`.
17
+ * The adapter is built to MATCH those goldens (driven by
18
+ * `tests/core/adapter/llm-wiki-adapter.test.ts`).
19
+ *
20
+ * ── Structure (spec §7, wiki.ts canonical-content contract) ──
21
+ *
22
+ * - `schema.md` / `index.md` / `log.md` at the wiki ROOT are RESERVED
23
+ * (recognized, never indexed as concepts) — analogous to OKF's index.md/log.md.
24
+ * - `raw/<slug>.md` are immutable ingested sources → the adapter's own `type`
25
+ * = `wiki-source` (RESOLVED, reading A: recognition golden). First-class
26
+ * addressable + searchable; lint tracks whether each is cited.
27
+ * - `pages/**.md` are agent-authored pages → open `type` = frontmatter
28
+ * `pageKind` (concept/entity/note/<custom>). None of concept/entity/note/
29
+ * wiki-source is in `KNOWN_TYPES`, so they present GENERICALLY (renderer
30
+ * golden); the retired `wiki-md` renderer is deliberately unused.
31
+ * - Anything else (root README, stray root `.md`, other dirs) is NOT a wiki
32
+ * asset (`recognize` abstains) — pages live under `pages/`.
33
+ *
34
+ * ── Links / citations (spec §9) ──
35
+ *
36
+ * A page's `IndexDocument.links` = its resolved `xrefs:` frontmatter (the
37
+ * `wiki:<name>/<conceptId>` form, stripped to the target conceptId) PLUS its
38
+ * body bundle-relative markdown links, deduped, first-appearance order. Its
39
+ * `sources:` frontmatter resolves to the cited raw conceptIds (citation edges),
40
+ * carried on `documentJson` (adapter extras — plan §4.3) and consumed by the
41
+ * uncited-raw lint check.
42
+ *
43
+ * ── validate (spec §6/§7, §9) — native wiki checks ONLY ──
44
+ *
45
+ * The native structural checks ported from the retired `src/wiki/` module's
46
+ * `lintWiki`: `broken-xref`
47
+ * (an xref target that does not resolve to an existing page), `uncited-raw`
48
+ * (a `raw/` source not cited by any page's `sources:`), `missing-description`
49
+ * (a page with no description), and `broken-source` (a page `sources:` entry
50
+ * with no matching raw file). Broken xrefs are TOLERATED (warning, non-blocking,
51
+ * spec §9). The shared `runBaseValidateChecks` (unquoted-colon / missing-updated
52
+ * / stale-path / missing-ref) is NOT run: wiki files never carry an `updated`
53
+ * field, so `missing-updated` would fire on every page/reserved file and
54
+ * contradict the lint golden's clean result — the native checks are the wiki's
55
+ * complete validation surface. The `orphan` issue CODE is APPROVED but the
56
+ * recorded chunk-4 behavior (lint golden edgeCases) is to emit `broken-xref`
57
+ * only (the actionable finding) and surface `orphan` after the xref is fixed —
58
+ * so no `orphan` finding is emitted here.
59
+ *
60
+ * ── Cycle-safety ──
61
+ *
62
+ * Imported by the `adapters/index.ts` barrel, which is NOT test-only: `core/
63
+ * adapter/registry.ts:33` imports it in production for the frozen
64
+ * `BUILTIN_ADAPTERS` list (`installations.ts#detectAdapterId`,
65
+ * `provider-utils.ts#detectStashRoot`). This still can never gain an inbound
66
+ * edge from a cycle participant, since neither the barrel nor the registry
67
+ * import anything that imports back into this file. It value-imports only
68
+ * pure leaves (`frontmatter`, `shared`) plus Node builtins + `yaml` (already a
69
+ * runtime dep). Verified: `bun scripts/lint-import-cycles.ts` reports 0 cycle
70
+ * participants with this file present.
71
+ */
72
+ import fs from "node:fs";
73
+ import path from "node:path";
74
+ import { parse as parseYaml } from "yaml";
75
+ import { parseFrontmatter, parseFrontmatterBlock } from "../../asset/frontmatter.js";
76
+ import { hashContent, nonEmptyString } from "./shared.js";
77
+ /** A wiki is a single-component bundle; its one component is conventionally `main` (recognition golden). */
78
+ const WIKI_COMPONENT_ID = "main";
79
+ /** The adapter's own `type` for immutable ingested sources under `raw/` (recognition golden, reading A). */
80
+ const WIKI_SOURCE_TYPE = "wiki-source";
81
+ /** Default open `type` for a `pages/` file whose frontmatter carries no `pageKind`. */
82
+ const DEFAULT_PAGE_KIND = "note";
83
+ /** Reserved wiki files (case-insensitive) at the wiki ROOT — recognized, never indexed as concepts (spec §7). */
84
+ const RESERVED_ROOT_FILES = new Set(["schema.md", "index.md", "log.md"]);
85
+ /** Content subdirectory holding immutable ingested sources. */
86
+ const RAW_SUBDIR = "raw";
87
+ /** Content subdirectory holding agent-authored pages. */
88
+ const PAGES_SUBDIR = "pages";
89
+ /** Upper bound on the bounded `content` FTS field (mirrors okf-adapter). */
90
+ const MAX_CONTENT_CHARS = 100_000;
91
+ /** POSIX-normalize separators. */
92
+ function toPosix(p) {
93
+ return p.replace(/\\/g, "/");
94
+ }
95
+ /** conceptId = component-root-relative path minus `.md`. */
96
+ function conceptIdOf(relPath) {
97
+ return toPosix(relPath).replace(/\.md$/i, "");
98
+ }
99
+ /**
100
+ * Parse a wiki page's frontmatter with a real YAML parser so list-valued keys
101
+ * (`xrefs:`, `sources:`) round-trip (the project's hand-rolled `parseFrontmatter`
102
+ * deliberately drops YAML lists — see `wiki.ts#parsePageFrontmatterYaml`).
103
+ * Tolerant: malformed YAML / no frontmatter yields empty fields.
104
+ */
105
+ function parseWikiFrontmatter(raw) {
106
+ const out = { xrefs: [], sources: [] };
107
+ const block = parseFrontmatterBlock(raw);
108
+ let data = {};
109
+ if (block) {
110
+ try {
111
+ const value = parseYaml(block.frontmatter);
112
+ if (value && typeof value === "object" && !Array.isArray(value)) {
113
+ data = value;
114
+ }
115
+ }
116
+ catch {
117
+ // malformed YAML — fall back to the lightweight parser (scalars only)
118
+ try {
119
+ data = parseFrontmatter(raw).data;
120
+ }
121
+ catch {
122
+ data = {};
123
+ }
124
+ }
125
+ }
126
+ out.description = nonEmptyString(data.description);
127
+ out.pageKind = nonEmptyString(data.pageKind);
128
+ out.wikiRole = nonEmptyString(data.wikiRole);
129
+ if (Array.isArray(data.xrefs)) {
130
+ out.xrefs = data.xrefs
131
+ .filter((x) => typeof x === "string" && x.trim().length > 0)
132
+ .map((x) => x.trim());
133
+ }
134
+ if (Array.isArray(data.sources)) {
135
+ out.sources = data.sources
136
+ .filter((s) => typeof s === "string" && s.trim().length > 0)
137
+ .map((s) => s.trim());
138
+ }
139
+ return out;
140
+ }
141
+ /** True when `relPath` is a RESERVED wiki file at the component root (schema/index/log). */
142
+ function isReservedRootFile(relPath) {
143
+ const posix = toPosix(relPath);
144
+ if (posix.includes("/"))
145
+ return false; // reserved files are special ONLY at the wiki root
146
+ return RESERVED_ROOT_FILES.has(posix.toLowerCase());
147
+ }
148
+ /** First path segment of a component-root-relative POSIX path (or the whole thing when flat). */
149
+ function firstSegment(relPath) {
150
+ const posix = toPosix(relPath);
151
+ const slash = posix.indexOf("/");
152
+ return slash < 0 ? posix : posix.slice(0, slash);
153
+ }
154
+ /**
155
+ * Resolve one xref token (`wiki:<bundleId>/<conceptId>`) to a same-wiki target
156
+ * conceptId, or `null` when it points at another wiki / is not a wiki xref.
157
+ * `bundleId` is the bundle id (`c.id`); cross-wiki xrefs are left alone
158
+ * (wiki.ts#lintWiki: "a cross-wiki link is a feature, not a defect").
159
+ */
160
+ function resolveXref(xref, bundleId) {
161
+ const prefix = `wiki:${bundleId}/`;
162
+ if (!xref.startsWith(prefix))
163
+ return null;
164
+ const target = xref.slice(prefix.length).replace(/\.md$/i, "");
165
+ return target.length > 0 ? target : null;
166
+ }
167
+ /**
168
+ * Resolve a page body's bundle-relative markdown links to component-root-relative
169
+ * conceptIds. `/`-rooted links resolve from the component root; standard relative
170
+ * links resolve against the linking page's own directory. External schemes,
171
+ * anchors, non-`.md` targets, and links escaping the component root are dropped
172
+ * (tolerant, §9). First-appearance order; duplicates collapse.
173
+ */
174
+ function resolveBodyLinks(body, fileRelPath) {
175
+ const dir = path.posix.dirname(toPosix(fileRelPath));
176
+ const linkRe = /\[[^\]]*\]\(([^)]+)\)/g;
177
+ const out = [];
178
+ const seen = new Set();
179
+ let match;
180
+ // biome-ignore lint/suspicious/noAssignInExpressions: idiomatic regex loop
181
+ while ((match = linkRe.exec(body)) !== null) {
182
+ let target = match[1].trim();
183
+ const wsIdx = target.search(/\s/);
184
+ if (wsIdx >= 0)
185
+ target = target.slice(0, wsIdx);
186
+ const hashIdx = target.indexOf("#");
187
+ if (hashIdx >= 0)
188
+ target = target.slice(0, hashIdx);
189
+ const queryIdx = target.indexOf("?");
190
+ if (queryIdx >= 0)
191
+ target = target.slice(0, queryIdx);
192
+ if (!target)
193
+ continue;
194
+ if (/^[a-z][a-z0-9+.-]*:/i.test(target))
195
+ continue; // external scheme
196
+ if (target.startsWith("//"))
197
+ continue; // protocol-relative
198
+ if (!target.toLowerCase().endsWith(".md"))
199
+ continue;
200
+ let resolved;
201
+ if (target.startsWith("/")) {
202
+ resolved = path.posix.normalize(target.slice(1));
203
+ }
204
+ else {
205
+ const base = dir === "." ? "" : dir;
206
+ resolved = path.posix.normalize(path.posix.join(base, target));
207
+ }
208
+ if (resolved.startsWith("../") || resolved === ".." || resolved.startsWith("/"))
209
+ continue;
210
+ const conceptId = resolved.replace(/\.md$/i, "");
211
+ if (!conceptId || seen.has(conceptId))
212
+ continue;
213
+ seen.add(conceptId);
214
+ out.push(conceptId);
215
+ }
216
+ return out;
217
+ }
218
+ /** Resolve a page's `xrefs` + body links into deduped target conceptIds (links = relationships, §9). */
219
+ function resolvePageLinks(fm, body, fileRelPath, bundleId) {
220
+ const out = [];
221
+ const seen = new Set();
222
+ const push = (conceptId) => {
223
+ if (conceptId.length > 0 && !seen.has(conceptId)) {
224
+ seen.add(conceptId);
225
+ out.push(conceptId);
226
+ }
227
+ };
228
+ for (const xref of fm.xrefs) {
229
+ const resolved = resolveXref(xref, bundleId);
230
+ if (resolved !== null)
231
+ push(resolved);
232
+ }
233
+ for (const link of resolveBodyLinks(body, fileRelPath))
234
+ push(link);
235
+ return out;
236
+ }
237
+ /** Resolve a page's `sources:` entries (`raw/<slug>[.md]`) to raw conceptIds (citation edges). */
238
+ function resolveSources(fm) {
239
+ const out = [];
240
+ const seen = new Set();
241
+ for (const src of fm.sources) {
242
+ const match = src.match(/^raw\/([^/\s]+?)(?:\.md)?$/i);
243
+ if (!match)
244
+ continue;
245
+ const conceptId = `raw/${match[1]}`;
246
+ if (!seen.has(conceptId)) {
247
+ seen.add(conceptId);
248
+ out.push(conceptId);
249
+ }
250
+ }
251
+ return out;
252
+ }
253
+ function recognize(c, file) {
254
+ if (file.ext !== ".md")
255
+ return null;
256
+ const relPath = toPosix(file.relPath);
257
+ // Reserved root files (schema/index/log) are recognized but never indexed.
258
+ if (isReservedRootFile(relPath))
259
+ return null;
260
+ const head = firstSegment(relPath);
261
+ const isRaw = head === RAW_SUBDIR && relPath.includes("/");
262
+ const isPage = head === PAGES_SUBDIR && relPath.includes("/");
263
+ // Only `raw/` sources and `pages/` pages are wiki assets. Everything else
264
+ // (root README, stray root `.md`, other dirs) is abstained on.
265
+ if (!isRaw && !isPage)
266
+ return null;
267
+ const conceptId = conceptIdOf(relPath);
268
+ const lastSegment = conceptId.split("/").pop() ?? conceptId;
269
+ const raw = file.content();
270
+ const fm = parseWikiFrontmatter(raw);
271
+ const body = parseFrontmatter(raw).content;
272
+ const doc = {
273
+ ref: `${c.id}//${conceptId}`,
274
+ bundle: c.id,
275
+ component: WIKI_COMPONENT_ID,
276
+ conceptId,
277
+ path: file.absPath,
278
+ hash: hashContent(raw),
279
+ adapterId: "llm-wiki",
280
+ ownsPresentation: true,
281
+ type: isRaw ? WIKI_SOURCE_TYPE : (fm.pageKind ?? DEFAULT_PAGE_KIND),
282
+ name: lastSegment,
283
+ content: body.length > MAX_CONTENT_CHARS ? body.slice(0, MAX_CONTENT_CHARS) : body,
284
+ };
285
+ if (fm.description !== undefined)
286
+ doc.description = fm.description;
287
+ if (isPage) {
288
+ const links = resolvePageLinks(fm, body, relPath, c.id);
289
+ if (links.length > 0)
290
+ doc.links = links;
291
+ const sources = resolveSources(fm);
292
+ // wiki page extras (adapter-owned; plan §4.3 — wikiRole/pageKind + citations).
293
+ const extras = { pageKind: fm.pageKind ?? DEFAULT_PAGE_KIND, sources };
294
+ if (fm.wikiRole !== undefined)
295
+ extras.wikiRole = fm.wikiRole;
296
+ doc.documentJson = extras;
297
+ }
298
+ else {
299
+ doc.documentJson = { wikiRole: fm.wikiRole ?? "source" };
300
+ }
301
+ return doc;
302
+ }
303
+ async function validate(c, changes, ctx) {
304
+ const items = [];
305
+ for (const change of changes) {
306
+ if (change.op === "delete")
307
+ continue;
308
+ const raw = change.after ?? (await ctx.readFile(change.path));
309
+ if (typeof raw !== "string")
310
+ continue;
311
+ const relPath = toPosix(change.path);
312
+ if (isReservedRootFile(relPath))
313
+ continue; // reserved files are not concepts — no page checks
314
+ const head = firstSegment(relPath);
315
+ const isRaw = head === RAW_SUBDIR && relPath.includes("/");
316
+ const isPage = head === PAGES_SUBDIR && relPath.includes("/");
317
+ if (!isRaw && !isPage)
318
+ continue;
319
+ items.push({
320
+ relPath,
321
+ conceptId: conceptIdOf(relPath),
322
+ kind: isRaw ? "raw" : "page",
323
+ fm: parseWikiFrontmatter(raw),
324
+ body: parseFrontmatter(raw).content,
325
+ });
326
+ }
327
+ const existingConceptIds = new Set(items.map((i) => i.conceptId));
328
+ const citedRawConceptIds = new Set();
329
+ for (const item of items) {
330
+ if (item.kind !== "page")
331
+ continue;
332
+ for (const src of resolveSources(item.fm))
333
+ citedRawConceptIds.add(src);
334
+ }
335
+ const diagnostics = [];
336
+ for (const item of items) {
337
+ if (item.kind === "raw") {
338
+ // uncited-raw: a raw source not cited by any page's `sources:`.
339
+ if (!citedRawConceptIds.has(item.conceptId)) {
340
+ diagnostics.push({
341
+ file: item.relPath,
342
+ issue: "uncited-raw",
343
+ detail: `warning: raw source ${item.conceptId} is not cited by any page's sources: frontmatter (non-blocking).`,
344
+ fixed: false,
345
+ });
346
+ }
347
+ continue;
348
+ }
349
+ // missing-description
350
+ if (item.fm.description === undefined) {
351
+ diagnostics.push({
352
+ file: item.relPath,
353
+ issue: "missing-description",
354
+ detail: "warning: page is missing a frontmatter `description` (non-blocking).",
355
+ fixed: false,
356
+ });
357
+ }
358
+ // broken-xref: same-wiki xref targets that do not resolve to an existing page.
359
+ const targets = new Set();
360
+ for (const xref of item.fm.xrefs) {
361
+ const resolved = resolveXref(xref, c.id);
362
+ if (resolved !== null)
363
+ targets.add(resolved);
364
+ }
365
+ for (const link of resolveBodyLinks(item.body, item.relPath))
366
+ targets.add(link);
367
+ for (const target of targets) {
368
+ if (!existingConceptIds.has(target)) {
369
+ diagnostics.push({
370
+ file: item.relPath,
371
+ issue: "broken-xref",
372
+ detail: `warning: cross-reference target not found: ${target} ` +
373
+ "(non-blocking; cross-references must point at pages that actually exist — wiki schema hard rule).",
374
+ fixed: false,
375
+ });
376
+ }
377
+ }
378
+ // broken-source: `sources:` entries must resolve to an existing raw file.
379
+ for (const source of resolveSources(item.fm)) {
380
+ if (!existingConceptIds.has(source)) {
381
+ diagnostics.push({
382
+ file: item.relPath,
383
+ issue: "broken-source",
384
+ detail: `warning: page references missing raw source ${source} (non-blocking).`,
385
+ fixed: false,
386
+ });
387
+ }
388
+ }
389
+ }
390
+ return diagnostics;
391
+ }
392
+ export const llmWikiAdapter = {
393
+ id: "llm-wiki",
394
+ version: "0.9.0",
395
+ extensions: [".md"],
396
+ recognize,
397
+ validate,
398
+ /** `<c.root>/<conceptId>.md` — the conceptId already carries its `pages/`/`raw/` prefix (placement golden). */
399
+ placeNew(c, conceptId) {
400
+ return path.join(c.root, `${conceptId}.md`);
401
+ },
402
+ /** The wiki owns its whole root (schema/index/log at root plus pages/ + raw/); one component. */
403
+ directoryList(_c) {
404
+ return ["."];
405
+ },
406
+ /** Install-time probe (§1.2): a root is an LLM Wiki when it has a root `schema.md` AND a `pages/` directory. */
407
+ looksLikeRoot(root) {
408
+ try {
409
+ if (!fs.existsSync(path.join(root, "schema.md")))
410
+ return false;
411
+ return fs.statSync(path.join(root, PAGES_SUBDIR)).isDirectory();
412
+ }
413
+ catch {
414
+ return false;
415
+ }
416
+ },
417
+ };
418
+ // Exported pure helpers for the conformance test.
419
+ export { resolveBodyLinks, resolvePageLinks, resolveSources, resolveXref };