akm-cli 0.9.0-rc.8 → 0.9.0

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 (450) hide show
  1. package/CHANGELOG.md +1063 -44
  2. package/README.md +51 -25
  3. package/SECURITY.md +14 -1
  4. package/STABILITY.md +497 -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 +73 -88
  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 +141 -87
  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/md-report.js +5 -9
  57. package/dist/commands/health/metrics.js +62 -20
  58. package/dist/commands/health/renderers.js +47 -0
  59. package/dist/commands/health/report-view-model.js +4 -5
  60. package/dist/commands/health/stash-exposure.js +1 -1
  61. package/dist/commands/health/surfaces.js +3 -48
  62. package/dist/commands/health/task-runs.js +3 -67
  63. package/dist/commands/health/types-improve.js +7 -0
  64. package/dist/commands/health.js +99 -28
  65. package/dist/commands/improve/anti-collapse.js +2 -2
  66. package/dist/commands/improve/autonomy-gate.js +68 -0
  67. package/dist/commands/improve/collapse-detector.js +41 -40
  68. package/dist/commands/improve/consolidate/eligibility.js +1 -23
  69. package/dist/commands/improve/consolidate/merge.js +4 -0
  70. package/dist/commands/improve/consolidate.js +140 -1000
  71. package/dist/commands/improve/distill/promote-memory.js +12 -12
  72. package/dist/commands/improve/distill/quality-gate.js +6 -6
  73. package/dist/commands/improve/distill.js +58 -69
  74. package/dist/commands/improve/eligibility.js +105 -57
  75. package/dist/commands/improve/extract-cli.js +14 -133
  76. package/dist/commands/improve/improve-cli.js +98 -114
  77. package/dist/commands/improve/improve-result-file.js +1 -28
  78. package/dist/commands/improve/improve-strategies.js +8 -5
  79. package/dist/commands/improve/improve.js +128 -91
  80. package/dist/commands/improve/loop-stages.js +182 -20
  81. package/dist/commands/improve/memory/derived-ref.js +45 -43
  82. package/dist/commands/improve/memory/memory-belief.js +1 -1
  83. package/dist/commands/improve/memory/memory-contradiction-detect.js +4 -12
  84. package/dist/commands/improve/memory/memory-improve.js +6 -5
  85. package/dist/commands/improve/outcome-loop.js +22 -65
  86. package/dist/commands/improve/preparation.js +114 -123
  87. package/dist/commands/improve/proactive-maintenance.js +2 -5
  88. package/dist/commands/improve/reflect.js +56 -160
  89. package/dist/commands/improve/salience.js +11 -122
  90. package/dist/commands/improve/source-identity.js +10 -38
  91. package/dist/commands/lint/base-linter.js +20 -124
  92. package/dist/commands/lint/env-key-rules.js +31 -47
  93. package/dist/commands/lint/index.js +249 -43
  94. package/dist/commands/{events.js → log.js} +33 -38
  95. package/dist/commands/migrate-cli.js +92 -12
  96. package/dist/commands/migration-tool.js +46 -0
  97. package/dist/commands/observability-cli.js +70 -209
  98. package/dist/commands/proposal/drain.js +101 -29
  99. package/dist/commands/proposal/proposal-cli.js +76 -48
  100. package/dist/commands/proposal/proposal.js +54 -18
  101. package/dist/commands/proposal/propose-cli.js +88 -0
  102. package/dist/commands/proposal/propose.js +23 -15
  103. package/dist/commands/proposal/repository.js +701 -278
  104. package/dist/commands/proposal/validators/proposal-quality-validators.js +2 -8
  105. package/dist/commands/proposal/validators/proposal-validators.js +55 -7
  106. package/dist/commands/proposal/validators/proposals.js +4 -7
  107. package/dist/commands/read/curate.js +34 -53
  108. package/dist/commands/read/knowledge.js +150 -95
  109. package/dist/commands/read/registry-search.js +2 -2
  110. package/dist/commands/read/remember-cli.js +42 -15
  111. package/dist/commands/read/search-cli.js +180 -78
  112. package/dist/commands/read/search.js +58 -43
  113. package/dist/commands/read/show.js +197 -141
  114. package/dist/commands/registry-cli.js +12 -51
  115. package/dist/commands/remember.js +14 -57
  116. package/dist/commands/sources/add-cli.js +100 -31
  117. package/dist/commands/sources/bundle-cli.js +166 -0
  118. package/dist/commands/sources/bundle-config-ops.js +7 -2
  119. package/dist/commands/sources/info.js +18 -5
  120. package/dist/commands/sources/init.js +12 -12
  121. package/dist/commands/sources/installed-stashes.js +382 -98
  122. package/dist/commands/sources/schema-repair.js +3 -2
  123. package/dist/commands/sources/self-update.js +131 -38
  124. package/dist/commands/sources/source-add.js +72 -17
  125. package/dist/commands/sources/source-clone.js +129 -45
  126. package/dist/commands/sources/source-manage.js +43 -23
  127. package/dist/commands/sources/sources-cli.js +57 -208
  128. package/dist/commands/sources/stash-cli.js +46 -53
  129. package/dist/commands/tasks/tasks-cli.js +91 -97
  130. package/dist/commands/tasks/tasks.js +276 -421
  131. package/dist/commands/workflow-cli.js +175 -450
  132. package/dist/core/adapter/adapters/akm-adapter.js +47 -28
  133. package/dist/core/adapter/adapters/akm-lint.js +42 -27
  134. package/dist/core/adapter/adapters/akm-metadata.js +15 -44
  135. package/dist/core/adapter/adapters/akm-task-adapter.js +15 -13
  136. package/dist/core/adapter/adapters/akm-workflow-adapter.js +55 -71
  137. package/dist/core/adapter/adapters/dotenv-adapter.js +1 -1
  138. package/dist/core/adapter/adapters/generic-files-adapter.js +2 -0
  139. package/dist/core/adapter/adapters/index.js +6 -6
  140. package/dist/core/adapter/adapters/llm-wiki-adapter.js +14 -8
  141. package/dist/core/adapter/adapters/okf-adapter.js +187 -19
  142. package/dist/core/adapter/adapters/shared.js +3 -19
  143. package/dist/core/adapter/adapters/tool-dir-shared.js +8 -3
  144. package/dist/core/adapter/adapters/website-snapshot-adapter.js +1 -0
  145. package/dist/core/adapter/detect-adapter.js +17 -0
  146. package/dist/core/adapter/recognize-match.js +6 -4
  147. package/dist/core/adapter/validate-context.js +214 -0
  148. package/dist/core/asset/akm-markdown.js +63 -0
  149. package/dist/core/asset/asset-placement.js +20 -6
  150. package/dist/core/asset/asset-ref.js +11 -9
  151. package/dist/core/asset/frontmatter-lint.js +30 -0
  152. package/dist/core/asset/frontmatter.js +37 -9
  153. package/dist/core/asset/markdown.js +40 -51
  154. package/dist/core/asset/resolve-ref.js +89 -18
  155. package/dist/core/asset/stash-meta.js +1 -1
  156. package/dist/core/bundle-id.js +51 -0
  157. package/dist/core/common.js +152 -38
  158. package/dist/core/config/config-io.js +12 -1
  159. package/dist/core/config/config-schema.js +35 -8
  160. package/dist/core/config/config-sources.js +55 -11
  161. package/dist/core/config/config-walker.js +25 -9
  162. package/dist/core/config/config.js +9 -48
  163. package/dist/core/config/experimental.js +21 -0
  164. package/dist/core/config/schema/embedding.js +5 -1
  165. package/dist/core/config/schema/experimental.js +30 -0
  166. package/dist/core/config/schema/improve-processes.js +0 -6
  167. package/dist/core/config/schema/improve.js +21 -3
  168. package/dist/core/config/schema/index-config.js +8 -15
  169. package/dist/core/config/schema/output.js +4 -1
  170. package/dist/core/config/schema/setup.js +9 -18
  171. package/dist/core/config/schema/sources-bundles.js +49 -33
  172. package/dist/core/config/schema/workflow.js +3 -3
  173. package/dist/core/env-secret-ref.js +76 -46
  174. package/dist/core/errors.js +18 -12
  175. package/dist/core/events.js +46 -128
  176. package/dist/core/file-change.js +6 -5
  177. package/dist/core/fs-txn.js +83 -7
  178. package/dist/core/git-message.js +2 -2
  179. package/dist/core/improve-result.js +1 -100
  180. package/dist/core/lesson-lint.js +1 -17
  181. package/dist/core/logs-db.js +2 -1
  182. package/dist/core/migration-operation.js +16 -0
  183. package/dist/core/mutation-target.js +78 -0
  184. package/dist/core/parse.js +4 -1
  185. package/dist/core/paths.js +17 -20
  186. package/dist/core/recognition-util.js +12 -14
  187. package/dist/core/redaction.js +34 -0
  188. package/dist/core/standards/resolve-standards-context.js +2 -14
  189. package/dist/core/standards/resolve-stash-standards.js +2 -2
  190. package/dist/core/standards/resolve-type-conventions.js +2 -2
  191. package/dist/core/state/migrations.js +41 -18
  192. package/dist/core/state-db.js +5 -14
  193. package/dist/core/structured.js +1 -1
  194. package/dist/core/subprocess.js +6 -4
  195. package/dist/core/text-truncation.js +9 -5
  196. package/dist/core/type-presentation.js +3 -3
  197. package/dist/core/warn.js +0 -3
  198. package/dist/core/write-source.js +771 -95
  199. package/dist/indexer/bundle-identity-guard.js +3 -2
  200. package/dist/indexer/db/graph-db.js +0 -24
  201. package/dist/indexer/ensure-index.js +1 -0
  202. package/dist/indexer/graph/graph-boost.js +9 -34
  203. package/dist/indexer/graph/graph-extraction.js +8 -5
  204. package/dist/indexer/index-writer-lock.js +53 -17
  205. package/dist/indexer/index-written-assets.js +16 -22
  206. package/dist/indexer/indexer.js +497 -239
  207. package/dist/indexer/installations.js +14 -96
  208. package/dist/indexer/passes/dir-staleness.js +16 -9
  209. package/dist/indexer/passes/memory-inference.js +11 -9
  210. package/dist/indexer/passes/metadata.js +113 -47
  211. package/dist/indexer/scan/doc-to-entry.js +38 -1
  212. package/dist/indexer/scan/drain-dir.js +13 -23
  213. package/dist/indexer/search/db-search.js +99 -54
  214. package/dist/indexer/search/fts-query.js +47 -24
  215. package/dist/indexer/search/ranking-contributors.js +42 -20
  216. package/dist/indexer/search/ranking.js +18 -99
  217. package/dist/indexer/search/search-fields.js +7 -2
  218. package/dist/indexer/search/search-source.js +82 -93
  219. package/dist/indexer/usage/usage-events.js +0 -89
  220. package/dist/indexer/walk/file-context.js +2 -1
  221. package/dist/indexer/walk/matchers.js +30 -43
  222. package/dist/indexer/walk/path-resolver.js +7 -2
  223. package/dist/indexer/walk/walker.js +38 -12
  224. package/dist/integrations/agent/builders.js +0 -6
  225. package/dist/integrations/agent/config.js +2 -2
  226. package/dist/integrations/agent/detect.js +49 -19
  227. package/dist/integrations/agent/engine-fallback.js +76 -0
  228. package/dist/integrations/agent/profiles.js +14 -0
  229. package/dist/integrations/agent/prompts.js +12 -8
  230. package/dist/integrations/agent/runner-dispatch.js +4 -2
  231. package/dist/integrations/agent/runner.js +0 -1
  232. package/dist/integrations/agent/spawn.js +5 -6
  233. package/dist/integrations/github.js +1 -1
  234. package/dist/integrations/harnesses/aider/agent-builder.js +6 -4
  235. package/dist/integrations/harnesses/amazonq/agent-builder.js +7 -4
  236. package/dist/integrations/harnesses/claude/session-log.js +0 -10
  237. package/dist/integrations/harnesses/codex/agent-builder.js +5 -2
  238. package/dist/integrations/harnesses/copilot/agent-builder.js +5 -3
  239. package/dist/integrations/harnesses/gemini/agent-builder.js +5 -3
  240. package/dist/integrations/harnesses/index.js +3 -7
  241. package/dist/integrations/harnesses/opencode/agent-builder.js +21 -2
  242. package/dist/integrations/harnesses/opencode/session-log.js +0 -15
  243. package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +13 -4
  244. package/dist/integrations/harnesses/openhands/agent-builder.js +9 -6
  245. package/dist/integrations/harnesses/pi/agent-builder.js +6 -4
  246. package/dist/integrations/lockfile.js +101 -6
  247. package/dist/integrations/session-logs/index.js +3 -28
  248. package/dist/llm/client.js +136 -100
  249. package/dist/llm/embedders/remote.js +13 -5
  250. package/dist/llm/feature-gate.js +4 -12
  251. package/dist/llm/graph-extract.js +5 -11
  252. package/dist/llm/memory-infer.js +144 -1
  253. package/dist/llm/metadata-enhance.js +5 -7
  254. package/dist/llm/structured-call.js +1 -1
  255. package/dist/llm/usage-persist.js +26 -5
  256. package/dist/llm/usage-telemetry.js +25 -2
  257. package/dist/output/cli-hints.js +1 -2
  258. package/dist/output/context.js +22 -7
  259. package/dist/output/format-exempt.js +80 -0
  260. package/dist/output/generic-render.js +259 -0
  261. package/dist/output/render-registry.js +57 -0
  262. package/dist/output/renderers.js +14 -36
  263. package/dist/output/shapes/curate.js +10 -1
  264. package/dist/output/shapes/events.js +12 -7
  265. package/dist/output/shapes/helpers.js +56 -83
  266. package/dist/output/shapes/migrate.js +8 -0
  267. package/dist/output/shapes/passthrough.js +7 -41
  268. package/dist/output/shapes/proposal/producer.js +15 -7
  269. package/dist/output/shapes.js +2 -9
  270. package/dist/output/text/{init.js → bundle-create.js} +3 -1
  271. package/dist/output/text/bundle-show.js +7 -0
  272. package/dist/output/text/command-format.js +164 -96
  273. package/dist/output/text/env.js +1 -3
  274. package/dist/output/text/events.js +8 -7
  275. package/dist/output/text/health-format.js +103 -0
  276. package/dist/output/text/health.js +7 -0
  277. package/dist/output/text/helpers.js +10 -8
  278. package/dist/output/text/lint-format.js +43 -0
  279. package/dist/output/text/{save.js → lint.js} +2 -2
  280. package/dist/output/text/migrate.js +88 -0
  281. package/dist/output/text/proposal/producer.js +4 -2
  282. package/dist/output/text/proposal-format.js +44 -72
  283. package/dist/output/text/registry-commands.js +1 -2
  284. package/dist/output/text/show-directives.js +15 -7
  285. package/dist/output/text/status-list.js +32 -0
  286. package/dist/output/text/sync.js +5 -0
  287. package/dist/output/text/workflow-format.js +24 -203
  288. package/dist/output/text/workflow.js +1 -7
  289. package/dist/output/text.js +16 -17
  290. package/dist/registry/factory.js +4 -6
  291. package/dist/registry/origin-resolve.js +16 -27
  292. package/dist/registry/providers/skills-sh.js +3 -3
  293. package/dist/registry/providers/static-index.js +13 -23
  294. package/dist/registry/resolve.js +42 -7
  295. package/dist/registry/semver.js +34 -84
  296. package/dist/runtime.js +2 -23
  297. package/dist/scripts/akm-migrate-node.js +60290 -0
  298. package/dist/scripts/akm-migrate.js +59628 -0
  299. package/dist/setup/detect.js +42 -15
  300. package/dist/setup/registry-stash-loader.js +2 -2
  301. package/dist/setup/setup.js +236 -136
  302. package/dist/setup/steps/connection.js +7 -9
  303. package/dist/setup/steps/platforms.js +9 -9
  304. package/dist/setup/steps/semantic.js +15 -3
  305. package/dist/setup/steps/sources.js +12 -13
  306. package/dist/setup/steps/stashdir.js +2 -3
  307. package/dist/setup/steps/tasks.js +237 -120
  308. package/dist/sources/freshness.js +1 -1
  309. package/dist/sources/provider-factory.js +11 -17
  310. package/dist/sources/providers/filesystem.js +2 -3
  311. package/dist/sources/providers/git-install.js +278 -34
  312. package/dist/sources/providers/git-provider.js +25 -23
  313. package/dist/sources/providers/git-stash.js +395 -106
  314. package/dist/sources/providers/git.js +2 -2
  315. package/dist/sources/providers/npm.js +16 -19
  316. package/dist/sources/providers/provider-utils.js +7 -4
  317. package/dist/sources/providers/sync-from-ref.js +3 -9
  318. package/dist/sources/providers/website.js +6 -1
  319. package/dist/sources/resolve.js +6 -5
  320. package/dist/sources/snapshot-fetchers/bluesky.js +146 -0
  321. package/dist/sources/snapshot-fetchers/content-extract.js +566 -0
  322. package/dist/sources/snapshot-fetchers/fetcher-util.js +41 -0
  323. package/dist/sources/snapshot-fetchers/github.js +100 -0
  324. package/dist/sources/snapshot-fetchers/host-guard.js +291 -0
  325. package/dist/sources/snapshot-fetchers/registry.js +17 -1
  326. package/dist/sources/snapshot-fetchers/robots.js +348 -0
  327. package/dist/sources/snapshot-fetchers/rss.js +282 -0
  328. package/dist/sources/snapshot-fetchers/secret-seam.js +42 -0
  329. package/dist/sources/snapshot-fetchers/website-ingest.js +566 -268
  330. package/dist/sources/snapshot-fetchers/x.js +910 -0
  331. package/dist/storage/database.js +7 -0
  332. package/dist/storage/engines/sqlite-migrations.js +23 -111
  333. package/dist/storage/managed-db.js +2 -2
  334. package/dist/storage/repositories/canaries-repository.js +1 -1
  335. package/dist/storage/repositories/events-repository.js +27 -11
  336. package/dist/storage/repositories/improve-runs-repository.js +6 -12
  337. package/dist/storage/repositories/index-connection.js +17 -6
  338. package/dist/storage/repositories/index-entries-repository.js +151 -240
  339. package/dist/storage/repositories/index-entry-mapper.js +15 -11
  340. package/dist/storage/repositories/index-fts-repository.js +5 -2
  341. package/dist/storage/repositories/index-llm-cache-repository.js +0 -1
  342. package/dist/storage/repositories/index-meta-repository.js +2 -3
  343. package/dist/storage/repositories/index-schema.js +10 -25
  344. package/dist/storage/repositories/index-utility-repository.js +15 -28
  345. package/dist/storage/repositories/index-vec-repository.js +6 -1
  346. package/dist/storage/repositories/outcome-repository.js +119 -0
  347. package/dist/storage/repositories/proposals-repository.js +296 -59
  348. package/dist/storage/repositories/registry-cache.js +19 -0
  349. package/dist/storage/repositories/salience-repository.js +172 -0
  350. package/dist/storage/repositories/task-history-repository.js +15 -13
  351. package/dist/storage/repositories/workflow-runs-repository.js +52 -40
  352. package/dist/tasks/backends/cron.js +105 -15
  353. package/dist/tasks/backends/index.js +1 -1
  354. package/dist/tasks/backends/launchd.js +85 -38
  355. package/dist/tasks/backends/schtasks.js +135 -15
  356. package/dist/tasks/embedded.js +56 -40
  357. package/dist/tasks/parser.js +7 -157
  358. package/dist/tasks/resolve-akm-bin.js +137 -59
  359. package/dist/tasks/runner.js +79 -42
  360. package/dist/tasks/scheduler-invocation.js +220 -10
  361. package/dist/tasks/schema.js +24 -1
  362. package/dist/tasks/task-id.js +1 -3
  363. package/dist/tasks/validator.js +20 -6
  364. package/dist/workflows/authoring/authoring.js +94 -143
  365. package/dist/workflows/authoring/scope-key.js +1 -1
  366. package/dist/workflows/exec/frozen-judge.js +28 -2
  367. package/dist/workflows/exec/native-executor.js +77 -57
  368. package/dist/workflows/exec/param-secrets.js +9 -9
  369. package/dist/workflows/exec/run-workflow.js +133 -79
  370. package/dist/workflows/exec/step-work.js +219 -346
  371. package/dist/{migrate-storage-node.mjs → workflows/exec/unit-dispatch.js} +1 -5
  372. package/dist/workflows/ir/compile.js +141 -270
  373. package/dist/workflows/ir/freeze.js +40 -30
  374. package/dist/workflows/ir/params.js +135 -11
  375. package/dist/workflows/ir/plan-hash.js +1 -1
  376. package/dist/workflows/ir/schema.js +25 -26
  377. package/dist/workflows/parser.js +872 -307
  378. package/dist/workflows/program/expressions.js +20 -208
  379. package/dist/workflows/program/schema.js +7 -10
  380. package/dist/workflows/renderer.js +95 -68
  381. package/dist/workflows/resource-limits.js +2 -0
  382. package/dist/workflows/runtime/checkin.js +3 -3
  383. package/dist/workflows/runtime/plan-classifier.js +16 -75
  384. package/dist/workflows/runtime/runs.js +186 -127
  385. package/dist/workflows/runtime/unit-checkin.js +1 -1
  386. package/dist/workflows/runtime/unit-phases.js +2 -2
  387. package/dist/workflows/runtime/workflow-asset-loader.js +232 -83
  388. package/dist/workflows/schema.js +1 -11
  389. package/dist/workflows/validate-summary.js +30 -36
  390. package/dist/workflows/validator.js +21 -62
  391. package/docs/README.md +68 -0
  392. package/docs/migration/README.md +8 -0
  393. package/docs/migration/release-notes/0.7.0.md +11 -11
  394. package/docs/migration/release-notes/0.9.0.md +208 -27
  395. package/docs/migration/v0.7-to-v0.8.md +46 -47
  396. package/docs/migration/v0.8-to-v0.9.md +564 -208
  397. package/docs/migration/v0.9.0-troubleshooting.md +561 -0
  398. package/docs/reference/README.md +12 -0
  399. package/docs/reference/cli.md +2253 -0
  400. package/docs/reference/configuration.md +358 -0
  401. package/docs/reference/data-and-telemetry.md +105 -42
  402. package/docs/reference/workflows.md +647 -0
  403. package/package.json +22 -11
  404. package/schemas/akm-asset-envelope.json +93 -0
  405. package/schemas/akm-config.json +81 -128
  406. package/schemas/akm-workflow.json +74 -73
  407. package/dist/assets/tasks/core/backup.yml +0 -5
  408. package/dist/assets/tasks/graph-refresh-weekly.yml +0 -10
  409. package/dist/cli/config-migrate.js +0 -1806
  410. package/dist/cli/config-validate.js +0 -41
  411. package/dist/commands/backup-cli.js +0 -56
  412. package/dist/commands/bundle/bundle-cli.js +0 -68
  413. package/dist/commands/bundle/bundle.js +0 -219
  414. package/dist/commands/graph/graph-cli.js +0 -124
  415. package/dist/commands/graph/graph.js +0 -489
  416. package/dist/commands/improve/extract-watch.js +0 -140
  417. package/dist/commands/mv-cli.js +0 -1221
  418. package/dist/commands/sources/history.js +0 -201
  419. package/dist/commands/tasks/default-tasks.js +0 -186
  420. package/dist/core/migration-backup.js +0 -1234
  421. package/dist/indexer/usage/unmigrated-vaults-guard.js +0 -95
  422. package/dist/llm/memory-infer-impl.js +0 -138
  423. package/dist/migrate/legacy/config-source-migration.js +0 -223
  424. package/dist/migrate/legacy/content-migration.js +0 -305
  425. package/dist/migrate/legacy/legacy-layout.js +0 -779
  426. package/dist/migrate/legacy/legacy-paths.js +0 -25
  427. package/dist/migrate/legacy/legacy-stash-json.js +0 -72
  428. package/dist/migrate/legacy/proposal-fs-import.js +0 -168
  429. package/dist/migrate/legacy/task-target-ref-migration.js +0 -272
  430. package/dist/migrate/legacy/three-db-cutover.js +0 -841
  431. package/dist/migrate/legacy/workflow-migrations-bodies.js +0 -52
  432. package/dist/migrate/legacy/workflow-migrations-frozen.js +0 -21
  433. package/dist/migrate/legacy-ref-grammar.js +0 -214
  434. package/dist/output/shapes/distill.js +0 -14
  435. package/dist/output/shapes/history.js +0 -11
  436. package/dist/output/text/distill.js +0 -6
  437. package/dist/output/text/enable-disable.js +0 -8
  438. package/dist/output/text/history.js +0 -6
  439. package/dist/registry/build-index.js +0 -382
  440. package/dist/schemas/akm-config.json +0 -4704
  441. package/dist/schemas/akm-task.json +0 -87
  442. package/dist/schemas/akm-workflow.json +0 -372
  443. package/dist/scripts/migrate-storage.js +0 -3816
  444. package/dist/workflows/authoring/workflow-program-template.yaml +0 -31
  445. package/dist/workflows/cli.js +0 -53
  446. package/dist/workflows/exec/brief.js +0 -481
  447. package/dist/workflows/exec/report.js +0 -1460
  448. package/dist/workflows/exec/watch.js +0 -116
  449. package/dist/workflows/program/parser.js +0 -813
  450. package/dist/workflows/program/project.js +0 -104
@@ -16,9 +16,9 @@
16
16
  *
17
17
  * `file-context.ts#runMatchers` (`:242-265`) is async ONLY because of its lazy
18
18
  * `ensureBuiltinsRegistered()` dynamic import; its ARBITRATION is pure and
19
- * synchronous. We reproduce it here by importing the SAME five builtin matcher
19
+ * synchronous. We reproduce it here by importing the SAME four builtin matcher
20
20
  * functions (`matchers.ts` `extensionMatcher` / `directoryMatcher` /
21
- * `parentDirHintMatcher` / `smartMdMatcher` / `workflowProgramMatcher`) in the
21
+ * `parentDirHintMatcher` / `smartMdMatcher`) in the
22
22
  * SAME order they are registered, collecting every non-null
23
23
  * `MatchResult` and picking the winner by **specificity descending, ties broken
24
24
  * by later-registered (higher index) winning** — byte-identical to
@@ -69,10 +69,14 @@
69
69
  * logic, not re-implementing it. Neither is a taxonomy import-cycle (SCC)
70
70
  * participant: `matchers.ts` resolves renderers via `type-presentation.ts`, and
71
71
  * `asset-placement.ts` is a pure leaf (only Node builtins + `recognition-util`).
72
- * Nothing in `src/` imports this adapter back (only the test-only
73
- * `adapters/index.ts` barrel does, and nothing in `src/` imports THAT), so the
74
- * adapter is itself a leaf — verified: `bun scripts/lint-import-cycles.ts` stays
75
- * within baseline and this module is NOT a participant.
72
+ * Nothing in `src/` imports this adapter back except the `adapters/index.ts`
73
+ * barrel — which is NOT test-only: `core/adapter/registry.ts:33` imports it
74
+ * in production for the frozen `BUILTIN_ADAPTERS` list
75
+ * (`installations.ts#detectAdapterId`, `provider-utils.ts#detectStashRoot`).
76
+ * The adapter is still itself a leaf, since neither the barrel nor the
77
+ * registry import anything that imports back into this file — verified: `bun
78
+ * scripts/lint-import-cycles.ts` reports 0 cycle participants and this module
79
+ * is NOT one.
76
80
  */
77
81
  import fs from "node:fs";
78
82
  import path from "node:path";
@@ -115,7 +119,6 @@ const WIKI_INFRA_FILES = new Set(["schema.md", "index.md", "log.md"]);
115
119
  * invariant for sensitive env/secret files holds by construction. Returns `true`
116
120
  * when the `akm` adapter must ABSTAIN (recognize → null):
117
121
  * - an `env/…` `.env` file with a sibling `.sensitive` marker;
118
- * - anything under the frozen legacy `vaults/` dir (the `vault` type is gone);
119
122
  * - a `secrets/` `.sensitive`/`.lock` marker, or a secret with a sibling
120
123
  * `<name>.sensitive` marker;
121
124
  * - a `wikis/<name>/` root-level infra file (schema.md/index.md/log.md).
@@ -132,10 +135,6 @@ function akmStashAbstains(root, absPath) {
132
135
  if (fs.existsSync(absPath.replace(/\.env$/, ".sensitive")))
133
136
  return true;
134
137
  }
135
- // The legacy `vaults/` directory (frozen copy left by the 0.8 migration) is
136
- // never indexed — the `vault` asset type was removed in 0.9.0.
137
- if (segments[0] === "vaults")
138
- return true;
139
138
  // Skip secret files that are themselves a `.sensitive` marker, or that have a
140
139
  // sibling `<name>.sensitive` marker. Secrets are otherwise indexed by name
141
140
  // only (their bytes are never read for classification here).
@@ -190,8 +189,12 @@ const DOCUMENT_JSON_CARRIED_FIELDS = [
190
189
  "wikiRole",
191
190
  "sources",
192
191
  "generation",
193
- "sourceRefs",
194
192
  "evidenceSources",
193
+ // D2 (#730): the OKF v0.2 provenance `promoteProposal` stamps onto AKM-native
194
+ // writes (generated/verified/sources, namespaced — see `types.ts`'s
195
+ // `OkfProvenance` doc). Carried so the akm adapter rereads what it wrote and
196
+ // `akm show` surfaces it, exactly like every other field in this list.
197
+ "provenance",
195
198
  ];
196
199
  /**
197
200
  * Map the fully-assembled `IndexDocument` (produced by the shared metadata
@@ -254,17 +257,12 @@ function recognize(c, file) {
254
257
  const match = recognizeMatch(file);
255
258
  if (match === null)
256
259
  return null;
257
- // canonical name = the winning type's per-type canonical name (§5.1:
258
- // reproduce AssetSpec.toCanonicalName). Fall back to the BASENAME minus its
259
- // extension only if the type's toCanonicalName abstains (e.g. a `skills/x.md`
260
- // flat file, or a `SKILL.md` sitting directly at the skills/ root with no name
261
- // dir). The basename fallback is byte-identical to the pre-0.9.0 flat-walk's
262
- // `?? baseName` fallback (metadata.ts `generateMetadata`), so `entry.name`
263
- // stays the BARE canonical name — never the stash-root-relative path, which
264
- // would re-embed the `<stash-subdir>/` type prefix and double-prefix every
265
- // downstream legacy `type:name` ref (e.g. `skill:skills/x`).
260
+ // Canonical name = the winning type's per-type canonical name (§5.1).
261
+ // Invalid placements are not projected onto a different identity.
266
262
  const derived = deriveCanonicalAssetNameFromStashRoot(match.type, c.root, file.absPath);
267
- const canonicalName = derived ?? path.basename(file.absPath).replace(/\.[^./]+$/, "");
263
+ if (derived === undefined)
264
+ return null;
265
+ const canonicalName = derived;
268
266
  // conceptId = the QUALIFIED `<stash-subdir>/<canonical-name>` spelling
269
267
  // (ref-grammar decision D-R2): the same form `placeNew` consumes, and for
270
268
  // markdown types the OKF concept ID (path − .md). Both branches now feed a
@@ -416,8 +414,8 @@ export const akmAdapter = {
416
414
  id: "akm",
417
415
  version: "0.9.0",
418
416
  // Recognized-extension HINT, derived from what the matchers accept (§6):
419
- // `.md` (markdown types + skill), `.yaml`/`.yml` (workflow programs,
420
- // task YAML), `.env` (env files), and the 16 SCRIPT_EXTENSIONS. This is a
417
+ // `.md` (markdown types + skill), `.yaml`/`.yml` (task YAML), `.env` (env
418
+ // files), and the 16 SCRIPT_EXTENSIONS. This is a
421
419
  // NON-EXHAUSTIVE hint for the akm adapter: recognition is directory-driven
422
420
  // via `recognize()` (e.g. a bare `secrets/<anything>` file with no extension
423
421
  // is a `secret`), so `recognize()` — not this list — is the source of truth.
@@ -484,9 +482,11 @@ export const akmAdapter = {
484
482
  /**
485
483
  * Install-time probe (§1.2), reproducing today's stash-root detection
486
484
  * (`provider-utils.ts#detectStashRoot`/`hasStashDirs`): a root is an AKM
487
- * workspace root when it carries a `.stash` marker directory OR any immediate
488
- * subdirectory named after a placement stash subdir. Pure stat/readdir; a
489
- * missing/unreadable root is not a root.
485
+ * workspace root when it carries a `.stash` marker, multiple native placement
486
+ * directories, or one native directory whose Markdown is absent or
487
+ * declares the matching AKM type. The final check prevents an OKF bundle with
488
+ * an unrelated open type under (for example) `knowledge/` from being claimed
489
+ * by AKM merely because the directory name overlaps.
490
490
  */
491
491
  looksLikeRoot(root) {
492
492
  try {
@@ -504,6 +504,25 @@ export const akmAdapter = {
504
504
  catch {
505
505
  return false;
506
506
  }
507
- return entries.some((entry) => entry.isDirectory() && ownedDirNames.has(entry.name));
507
+ const ownedDirs = entries.filter((entry) => entry.isDirectory() && ownedDirNames.has(entry.name));
508
+ if (ownedDirs.length >= 2)
509
+ return true;
510
+ const only = ownedDirs[0];
511
+ if (!only)
512
+ return false;
513
+ const expectedType = stashDirToType(only.name);
514
+ try {
515
+ const markdown = fs
516
+ .readdirSync(path.join(root, only.name), { withFileTypes: true })
517
+ .find((entry) => entry.isFile() && entry.name.toLowerCase().endsWith(".md"));
518
+ if (!markdown)
519
+ return true;
520
+ const data = parseFrontmatter(fs.readFileSync(path.join(root, only.name, markdown.name), "utf8")).data;
521
+ const declaredType = typeof data.type === "string" ? data.type.trim() : "";
522
+ return !declaredType || declaredType === expectedType;
523
+ }
524
+ catch {
525
+ return true;
526
+ }
508
527
  },
509
528
  };
@@ -41,7 +41,7 @@
41
41
  *
42
42
  * Imported ONLY by `akm-adapter.ts` (no inbound `src/` edge) → can never join a
43
43
  * cycle. It VALUE-imports `parseWorkflow` (already transitively reachable from
44
- * `akm-adapter` via `matchers.ts`) and the PURE predicate `isDangerousVaultKey`
44
+ * `akm-adapter` via `matchers.ts`) and the pure predicate `isDangerousEnvKey`
45
45
  * from `commands/lint/env-key-rules` — the predicate is imported, not copied,
46
46
  * precisely so the 40+ security-sensitive dangerous-key names cannot drift from
47
47
  * the canonical set; importing it is ratchet-neutral (verified: 18). The small
@@ -51,14 +51,17 @@
51
51
  * adapter.
52
52
  */
53
53
  import path from "node:path";
54
- import { isDangerousVaultKey } from "../../../commands/lint/env-key-rules.js";
54
+ import { isDangerousEnvKey } from "../../../commands/lint/env-key-rules.js";
55
+ import { taskFieldProblems } from "../../../tasks/schema.js";
56
+ import { compileWorkflowPlan } from "../../../workflows/ir/compile.js";
55
57
  import { parseWorkflow } from "../../../workflows/parser.js";
58
+ import { conceptIdForStashFile } from "../../asset/resolve-ref.js";
56
59
  /** Recommended `category` values for facts — `commands/lint/fact-linter.ts:9`. */
57
60
  const KNOWN_CATEGORIES = new Set(["personal", "team", "project", "convention", "meta"]);
58
61
  /** Placeholder markers a workflow stub carries — `commands/lint/workflow-linter.ts:10`. */
59
62
  const PLACEHOLDER_STRINGS = ["Describe what this workflow accomplishes", "Example Workflow"];
60
63
  /** Inline suppression token — `commands/lint/env-key-rules.ts:138` (not exported there; reproduced verbatim). */
61
- const SUPPRESSION_COMMENT = "# akm-lint-ok: dangerous-vault-key";
64
+ const SUPPRESSION_COMMENT = "# akm-lint-ok: dangerous-env-key";
62
65
  // ── BaseLinter protected-method ports (base-linter.ts:520-551) ───────────────
63
66
  /** Port of `BaseLinter.checkMissingNameOrType` (`:520-527`). */
64
67
  function checkMissingNameOrType(data, frontmatter) {
@@ -149,10 +152,14 @@ function collectSuppressedKeys(raw) {
149
152
  return suppressed;
150
153
  }
151
154
  /**
152
- * env/secret dangerous-key scan (`lint/index.ts:191-218` + `env-key-rules.ts#checkVaultForDangerousKeys`),
155
+ * env/secret dangerous-key scan (`lint/index.ts:191-218` + `env-key-rules.ts#checkEnvForDangerousKeys`),
153
156
  * keyed on `type` and preserving the `.env`-suffix narrowness (see file header).
154
- * Reads the overlay `raw`, not disk. `type`==="env" ⇒ ref prefix `env:`;
155
- * `type`==="secret" ⇒ `secret:` (`lint/index.ts:201-204`).
157
+ * Reads the overlay `raw`, not disk.
158
+ *
159
+ * The emitted `Ref:` comes from `conceptIdForStashFile` — the one place that
160
+ * spells a diagnostic ref the way `akm show` accepts it. It used to be
161
+ * hand-built as `env:<base>` / `secret:<base>`, a colon grammar the 0.9.0 ref
162
+ * parser rejects outright — a dead-end ref on a *security* finding.
156
163
  */
157
164
  export function dangerousEnvKeyDiagnostics(type, relPath, raw) {
158
165
  if (type !== "env" && type !== "secret")
@@ -160,20 +167,19 @@ export function dangerousEnvKeyDiagnostics(type, relPath, raw) {
160
167
  const baseNameWithExt = path.basename(relPath);
161
168
  if (!baseNameWithExt.endsWith(".env"))
162
169
  return []; // NARROWNESS: collectEnvFiles only visits *.env
163
- const refPrefix = type === "env" ? "env" : "secret";
164
- const baseName = path.basename(relPath, ".env");
165
- const ref = baseName === "" ? `${refPrefix}:.env` : `${refPrefix}:${baseName}`;
170
+ // `relPath` is already stash-root-relative, so "." IS the stash root here.
171
+ const ref = conceptIdForStashFile(type, ".", relPath);
166
172
  const keys = scanKeys(raw);
167
173
  const suppressed = collectSuppressedKeys(raw);
168
174
  const diagnostics = [];
169
175
  for (const key of keys) {
170
- if (!isDangerousVaultKey(key))
176
+ if (!isDangerousEnvKey(key))
171
177
  continue;
172
178
  if (suppressed.has(key))
173
179
  continue;
174
180
  diagnostics.push({
175
181
  file: relPath,
176
- issue: "dangerous-vault-key",
182
+ issue: "dangerous-env-key",
177
183
  detail: `Env key \`${key}\` can be used to hijack process execution when injected via \`akm env run\`. Ref: ${ref}. Review this file before running \`akm env run\` commands against untrusted stashes. (suppress with: ${SUPPRESSION_COMMENT} on previous line)`,
178
184
  fixed: false,
179
185
  });
@@ -221,10 +227,7 @@ export async function perTypeValidateChecks(args) {
221
227
  case "task":
222
228
  return taskDiagnostics(relPath, data);
223
229
  case "workflow":
224
- // WorkflowLinter only ever sees `.md` in production (collectMarkdownFiles
225
- // filters `.md`); YAML programs are not a lint path (lint golden pins the
226
- // workflow-program via parseWorkflowProgram, not a linter). So the extra
227
- // checks apply to markdown workflows only.
230
+ // Unified workflows are markdown-only; other extensions are not a lint path.
228
231
  return ext === ".md" ? workflowDiagnostics(relPath, raw, body) : [];
229
232
  case "memory":
230
233
  return memoryDiagnostics(relPath, data, body, ctx);
@@ -261,17 +264,16 @@ export function factDiagnostics(relPath, data) {
261
264
  }
262
265
  return [];
263
266
  }
264
- /** TaskLinter extra check (`task-linter.ts:25-58`). `data` is the parsed YAML. */
267
+ /**
268
+ * TaskLinter extra check (`task-linter.ts:25-58`). `data` is the parsed YAML.
269
+ * Field rules come from the shared {@link taskFieldProblems} (see its doc for
270
+ * the lint-vs-parser reconciliation story); this sweep additionally requires
271
+ * at least one target.
272
+ */
265
273
  export function taskDiagnostics(relPath, data) {
266
274
  if (data === null || Object.keys(data).length === 0)
267
275
  return [];
268
- const missing = [];
269
- if (!("schedule" in data) || typeof data.schedule !== "string" || data.schedule.trim() === "") {
270
- missing.push("schedule");
271
- }
272
- if (!("enabled" in data) || typeof data.enabled !== "boolean") {
273
- missing.push("enabled (must be a boolean)");
274
- }
276
+ const missing = taskFieldProblems(data);
275
277
  const hasTarget = "prompt" in data || "workflow" in data || "command" in data;
276
278
  if (!hasTarget)
277
279
  missing.push("prompt, workflow, or command");
@@ -298,8 +300,9 @@ export function matchWorkflowPlaceholder(body) {
298
300
  }
299
301
  /**
300
302
  * WorkflowLinter's `invalid-workflow-structure` check (`workflow-linter.ts:48-77`):
301
- * re-parse via `parseWorkflow` and surface every structural error, skipping the
302
- * read-only `/.cache/`+`/registry/` cached copies. Shared with the live linter;
303
+ * parse and compile through the unified workflow frontend, surfacing every
304
+ * structural or semantic error and skipping the read-only `/.cache/`+`/registry/`
305
+ * cached copies. Shared with the live linter;
303
306
  * `parsePath` is the path handed to `parseWorkflow` (the adapter passes the
304
307
  * change relPath, the CLI passes the absolute filePath — matching each caller's
305
308
  * legacy behavior). NEVER writes.
@@ -319,6 +322,18 @@ export function workflowStructureDiagnostics(relPath, raw, parsePath) {
319
322
  fixed: false,
320
323
  });
321
324
  }
325
+ return diagnostics;
326
+ }
327
+ const compiled = compileWorkflowPlan(result.document, path.basename(parsePath, path.extname(parsePath)));
328
+ if (!compiled.ok) {
329
+ for (const err of compiled.errors) {
330
+ diagnostics.push({
331
+ file: relPath,
332
+ issue: "invalid-workflow-structure",
333
+ detail: err.message,
334
+ fixed: false,
335
+ });
336
+ }
322
337
  }
323
338
  }
324
339
  catch (e) {
@@ -334,8 +349,8 @@ export function workflowStructureDiagnostics(relPath, raw, parsePath) {
334
349
  /**
335
350
  * WorkflowLinter extra checks (`workflow-linter.ts:22-79`), READ-ONLY:
336
351
  * `placeholder-stub` is NEVER deleted here (validate MUST NOT write) — emitted
337
- * as a non-fixable Diagnostic. `invalid-workflow-structure` re-parses via
338
- * `parseWorkflow` over the whole `raw` (mirroring `parseWorkflow(ctx.raw, …)`).
352
+ * as a non-fixable Diagnostic. `invalid-workflow-structure` parses and compiles
353
+ * the whole `raw` through the unified workflow frontend.
339
354
  */
340
355
  function workflowDiagnostics(relPath, raw, body) {
341
356
  const diagnostics = [];
@@ -4,7 +4,7 @@
4
4
  /**
5
5
  * Index-time metadata fold for the `akm` adapter's `recognize` — akm 0.9.0
6
6
  * chunk-2, WI-C, implementing spec §2 ("the nine index-time metadata
7
- * contributors move into recognize") + the 2 workflow contributors.
7
+ * contributors move into recognize") + the workflow contributor.
8
8
  *
9
9
  * This leaf reproduces the 11 `registerMetadataContributor` sites keyed on the
10
10
  * winning RENDERER name (exactly how each contributor's `appliesTo({ rendererName })`
@@ -14,8 +14,7 @@
14
14
  * lesson-frontmatter-metadata, memory-frontmatter-metadata,
15
15
  * script-comment-metadata, env-file-metadata, secret-file-metadata,
16
16
  * task-yaml-metadata, session-md-metadata, fact-md-metadata;
17
- * - `workflows/renderer.ts` (2): workflow-document-metadata (workflow-md),
18
- * workflow-program-metadata (workflow-program-yaml).
17
+ * - `workflows/renderer.ts` (1): workflow-document-metadata (workflow-md).
19
18
  *
20
19
  * ── Cycle-safety (chunk-2 ratchet, baseline 18) ──
21
20
  *
@@ -58,8 +57,6 @@ import fs from "node:fs";
58
57
  import { parse as parseYaml } from "yaml";
59
58
  import { listKeys } from "../../../commands/env/env.js";
60
59
  import { parseWorkflow } from "../../../workflows/parser.js";
61
- import { parseWorkflowProgram } from "../../../workflows/program/parser.js";
62
- import { programStepInstructions, projectProgramParameters } from "../../../workflows/program/project.js";
63
60
  import { parseFrontmatter } from "../../asset/frontmatter.js";
64
61
  import { parseMarkdownToc } from "../../asset/markdown.js";
65
62
  import { nonEmptyString } from "./shared.js";
@@ -312,20 +309,23 @@ export function foldRecognizedMetadata(rendererName, file) {
312
309
  return out;
313
310
  const doc = result.document;
314
311
  const hints = new Set();
315
- hints.add(doc.title);
312
+ if (doc.preamble)
313
+ hints.add(doc.preamble);
316
314
  for (const step of doc.steps) {
317
- hints.add(step.title);
318
315
  hints.add(step.id);
319
- hints.add(step.instructions.text);
320
- for (const criterion of step.completionCriteria ?? [])
321
- hints.add(criterion.text);
316
+ if (step.instructions)
317
+ hints.add(step.instructions.text);
318
+ if (step.gateRubric)
319
+ hints.add(step.gateRubric.text);
322
320
  }
323
321
  out.searchHints = Array.from(hints).filter(Boolean);
324
- if (doc.parameters?.length) {
325
- out.parameters = doc.parameters.map((p) => ({
326
- name: p.name,
327
- ...(p.description ? { description: p.description } : {}),
328
- }));
322
+ if (doc.params) {
323
+ const parameters = Object.entries(doc.params).map(([name, schema]) => {
324
+ const description = schema.description;
325
+ return { name, ...(typeof description === "string" && description ? { description } : {}) };
326
+ });
327
+ if (parameters.length)
328
+ out.parameters = parameters;
329
329
  }
330
330
  }
331
331
  catch {
@@ -333,35 +333,6 @@ export function foldRecognizedMetadata(rendererName, file) {
333
333
  }
334
334
  return out;
335
335
  }
336
- // ── workflow-program-metadata (workflow-program-yaml) ──
337
- case "workflow-program-yaml": {
338
- try {
339
- const result = parseWorkflowProgram(file.content(), { path: file.relPath });
340
- if (!result.ok)
341
- return out;
342
- const program = result.program;
343
- const hints = new Set();
344
- hints.add(program.name);
345
- for (const step of program.steps) {
346
- hints.add(step.id);
347
- if (step.title)
348
- hints.add(step.title);
349
- hints.add(programStepInstructions(step));
350
- for (const criterion of step.gate?.criteria ?? [])
351
- hints.add(criterion);
352
- }
353
- out.searchHints = Array.from(hints).filter(Boolean);
354
- if (!out.description && program.description)
355
- out.description = program.description;
356
- const parameters = projectProgramParameters(program);
357
- if (parameters?.length)
358
- out.parameters = parameters;
359
- }
360
- catch {
361
- // See file header: broken programs drop at drain time, not here.
362
- }
363
- return out;
364
- }
365
336
  default:
366
337
  // No contributor applies to this renderer (e.g. skill-md/command-md/
367
338
  // agent-md — the static-only mappings carry no metadata contributor).
@@ -12,11 +12,13 @@
12
12
  *
13
13
  * ── validate (spec §6 task validation column) ──
14
14
  *
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.
15
+ * A task must declare `version: 2`, a `schedule`, and EXACTLY ONE target
16
+ * (`prompt` XOR `workflow` XOR `command`). `enabled` is OPTIONAL — the parser
17
+ * defaults it to `true`, so an omitted field means an ACTIVE task — but must
18
+ * be a boolean when present. The akm adapter's `TaskLinter` port checks
19
+ * "at least one" target; the native task family here is STRICTER — declaring
20
+ * two targets is `invalid-task-yaml`. So this adapter owns a purpose-built
21
+ * one-target check rather than reusing that port.
20
22
  *
21
23
  * Conformance oracle (authored, DO NOT modify): fixture
22
24
  * `tests/fixtures/bundles/akm-task/` + goldens
@@ -25,6 +27,7 @@
25
27
  import fs from "node:fs";
26
28
  import path from "node:path";
27
29
  import { parse as parseYaml } from "yaml";
30
+ import { taskFieldProblems } from "../../../tasks/schema.js";
28
31
  import { hashContent } from "./shared.js";
29
32
  /** A native task bundle is single-component; its one component is `main`. */
30
33
  const COMPONENT_ID = "main";
@@ -68,15 +71,15 @@ function parseTaskYaml(raw) {
68
71
  }
69
72
  return {};
70
73
  }
71
- /** The native `invalid-task-yaml` check: schedule + enabled(boolean) + EXACTLY ONE target. */
74
+ /**
75
+ * The native `invalid-task-yaml` check: the shared field rules
76
+ * ({@link taskFieldProblems} — see its doc for the lint-vs-parser
77
+ * reconciliation story) plus this adapter's stricter EXACTLY-ONE-target rule.
78
+ */
72
79
  function taskDiagnostics(relPath, data) {
73
80
  if (Object.keys(data).length === 0)
74
81
  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)");
82
+ const problems = taskFieldProblems(data);
80
83
  const targets = TARGET_KEYS.filter((k) => k in data && data[k] !== undefined && data[k] !== null);
81
84
  if (targets.length === 0)
82
85
  problems.push("exactly one target (prompt, workflow, or command)");
@@ -120,8 +123,7 @@ export const akmTaskAdapter = {
120
123
  /**
121
124
  * Install-time probe (§1.2): a root holding a top-level `.yml` file that
122
125
  * 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.
126
+ * from non-task YAML.
125
127
  */
126
128
  looksLikeRoot(root) {
127
129
  let entries;