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,180 @@
1
+ // This Source Code Form is subject to the terms of the Mozilla Public
2
+ // License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
+ /**
5
+ * The `akm-workflow` adapter — akm 0.9.0 format-family work item (#46).
6
+ *
7
+ * A native akm workflow bundle (spec §6/§7). One format now (workflow-format-
8
+ * unification): `.md` files, orchestration graph in frontmatter, per-step
9
+ * prose in the body. Recognition is frontmatter `type: workflow`, or — since
10
+ * this adapter's whole domain IS workflows — simply residing under this
11
+ * bundle's root; no content sniffing. conceptId strips the `.md` extension. A
12
+ * plain `.md` that opts out via an explicit non-workflow `type:` frontmatter
13
+ * key is abstained on.
14
+ *
15
+ * ── validate (spec §6 workflow row) ──
16
+ *
17
+ * Reuses the akm adapter's per-type workflow checks (shared base checks +
18
+ * `placeholder-stub` + `invalid-workflow-structure`). Delegates to the SAME
19
+ * `perTypeValidateChecks` / `runBaseValidateChecks` the `akm` adapter uses, so
20
+ * workflow validation has one home.
21
+ *
22
+ * Conformance oracle (authored, DO NOT modify): fixture
23
+ * `tests/fixtures/bundles/akm-workflow/` + goldens
24
+ * `tests/fixtures/format-family-goldens/akm-workflow/{recognition,placement,lint,renderer}.json`.
25
+ */
26
+ import fs from "node:fs";
27
+ import path from "node:path";
28
+ import { parseFrontmatter } from "../../asset/frontmatter.js";
29
+ import { perTypeValidateChecks } from "./akm-lint.js";
30
+ import { hashContent, nonEmptyString, readTags, runBaseValidateChecks } from "./shared.js";
31
+ /** A native workflow bundle is single-component; its one component is `main`. */
32
+ const COMPONENT_ID = "main";
33
+ /** One recognized workflow extension now (workflow-format-unification): `.md`. */
34
+ const WORKFLOW_EXTS = new Set([".md"]);
35
+ /** Upper bound on the bounded `content` FTS field (mirrors okf-adapter). */
36
+ const MAX_CONTENT_CHARS = 100_000;
37
+ function toPosix(p) {
38
+ return p.replace(/\\/g, "/");
39
+ }
40
+ /** Strip the recognized workflow extension from a component-root-relative path → conceptId. */
41
+ function conceptIdOf(relPath) {
42
+ return toPosix(relPath).replace(/\.md$/i, "");
43
+ }
44
+ /** `README.md` (case-insensitive) is documentation, never the typed asset — mirrors the akm matcher stack's D-R6 reserved-file exclusion (`TYPED_DIR_DOC_FILES`). */
45
+ function isReservedDocFile(fileName) {
46
+ return fileName.toLowerCase() === "readme.md";
47
+ }
48
+ /**
49
+ * Recognition gate: any `.md` file in this bundle IS a workflow (this
50
+ * adapter's entire domain is workflows — spec §2.5, "residence under
51
+ * workflows/"), UNLESS its frontmatter declares a DIFFERENT non-empty
52
+ * `type:` (an explicit opt-out, e.g. a README-shaped doc that wants to be
53
+ * something else). No content sniffing.
54
+ */
55
+ function isWorkflowFile(raw) {
56
+ const data = parseFrontmatter(raw).data;
57
+ const type = data.type;
58
+ return type === undefined || type === "workflow";
59
+ }
60
+ function recognize(c, file) {
61
+ if (!WORKFLOW_EXTS.has(file.ext))
62
+ return null;
63
+ if (isReservedDocFile(file.fileName))
64
+ return null;
65
+ const raw = file.content();
66
+ if (!isWorkflowFile(raw))
67
+ return null;
68
+ const conceptId = conceptIdOf(file.relPath);
69
+ const name = conceptId.split("/").pop() ?? conceptId;
70
+ const parsed = parseFrontmatter(raw);
71
+ const description = nonEmptyString(parsed.data.description);
72
+ const body = parsed.content;
73
+ const tags = readTags(parsed.data.tags);
74
+ const doc = {
75
+ ref: `${c.id}//${conceptId}`,
76
+ bundle: c.id,
77
+ component: COMPONENT_ID,
78
+ conceptId,
79
+ path: file.absPath,
80
+ hash: hashContent(raw),
81
+ adapterId: "akm-workflow",
82
+ type: "workflow",
83
+ name,
84
+ content: body.length > MAX_CONTENT_CHARS ? body.slice(0, MAX_CONTENT_CHARS) : body,
85
+ };
86
+ if (description !== undefined)
87
+ doc.description = description;
88
+ if (tags !== undefined)
89
+ doc.tags = tags;
90
+ return doc;
91
+ }
92
+ async function validate(c, changes, ctx) {
93
+ const diagnostics = [];
94
+ for (const change of changes) {
95
+ if (change.op === "delete")
96
+ continue;
97
+ const raw = change.after ?? (await ctx.readFile(change.path));
98
+ if (typeof raw !== "string")
99
+ continue;
100
+ const ext = path.extname(change.path).toLowerCase();
101
+ if (!WORKFLOW_EXTS.has(ext) || isReservedDocFile(path.basename(change.path)) || !isWorkflowFile(raw))
102
+ continue;
103
+ const relPath = toPosix(change.path);
104
+ const p = parseFrontmatter(raw);
105
+ const parsed = { data: p.data, content: p.content, frontmatter: p.frontmatter };
106
+ diagnostics.push(...(await runBaseValidateChecks(relPath, parsed, c.root, ctx)));
107
+ diagnostics.push(...(await perTypeValidateChecks({
108
+ type: "workflow",
109
+ relPath,
110
+ raw,
111
+ data: parsed.data,
112
+ frontmatter: parsed.frontmatter,
113
+ body: parsed.content,
114
+ ext,
115
+ ctx,
116
+ })));
117
+ }
118
+ return diagnostics;
119
+ }
120
+ /**
121
+ * True when a top-level file in `root` is workflow-shaped (used by
122
+ * looksLikeRoot). Unlike `isWorkflowFile` (which admits an absent `type:` —
123
+ * the lenient default ONCE a source is already known to be this bundle),
124
+ * this requires an EXPLICIT `type: workflow` — the install-time probe is
125
+ * choosing WHICH adapter owns an unconfigured root among several candidates
126
+ * (spec §1.2), and an incidental `.md` with no frontmatter type at all
127
+ * (common in an OKF or llm-wiki bundle) must not misclassify that root as
128
+ * akm-workflow's.
129
+ */
130
+ function hasTopLevelWorkflowFile(root, entries) {
131
+ for (const entry of entries) {
132
+ if (!entry.isFile())
133
+ continue;
134
+ const ext = path.extname(entry.name).toLowerCase();
135
+ if (!WORKFLOW_EXTS.has(ext) || isReservedDocFile(entry.name))
136
+ continue;
137
+ let raw;
138
+ try {
139
+ raw = fs.readFileSync(path.join(root, entry.name), "utf8");
140
+ }
141
+ catch {
142
+ continue;
143
+ }
144
+ if (parseFrontmatter(raw).data.type === "workflow")
145
+ return true;
146
+ }
147
+ return false;
148
+ }
149
+ export const akmWorkflowAdapter = {
150
+ id: "akm-workflow",
151
+ version: "0.9.0",
152
+ extensions: [".md"],
153
+ recognize,
154
+ validate,
155
+ /** Markdown placement; an explicit `.md` conceptId short-circuits to that extension. */
156
+ placeNew(c, conceptId) {
157
+ const posix = toPosix(conceptId);
158
+ if (/\.md$/i.test(posix))
159
+ return path.join(c.root, posix);
160
+ return path.join(c.root, `${posix}.md`);
161
+ },
162
+ /** Workflows live anywhere under the component root. */
163
+ directoryList() {
164
+ return ["."];
165
+ },
166
+ /**
167
+ * Install-time probe (§1.2): a root holding a workflow-shaped `.md` file at
168
+ * top level (frontmatter `type: workflow` or no `type:` at all).
169
+ */
170
+ looksLikeRoot(root) {
171
+ let entries;
172
+ try {
173
+ entries = fs.readdirSync(root, { withFileTypes: true });
174
+ }
175
+ catch {
176
+ return false;
177
+ }
178
+ return hasTopLevelWorkflowFile(root, entries);
179
+ },
180
+ };
@@ -0,0 +1,61 @@
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 `claude` tool-directory adapter — akm 0.9.0 format-family work item (#46).
6
+ *
7
+ * Recognizes a Claude Code `.claude` layout (spec §6/§7, real-world:
8
+ * https://code.claude.com/docs/en/claude-directory): a root `CLAUDE.md` →
9
+ * `instruction`, `commands/*.md` → `command`, `agents/*.md` → `agent`,
10
+ * `skills/<name>/SKILL.md` → `skill` (item = the dir; bundled resources abstain),
11
+ * and ABSTAINS on runtime config (`settings.json`, `.mcp.json`). The component
12
+ * id is the PROVENANCE `.claude`; the ref prefix is the bundle id (`c.id`).
13
+ *
14
+ * All behavior lives in the shared tool-dir codec ({@link makeToolDirAdapter});
15
+ * this module supplies only the `.claude` layout + the install-time probe.
16
+ *
17
+ * Conformance oracle (authored, DO NOT modify): fixture
18
+ * `tests/fixtures/bundles/claude/` + goldens
19
+ * `tests/fixtures/format-family-goldens/claude/{recognition,placement,lint,renderer}.json`.
20
+ */
21
+ import fs from "node:fs";
22
+ import path from "node:path";
23
+ import { makeToolDirAdapter } from "./tool-dir-shared.js";
24
+ const LAYOUT = {
25
+ adapterId: "claude",
26
+ componentId: ".claude",
27
+ instructionFile: "CLAUDE.md",
28
+ instructionConceptId: "CLAUDE",
29
+ commandDirs: new Set(["commands"]),
30
+ agentDirs: new Set(["agents"]),
31
+ skillDirs: new Set(["skills"]),
32
+ };
33
+ /** True when `root` carries a directory. */
34
+ function dirExists(p) {
35
+ try {
36
+ return fs.statSync(p).isDirectory();
37
+ }
38
+ catch {
39
+ return false;
40
+ }
41
+ }
42
+ /**
43
+ * Install-time probe (§1.2): a root is a `.claude` tool dir when it carries a
44
+ * root `CLAUDE.md` AND at least one of the `commands/`/`agents/`/`skills/` tool
45
+ * dirs. The tool-dir requirement keeps a bare project `CLAUDE.md` (no `.claude`
46
+ * structure) from being mistaken for a claude bundle, and — because it demands
47
+ * `CLAUDE.md`, which an akm workspace / okf / wiki root never carries — the
48
+ * probe is registered AHEAD of `akm` so a `.claude` root (whose `commands/`
49
+ * etc. also look like akm stash subdirs) is claimed by `claude`, not shadowed.
50
+ */
51
+ function claudeLooksLikeRoot(root) {
52
+ try {
53
+ if (!fs.existsSync(path.join(root, "CLAUDE.md")))
54
+ return false;
55
+ }
56
+ catch {
57
+ return false;
58
+ }
59
+ return ["commands", "agents", "skills"].some((d) => dirExists(path.join(root, d)));
60
+ }
61
+ export const claudeAdapter = makeToolDirAdapter(LAYOUT, claudeLooksLikeRoot);
@@ -0,0 +1,187 @@
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 `dotenv` adapter — akm 0.9.0 format-family work item (#46).
6
+ *
7
+ * A metadata-only env/secret bundle (spec §6/§7, normative §21.2). REDACTION IS
8
+ * A HARD CONTRACT keyed on the ADAPTER, never on the open `type` value (a
9
+ * frontmatter `type:` cannot opt out):
10
+ * - `env/*.env` → `type: env` — only the KEY NAMES are surfaced (on `hints`);
11
+ * VALUES, COMMENTS, and raw CONTENT are NEVER read into the index.
12
+ * - any file under `secrets/` → `type: secret` — only the FILE NAME is
13
+ * surfaced; the whole file is the value and is never read. A `.env` UNDER
14
+ * `secrets/` is a SECRET (the dir gate wins) — name-only, MORE redacted than
15
+ * an `env/` file even though it has KEY=VALUE lines.
16
+ * conceptId: env strips `.env`; secret keeps its natural path (including any
17
+ * extension). Neither branch ever writes a value onto the emitted document.
18
+ *
19
+ * ── validate (spec §6 env/secret validation column) ──
20
+ *
21
+ * The dangerous-key scan (`dangerous-env-key`), reusing the akm adapter's
22
+ * `dangerousEnvKeyDiagnostics` — which preserves the code-grounded narrowness:
23
+ * it runs ONLY on `*.env`-suffixed files, so `secrets/<bare-name>` is never
24
+ * scanned (its whole content is an opaque secret value). Reads KEY NAMES only.
25
+ *
26
+ * Conformance oracle (authored, DO NOT modify): fixture
27
+ * `tests/fixtures/bundles/dotenv/` + goldens
28
+ * `tests/fixtures/format-family-goldens/dotenv/{recognition,placement,lint,renderer}.json`.
29
+ */
30
+ import fs from "node:fs";
31
+ import path from "node:path";
32
+ import { assetPathForName, typeForStashDir } from "../../asset/asset-placement.js";
33
+ import { dangerousEnvKeyDiagnostics } from "./akm-lint.js";
34
+ import { hashContent } from "./shared.js";
35
+ /** A dotenv bundle is single-component; its one component is `main`. */
36
+ const COMPONENT_ID = "main";
37
+ /** The `env/` content subdir (KEY=VALUE files). */
38
+ const ENV_DIR = "env";
39
+ /** The `secrets/` content subdir (whole-file secrets). */
40
+ const SECRETS_DIR = "secrets";
41
+ /** Non-secret marker suffixes under `secrets/` (spec §6 secret row). */
42
+ const SECRET_SKIP_SUFFIXES = [".lock", ".sensitive"];
43
+ /** Matches a KEY=value assignment line, capturing only the key (mirrors akm-lint scanKeys). */
44
+ const ASSIGN_RE = /^\s*(?:export\s+)?([A-Za-z_][A-Za-z0-9_]*)\s*=/;
45
+ function toPosix(p) {
46
+ return p.replace(/\\/g, "/");
47
+ }
48
+ /** Classify a component-root-relative file as env / secret, or null (abstain). */
49
+ function classify(relPath) {
50
+ const posix = toPosix(relPath);
51
+ const segs = posix.split("/").filter((s) => s.length > 0);
52
+ if (segs.length < 2)
53
+ return null;
54
+ const head = segs[0];
55
+ const base = segs[segs.length - 1];
56
+ if (head === ENV_DIR) {
57
+ return base === ".env" || base.endsWith(".env") ? "env" : null;
58
+ }
59
+ if (head === SECRETS_DIR) {
60
+ return SECRET_SKIP_SUFFIXES.some((s) => base.endsWith(s)) ? null : "secret";
61
+ }
62
+ return null;
63
+ }
64
+ /** Extract KEY NAMES (never values) from an env file's raw content, first-appearance order, deduped. */
65
+ function scanKeyNames(raw) {
66
+ const keys = [];
67
+ const seen = new Set();
68
+ for (const line of raw.split(/\r?\n/)) {
69
+ const m = line.match(ASSIGN_RE);
70
+ if (!m)
71
+ continue;
72
+ const key = m[1];
73
+ if (seen.has(key))
74
+ continue;
75
+ seen.add(key);
76
+ keys.push(key);
77
+ }
78
+ return keys;
79
+ }
80
+ function recognize(c, file) {
81
+ const type = classify(file.relPath);
82
+ if (type === null)
83
+ return null;
84
+ const posix = toPosix(file.relPath);
85
+ const raw = file.content();
86
+ if (type === "env") {
87
+ // env: strip `.env`; surface KEY NAMES only (never values/comments/content).
88
+ const conceptId = posix.replace(/\.env$/i, "");
89
+ const name = (conceptId.split("/").pop() ?? conceptId) || "default";
90
+ const keys = scanKeyNames(raw);
91
+ const doc = {
92
+ ref: `${c.id}//${conceptId}`,
93
+ bundle: c.id,
94
+ component: COMPONENT_ID,
95
+ conceptId,
96
+ path: file.absPath,
97
+ hash: hashContent(raw),
98
+ adapterId: "dotenv",
99
+ type: "env",
100
+ name,
101
+ };
102
+ if (keys.length > 0)
103
+ doc.hints = keys;
104
+ return doc;
105
+ }
106
+ // secret: keep the natural path; surface the FILE NAME only — never keys/content.
107
+ const name = posix.split("/").pop() ?? posix;
108
+ return {
109
+ ref: `${c.id}//${posix}`,
110
+ bundle: c.id,
111
+ component: COMPONENT_ID,
112
+ conceptId: posix,
113
+ path: file.absPath,
114
+ hash: hashContent(raw),
115
+ adapterId: "dotenv",
116
+ type: "secret",
117
+ name,
118
+ };
119
+ }
120
+ async function validate(_c, changes, ctx) {
121
+ const diagnostics = [];
122
+ for (const change of changes) {
123
+ if (change.op === "delete")
124
+ continue;
125
+ const raw = change.after ?? (await ctx.readFile(change.path));
126
+ if (typeof raw !== "string")
127
+ continue;
128
+ const type = classify(change.path);
129
+ if (type === null)
130
+ continue;
131
+ // dangerousEnvKeyDiagnostics is `.env`-suffix-narrow: a bare secret file is never scanned.
132
+ diagnostics.push(...dangerousEnvKeyDiagnostics(type, toPosix(change.path), raw));
133
+ }
134
+ return diagnostics;
135
+ }
136
+ export const dotenvAdapter = {
137
+ id: "dotenv",
138
+ version: "0.9.0",
139
+ extensions: [".env"],
140
+ recognize,
141
+ validate,
142
+ /**
143
+ * env places to `env/<name>.env`, secret to `secrets/<name>` (identity join,
144
+ * no extension logic) — reusing the shared `assetPathForName` so the env
145
+ * default-alias / already-suffixed / nested-secret edge cases match the akm
146
+ * placement convention exactly.
147
+ */
148
+ placeNew(c, conceptId) {
149
+ const posix = toPosix(conceptId);
150
+ const slash = posix.indexOf("/");
151
+ if (slash > 0) {
152
+ const head = posix.slice(0, slash);
153
+ const rest = posix.slice(slash + 1);
154
+ const type = typeForStashDir(head);
155
+ if ((type === "env" || type === "secret") && rest.length > 0) {
156
+ return assetPathForName(type, path.join(c.root, head), rest);
157
+ }
158
+ }
159
+ return path.join(c.root, posix);
160
+ },
161
+ /** The dotenv bundle owns its `env/` + `secrets/` dirs. */
162
+ directoryList() {
163
+ return [ENV_DIR, SECRETS_DIR];
164
+ },
165
+ /**
166
+ * Install-time probe (§1.2): a root whose ONLY content dirs are `env/` and/or
167
+ * `secrets/` (at least one present). The env/secrets-ONLY requirement keeps a
168
+ * full akm workspace — which also carries `env/` + `secrets/` alongside many
169
+ * other stash subdirs — from being mistaken for a dotenv bundle, so the probe
170
+ * is registered ahead of `akm` without shadowing it.
171
+ */
172
+ looksLikeRoot(root) {
173
+ let entries;
174
+ try {
175
+ entries = fs.readdirSync(root, { withFileTypes: true });
176
+ }
177
+ catch {
178
+ return false;
179
+ }
180
+ const dirs = entries.filter((e) => e.isDirectory()).map((e) => e.name);
181
+ if (dirs.length === 0)
182
+ return false;
183
+ if (!dirs.every((d) => d === ENV_DIR || d === SECRETS_DIR))
184
+ return false;
185
+ return dirs.includes(ENV_DIR) || dirs.includes(SECRETS_DIR);
186
+ },
187
+ };
@@ -0,0 +1,119 @@
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 `generic-files` adapter — akm 0.9.0 format-family work item (#46).
6
+ *
7
+ * The AKM-native FALLBACK family (spec §7). Any leftover file is classified by
8
+ * extension (open-question-5, RESOLVED — maintainer 2026-07):
9
+ * - a SCRIPT_EXTENSIONS extension → `script` (conceptId KEEPS the extension);
10
+ * - markdown / plain-text → `document` (conceptId STRIPS the extension);
11
+ * - everything else → `file` (conceptId keeps the extension).
12
+ * Placement is IDENTITY: `document` appends `.md`, `script`/`file` keep their
13
+ * natural path. D-R6 reserved files (`index.md`/`log.md`) are excluded from the
14
+ * catch-all so a structural listing is never indexed as a `document`.
15
+ *
16
+ * EXPLICIT-CONFIG ONLY: `generic-files` is never in the §1.2 auto-probe order —
17
+ * a user opts in deliberately — so `looksLikeRoot` NEVER fires. It has no
18
+ * type-specific validators (`validate` runs base checks only).
19
+ *
20
+ * Conformance oracle (authored, DO NOT modify): fixture
21
+ * `tests/fixtures/bundles/generic-files/` + goldens
22
+ * `tests/fixtures/format-family-goldens/generic-files/{recognition,placement,lint,renderer}.json`.
23
+ */
24
+ import path from "node:path";
25
+ import { parseFrontmatter } from "../../asset/frontmatter.js";
26
+ import { SCRIPT_EXTENSIONS } from "../../recognition-util.js";
27
+ import { hashContent, nonEmptyString, readTags, runBaseValidateChecks } from "./shared.js";
28
+ /** A generic-files bundle is single-component; its one component is `main`. */
29
+ const COMPONENT_ID = "main";
30
+ /** Markdown / plain-text extensions classified as `document`. */
31
+ const DOCUMENT_EXTENSIONS = new Set([".md", ".markdown", ".txt", ".text"]);
32
+ /** OKF reserved structural files (D-R6) — excluded from the catch-all, case-insensitive. */
33
+ const RESERVED_FILES = new Set(["index.md", "log.md"]);
34
+ /** Upper bound on the bounded `content` FTS field (mirrors okf-adapter). */
35
+ const MAX_CONTENT_CHARS = 100_000;
36
+ function toPosix(p) {
37
+ return p.replace(/\\/g, "/");
38
+ }
39
+ function isReserved(base) {
40
+ return RESERVED_FILES.has(base.toLowerCase());
41
+ }
42
+ /** Classify by extension (open-question-5 predicate). */
43
+ function classify(ext) {
44
+ if (SCRIPT_EXTENSIONS.has(ext))
45
+ return "script";
46
+ if (DOCUMENT_EXTENSIONS.has(ext))
47
+ return "document";
48
+ return "file";
49
+ }
50
+ function recognize(c, file) {
51
+ const posix = toPosix(file.relPath);
52
+ const base = posix.split("/").pop() ?? posix;
53
+ if (isReserved(base))
54
+ return null; // D-R6: never index a structural listing
55
+ const type = classify(file.ext);
56
+ // document strips its extension; script/file keep the natural path.
57
+ const conceptId = type === "document" ? posix.replace(/\.[^./]+$/, "") : posix;
58
+ const name = conceptId.split("/").pop() ?? conceptId;
59
+ const raw = file.content();
60
+ const parsed = parseFrontmatter(raw);
61
+ const body = parsed.content;
62
+ const doc = {
63
+ ref: `${c.id}//${conceptId}`,
64
+ bundle: c.id,
65
+ component: COMPONENT_ID,
66
+ conceptId,
67
+ path: file.absPath,
68
+ hash: hashContent(raw),
69
+ adapterId: "generic-files",
70
+ type,
71
+ name,
72
+ content: body.length > MAX_CONTENT_CHARS ? body.slice(0, MAX_CONTENT_CHARS) : body,
73
+ };
74
+ if (type !== "script")
75
+ doc.ownsPresentation = true;
76
+ const description = nonEmptyString(parsed.data.description);
77
+ if (description !== undefined)
78
+ doc.description = description;
79
+ const tags = readTags(parsed.data.tags);
80
+ if (tags !== undefined)
81
+ doc.tags = tags;
82
+ return doc;
83
+ }
84
+ async function validate(c, changes, ctx) {
85
+ const diagnostics = [];
86
+ for (const change of changes) {
87
+ if (change.op === "delete")
88
+ continue;
89
+ const raw = change.after ?? (await ctx.readFile(change.path));
90
+ if (typeof raw !== "string")
91
+ continue;
92
+ // No type-specific validators — base checks only (spec §6 script/document/file rows).
93
+ diagnostics.push(...(await runBaseValidateChecks(toPosix(change.path), parseFrontmatter(raw), c.root, ctx)));
94
+ }
95
+ return diagnostics;
96
+ }
97
+ export const genericFilesAdapter = {
98
+ id: "generic-files",
99
+ version: "0.9.0",
100
+ // Non-exhaustive HINT: generic-files recognizes ANY file — recognize() is the
101
+ // source of truth (empty extension list would drop the extension-strip hint).
102
+ extensions: [".md", ".txt"],
103
+ recognize,
104
+ validate,
105
+ /**
106
+ * IDENTITY placement (open-question-5): a conceptId that carries an extension
107
+ * (`script`/`file`) places to itself; an extension-less conceptId (a
108
+ * `document`) appends `.md`.
109
+ */
110
+ placeNew(c, conceptId) {
111
+ const posix = toPosix(conceptId);
112
+ const hasExt = path.extname(posix) !== "";
113
+ return path.join(c.root, hasExt ? posix : `${posix}.md`);
114
+ },
115
+ /** generic-files is EXPLICIT-CONFIG ONLY — never auto-selected (§1.2), so this never fires. */
116
+ looksLikeRoot() {
117
+ return false;
118
+ },
119
+ };
@@ -0,0 +1,80 @@
1
+ // This Source Code Form is subject to the terms of the Mozilla Public
2
+ // License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
+ import { agentSkillsAdapter } from "./agent-skills-adapter.js";
5
+ import { akmAdapter } from "./akm-adapter.js";
6
+ import { akmTaskAdapter } from "./akm-task-adapter.js";
7
+ import { akmWorkflowAdapter } from "./akm-workflow-adapter.js";
8
+ import { claudeAdapter } from "./claude-adapter.js";
9
+ import { dotenvAdapter } from "./dotenv-adapter.js";
10
+ import { genericFilesAdapter } from "./generic-files-adapter.js";
11
+ import { llmWikiAdapter } from "./llm-wiki-adapter.js";
12
+ import { okfAdapter } from "./okf-adapter.js";
13
+ import { opencodeAdapter } from "./opencode-adapter.js";
14
+ import { websiteSnapshotAdapter } from "./website-snapshot-adapter.js";
15
+ export { agentSkillsAdapter } from "./agent-skills-adapter.js";
16
+ export { akmAdapter } from "./akm-adapter.js";
17
+ export { akmTaskAdapter } from "./akm-task-adapter.js";
18
+ export { akmWorkflowAdapter } from "./akm-workflow-adapter.js";
19
+ export { claudeAdapter } from "./claude-adapter.js";
20
+ export { dotenvAdapter } from "./dotenv-adapter.js";
21
+ export { genericFilesAdapter } from "./generic-files-adapter.js";
22
+ export { llmWikiAdapter } from "./llm-wiki-adapter.js";
23
+ export { okfAdapter } from "./okf-adapter.js";
24
+ export { opencodeAdapter } from "./opencode-adapter.js";
25
+ export { websiteSnapshotAdapter } from "./website-snapshot-adapter.js";
26
+ /**
27
+ * Every built-in adapter, frozen in the §1.2 install-time probe order: the first
28
+ * adapter whose `looksLikeRoot` fires claims a root, so MORE-SPECIFIC probes
29
+ * come FIRST. This ARRAY ORDER is the executable probe order (`getAdapters()`
30
+ * returns it verbatim) and is pinned by the conformance suite's ordered-owner
31
+ * matrix — it, not the spec §1.2(3) 5-adapter prose listing, is authoritative
32
+ * for the implemented 11-family set.
33
+ *
34
+ * Probe-precedence rationale (grounds "cannot shadow the existing three"):
35
+ *
36
+ * - The three loosest probes — `llm-wiki`, `akm`, and `okf` — stay LAST.
37
+ * Native AKM evidence wins before OKF because AKM Markdown is an OKF
38
+ * superset; the AKM probe is correspondingly strict enough not to claim an
39
+ * OKF bundle merely because it contains one familiar directory name.
40
+ * - `akm.looksLikeRoot` fires on ANY root carrying a stash-subdir-named
41
+ * directory — which includes a `.claude`/`.opencode` tool dir (`commands/`,
42
+ * `agents/`, `skills/`) and a dotenv bundle (`env/`, `secrets/`). So
43
+ * `claude` / `opencode` / `dotenv` come AHEAD of `akm`; their tighter
44
+ * markers (CLAUDE.md+tooldir / AGENTS.md|opencode.json / env-secrets-ONLY)
45
+ * claim those roots first, and `akm` still wins its own workspace root (which
46
+ * those tighter probes reject).
47
+ * - `website-snapshot` (manifest.json), `agent-skills` (a `<name>/SKILL.md`
48
+ * package), `akm-workflow` (a workflow-shaped top-level file), and `akm-task`
49
+ * (a schedule-bearing top-level `.yml`) carry disjoint, specific markers that
50
+ * fire on none of the other roots; they come at the front for clarity.
51
+ * - `generic-files` is EXPLICIT-CONFIG ONLY (§1.2) — its `looksLikeRoot` never
52
+ * fires — so it is LAST and can never shadow anything.
53
+ */
54
+ export const BUILTIN_ADAPTERS = Object.freeze([
55
+ // Specific, disjoint markers first.
56
+ websiteSnapshotAdapter,
57
+ agentSkillsAdapter,
58
+ // Tool dirs + dotenv BEFORE akm (they share stash-subdir-shaped structure).
59
+ claudeAdapter,
60
+ opencodeAdapter,
61
+ dotenvAdapter,
62
+ // Native akm sub-formats (disjoint content-shape probes).
63
+ akmWorkflowAdapter,
64
+ akmTaskAdapter,
65
+ // Loose probes: specific native layouts before the portable OKF baseline.
66
+ llmWikiAdapter,
67
+ akmAdapter,
68
+ okfAdapter,
69
+ // Explicit-config fallback (never auto-selected) — last.
70
+ genericFilesAdapter,
71
+ ]);
72
+ /**
73
+ * DEPRECATED no-op retained for test back-compat only. The built-in set is now
74
+ * the static, frozen {@link BUILTIN_ADAPTERS}, exposed by the registry at
75
+ * module load (normative §12.6), so there is nothing to register. New code MUST
76
+ * NOT call this — `getAdapters()` / `adapterForId()` are always populated.
77
+ */
78
+ export function registerBuiltinAdapters() {
79
+ // intentionally empty — BUILTIN_ADAPTERS is static; see the doc comment above.
80
+ }