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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (587) hide show
  1. package/CHANGELOG.md +1190 -52
  2. package/README.md +62 -37
  3. package/SECURITY.md +46 -31
  4. package/dist/akm +162 -38
  5. package/dist/akm-migrate +44 -0
  6. package/dist/assets/backends/schtasks-template.xml +2 -1
  7. package/dist/assets/hints/cli-hints-full.md +268 -118
  8. package/dist/assets/hints/cli-hints-short.md +87 -24
  9. package/dist/assets/{profiles → improve-strategies}/catchup.json +3 -1
  10. package/dist/assets/{profiles → improve-strategies}/consolidate.json +3 -1
  11. package/dist/assets/{profiles → improve-strategies}/default.json +6 -7
  12. package/dist/assets/improve-strategies/frequent.json +15 -0
  13. package/dist/assets/{profiles → improve-strategies}/graph-refresh.json +4 -2
  14. package/dist/assets/{profiles → improve-strategies}/memory-focus.json +4 -1
  15. package/dist/assets/{profiles → improve-strategies}/proactive-maintenance.json +5 -5
  16. package/dist/assets/{profiles → improve-strategies}/quick.json +4 -2
  17. package/dist/assets/improve-strategies/reflect-distill.json +30 -0
  18. package/dist/assets/{profiles → improve-strategies}/thorough.json +1 -1
  19. package/dist/assets/prompts/consolidate-system.md +5 -5
  20. package/dist/assets/prompts/extract-session.md +2 -6
  21. package/dist/assets/prompts/memory-infer-user.md +2 -3
  22. package/dist/assets/prompts/reflect-llm-framed-contract.md +11 -0
  23. package/dist/assets/prompts/reflect-llm-schema-contract.md +3 -0
  24. package/dist/assets/prompts/reflect-output-repair.md +3 -0
  25. package/dist/assets/stash-skeleton/README.md +38 -10
  26. package/dist/assets/stash-skeleton/facts/conventions/assets/agent.md +8 -0
  27. package/dist/assets/stash-skeleton/facts/conventions/assets/command.md +8 -0
  28. package/dist/assets/stash-skeleton/facts/conventions/assets/fact.md +14 -1
  29. package/dist/assets/stash-skeleton/facts/conventions/assets/knowledge.md +13 -1
  30. package/dist/assets/stash-skeleton/facts/conventions/assets/lesson.md +9 -1
  31. package/dist/assets/stash-skeleton/facts/conventions/assets/memory.md +11 -0
  32. package/dist/assets/stash-skeleton/facts/conventions/assets/script.md +9 -0
  33. package/dist/assets/stash-skeleton/facts/conventions/assets/skill.md +9 -0
  34. package/dist/assets/stash-skeleton/facts/conventions/assets/workflow.md +8 -0
  35. package/dist/assets/stash-skeleton/facts/conventions/backlinks.md +100 -0
  36. package/dist/assets/stash-skeleton/facts/conventions/domains.md +64 -0
  37. package/dist/assets/stash-skeleton/facts/conventions/organization.md +136 -0
  38. package/dist/assets/tasks/core/extract.yml +3 -2
  39. package/dist/assets/tasks/core/improve.yml +2 -1
  40. package/dist/assets/tasks/core/index-refresh.yml +1 -0
  41. package/dist/assets/tasks/core/sync.yml +1 -0
  42. package/dist/assets/tasks/core/version-check.yml +2 -1
  43. package/dist/assets/tasks/improve/akm-graph-refresh-weekly.yml +5 -0
  44. package/dist/assets/tasks/improve/akm-improve-catchup.yml +8 -0
  45. package/dist/assets/tasks/improve/akm-improve-consolidate.yml +5 -0
  46. package/dist/assets/tasks/improve/akm-improve-frequent.yml +5 -0
  47. package/dist/assets/tasks/improve/akm-improve-nightly.yml +5 -0
  48. package/dist/assets/templates/html/health.html +5 -4
  49. package/dist/assets/workflows/workflow-template.md +31 -15
  50. package/dist/cli/invocation.js +279 -0
  51. package/dist/cli/parse-args.js +5 -90
  52. package/dist/cli/retired-commands.js +78 -0
  53. package/dist/cli/shared.js +158 -48
  54. package/dist/cli-node.mjs +2 -1
  55. package/dist/cli.js +747 -293
  56. package/dist/commands/agent/agent-dispatch.js +19 -18
  57. package/dist/commands/agent/agent-support.js +0 -24
  58. package/dist/commands/agent/contribute-cli.js +43 -97
  59. package/dist/commands/completions.js +80 -23
  60. package/dist/commands/config-cli.js +44 -281
  61. package/dist/commands/env/env-binding.js +13 -9
  62. package/dist/commands/env/env-cli.js +76 -159
  63. package/dist/commands/env/env.js +12 -163
  64. package/dist/commands/env/marker-path.js +6 -0
  65. package/dist/commands/env/secret-cli.js +45 -61
  66. package/dist/commands/env/secret.js +32 -62
  67. package/dist/commands/feedback-cli.js +179 -85
  68. package/dist/commands/health/accept-rate.js +58 -0
  69. package/dist/commands/health/advisories.js +7 -8
  70. package/dist/commands/health/checks.js +279 -94
  71. package/dist/commands/health/html-report.js +197 -578
  72. package/dist/commands/health/improve-metrics.js +277 -246
  73. package/dist/commands/health/llm-usage.js +19 -19
  74. package/dist/commands/health/md-report.js +16 -7
  75. package/dist/commands/health/metrics.js +67 -32
  76. package/dist/commands/health/renderers.js +47 -0
  77. package/dist/commands/health/report-view-model.js +508 -0
  78. package/dist/commands/health/stash-exposure.js +1 -1
  79. package/dist/commands/health/surfaces.js +16 -56
  80. package/dist/commands/health/task-runs.js +3 -67
  81. package/dist/{migrate-storage-node.mjs → commands/health/types-checks.js} +1 -5
  82. package/dist/commands/health/types-improve.js +29 -0
  83. package/dist/{output/text/save.js → commands/health/types-metrics.js} +1 -2
  84. package/dist/commands/health/types-result.js +7 -0
  85. package/dist/commands/health/types-runs.js +4 -0
  86. package/dist/commands/health/types-session-log.js +4 -0
  87. package/dist/commands/health/types-windows.js +4 -0
  88. package/dist/commands/health/types.js +26 -21
  89. package/dist/commands/health/windows.js +2 -3
  90. package/dist/commands/health.js +296 -167
  91. package/dist/commands/improve/anti-collapse.js +5 -5
  92. package/dist/commands/improve/autonomy-gate.js +68 -0
  93. package/dist/commands/improve/collapse-detector.js +65 -52
  94. package/dist/commands/improve/consolidate/chunking.js +9 -7
  95. package/dist/commands/improve/consolidate/eligibility.js +1 -23
  96. package/dist/commands/improve/consolidate/merge.js +4 -0
  97. package/dist/commands/improve/consolidate.js +454 -1354
  98. package/dist/commands/improve/content-hash.js +39 -0
  99. package/dist/commands/improve/distill/content-repair.js +4 -10
  100. package/dist/commands/improve/distill/promote-memory.js +89 -64
  101. package/dist/commands/improve/distill/quality-gate.js +118 -42
  102. package/dist/commands/improve/distill-guards.js +1 -1
  103. package/dist/commands/improve/distill-promotion-policy.js +33 -888
  104. package/dist/commands/improve/distill.js +607 -363
  105. package/dist/commands/improve/eligibility.js +165 -79
  106. package/dist/commands/improve/extract-cli.js +35 -126
  107. package/dist/commands/improve/extract-prompt.js +6 -35
  108. package/dist/commands/improve/extract.js +640 -391
  109. package/dist/commands/improve/feedback-valence.js +2 -12
  110. package/dist/commands/improve/improve-cli.js +134 -135
  111. package/dist/commands/improve/improve-result-file.js +30 -50
  112. package/dist/commands/improve/improve-run-types.js +4 -0
  113. package/dist/commands/improve/improve-strategies.js +135 -0
  114. package/dist/commands/improve/improve.js +904 -701
  115. package/dist/commands/improve/locks.js +64 -111
  116. package/dist/commands/improve/loop-stages.js +1110 -923
  117. package/dist/commands/improve/memory/derived-ref.js +124 -0
  118. package/dist/commands/improve/memory/memory-belief.js +79 -7
  119. package/dist/commands/improve/memory/memory-contradiction-detect.js +49 -52
  120. package/dist/commands/improve/memory/memory-improve.js +25 -37
  121. package/dist/commands/improve/outcome-loop.js +25 -88
  122. package/dist/commands/improve/preparation.js +1034 -813
  123. package/dist/commands/improve/proactive-maintenance.js +34 -9
  124. package/dist/commands/improve/proposal-envelope.js +31 -0
  125. package/dist/commands/improve/reflect.js +983 -794
  126. package/dist/commands/improve/run-context.js +119 -0
  127. package/dist/commands/improve/salience.js +24 -127
  128. package/dist/commands/improve/session-asset.js +7 -3
  129. package/dist/commands/improve/shared.js +14 -34
  130. package/dist/commands/improve/source-identity.js +28 -0
  131. package/dist/commands/improve/triage.js +20 -17
  132. package/dist/commands/lint/base-linter.js +340 -313
  133. package/dist/commands/lint/env-key-rules.js +31 -47
  134. package/dist/commands/lint/index.js +185 -30
  135. package/dist/commands/{events.js → log.js} +28 -38
  136. package/dist/commands/migrate-cli.js +54 -0
  137. package/dist/commands/migration-tool.js +55 -0
  138. package/dist/commands/observability-cli.js +70 -208
  139. package/dist/commands/proposal/diff-format.js +50 -0
  140. package/dist/commands/proposal/drain-policies.js +0 -6
  141. package/dist/commands/proposal/drain.js +91 -40
  142. package/dist/commands/proposal/proposal-cli.js +134 -132
  143. package/dist/commands/proposal/proposal-types.js +56 -0
  144. package/dist/commands/proposal/proposal.js +83 -65
  145. package/dist/commands/proposal/propose-cli.js +88 -0
  146. package/dist/commands/proposal/propose.js +105 -88
  147. package/dist/commands/proposal/repository.js +1303 -278
  148. package/dist/commands/proposal/validators/proposal-quality-validators.js +16 -6
  149. package/dist/commands/proposal/validators/proposal-validators.js +61 -12
  150. package/dist/commands/proposal/validators/proposals.js +6 -8
  151. package/dist/commands/read/curate.js +78 -73
  152. package/dist/commands/read/knowledge.js +510 -13
  153. package/dist/commands/read/registry-search.js +2 -2
  154. package/dist/commands/read/remember-cli.js +84 -15
  155. package/dist/commands/read/search-cli.js +203 -96
  156. package/dist/commands/read/search.js +126 -94
  157. package/dist/commands/read/show.js +226 -250
  158. package/dist/commands/registry-cli.js +34 -60
  159. package/dist/commands/remember.js +18 -57
  160. package/dist/commands/sources/add-cli.js +104 -49
  161. package/dist/commands/sources/bundle-cli.js +166 -0
  162. package/dist/commands/sources/bundle-config-ops.js +63 -0
  163. package/dist/commands/sources/info.js +27 -15
  164. package/dist/commands/sources/init.js +30 -40
  165. package/dist/commands/sources/installed-stashes.js +469 -172
  166. package/dist/commands/sources/schema-repair.js +10 -9
  167. package/dist/commands/sources/self-update.js +182 -121
  168. package/dist/commands/sources/source-add.js +169 -178
  169. package/dist/commands/sources/source-clone.js +144 -41
  170. package/dist/commands/sources/source-manage.js +94 -59
  171. package/dist/commands/sources/sources-cli.js +64 -205
  172. package/dist/commands/sources/stash-cli.js +91 -54
  173. package/dist/commands/sources/stash-skeleton.js +1 -1
  174. package/dist/commands/tasks/tasks-cli.js +106 -104
  175. package/dist/commands/tasks/tasks.js +445 -262
  176. package/dist/commands/workflow-cli.js +75 -228
  177. package/dist/core/action-contributors.js +1 -1
  178. package/dist/core/activation-policy.js +49 -0
  179. package/dist/core/adapter/adapters/agent-skills-adapter.js +181 -0
  180. package/dist/core/adapter/adapters/akm-adapter.js +528 -0
  181. package/dist/core/adapter/adapters/akm-lint.js +392 -0
  182. package/dist/core/adapter/adapters/akm-metadata.js +387 -0
  183. package/dist/core/adapter/adapters/akm-task-adapter.js +149 -0
  184. package/dist/core/adapter/adapters/akm-workflow-adapter.js +180 -0
  185. package/dist/core/adapter/adapters/claude-adapter.js +61 -0
  186. package/dist/core/adapter/adapters/dotenv-adapter.js +187 -0
  187. package/dist/core/adapter/adapters/generic-files-adapter.js +119 -0
  188. package/dist/core/adapter/adapters/index.js +80 -0
  189. package/dist/core/adapter/adapters/llm-wiki-adapter.js +419 -0
  190. package/dist/core/adapter/adapters/okf-adapter.js +391 -0
  191. package/dist/core/adapter/adapters/opencode-adapter.js +68 -0
  192. package/dist/core/adapter/adapters/shared.js +286 -0
  193. package/dist/core/adapter/adapters/tool-dir-shared.js +217 -0
  194. package/dist/core/adapter/adapters/website-snapshot-adapter.js +155 -0
  195. package/dist/core/adapter/bundle-adapter.js +4 -0
  196. package/dist/core/adapter/detect-adapter.js +17 -0
  197. package/dist/core/adapter/recognize-match.js +44 -0
  198. package/dist/core/adapter/registry.js +56 -0
  199. package/dist/core/adapter/types.js +4 -0
  200. package/dist/core/asset/akm-markdown.js +30 -0
  201. package/dist/core/asset/asset-placement.js +243 -0
  202. package/dist/core/asset/asset-ref.js +110 -79
  203. package/dist/core/asset/asset-serialize.js +20 -0
  204. package/dist/core/asset/frontmatter.js +28 -12
  205. package/dist/core/asset/markdown.js +40 -51
  206. package/dist/core/asset/resolve-ref.js +274 -0
  207. package/dist/core/asset/stash-meta.js +2 -2
  208. package/dist/core/bundle-id.js +51 -0
  209. package/dist/core/common.js +281 -86
  210. package/dist/core/config/config-io.js +42 -128
  211. package/dist/core/config/config-schema.js +233 -855
  212. package/dist/core/config/config-sources.js +162 -39
  213. package/dist/core/config/config-types.js +16 -11
  214. package/dist/core/config/config-version.js +29 -0
  215. package/dist/core/config/config-walker.js +126 -37
  216. package/dist/core/config/config.js +154 -331
  217. package/dist/core/config/deep-merge.js +41 -0
  218. package/dist/core/config/engine-semantics.js +28 -0
  219. package/dist/core/config/experimental.js +21 -0
  220. package/dist/core/config/schema/embedding.js +38 -0
  221. package/dist/core/config/schema/engines.js +116 -0
  222. package/dist/core/config/schema/experimental.js +47 -0
  223. package/dist/core/config/schema/feedback.js +31 -0
  224. package/dist/core/config/schema/improve-processes.js +389 -0
  225. package/dist/core/config/schema/improve.js +94 -0
  226. package/dist/core/config/schema/index-config.js +176 -0
  227. package/dist/core/config/schema/output.js +18 -0
  228. package/dist/core/config/schema/primitives.js +94 -0
  229. package/dist/core/config/schema/search.js +30 -0
  230. package/dist/core/config/schema/setup.js +18 -0
  231. package/dist/core/config/schema/sources-bundles.js +169 -0
  232. package/dist/core/config/schema/workflow.js +29 -0
  233. package/dist/core/env-secret-ref.js +155 -20
  234. package/dist/core/errors.js +17 -15
  235. package/dist/core/events-types.js +4 -0
  236. package/dist/core/events.js +46 -128
  237. package/dist/core/extra-params.js +62 -0
  238. package/dist/core/file-change.js +17 -0
  239. package/dist/core/file-lock.js +202 -57
  240. package/dist/core/fs-txn.js +392 -0
  241. package/dist/core/git-message.js +59 -0
  242. package/dist/core/improve-result.js +167 -0
  243. package/dist/core/lesson-lint.js +1 -17
  244. package/dist/core/logs-db.js +1 -1
  245. package/dist/core/maintenance-barrier.js +135 -0
  246. package/dist/core/migration-operation.js +44 -0
  247. package/dist/core/mutation-target.js +78 -0
  248. package/dist/core/paths.js +22 -25
  249. package/dist/core/platform.js +10 -0
  250. package/dist/core/recognition-util.js +128 -0
  251. package/dist/core/redaction.js +392 -0
  252. package/dist/core/standards/resolve-standards-context.js +36 -65
  253. package/dist/core/standards/resolve-stash-standards.js +2 -2
  254. package/dist/core/standards/resolve-type-conventions.js +5 -5
  255. package/dist/core/state/migrations.js +242 -11
  256. package/dist/core/state-db.js +98 -10
  257. package/dist/core/structured.js +1 -1
  258. package/dist/core/subprocess.js +303 -0
  259. package/dist/core/text-truncation.js +9 -5
  260. package/dist/core/time.js +20 -0
  261. package/dist/core/type-presentation.js +130 -0
  262. package/dist/core/warn.js +0 -3
  263. package/dist/core/write-source.js +834 -118
  264. package/dist/indexer/bundle-identity-guard.js +92 -0
  265. package/dist/indexer/db/graph-db.js +1 -25
  266. package/dist/indexer/db/llm-cache.js +1 -1
  267. package/dist/indexer/ensure-index.js +30 -9
  268. package/dist/indexer/graph/graph-boost.js +9 -30
  269. package/dist/indexer/graph/graph-extraction.js +41 -27
  270. package/dist/indexer/graph/graph-types.js +4 -0
  271. package/dist/indexer/index-writer-lock.js +93 -49
  272. package/dist/indexer/index-written-assets.js +100 -53
  273. package/dist/indexer/indexer.js +746 -329
  274. package/dist/indexer/init.js +18 -25
  275. package/dist/indexer/installations.js +142 -0
  276. package/dist/indexer/passes/dir-staleness.js +18 -10
  277. package/dist/indexer/passes/memory-inference.js +25 -15
  278. package/dist/indexer/passes/metadata.js +412 -243
  279. package/dist/indexer/scan/doc-to-entry.js +160 -0
  280. package/dist/indexer/scan/drain-dir.js +134 -0
  281. package/dist/indexer/search/db-search.js +292 -108
  282. package/dist/indexer/search/fts-query.js +64 -0
  283. package/dist/indexer/search/ranking-contributors.js +145 -25
  284. package/dist/indexer/search/ranking-types.js +4 -0
  285. package/dist/indexer/search/ranking.js +28 -71
  286. package/dist/indexer/search/search-attribution.js +67 -0
  287. package/dist/indexer/search/search-fields.js +18 -3
  288. package/dist/indexer/search/search-hit-enrichers.js +30 -40
  289. package/dist/indexer/search/search-source.js +157 -111
  290. package/dist/indexer/search/semantic-status.js +4 -1
  291. package/dist/indexer/usage/usage-events.js +10 -30
  292. package/dist/indexer/walk/file-context.js +3 -45
  293. package/dist/indexer/walk/matchers.js +42 -73
  294. package/dist/indexer/walk/path-resolver.js +11 -5
  295. package/dist/indexer/walk/walker.js +42 -14
  296. package/dist/integrations/agent/builder-shared.js +7 -0
  297. package/dist/integrations/agent/builders.js +5 -58
  298. package/dist/integrations/agent/config.js +3 -143
  299. package/dist/integrations/agent/detect.js +17 -2
  300. package/dist/integrations/agent/engine-resolution.js +231 -0
  301. package/dist/integrations/agent/index.js +1 -2
  302. package/dist/integrations/agent/model-aliases.js +8 -3
  303. package/dist/integrations/agent/profiles.js +6 -99
  304. package/dist/integrations/agent/prompts.js +46 -18
  305. package/dist/integrations/agent/runner-dispatch.js +78 -13
  306. package/dist/integrations/agent/runner.js +76 -208
  307. package/dist/integrations/agent/spawn.js +48 -279
  308. package/dist/integrations/harnesses/aider/agent-builder.js +9 -8
  309. package/dist/integrations/harnesses/aider/index.js +2 -12
  310. package/dist/integrations/harnesses/amazonq/agent-builder.js +10 -16
  311. package/dist/integrations/harnesses/amazonq/index.js +3 -17
  312. package/dist/integrations/harnesses/claude/agent-builder.js +2 -3
  313. package/dist/integrations/harnesses/claude/config-import.js +1 -3
  314. package/dist/integrations/harnesses/claude/index.js +1 -14
  315. package/dist/integrations/harnesses/claude/session-log.js +27 -75
  316. package/dist/integrations/harnesses/codex/agent-builder.js +8 -7
  317. package/dist/integrations/harnesses/codex/index.js +2 -13
  318. package/dist/integrations/harnesses/copilot/agent-builder.js +9 -9
  319. package/dist/integrations/harnesses/copilot/index.js +1 -13
  320. package/dist/integrations/harnesses/gemini/agent-builder.js +8 -9
  321. package/dist/integrations/harnesses/gemini/index.js +1 -13
  322. package/dist/integrations/harnesses/ids.js +24 -0
  323. package/dist/integrations/harnesses/index.js +31 -33
  324. package/dist/integrations/harnesses/opencode/agent-builder.js +23 -5
  325. package/dist/integrations/harnesses/opencode/config-import.js +1 -3
  326. package/dist/integrations/harnesses/opencode/index.js +1 -18
  327. package/dist/integrations/harnesses/opencode/session-log.js +67 -125
  328. package/dist/integrations/harnesses/opencode-sdk/harness.js +3 -17
  329. package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +274 -191
  330. package/dist/integrations/harnesses/openhands/agent-builder.js +12 -10
  331. package/dist/integrations/harnesses/openhands/index.js +2 -12
  332. package/dist/integrations/harnesses/pi/agent-builder.js +11 -18
  333. package/dist/integrations/harnesses/pi/index.js +3 -16
  334. package/dist/integrations/harnesses/shared.js +17 -0
  335. package/dist/integrations/harnesses/types.js +38 -34
  336. package/dist/integrations/lockfile.js +211 -24
  337. package/dist/integrations/session-logs/index.js +24 -40
  338. package/dist/integrations/session-logs/provider-base.js +113 -0
  339. package/dist/llm/client.js +182 -110
  340. package/dist/llm/embedders/deterministic.js +2 -2
  341. package/dist/llm/embedders/remote.js +21 -9
  342. package/dist/llm/feature-gate.js +17 -57
  343. package/dist/llm/graph-extract.js +12 -13
  344. package/dist/llm/index-passes.js +8 -42
  345. package/dist/llm/memory-infer.js +144 -1
  346. package/dist/llm/metadata-enhance.js +45 -30
  347. package/dist/llm/structured-call.js +16 -8
  348. package/dist/llm/usage-persist.js +30 -5
  349. package/dist/llm/usage-telemetry.js +59 -6
  350. package/dist/output/cli-hints.js +1 -2
  351. package/dist/output/command-registry.js +27 -0
  352. package/dist/output/context.js +22 -7
  353. package/dist/output/format-exempt.js +80 -0
  354. package/dist/output/generic-render.js +251 -0
  355. package/dist/output/html-render.js +11 -16
  356. package/dist/output/render-registry.js +57 -0
  357. package/dist/output/renderers.js +15 -281
  358. package/dist/output/shapes/curate.js +10 -1
  359. package/dist/output/shapes/events.js +12 -7
  360. package/dist/output/shapes/helpers.js +58 -84
  361. package/dist/output/shapes/passthrough.js +8 -40
  362. package/dist/output/shapes/proposal/producer.js +15 -7
  363. package/dist/output/shapes/registry.js +12 -6
  364. package/dist/output/shapes.js +0 -9
  365. package/dist/output/text/{init.js → bundle-create.js} +3 -1
  366. package/dist/output/text/bundle-show.js +7 -0
  367. package/dist/output/text/command-format.js +562 -0
  368. package/dist/output/text/env.js +1 -3
  369. package/dist/output/text/events.js +8 -7
  370. package/dist/output/text/helpers.js +15 -1375
  371. package/dist/output/text/proposal/producer.js +4 -2
  372. package/dist/output/text/proposal-format.js +202 -0
  373. package/dist/output/text/registry-commands.js +1 -2
  374. package/dist/output/text/registry.js +12 -6
  375. package/dist/output/text/show-directives.js +117 -0
  376. package/dist/output/text/show-format.js +103 -0
  377. package/dist/output/text/sync.js +5 -0
  378. package/dist/output/text/workflow-format.js +332 -0
  379. package/dist/output/text/workflow.js +1 -2
  380. package/dist/output/text.js +10 -19
  381. package/dist/registry/factory.js +4 -6
  382. package/dist/registry/origin-resolve.js +16 -27
  383. package/dist/registry/providers/skills-sh.js +3 -3
  384. package/dist/registry/providers/static-index.js +15 -25
  385. package/dist/registry/resolve.js +43 -94
  386. package/dist/registry/semver.js +43 -0
  387. package/dist/runtime.js +81 -12
  388. package/dist/scripts/akm-migrate.js +35529 -0
  389. package/dist/setup/detect.js +5 -7
  390. package/dist/setup/detected-engines.js +136 -0
  391. package/dist/setup/engine-config.js +100 -0
  392. package/dist/setup/registry-stash-loader.js +3 -3
  393. package/dist/setup/semantic-assets.js +12 -9
  394. package/dist/setup/setup.js +444 -208
  395. package/dist/setup/steps/connection-shared.js +120 -0
  396. package/dist/setup/steps/connection.js +108 -305
  397. package/dist/setup/steps/platforms.js +13 -12
  398. package/dist/setup/steps/semantic.js +15 -3
  399. package/dist/setup/steps/sources.js +21 -15
  400. package/dist/setup/steps/stashdir.js +6 -4
  401. package/dist/setup/steps/tasks.js +236 -119
  402. package/dist/setup/steps.js +3 -2
  403. package/dist/sources/freshness.js +39 -0
  404. package/dist/sources/provider-factory.js +11 -17
  405. package/dist/sources/providers/filesystem.js +2 -3
  406. package/dist/sources/providers/git-install.js +278 -34
  407. package/dist/sources/providers/git-provider.js +54 -56
  408. package/dist/sources/providers/git-stash.js +420 -91
  409. package/dist/sources/providers/git.js +2 -2
  410. package/dist/sources/providers/npm.js +16 -19
  411. package/dist/sources/providers/provider-utils.js +47 -22
  412. package/dist/sources/providers/sync-from-ref.js +3 -9
  413. package/dist/sources/providers/website.js +2 -2
  414. package/dist/sources/resolve.js +11 -10
  415. package/dist/sources/snapshot-fetchers/types.js +4 -0
  416. package/dist/sources/{website-ingest.js → snapshot-fetchers/website-ingest.js} +110 -41
  417. package/dist/storage/database.js +60 -4
  418. package/dist/storage/engines/sqlite-migrations.js +156 -5
  419. package/dist/storage/locations.js +1 -2
  420. package/dist/storage/repositories/canaries-repository.js +1 -1
  421. package/dist/storage/repositories/events-repository.js +51 -11
  422. package/dist/storage/repositories/improve-runs-repository.js +6 -32
  423. package/dist/storage/repositories/index-connection.js +79 -0
  424. package/dist/storage/repositories/index-db.js +4 -3
  425. package/dist/storage/repositories/index-entries-repository.js +863 -0
  426. package/dist/{indexer/db/entry-mapper.js → storage/repositories/index-entry-mapper.js} +19 -2
  427. package/dist/storage/repositories/index-entry-types.js +4 -0
  428. package/dist/storage/repositories/index-fts-repository.js +167 -0
  429. package/dist/storage/repositories/index-llm-cache-repository.js +108 -0
  430. package/dist/storage/repositories/index-meta-repository.js +49 -0
  431. package/dist/{indexer/db/schema.js → storage/repositories/index-schema.js} +226 -100
  432. package/dist/storage/repositories/index-sql.js +12 -0
  433. package/dist/storage/repositories/index-utility-repository.js +356 -0
  434. package/dist/storage/repositories/index-vec-repository.js +250 -0
  435. package/dist/storage/repositories/outcome-repository.js +119 -0
  436. package/dist/storage/repositories/proposals-repository.js +317 -75
  437. package/dist/storage/repositories/registry-cache.js +1 -1
  438. package/dist/storage/repositories/salience-repository.js +172 -0
  439. package/dist/storage/repositories/task-history-repository.js +110 -3
  440. package/dist/storage/repositories/workflow-runs-repository.js +68 -35
  441. package/dist/tasks/backends/cron.js +169 -46
  442. package/dist/tasks/backends/exec-utils.js +76 -3
  443. package/dist/tasks/backends/index.js +6 -9
  444. package/dist/tasks/backends/launchd.js +292 -55
  445. package/dist/tasks/backends/schtasks.js +557 -70
  446. package/dist/tasks/backends/types.js +4 -0
  447. package/dist/tasks/command-executable.js +93 -0
  448. package/dist/tasks/embedded.js +56 -38
  449. package/dist/tasks/parser.js +156 -64
  450. package/dist/tasks/resolve-akm-bin.js +144 -51
  451. package/dist/tasks/runner.js +377 -209
  452. package/dist/tasks/schedule.js +108 -19
  453. package/dist/tasks/scheduler-invocation.js +296 -0
  454. package/dist/tasks/schema.js +1 -1
  455. package/dist/tasks/task-id.js +35 -0
  456. package/dist/tasks/validator.js +30 -16
  457. package/dist/workflows/authoring/authoring.js +96 -148
  458. package/dist/workflows/authoring/scope-key.js +1 -1
  459. package/dist/workflows/cli.js +0 -20
  460. package/dist/workflows/concurrency-policy.js +15 -0
  461. package/dist/workflows/exec/brief.js +25 -59
  462. package/dist/workflows/exec/frozen-judge.js +47 -0
  463. package/dist/workflows/exec/native-executor.js +157 -94
  464. package/dist/workflows/exec/report.js +365 -200
  465. package/dist/workflows/exec/run-workflow.js +46 -40
  466. package/dist/workflows/exec/scheduler.js +12 -41
  467. package/dist/workflows/exec/step-work.js +239 -205
  468. package/dist/workflows/exec/workflow-engine-gate.js +67 -0
  469. package/dist/workflows/ir/compile.js +141 -283
  470. package/dist/workflows/ir/freeze.js +233 -0
  471. package/dist/workflows/ir/plan-hash.js +40 -5
  472. package/dist/workflows/ir/schema.js +537 -1
  473. package/dist/workflows/parser.js +878 -306
  474. package/dist/workflows/program/expressions.js +20 -208
  475. package/dist/workflows/program/schema.js +7 -10
  476. package/dist/workflows/renderer.js +99 -121
  477. package/dist/workflows/resource-limits.js +22 -0
  478. package/dist/workflows/runtime/checkin.js +1 -1
  479. package/dist/workflows/runtime/plan-classifier.js +131 -0
  480. package/dist/workflows/runtime/runs.js +200 -113
  481. package/dist/workflows/runtime/unit-checkin.js +1 -1
  482. package/dist/workflows/runtime/unit-phases.js +20 -0
  483. package/dist/workflows/runtime/workflow-asset-loader.js +235 -97
  484. package/dist/workflows/schema.js +1 -11
  485. package/dist/workflows/validate-summary.js +4 -26
  486. package/dist/workflows/validator.js +52 -30
  487. package/docs/README.md +42 -78
  488. package/docs/migration/README.md +8 -0
  489. package/docs/migration/release-notes/0.6.0.md +1 -1
  490. package/docs/migration/release-notes/0.7.0.md +9 -8
  491. package/docs/migration/release-notes/0.9.0.md +158 -14
  492. package/docs/migration/v0.7-to-v0.8.md +46 -47
  493. package/docs/migration/v0.8-to-v0.9.md +844 -0
  494. package/docs/reference/README.md +12 -0
  495. package/docs/reference/data-and-telemetry.md +333 -0
  496. package/package.json +21 -17
  497. package/schemas/akm-asset-envelope.json +93 -0
  498. package/schemas/akm-config.json +4636 -0
  499. package/schemas/akm-task.json +87 -0
  500. package/{dist/schemas → schemas}/akm-workflow.json +127 -82
  501. package/dist/akm-migrate-storage +0 -38
  502. package/dist/assets/help/help-accept.md +0 -12
  503. package/dist/assets/help/help-improve.md +0 -84
  504. package/dist/assets/help/help-proposals.md +0 -17
  505. package/dist/assets/help/help-propose.md +0 -17
  506. package/dist/assets/help/help-reject.md +0 -11
  507. package/dist/assets/profiles/frequent.json +0 -13
  508. package/dist/assets/profiles/recombine-only.json +0 -21
  509. package/dist/assets/profiles/reflect-distill.json +0 -30
  510. package/dist/assets/profiles/synthesize.json +0 -15
  511. package/dist/assets/prompts/procedural-system.md +0 -44
  512. package/dist/assets/prompts/recombine-system.md +0 -40
  513. package/dist/assets/prompts/staleness-detect-system.md +0 -6
  514. package/dist/assets/tasks/core/backup.yml +0 -4
  515. package/dist/assets/tasks/graph-refresh-weekly.yml +0 -10
  516. package/dist/assets/templates/html/default.html +0 -78
  517. package/dist/assets/templates/html/vendor/echarts.min.js +0 -45
  518. package/dist/assets/wiki/index-template.md +0 -12
  519. package/dist/assets/wiki/ingest-workflow-template.md +0 -83
  520. package/dist/assets/wiki/log-template.md +0 -8
  521. package/dist/assets/wiki/schema-template.md +0 -61
  522. package/dist/cli/config-migrate.js +0 -150
  523. package/dist/cli/config-validate.js +0 -39
  524. package/dist/commands/graph/graph-cli.js +0 -124
  525. package/dist/commands/graph/graph.js +0 -487
  526. package/dist/commands/improve/calibration.js +0 -161
  527. package/dist/commands/improve/dedup.js +0 -482
  528. package/dist/commands/improve/extract-watch.js +0 -140
  529. package/dist/commands/improve/hot-probation.js +0 -45
  530. package/dist/commands/improve/improve-auto-accept.js +0 -276
  531. package/dist/commands/improve/improve-profiles.js +0 -168
  532. package/dist/commands/improve/procedural.js +0 -398
  533. package/dist/commands/improve/recombine.js +0 -818
  534. package/dist/commands/improve/schema-similarity-gate.js +0 -168
  535. package/dist/commands/lint/agent-linter.js +0 -44
  536. package/dist/commands/lint/command-linter.js +0 -44
  537. package/dist/commands/lint/default-linter.js +0 -16
  538. package/dist/commands/lint/fact-linter.js +0 -39
  539. package/dist/commands/lint/knowledge-linter.js +0 -16
  540. package/dist/commands/lint/memory-linter.js +0 -61
  541. package/dist/commands/lint/registry.js +0 -41
  542. package/dist/commands/lint/skill-linter.js +0 -45
  543. package/dist/commands/lint/task-linter.js +0 -50
  544. package/dist/commands/lint/workflow-linter.js +0 -81
  545. package/dist/commands/proposal/legacy-import.js +0 -115
  546. package/dist/commands/sources/history.js +0 -196
  547. package/dist/commands/tasks/default-tasks.js +0 -186
  548. package/dist/commands/wiki-cli.js +0 -292
  549. package/dist/core/asset/asset-registry.js +0 -76
  550. package/dist/core/asset/asset-spec.js +0 -316
  551. package/dist/core/config/config-migration.js +0 -602
  552. package/dist/core/deep-merge.js +0 -38
  553. package/dist/core/eval/rank-metrics.js +0 -113
  554. package/dist/core/ripgrep/install.js +0 -163
  555. package/dist/core/ripgrep/resolve.js +0 -81
  556. package/dist/indexer/db/db.js +0 -1414
  557. package/dist/indexer/manifest.js +0 -170
  558. package/dist/indexer/passes/metadata-contributors.js +0 -31
  559. package/dist/indexer/usage/unmigrated-vaults-guard.js +0 -94
  560. package/dist/integrations/harnesses/opencode-sdk/index.js +0 -25
  561. package/dist/llm/call-ai.js +0 -62
  562. package/dist/llm/memory-infer-impl.js +0 -138
  563. package/dist/output/shapes/distill.js +0 -14
  564. package/dist/output/shapes/history.js +0 -11
  565. package/dist/output/text/distill.js +0 -6
  566. package/dist/output/text/enable-disable.js +0 -8
  567. package/dist/output/text/history.js +0 -6
  568. package/dist/output/text/wiki.js +0 -16
  569. package/dist/registry/build-index.js +0 -386
  570. package/dist/schemas/akm-config.json +0 -14225
  571. package/dist/scripts/migrate-storage.js +0 -13169
  572. package/dist/scripts/migrations/import-fs-improve-runs-to-db.js +0 -10169
  573. package/dist/scripts/migrations/v16-to-v17.js +0 -141
  574. package/dist/setup/legacy-config.js +0 -106
  575. package/dist/storage/repositories/consolidation-repository.js +0 -38
  576. package/dist/storage/repositories/recombine-repository.js +0 -213
  577. package/dist/wiki/wiki-templates.js +0 -15
  578. package/dist/wiki/wiki.js +0 -1012
  579. package/dist/workflows/authoring/workflow-program-template.yaml +0 -31
  580. package/dist/workflows/db.js +0 -350
  581. package/dist/workflows/exec/watch.js +0 -116
  582. package/dist/workflows/program/parser.js +0 -760
  583. package/dist/workflows/program/project.js +0 -105
  584. package/docs/data-and-telemetry.md +0 -227
  585. package/docs/migration/release-notes/0.9.0-beta.60.md +0 -19
  586. /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/registry.js +0 -0
  587. /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/youtube.js +0 -0
@@ -0,0 +1,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 };