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

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