akm-cli 0.9.0-rc.9 → 0.9.1-beta.1

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 (477) hide show
  1. package/CHANGELOG.md +1770 -44
  2. package/README.md +38 -47
  3. package/SECURITY.md +14 -1
  4. package/STABILITY.md +499 -0
  5. package/dist/akm +148 -35
  6. package/dist/{akm-migrate-storage → akm-migrate} +6 -9
  7. package/dist/assets/hints/cli-hints-full.md +223 -95
  8. package/dist/assets/hints/cli-hints-short.md +85 -22
  9. package/dist/assets/improve-strategies/default.json +1 -1
  10. package/dist/assets/improve-strategies/reflect-distill.json +1 -1
  11. package/dist/assets/prompts/memory-infer-user.md +2 -3
  12. package/dist/assets/stash-skeleton/README.md +6 -5
  13. package/dist/assets/stash-skeleton/facts/conventions/assets/agent.md +2 -0
  14. package/dist/assets/stash-skeleton/facts/conventions/assets/command.md +2 -0
  15. package/dist/assets/stash-skeleton/facts/conventions/assets/fact.md +2 -0
  16. package/dist/assets/stash-skeleton/facts/conventions/assets/knowledge.md +2 -0
  17. package/dist/assets/stash-skeleton/facts/conventions/assets/lesson.md +2 -0
  18. package/dist/assets/stash-skeleton/facts/conventions/assets/memory.md +2 -0
  19. package/dist/assets/stash-skeleton/facts/conventions/assets/script.md +2 -0
  20. package/dist/assets/stash-skeleton/facts/conventions/assets/skill.md +2 -0
  21. package/dist/assets/stash-skeleton/facts/conventions/assets/workflow.md +2 -0
  22. package/dist/assets/stash-skeleton/facts/conventions/backlinks.md +2 -0
  23. package/dist/assets/stash-skeleton/facts/conventions/domains.md +2 -0
  24. package/dist/assets/stash-skeleton/facts/conventions/organization.md +20 -9
  25. package/dist/assets/tasks/core/extract.yml +1 -1
  26. package/dist/assets/tasks/core/version-check.yml +1 -1
  27. package/dist/assets/tasks/improve/akm-graph-refresh-weekly.yml +5 -0
  28. package/dist/assets/tasks/improve/akm-improve-catchup.yml +8 -0
  29. package/dist/assets/tasks/improve/akm-improve-consolidate.yml +5 -0
  30. package/dist/assets/tasks/improve/akm-improve-frequent.yml +5 -0
  31. package/dist/assets/tasks/improve/akm-improve-nightly.yml +5 -0
  32. package/dist/assets/templates/html/health.html +1 -3
  33. package/dist/assets/workflows/workflow-template.md +32 -15
  34. package/dist/cli/invocation.js +40 -15
  35. package/dist/cli/parse-args.js +0 -22
  36. package/dist/cli/retired-commands.js +121 -0
  37. package/dist/cli/shared.js +154 -22
  38. package/dist/cli/unknown-flags.js +236 -0
  39. package/dist/cli-node.mjs +2 -1
  40. package/dist/cli.js +696 -258
  41. package/dist/commands/agent/agent-dispatch.js +14 -3
  42. package/dist/commands/agent/contribute-cli.js +74 -89
  43. package/dist/commands/completions.js +79 -22
  44. package/dist/commands/config-cli.js +17 -150
  45. package/dist/commands/env/env-cli.js +59 -143
  46. package/dist/commands/env/env.js +12 -163
  47. package/dist/commands/env/marker-path.js +6 -0
  48. package/dist/commands/env/secret-cli.js +36 -66
  49. package/dist/commands/env/secret.js +24 -57
  50. package/dist/commands/feedback-cli.js +148 -88
  51. package/dist/commands/health/accept-rate.js +58 -0
  52. package/dist/commands/health/advisories.js +3 -4
  53. package/dist/commands/health/checks.js +85 -23
  54. package/dist/commands/health/html-report.js +7 -10
  55. package/dist/commands/health/improve-metrics.js +25 -83
  56. package/dist/commands/health/llm-usage.js +2 -1
  57. package/dist/commands/health/md-report.js +5 -9
  58. package/dist/commands/health/metrics.js +62 -20
  59. package/dist/commands/health/renderers.js +47 -0
  60. package/dist/commands/health/report-view-model.js +4 -5
  61. package/dist/commands/health/stash-exposure.js +1 -1
  62. package/dist/commands/health/surfaces.js +4 -122
  63. package/dist/commands/health/task-runs.js +3 -67
  64. package/dist/commands/health/types-improve.js +7 -0
  65. package/dist/commands/health.js +160 -35
  66. package/dist/commands/improve/anti-collapse.js +2 -2
  67. package/dist/commands/improve/autonomy-gate.js +68 -0
  68. package/dist/commands/improve/collapse-detector.js +41 -40
  69. package/dist/commands/improve/consolidate/eligibility.js +1 -23
  70. package/dist/commands/improve/consolidate/merge.js +4 -0
  71. package/dist/commands/improve/consolidate.js +140 -1000
  72. package/dist/commands/improve/distill/promote-memory.js +12 -12
  73. package/dist/commands/improve/distill/quality-gate.js +11 -6
  74. package/dist/commands/improve/distill.js +58 -69
  75. package/dist/commands/improve/eligibility.js +101 -55
  76. package/dist/commands/improve/extract-cli.js +14 -133
  77. package/dist/commands/improve/improve-cli.js +98 -114
  78. package/dist/commands/improve/improve-result-file.js +1 -28
  79. package/dist/commands/improve/improve-strategies.js +8 -5
  80. package/dist/commands/improve/improve.js +254 -101
  81. package/dist/commands/improve/locks.js +7 -0
  82. package/dist/commands/improve/loop-stages.js +182 -20
  83. package/dist/commands/improve/memory/derived-ref.js +45 -43
  84. package/dist/commands/improve/memory/memory-belief.js +1 -1
  85. package/dist/commands/improve/memory/memory-contradiction-detect.js +4 -12
  86. package/dist/commands/improve/memory/memory-improve.js +14 -5
  87. package/dist/commands/improve/outcome-loop.js +22 -65
  88. package/dist/commands/improve/preparation.js +114 -123
  89. package/dist/commands/improve/proactive-maintenance.js +2 -5
  90. package/dist/commands/improve/reflect.js +56 -160
  91. package/dist/commands/improve/run-context.js +5 -0
  92. package/dist/commands/improve/salience.js +11 -122
  93. package/dist/commands/improve/session-asset.js +4 -0
  94. package/dist/commands/improve/source-identity.js +10 -38
  95. package/dist/commands/lint/base-linter.js +51 -131
  96. package/dist/commands/lint/env-key-rules.js +31 -47
  97. package/dist/commands/lint/index.js +444 -88
  98. package/dist/commands/lint/types.js +22 -1
  99. package/dist/commands/{events.js → log.js} +33 -38
  100. package/dist/commands/migrate-cli.js +92 -12
  101. package/dist/commands/migration-tool.js +46 -0
  102. package/dist/commands/observability-cli.js +70 -209
  103. package/dist/commands/proposal/drain.js +101 -29
  104. package/dist/commands/proposal/proposal-cli.js +76 -48
  105. package/dist/commands/proposal/proposal.js +54 -18
  106. package/dist/commands/proposal/propose-cli.js +88 -0
  107. package/dist/commands/proposal/propose.js +23 -15
  108. package/dist/commands/proposal/repository.js +718 -279
  109. package/dist/commands/proposal/validators/proposal-quality-validators.js +2 -8
  110. package/dist/commands/proposal/validators/proposal-validators.js +55 -7
  111. package/dist/commands/proposal/validators/proposals.js +4 -7
  112. package/dist/commands/read/curate.js +34 -53
  113. package/dist/commands/read/knowledge.js +150 -95
  114. package/dist/commands/read/registry-search.js +2 -2
  115. package/dist/commands/read/remember-cli.js +42 -15
  116. package/dist/commands/read/search-cli.js +180 -78
  117. package/dist/commands/read/search.js +58 -43
  118. package/dist/commands/read/show.js +197 -141
  119. package/dist/commands/registry-cli.js +12 -51
  120. package/dist/commands/remember.js +14 -57
  121. package/dist/commands/sources/add-cli.js +100 -31
  122. package/dist/commands/sources/bundle-cli.js +166 -0
  123. package/dist/commands/sources/bundle-config-ops.js +7 -2
  124. package/dist/commands/sources/info.js +30 -7
  125. package/dist/commands/sources/init.js +12 -12
  126. package/dist/commands/sources/installed-stashes.js +387 -98
  127. package/dist/commands/sources/schema-repair.js +3 -2
  128. package/dist/commands/sources/self-update.js +131 -38
  129. package/dist/commands/sources/source-add.js +72 -17
  130. package/dist/commands/sources/source-clone.js +129 -45
  131. package/dist/commands/sources/source-manage.js +43 -23
  132. package/dist/commands/sources/sources-cli.js +57 -208
  133. package/dist/commands/sources/stash-cli.js +46 -53
  134. package/dist/commands/tasks/tasks-cli.js +91 -97
  135. package/dist/commands/tasks/tasks.js +284 -423
  136. package/dist/commands/workflow-cli.js +181 -450
  137. package/dist/core/abort-deadline.js +28 -0
  138. package/dist/core/adapter/adapters/agent-skills-adapter.js +67 -5
  139. package/dist/core/adapter/adapters/akm-adapter.js +60 -38
  140. package/dist/core/adapter/adapters/akm-lint.js +109 -42
  141. package/dist/core/adapter/adapters/akm-metadata.js +15 -44
  142. package/dist/core/adapter/adapters/akm-task-adapter.js +54 -31
  143. package/dist/core/adapter/adapters/akm-workflow-adapter.js +55 -71
  144. package/dist/core/adapter/adapters/dotenv-adapter.js +1 -1
  145. package/dist/core/adapter/adapters/generic-files-adapter.js +2 -0
  146. package/dist/core/adapter/adapters/index.js +6 -6
  147. package/dist/core/adapter/adapters/llm-wiki-adapter.js +14 -8
  148. package/dist/core/adapter/adapters/okf-adapter.js +187 -19
  149. package/dist/core/adapter/adapters/shared.js +3 -19
  150. package/dist/core/adapter/adapters/tool-dir-shared.js +13 -6
  151. package/dist/core/adapter/adapters/website-snapshot-adapter.js +1 -0
  152. package/dist/core/adapter/detect-adapter.js +17 -0
  153. package/dist/core/adapter/recognize-match.js +6 -4
  154. package/dist/core/adapter/validate-context.js +214 -0
  155. package/dist/core/asset/akm-markdown.js +63 -0
  156. package/dist/core/asset/asset-placement.js +20 -6
  157. package/dist/core/asset/asset-ref.js +11 -9
  158. package/dist/core/asset/frontmatter-lint.js +30 -0
  159. package/dist/core/asset/frontmatter.js +29 -9
  160. package/dist/core/asset/markdown.js +40 -51
  161. package/dist/core/asset/resolve-ref.js +89 -18
  162. package/dist/core/asset/stash-meta.js +1 -1
  163. package/dist/core/bundle-id.js +51 -0
  164. package/dist/core/common.js +218 -44
  165. package/dist/core/concurrent.js +32 -0
  166. package/dist/core/config/config-io.js +12 -1
  167. package/dist/core/config/config-schema.js +35 -8
  168. package/dist/core/config/config-sources.js +55 -11
  169. package/dist/core/config/config-walker.js +25 -9
  170. package/dist/core/config/config.js +9 -48
  171. package/dist/core/config/experimental.js +21 -0
  172. package/dist/core/config/schema/embedding.js +5 -1
  173. package/dist/core/config/schema/experimental.js +30 -0
  174. package/dist/core/config/schema/improve-processes.js +0 -6
  175. package/dist/core/config/schema/improve.js +21 -3
  176. package/dist/core/config/schema/index-config.js +8 -15
  177. package/dist/core/config/schema/output.js +4 -1
  178. package/dist/core/config/schema/setup.js +9 -18
  179. package/dist/core/config/schema/sources-bundles.js +49 -33
  180. package/dist/core/config/schema/workflow.js +14 -3
  181. package/dist/core/env-secret-ref.js +76 -46
  182. package/dist/core/errors.js +43 -12
  183. package/dist/core/events.js +76 -152
  184. package/dist/core/file-change.js +6 -5
  185. package/dist/core/file-lock.js +7 -1
  186. package/dist/core/fs-txn.js +83 -7
  187. package/dist/core/git-message.js +2 -2
  188. package/dist/core/improve-result.js +6 -100
  189. package/dist/core/json-schema.js +327 -9
  190. package/dist/core/lesson-lint.js +1 -17
  191. package/dist/core/logs-db.js +2 -1
  192. package/dist/core/loopback.js +89 -0
  193. package/dist/core/migration-operation.js +33 -2
  194. package/dist/core/mutation-target.js +78 -0
  195. package/dist/core/parse.js +4 -1
  196. package/dist/core/path-access.js +107 -0
  197. package/dist/core/paths.js +17 -20
  198. package/dist/core/recognition-util.js +12 -14
  199. package/dist/core/redaction.js +98 -17
  200. package/dist/core/spawn-env.js +234 -0
  201. package/dist/core/standards/resolve-standards-context.js +2 -14
  202. package/dist/core/standards/resolve-stash-standards.js +2 -2
  203. package/dist/core/standards/resolve-type-conventions.js +2 -2
  204. package/dist/core/state/migrations.js +41 -18
  205. package/dist/core/state-db-scope.js +134 -0
  206. package/dist/core/state-db.js +5 -14
  207. package/dist/core/structured.js +1 -1
  208. package/dist/core/subprocess.js +182 -36
  209. package/dist/core/text-truncation.js +9 -5
  210. package/dist/core/type-presentation.js +3 -3
  211. package/dist/core/warn.js +0 -3
  212. package/dist/core/write-provenance.js +85 -0
  213. package/dist/core/write-source.js +778 -95
  214. package/dist/indexer/bundle-identity-guard.js +3 -2
  215. package/dist/indexer/db/graph-db.js +17 -30
  216. package/dist/indexer/ensure-index.js +11 -3
  217. package/dist/indexer/graph/graph-boost.js +9 -34
  218. package/dist/indexer/graph/graph-extraction.js +8 -5
  219. package/dist/indexer/index-writer-lock.js +53 -17
  220. package/dist/indexer/index-written-assets.js +33 -24
  221. package/dist/indexer/indexer.js +551 -253
  222. package/dist/indexer/installations.js +14 -96
  223. package/dist/indexer/passes/dir-staleness.js +16 -9
  224. package/dist/indexer/passes/memory-inference.js +15 -9
  225. package/dist/indexer/passes/metadata.js +113 -47
  226. package/dist/indexer/scan/doc-to-entry.js +38 -1
  227. package/dist/indexer/scan/drain-dir.js +13 -23
  228. package/dist/indexer/search/db-search.js +107 -69
  229. package/dist/indexer/search/fts-query.js +47 -24
  230. package/dist/indexer/search/ranking-contributors.js +42 -20
  231. package/dist/indexer/search/ranking.js +18 -99
  232. package/dist/indexer/search/search-fields.js +7 -2
  233. package/dist/indexer/search/search-source.js +82 -93
  234. package/dist/indexer/usage/usage-events.js +0 -89
  235. package/dist/indexer/walk/file-context.js +2 -1
  236. package/dist/indexer/walk/matchers.js +30 -43
  237. package/dist/indexer/walk/path-resolver.js +7 -2
  238. package/dist/indexer/walk/walker.js +38 -12
  239. package/dist/integrations/agent/builders.js +0 -6
  240. package/dist/integrations/agent/config.js +2 -2
  241. package/dist/integrations/agent/detect.js +49 -19
  242. package/dist/integrations/agent/engine-fallback.js +76 -0
  243. package/dist/integrations/agent/engine-resolution.js +24 -11
  244. package/dist/integrations/agent/model-aliases.js +1 -1
  245. package/dist/integrations/agent/profiles.js +23 -1
  246. package/dist/integrations/agent/prompts.js +12 -8
  247. package/dist/integrations/agent/runner-dispatch.js +4 -2
  248. package/dist/integrations/agent/runner.js +0 -1
  249. package/dist/integrations/agent/spawn.js +20 -93
  250. package/dist/integrations/github.js +1 -1
  251. package/dist/integrations/harnesses/aider/agent-builder.js +6 -4
  252. package/dist/integrations/harnesses/amazonq/agent-builder.js +7 -4
  253. package/dist/integrations/harnesses/claude/session-log.js +0 -10
  254. package/dist/integrations/harnesses/codex/agent-builder.js +5 -2
  255. package/dist/integrations/harnesses/copilot/agent-builder.js +5 -3
  256. package/dist/integrations/harnesses/gemini/agent-builder.js +5 -3
  257. package/dist/integrations/harnesses/index.js +3 -7
  258. package/dist/integrations/harnesses/opencode/agent-builder.js +21 -2
  259. package/dist/integrations/harnesses/opencode/session-log.js +0 -15
  260. package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +13 -4
  261. package/dist/integrations/harnesses/openhands/agent-builder.js +9 -6
  262. package/dist/integrations/harnesses/pi/agent-builder.js +6 -4
  263. package/dist/integrations/lockfile.js +132 -8
  264. package/dist/integrations/session-logs/index.js +3 -28
  265. package/dist/llm/client.js +136 -100
  266. package/dist/llm/embedders/remote.js +13 -5
  267. package/dist/llm/feature-gate.js +4 -12
  268. package/dist/llm/graph-extract.js +5 -11
  269. package/dist/llm/memory-infer.js +144 -1
  270. package/dist/llm/metadata-enhance.js +5 -7
  271. package/dist/llm/structured-call.js +1 -1
  272. package/dist/llm/usage-persist.js +26 -5
  273. package/dist/llm/usage-telemetry.js +25 -2
  274. package/dist/output/cli-hints.js +1 -2
  275. package/dist/output/context.js +22 -7
  276. package/dist/output/format-exempt.js +80 -0
  277. package/dist/output/generic-render.js +259 -0
  278. package/dist/output/render-registry.js +57 -0
  279. package/dist/output/renderers.js +14 -36
  280. package/dist/output/shapes/curate.js +10 -1
  281. package/dist/output/shapes/events.js +12 -7
  282. package/dist/output/shapes/helpers.js +56 -83
  283. package/dist/output/shapes/migrate.js +8 -0
  284. package/dist/output/shapes/passthrough.js +7 -41
  285. package/dist/output/shapes/proposal/producer.js +15 -7
  286. package/dist/output/shapes.js +2 -9
  287. package/dist/output/text/{init.js → bundle-create.js} +3 -1
  288. package/dist/output/text/bundle-show.js +7 -0
  289. package/dist/output/text/command-format.js +164 -96
  290. package/dist/output/text/env.js +1 -3
  291. package/dist/output/text/events.js +8 -7
  292. package/dist/output/text/health-format.js +103 -0
  293. package/dist/output/text/health.js +7 -0
  294. package/dist/output/text/helpers.js +10 -8
  295. package/dist/output/text/lint-format.js +56 -0
  296. package/dist/{migrate-storage-node.mjs → output/text/lint.js} +2 -5
  297. package/dist/output/text/migrate.js +88 -0
  298. package/dist/output/text/proposal/producer.js +4 -2
  299. package/dist/output/text/proposal-format.js +44 -72
  300. package/dist/output/text/registry-commands.js +1 -2
  301. package/dist/output/text/show-directives.js +15 -7
  302. package/dist/output/text/status-list.js +32 -0
  303. package/dist/output/text/{save.js → sync.js} +2 -2
  304. package/dist/output/text/workflow-format.js +24 -203
  305. package/dist/output/text/workflow.js +1 -7
  306. package/dist/output/text.js +16 -17
  307. package/dist/registry/factory.js +4 -6
  308. package/dist/registry/origin-resolve.js +16 -27
  309. package/dist/registry/providers/skills-sh.js +3 -3
  310. package/dist/registry/providers/static-index.js +13 -23
  311. package/dist/registry/resolve.js +42 -7
  312. package/dist/registry/semver.js +34 -84
  313. package/dist/runtime.js +2 -23
  314. package/dist/scripts/akm-migrate-node.js +60972 -0
  315. package/dist/scripts/akm-migrate.js +60310 -0
  316. package/dist/setup/detect.js +42 -15
  317. package/dist/setup/registry-stash-loader.js +2 -2
  318. package/dist/setup/setup.js +236 -136
  319. package/dist/setup/steps/connection.js +7 -9
  320. package/dist/setup/steps/platforms.js +9 -9
  321. package/dist/setup/steps/semantic.js +15 -3
  322. package/dist/setup/steps/sources.js +12 -13
  323. package/dist/setup/steps/stashdir.js +2 -3
  324. package/dist/setup/steps/tasks.js +237 -120
  325. package/dist/sources/freshness.js +1 -1
  326. package/dist/sources/provider-factory.js +11 -17
  327. package/dist/sources/providers/filesystem.js +2 -3
  328. package/dist/sources/providers/git-install.js +278 -34
  329. package/dist/sources/providers/git-provider.js +25 -23
  330. package/dist/sources/providers/git-stash.js +414 -106
  331. package/dist/sources/providers/git.js +2 -2
  332. package/dist/sources/providers/npm.js +16 -19
  333. package/dist/sources/providers/provider-utils.js +7 -4
  334. package/dist/sources/providers/sync-from-ref.js +3 -9
  335. package/dist/sources/providers/website.js +6 -1
  336. package/dist/sources/resolve.js +6 -5
  337. package/dist/sources/snapshot-fetchers/bluesky.js +146 -0
  338. package/dist/sources/snapshot-fetchers/content-extract.js +566 -0
  339. package/dist/sources/snapshot-fetchers/fetcher-util.js +41 -0
  340. package/dist/sources/snapshot-fetchers/github.js +100 -0
  341. package/dist/sources/snapshot-fetchers/host-guard.js +291 -0
  342. package/dist/sources/snapshot-fetchers/registry.js +17 -1
  343. package/dist/sources/snapshot-fetchers/robots.js +348 -0
  344. package/dist/sources/snapshot-fetchers/rss.js +282 -0
  345. package/dist/sources/snapshot-fetchers/secret-seam.js +42 -0
  346. package/dist/sources/snapshot-fetchers/website-ingest.js +686 -282
  347. package/dist/sources/snapshot-fetchers/x.js +910 -0
  348. package/dist/storage/database.js +13 -1
  349. package/dist/storage/engines/sqlite-migrations.js +23 -111
  350. package/dist/storage/managed-db.js +21 -2
  351. package/dist/storage/repositories/canaries-repository.js +1 -1
  352. package/dist/storage/repositories/events-repository.js +27 -11
  353. package/dist/storage/repositories/improve-runs-repository.js +6 -12
  354. package/dist/storage/repositories/index-connection.js +44 -8
  355. package/dist/storage/repositories/index-entries-repository.js +157 -241
  356. package/dist/storage/repositories/index-entry-mapper.js +15 -11
  357. package/dist/storage/repositories/index-fts-repository.js +5 -2
  358. package/dist/storage/repositories/index-llm-cache-repository.js +0 -1
  359. package/dist/storage/repositories/index-meta-repository.js +2 -3
  360. package/dist/storage/repositories/index-schema.js +10 -25
  361. package/dist/storage/repositories/index-utility-repository.js +15 -28
  362. package/dist/storage/repositories/index-vec-repository.js +6 -1
  363. package/dist/storage/repositories/outcome-repository.js +119 -0
  364. package/dist/storage/repositories/proposals-repository.js +296 -59
  365. package/dist/storage/repositories/registry-cache.js +19 -0
  366. package/dist/storage/repositories/salience-repository.js +172 -0
  367. package/dist/storage/repositories/task-history-repository.js +15 -13
  368. package/dist/storage/repositories/workflow-runs-repository.js +118 -53
  369. package/dist/tasks/backends/cron.js +105 -15
  370. package/dist/tasks/backends/index.js +1 -1
  371. package/dist/tasks/backends/launchd.js +85 -38
  372. package/dist/tasks/backends/schtasks.js +135 -15
  373. package/dist/tasks/embedded.js +56 -40
  374. package/dist/tasks/log-redaction.js +156 -0
  375. package/dist/tasks/parser.js +87 -160
  376. package/dist/tasks/resolve-akm-bin.js +137 -59
  377. package/dist/tasks/runner.js +209 -44
  378. package/dist/tasks/scheduler-invocation.js +220 -10
  379. package/dist/tasks/schema.js +89 -1
  380. package/dist/tasks/task-id.js +1 -3
  381. package/dist/tasks/validator.js +20 -6
  382. package/dist/workflows/authoring/authoring.js +94 -143
  383. package/dist/workflows/authoring/scope-key.js +1 -1
  384. package/dist/workflows/concurrency-policy.js +95 -1
  385. package/dist/workflows/exec/dispatch-redaction.js +114 -0
  386. package/dist/workflows/exec/exec-unit.js +542 -0
  387. package/dist/workflows/exec/frozen-judge.js +130 -32
  388. package/dist/workflows/exec/native-executor.js +513 -274
  389. package/dist/workflows/exec/param-secrets.js +12 -11
  390. package/dist/workflows/exec/run-workflow.js +496 -237
  391. package/dist/workflows/exec/step-work.js +616 -412
  392. package/dist/workflows/exec/unit-dispatch.js +34 -0
  393. package/dist/workflows/exec/unit-writer.js +53 -13
  394. package/dist/workflows/exec/worktree.js +454 -41
  395. package/dist/workflows/ir/compile.js +166 -271
  396. package/dist/workflows/ir/freeze.js +119 -42
  397. package/dist/workflows/ir/params.js +135 -11
  398. package/dist/workflows/ir/plan-hash.js +1 -1
  399. package/dist/workflows/ir/schema.js +129 -45
  400. package/dist/workflows/parser.js +1070 -307
  401. package/dist/workflows/program/expressions.js +20 -208
  402. package/dist/workflows/program/schema.js +31 -10
  403. package/dist/workflows/renderer.js +123 -68
  404. package/dist/workflows/resource-limits.js +184 -0
  405. package/dist/workflows/runtime/checkin.js +3 -3
  406. package/dist/workflows/runtime/plan-classifier.js +16 -75
  407. package/dist/workflows/runtime/runs.js +331 -132
  408. package/dist/workflows/runtime/unit-checkin.js +1 -1
  409. package/dist/workflows/runtime/unit-phases.js +2 -2
  410. package/dist/workflows/runtime/workflow-asset-loader.js +232 -83
  411. package/dist/workflows/schema.js +1 -11
  412. package/dist/workflows/validate-summary.js +47 -38
  413. package/dist/workflows/validator.js +21 -62
  414. package/docs/README.md +110 -0
  415. package/docs/migration/README.md +8 -0
  416. package/docs/migration/release-notes/0.7.0.md +11 -11
  417. package/docs/migration/release-notes/0.9.0.md +209 -27
  418. package/docs/migration/v0.7-to-v0.8.md +48 -48
  419. package/docs/migration/v0.8-to-v0.9.md +567 -209
  420. package/docs/migration/v0.9.0-troubleshooting.md +561 -0
  421. package/docs/reference/README.md +19 -0
  422. package/docs/reference/bundle-types.md +19 -0
  423. package/docs/reference/cli.md +2342 -0
  424. package/docs/reference/configuration.md +371 -0
  425. package/docs/reference/data-and-telemetry.md +129 -46
  426. package/docs/reference/supported-formats.md +50 -0
  427. package/docs/reference/workflow-schema.md +1014 -0
  428. package/docs/reference/workflows.md +51 -0
  429. package/package.json +31 -13
  430. package/schemas/akm-asset-envelope.json +93 -0
  431. package/schemas/akm-config.json +89 -128
  432. package/schemas/akm-task.json +27 -5
  433. package/schemas/akm-workflow.json +157 -81
  434. package/dist/assets/tasks/core/backup.yml +0 -5
  435. package/dist/assets/tasks/graph-refresh-weekly.yml +0 -10
  436. package/dist/cli/config-migrate.js +0 -1878
  437. package/dist/cli/config-validate.js +0 -41
  438. package/dist/commands/backup-cli.js +0 -56
  439. package/dist/commands/bundle/bundle-cli.js +0 -68
  440. package/dist/commands/bundle/bundle.js +0 -219
  441. package/dist/commands/graph/graph-cli.js +0 -124
  442. package/dist/commands/graph/graph.js +0 -489
  443. package/dist/commands/improve/extract-watch.js +0 -140
  444. package/dist/commands/mv-cli.js +0 -1221
  445. package/dist/commands/sources/history.js +0 -201
  446. package/dist/commands/tasks/default-tasks.js +0 -186
  447. package/dist/core/migration-backup.js +0 -1231
  448. package/dist/indexer/usage/unmigrated-vaults-guard.js +0 -95
  449. package/dist/llm/memory-infer-impl.js +0 -138
  450. package/dist/migrate/legacy/config-source-migration.js +0 -257
  451. package/dist/migrate/legacy/content-migration.js +0 -350
  452. package/dist/migrate/legacy/legacy-layout.js +0 -779
  453. package/dist/migrate/legacy/legacy-paths.js +0 -25
  454. package/dist/migrate/legacy/legacy-stash-json.js +0 -80
  455. package/dist/migrate/legacy/proposal-fs-import.js +0 -168
  456. package/dist/migrate/legacy/task-target-ref-migration.js +0 -278
  457. package/dist/migrate/legacy/three-db-cutover.js +0 -845
  458. package/dist/migrate/legacy/workflow-migrations-bodies.js +0 -52
  459. package/dist/migrate/legacy/workflow-migrations-frozen.js +0 -21
  460. package/dist/migrate/legacy-ref-grammar.js +0 -214
  461. package/dist/output/shapes/distill.js +0 -14
  462. package/dist/output/shapes/history.js +0 -11
  463. package/dist/output/text/distill.js +0 -6
  464. package/dist/output/text/enable-disable.js +0 -8
  465. package/dist/output/text/history.js +0 -6
  466. package/dist/registry/build-index.js +0 -382
  467. package/dist/schemas/akm-config.json +0 -4704
  468. package/dist/schemas/akm-task.json +0 -87
  469. package/dist/schemas/akm-workflow.json +0 -372
  470. package/dist/scripts/migrate-storage.js +0 -3816
  471. package/dist/workflows/authoring/workflow-program-template.yaml +0 -31
  472. package/dist/workflows/cli.js +0 -53
  473. package/dist/workflows/exec/brief.js +0 -481
  474. package/dist/workflows/exec/report.js +0 -1460
  475. package/dist/workflows/exec/watch.js +0 -116
  476. package/dist/workflows/program/parser.js +0 -813
  477. package/dist/workflows/program/project.js +0 -104
@@ -10,13 +10,19 @@
10
10
  * invalid task (e.g. two targets) is still RECOGNIZED; the `invalid-task-yaml`
11
11
  * violation surfaces only in `validate`.
12
12
  *
13
+ * `.yaml` is the one extension `validate` inspects but `recognize` refuses: it
14
+ * is not a task spelling (nothing indexes or schedules it), so it is reported
15
+ * as `invalid-task-yaml` rather than silently skipped (issue #760).
16
+ *
13
17
  * ── validate (spec §6 task validation column) ──
14
18
  *
15
- * A task must declare a `schedule`, an `enabled` boolean, and EXACTLY ONE
16
- * target (`prompt` XOR `workflow` XOR `command`). The akm adapter's
17
- * `TaskLinter` port checks "at least one" target; the native task family here is
18
- * STRICTER — declaring two targets is `invalid-task-yaml`. So this adapter owns
19
- * a purpose-built one-target check rather than reusing that port.
19
+ * A task must declare `version: 2`, a `schedule`, and EXACTLY ONE target
20
+ * (`prompt` XOR `workflow` XOR `command`). `enabled` is OPTIONAL — the parser
21
+ * defaults it to `true`, so an omitted field means an ACTIVE task — but must
22
+ * be a boolean when present. The akm adapter's `TaskLinter` port checks
23
+ * "at least one" target; the native task family here is STRICTER — declaring
24
+ * two targets is `invalid-task-yaml`. So this adapter owns a purpose-built
25
+ * one-target check rather than reusing that port.
20
26
  *
21
27
  * Conformance oracle (authored, DO NOT modify): fixture
22
28
  * `tests/fixtures/bundles/akm-task/` + goldens
@@ -24,12 +30,12 @@
24
30
  */
25
31
  import fs from "node:fs";
26
32
  import path from "node:path";
27
- import { parse as parseYaml } from "yaml";
33
+ import { parseTaskYaml, TASK_EXTENSION, TASK_NEAR_MISS_EXTENSION, taskExtensionDetail, taskFieldProblems, taskYamlParseDetail, } from "../../../tasks/schema.js";
28
34
  import { hashContent } from "./shared.js";
29
35
  /** A native task bundle is single-component; its one component is `main`. */
30
36
  const COMPONENT_ID = "main";
31
37
  /** The task YAML extension (spec §6 task row). */
32
- const TASK_EXT = ".yml";
38
+ const TASK_EXT = TASK_EXTENSION;
33
39
  /** The mutually-exclusive task target keys (exactly one required). */
34
40
  const TARGET_KEYS = ["prompt", "workflow", "command"];
35
41
  /** Upper bound on the bounded `content` FTS field (mirrors okf-adapter). */
@@ -56,27 +62,15 @@ function recognize(c, file) {
56
62
  content: raw.length > MAX_CONTENT_CHARS ? raw.slice(0, MAX_CONTENT_CHARS) : raw,
57
63
  };
58
64
  }
59
- /** Parse a task YAML into a plain record (tolerant: malformed / non-mapping → {}). */
60
- function parseTaskYaml(raw) {
61
- try {
62
- const doc = parseYaml(raw);
63
- if (doc && typeof doc === "object" && !Array.isArray(doc))
64
- return doc;
65
- }
66
- catch {
67
- // malformed YAML
68
- }
69
- return {};
70
- }
71
- /** The native `invalid-task-yaml` check: schedule + enabled(boolean) + EXACTLY ONE target. */
65
+ /**
66
+ * The native `invalid-task-yaml` check: the shared field rules
67
+ * ({@link taskFieldProblems} — see its doc for the lint-vs-parser
68
+ * reconciliation story) plus this adapter's stricter EXACTLY-ONE-target rule.
69
+ */
72
70
  function taskDiagnostics(relPath, data) {
73
71
  if (Object.keys(data).length === 0)
74
72
  return [];
75
- const problems = [];
76
- if (typeof data.schedule !== "string" || data.schedule.trim() === "")
77
- problems.push("schedule");
78
- if (typeof data.enabled !== "boolean")
79
- problems.push("enabled (must be a boolean)");
73
+ const problems = taskFieldProblems(data);
80
74
  const targets = TARGET_KEYS.filter((k) => k in data && data[k] !== undefined && data[k] !== null);
81
75
  if (targets.length === 0)
82
76
  problems.push("exactly one target (prompt, workflow, or command)");
@@ -96,16 +90,46 @@ async function validate(_c, changes, ctx) {
96
90
  const raw = change.after ?? (await ctx.readFile(change.path));
97
91
  if (typeof raw !== "string")
98
92
  continue;
99
- if (path.extname(change.path).toLowerCase() !== TASK_EXT)
93
+ const ext = path.extname(change.path).toLowerCase();
94
+ // `.yaml` is NOT a task extension — the file never indexes and never runs.
95
+ // It is validated here purely so the near miss is REPORTED rather than
96
+ // skipped the way every other extension is (issue #760).
97
+ if (ext !== TASK_EXT && ext !== TASK_NEAR_MISS_EXTENSION)
98
+ continue;
99
+ const relPath = toPosix(change.path);
100
+ if (ext === TASK_NEAR_MISS_EXTENSION) {
101
+ diagnostics.push({
102
+ file: relPath,
103
+ issue: "invalid-task-yaml",
104
+ detail: taskExtensionDetail(relPath),
105
+ fixed: false,
106
+ });
107
+ }
108
+ const parsed = parseTaskYaml(raw);
109
+ if (!parsed.ok) {
110
+ // Distinguish "unparseable" from "empty": `taskDiagnostics` returns []
111
+ // for an empty mapping, so collapsing a parse failure onto `{}` made a
112
+ // broken task file lint clean.
113
+ diagnostics.push({
114
+ file: relPath,
115
+ issue: "invalid-task-yaml",
116
+ detail: taskYamlParseDetail(parsed.error),
117
+ fixed: false,
118
+ });
100
119
  continue;
101
- diagnostics.push(...taskDiagnostics(toPosix(change.path), parseTaskYaml(raw)));
120
+ }
121
+ diagnostics.push(...taskDiagnostics(relPath, parsed.data));
102
122
  }
103
123
  return diagnostics;
104
124
  }
105
125
  export const akmTaskAdapter = {
106
126
  id: "akm-task",
107
127
  version: "0.9.0",
108
- extensions: [TASK_EXT],
128
+ // `.yaml` is listed as a COLLECTION hint only — `recognize` still gates on
129
+ // `.yml`, so a `.yaml` file is never indexed as a task. Listing it is what
130
+ // routes the near-miss file into `validate`, where it is reported instead of
131
+ // silently skipped (issue #760).
132
+ extensions: [TASK_EXT, TASK_NEAR_MISS_EXTENSION],
109
133
  recognize,
110
134
  validate,
111
135
  /** A task places to `<conceptId>.yml`; an already-suffixed conceptId is idempotent. */
@@ -120,8 +144,7 @@ export const akmTaskAdapter = {
120
144
  /**
121
145
  * Install-time probe (§1.2): a root holding a top-level `.yml` file that
122
146
  * parses as a task (a `schedule` key). The task-shape probe keeps it disjoint
123
- * from the `akm-workflow` YAML program (`version` + `steps`, no `schedule`)
124
- * and from any non-task YAML.
147
+ * from non-task YAML.
125
148
  */
126
149
  looksLikeRoot(root) {
127
150
  let entries;
@@ -141,7 +164,7 @@ export const akmTaskAdapter = {
141
164
  catch {
142
165
  continue;
143
166
  }
144
- const data = parseTaskYaml(raw);
167
+ const { data } = parseTaskYaml(raw);
145
168
  if (typeof data.schedule === "string" && data.schedule.trim() !== "")
146
169
  return true;
147
170
  }
@@ -4,27 +4,20 @@
4
4
  /**
5
5
  * The `akm-workflow` adapter — akm 0.9.0 format-family work item (#46).
6
6
  *
7
- * A native akm workflow bundle (spec §6/§7). Both workflow forms derive
8
- * `type: workflow`:
9
- * - MARKDOWN (`.md`, ≈ an OKF concept) — the classic linear workflow
10
- * (`# Workflow:` / `## Step:` / `Step ID:` / `### Instructions`), detected
11
- * by the shared `looksLikeWorkflow` probe so the matcher and parser cannot
12
- * drift;
13
- * - YAML PROGRAM (`.yaml`/`.yml`, an AKM extension) — `version` + `steps`,
14
- * detected by `looksLikeWorkflowProgram`.
15
- * conceptId strips the recognized workflow extension (`.md`/`.yaml`/`.yml`). A
16
- * plain `.md` that is NOT workflow-shaped (a README, an OKF reserved listing/log
17
- * file) is abstained on — the content probe subsumes the D-R6 reserved-file
18
- * exclusion, so no reserved-basename literal is needed here.
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.
19
14
  *
20
15
  * ── validate (spec §6 workflow row) ──
21
16
  *
22
17
  * Reuses the akm adapter's per-type workflow checks (shared base checks +
23
- * `placeholder-stub` + `invalid-workflow-structure`, markdown only — the YAML
24
- * program's correctness is `parseWorkflowProgram`'s own result, not a
25
- * markdown-lint path). Delegates to the SAME `perTypeValidateChecks` /
26
- * `runBaseValidateChecks` the `akm` adapter uses, so workflow validation has
27
- * one home.
18
+ * `placeholder-stub` + `invalid-workflow-structure`). Delegates to the SAME
19
+ * `perTypeValidateChecks` / `runBaseValidateChecks` the `akm` adapter uses, so
20
+ * workflow validation has one home.
28
21
  *
29
22
  * Conformance oracle (authored, DO NOT modify): fixture
30
23
  * `tests/fixtures/bundles/akm-workflow/` + goldens
@@ -32,60 +25,52 @@
32
25
  */
33
26
  import fs from "node:fs";
34
27
  import path from "node:path";
35
- import { parse as parseYaml } from "yaml";
36
- import { looksLikeWorkflow } from "../../../workflows/parser.js";
37
- import { looksLikeWorkflowProgram } from "../../../workflows/program/parser.js";
38
28
  import { parseFrontmatter } from "../../asset/frontmatter.js";
39
29
  import { perTypeValidateChecks } from "./akm-lint.js";
40
30
  import { hashContent, nonEmptyString, readTags, runBaseValidateChecks } from "./shared.js";
41
31
  /** A native workflow bundle is single-component; its one component is `main`. */
42
32
  const COMPONENT_ID = "main";
43
- /** Recognized workflow extensions (matcher parity with recognition-util WORKFLOW_EXTENSIONS). */
44
- const WORKFLOW_EXTS = new Set([".md", ".yaml", ".yml"]);
33
+ /** One recognized workflow extension now (workflow-format-unification): `.md`. */
34
+ const WORKFLOW_EXTS = new Set([".md"]);
45
35
  /** Upper bound on the bounded `content` FTS field (mirrors okf-adapter). */
46
36
  const MAX_CONTENT_CHARS = 100_000;
47
37
  function toPosix(p) {
48
38
  return p.replace(/\\/g, "/");
49
39
  }
50
- /** Strip a recognized workflow extension from a component-root-relative path → conceptId. */
40
+ /** Strip the recognized workflow extension from a component-root-relative path → conceptId. */
51
41
  function conceptIdOf(relPath) {
52
- return toPosix(relPath).replace(/\.(md|ya?ml)$/i, "");
42
+ return toPosix(relPath).replace(/\.md$/i, "");
53
43
  }
54
- /** Which workflow form (if any) `file` is — the recognition gate. */
55
- function workflowForm(ext, raw) {
56
- if (ext === ".md")
57
- return looksLikeWorkflow(parseFrontmatter(raw).content) ? "markdown" : null;
58
- if (ext === ".yaml" || ext === ".yml")
59
- return looksLikeWorkflowProgram(raw) ? "yaml-program" : null;
60
- return null;
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";
61
47
  }
62
- /** The workflow's projected `description` — frontmatter for markdown, the program `description:` for YAML. */
63
- function workflowDescription(form, raw) {
64
- if (form === "markdown")
65
- return nonEmptyString(parseFrontmatter(raw).data.description);
66
- try {
67
- const doc = parseYaml(raw);
68
- if (doc && typeof doc === "object" && !Array.isArray(doc)) {
69
- return nonEmptyString(doc.description);
70
- }
71
- }
72
- catch {
73
- // malformed YAML — no description
74
- }
75
- return undefined;
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";
76
59
  }
77
60
  function recognize(c, file) {
78
61
  if (!WORKFLOW_EXTS.has(file.ext))
79
62
  return null;
63
+ if (isReservedDocFile(file.fileName))
64
+ return null;
80
65
  const raw = file.content();
81
- const form = workflowForm(file.ext, raw);
82
- if (form === null)
66
+ if (!isWorkflowFile(raw))
83
67
  return null;
84
68
  const conceptId = conceptIdOf(file.relPath);
85
69
  const name = conceptId.split("/").pop() ?? conceptId;
86
- const description = workflowDescription(form, raw);
87
- const body = form === "markdown" ? parseFrontmatter(raw).content : raw;
88
- const tags = readTags(parseFrontmatter(raw).data.tags);
70
+ const parsed = parseFrontmatter(raw);
71
+ const description = nonEmptyString(parsed.data.description);
72
+ const body = parsed.content;
73
+ const tags = readTags(parsed.data.tags);
89
74
  const doc = {
90
75
  ref: `${c.id}//${conceptId}`,
91
76
  bundle: c.id,
@@ -113,18 +98,11 @@ async function validate(c, changes, ctx) {
113
98
  if (typeof raw !== "string")
114
99
  continue;
115
100
  const ext = path.extname(change.path).toLowerCase();
116
- if (!WORKFLOW_EXTS.has(ext) || workflowForm(ext, raw) === null)
101
+ if (!WORKFLOW_EXTS.has(ext) || isReservedDocFile(path.basename(change.path)) || !isWorkflowFile(raw))
117
102
  continue;
118
103
  const relPath = toPosix(change.path);
119
- // Markdown workflows parse via frontmatter; YAML programs are pure YAML (no frontmatter).
120
- let parsed;
121
- if (ext === ".md") {
122
- const p = parseFrontmatter(raw);
123
- parsed = { data: p.data, content: p.content, frontmatter: p.frontmatter };
124
- }
125
- else {
126
- parsed = { data: {}, content: raw, frontmatter: null };
127
- }
104
+ const p = parseFrontmatter(raw);
105
+ const parsed = { data: p.data, content: p.content, frontmatter: p.frontmatter };
128
106
  diagnostics.push(...(await runBaseValidateChecks(relPath, parsed, c.root, ctx)));
129
107
  diagnostics.push(...(await perTypeValidateChecks({
130
108
  type: "workflow",
@@ -139,13 +117,22 @@ async function validate(c, changes, ctx) {
139
117
  }
140
118
  return diagnostics;
141
119
  }
142
- /** True when a top-level file in `root` is workflow-shaped (used by looksLikeRoot). */
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
+ */
143
130
  function hasTopLevelWorkflowFile(root, entries) {
144
131
  for (const entry of entries) {
145
132
  if (!entry.isFile())
146
133
  continue;
147
134
  const ext = path.extname(entry.name).toLowerCase();
148
- if (!WORKFLOW_EXTS.has(ext))
135
+ if (!WORKFLOW_EXTS.has(ext) || isReservedDocFile(entry.name))
149
136
  continue;
150
137
  let raw;
151
138
  try {
@@ -154,7 +141,7 @@ function hasTopLevelWorkflowFile(root, entries) {
154
141
  catch {
155
142
  continue;
156
143
  }
157
- if (workflowForm(ext, raw) !== null)
144
+ if (parseFrontmatter(raw).data.type === "workflow")
158
145
  return true;
159
146
  }
160
147
  return false;
@@ -162,13 +149,13 @@ function hasTopLevelWorkflowFile(root, entries) {
162
149
  export const akmWorkflowAdapter = {
163
150
  id: "akm-workflow",
164
151
  version: "0.9.0",
165
- extensions: [".md", ".yaml", ".yml"],
152
+ extensions: [".md"],
166
153
  recognize,
167
154
  validate,
168
- /** Default markdown placement; an explicit `.yaml`/`.yml`/`.md` conceptId short-circuits to that extension. */
155
+ /** Markdown placement; an explicit `.md` conceptId short-circuits to that extension. */
169
156
  placeNew(c, conceptId) {
170
157
  const posix = toPosix(conceptId);
171
- if (/\.(md|ya?ml)$/i.test(posix))
158
+ if (/\.md$/i.test(posix))
172
159
  return path.join(c.root, posix);
173
160
  return path.join(c.root, `${posix}.md`);
174
161
  },
@@ -177,11 +164,8 @@ export const akmWorkflowAdapter = {
177
164
  return ["."];
178
165
  },
179
166
  /**
180
- * Install-time probe (§1.2): a root holding a workflow file at top level — a
181
- * `.yaml`/`.yml` program (`version` + `steps`) or a workflow-shaped `.md`. The
182
- * content probe means an okf reserved listing, a wiki `schema.md`, or a README
183
- * never trips it, so the probe stays disjoint from the other adapters' roots
184
- * without any structural exclusion.
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).
185
169
  */
186
170
  looksLikeRoot(root) {
187
171
  let entries;
@@ -18,7 +18,7 @@
18
18
  *
19
19
  * ── validate (spec §6 env/secret validation column) ──
20
20
  *
21
- * The dangerous-key scan (`dangerous-vault-key`), reusing the akm adapter's
21
+ * The dangerous-key scan (`dangerous-env-key`), reusing the akm adapter's
22
22
  * `dangerousEnvKeyDiagnostics` — which preserves the code-grounded narrowness:
23
23
  * it runs ONLY on `*.env`-suffixed files, so `secrets/<bare-name>` is never
24
24
  * scanned (its whole content is an opaque secret value). Reads KEY NAMES only.
@@ -71,6 +71,8 @@ function recognize(c, file) {
71
71
  name,
72
72
  content: body.length > MAX_CONTENT_CHARS ? body.slice(0, MAX_CONTENT_CHARS) : body,
73
73
  };
74
+ if (type !== "script")
75
+ doc.ownsPresentation = true;
74
76
  const description = nonEmptyString(parsed.data.description);
75
77
  if (description !== undefined)
76
78
  doc.description = description;
@@ -33,10 +33,10 @@ export { websiteSnapshotAdapter } from "./website-snapshot-adapter.js";
33
33
  *
34
34
  * Probe-precedence rationale (grounds "cannot shadow the existing three"):
35
35
  *
36
- * - The three loosest probes — `llm-wiki` (schema.md + pages/), `okf` (root
37
- * index doc), `akm` (a placement stash subdir / `.stash`) — stay LAST and in
38
- * their established order (`llm-wiki` BEFORE `okf`: a wiki root also carries a
39
- * root index doc, so the more-specific wiki probe must win the overlap).
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
40
  * - `akm.looksLikeRoot` fires on ANY root carrying a stash-subdir-named
41
41
  * directory — which includes a `.claude`/`.opencode` tool dir (`commands/`,
42
42
  * `agents/`, `skills/`) and a dotenv bundle (`env/`, `secrets/`). So
@@ -62,10 +62,10 @@ export const BUILTIN_ADAPTERS = Object.freeze([
62
62
  // Native akm sub-formats (disjoint content-shape probes).
63
63
  akmWorkflowAdapter,
64
64
  akmTaskAdapter,
65
- // The three established loose probes, in their established order.
65
+ // Loose probes: specific native layouts before the portable OKF baseline.
66
66
  llmWikiAdapter,
67
- okfAdapter,
68
67
  akmAdapter,
68
+ okfAdapter,
69
69
  // Explicit-config fallback (never auto-selected) — last.
70
70
  genericFilesAdapter,
71
71
  ]);
@@ -5,8 +5,8 @@
5
5
  * The first-class `llm-wiki` adapter — akm 0.9.0 chunk-4 (DEV-7 restore).
6
6
  *
7
7
  * The `wiki` ASSET-TYPE dies in chunk 4 (plan §11 Chunk 4 / §7.4), but the LLM
8
- * Wiki structure stays first-class as its OWN adapter. This relocates the native
9
- * wiki semantics from `src/wiki/wiki.ts` + `src/wiki/wiki-templates.ts` into a
8
+ * Wiki structure stays first-class as its OWN adapter. This relocates the
9
+ * native wiki semantics from the retired `src/wiki/` module into a
10
10
  * `BundleAdapter` implementing `docs/architecture/specs/akm-0.9.0-bundle-adapter-spec.md` §7
11
11
  * (llm-wiki row), §6 (wiki-page row), §0.2 (the `wiki` asset-type is retired;
12
12
  * the adapter is first-class), §1.2 (probe = schema.md + pages/), §9 (links).
@@ -42,7 +42,8 @@
42
42
  *
43
43
  * ── validate (spec §6/§7, §9) — native wiki checks ONLY ──
44
44
  *
45
- * The native structural checks ported from `wiki.ts#lintWiki`: `broken-xref`
45
+ * The native structural checks ported from the retired `src/wiki/` module's
46
+ * `lintWiki`: `broken-xref`
46
47
  * (an xref target that does not resolve to an existing page), `uncited-raw`
47
48
  * (a `raw/` source not cited by any page's `sources:`), `missing-description`
48
49
  * (a page with no description), and `broken-source` (a page `sources:` entry
@@ -58,11 +59,15 @@
58
59
  *
59
60
  * ── Cycle-safety ──
60
61
  *
61
- * Imported ONLY by the test-only `adapters/index.ts` barrel (nothing in `src/`
62
- * imports that), so this leaf can never gain an inbound edge from a cycle
63
- * participant. It value-imports only pure leaves (`frontmatter`, `shared`) plus
64
- * Node builtins + `yaml` (already a runtime dep). Verified: `bun
65
- * scripts/lint-import-cycles.ts` stays within baseline (13) with this file present.
62
+ * Imported by the `adapters/index.ts` barrel, which is NOT test-only: `core/
63
+ * adapter/registry.ts:33` imports it in production for the frozen
64
+ * `BUILTIN_ADAPTERS` list (`installations.ts#detectAdapterId`,
65
+ * `provider-utils.ts#detectStashRoot`). This still can never gain an inbound
66
+ * edge from a cycle participant, since neither the barrel nor the registry
67
+ * import anything that imports back into this file. It value-imports only
68
+ * pure leaves (`frontmatter`, `shared`) plus Node builtins + `yaml` (already a
69
+ * runtime dep). Verified: `bun scripts/lint-import-cycles.ts` reports 0 cycle
70
+ * participants with this file present.
66
71
  */
67
72
  import fs from "node:fs";
68
73
  import path from "node:path";
@@ -272,6 +277,7 @@ function recognize(c, file) {
272
277
  path: file.absPath,
273
278
  hash: hashContent(raw),
274
279
  adapterId: "llm-wiki",
280
+ ownsPresentation: true,
275
281
  type: isRaw ? WIKI_SOURCE_TYPE : (fm.pageKind ?? DEFAULT_PAGE_KIND),
276
282
  name: lastSegment,
277
283
  content: body.length > MAX_CONTENT_CHARS ? body.slice(0, MAX_CONTENT_CHARS) : body,