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
@@ -5,58 +5,22 @@
5
5
  * Plain-text renderers for `akm workflow *` commands.
6
6
  *
7
7
  * Split out of `helpers.ts` (formerly 1418 lines / 59 fns) as its own
8
- * sibling module: the workflow run/step/status/brief renderers form a
8
+ * sibling module: the workflow list/status/run/create/resume renderers form a
9
9
  * cohesive, self-contained cluster (they call only each other, never
10
10
  * formatters from other domains).
11
11
  */
12
- export function formatWorkflowValidatePlain(r) {
13
- const ok = r.ok !== false;
14
- const pathValue = String(r.path ?? "?");
15
- if (!ok)
16
- return `workflow validate: failed (${pathValue})`;
17
- const title = typeof r.title === "string" ? r.title : "";
18
- const stepCount = typeof r.stepCount === "number" ? r.stepCount : 0;
19
- const lines = [`workflow validate: ok — ${title || pathValue} (${stepCount} step(s))`];
20
- // Non-fatal advisories: clearly marked, printed after the ok line so `ok`
21
- // is never in doubt. Absent/empty for markdown and fully-typed programs.
22
- const warnings = Array.isArray(r.warnings) ? r.warnings : [];
23
- if (warnings.length > 0) {
24
- lines.push(` ${warnings.length} warning(s):`);
25
- for (const w of warnings) {
26
- const line = typeof w.line === "number" ? w.line : "?";
27
- lines.push(` warning: ${pathValue}:${line} — ${String(w.message ?? "")}`);
28
- }
29
- }
30
- return lines.join("\n");
31
- }
32
- /**
33
- * Plain-text rendering for a step-completion that was rejected by the
34
- * summary-validation gate (#506): the step stays pending and the agent gets
35
- * corrective feedback on what to finish/fix.
36
- */
37
- export function formatWorkflowCompleteRejectedPlain(r) {
38
- const stepId = String(r.stepId ?? "?");
39
- const feedback = typeof r.feedback === "string" ? r.feedback : "";
40
- const missing = Array.isArray(r.missing) ? r.missing.map((m) => String(m)) : [];
41
- const lines = [`workflow complete: rejected — step "${stepId}" does not meet its completion criteria`];
42
- if (feedback)
43
- lines.push(` feedback: ${feedback}`);
44
- if (missing.length > 0) {
45
- lines.push(" outstanding:");
46
- for (const m of missing)
47
- lines.push(` - ${m}`);
48
- }
49
- return lines.join("\n");
50
- }
51
12
  export function formatWorkflowListPlain(result) {
52
13
  const runs = Array.isArray(result.runs) ? result.runs : [];
53
14
  if (runs.length === 0) {
54
- return "No workflow runs in the current working scope. Start one with `akm workflow next workflows/<name>` or author one with `akm workflow create <name>`.";
15
+ return "No workflow runs in the current working scope. Start one with `akm workflow run workflows/<name>` or author one with `akm workflow create <name>`.";
55
16
  }
56
17
  return runs
57
18
  .map((run) => {
58
19
  const id = typeof run.id === "string" ? run.id : "unknown";
59
- const ref = typeof run.workflowRef === "string" ? run.workflowRef : "workflow:unknown";
20
+ // Fallback matches the `id`/`status` convention just below (plain
21
+ // "unknown", not a `type:name`-shaped placeholder — that shape reads as
22
+ // a ref in the dead colon grammar, which this fallback must not model).
23
+ const ref = typeof run.workflowRef === "string" ? run.workflowRef : "unknown";
60
24
  const status = typeof run.status === "string" ? run.status : "unknown";
61
25
  const currentStep = typeof run.currentStepId === "string" ? ` (current: ${run.currentStepId})` : "";
62
26
  return `${id} ${ref} [${status}]${currentStep}`;
@@ -71,7 +35,7 @@ export function formatWorkflowStatusPlain(result) {
71
35
  if (!run || !workflow)
72
36
  return null;
73
37
  const lines = [
74
- `workflow: ${String(workflow.ref ?? "workflow:unknown")}`,
38
+ `workflow: ${String(workflow.ref ?? "unknown")}`,
75
39
  `run: ${String(run.id ?? "unknown")}`,
76
40
  `title: ${String(run.workflowTitle ?? workflow.title ?? "Workflow")}`,
77
41
  `status: ${String(run.status ?? "unknown")}`,
@@ -106,8 +70,8 @@ export function formatWorkflowStatusPlain(result) {
106
70
  const suffix = attempts !== undefined && attempts > 1 ? `, attempt ${attempts}` : "";
107
71
  lines.push(` - ${id} [${node}] (${status}${suffix})`);
108
72
  // Codex round-3 finding B: a `running` claim gone silent past the check-in
109
- // window — the driver likely died. Surface it (with the claim holder) so a
110
- // human can reclaim/re-run the unit, matching what `brief` reports.
73
+ // window — the process holding it likely died. Surface it (with the claim
74
+ // holder) so a human can reclaim/re-run the unit.
111
75
  if (unit.stale === true) {
112
76
  const holder = typeof unit.claimHolder === "string" && unit.claimHolder.trim() ? ` claimed by ${unit.claimHolder}` : "";
113
77
  lines.push(` stale: claim went silent past the check-in window${holder} — its driver may have died`);
@@ -134,7 +98,7 @@ export function formatWorkflowStatusPlain(result) {
134
98
  }
135
99
  /**
136
100
  * Render the stalled-run check-in directive (#506) when present on a
137
- * workflow-next/status result. Returns null when the run is healthy.
101
+ * workflow-status result. Returns null when the run is healthy.
138
102
  */
139
103
  function formatWorkflowCheckinLine(result) {
140
104
  const checkin = typeof result.checkin === "object" && result.checkin !== null
@@ -144,52 +108,16 @@ function formatWorkflowCheckinLine(result) {
144
108
  return null;
145
109
  return checkin.directive.trim();
146
110
  }
147
- export function formatWorkflowNextPlain(result) {
148
- const base = formatWorkflowStatusPlain(result);
149
- const step = typeof result.step === "object" && result.step !== null ? result.step : undefined;
150
- if (!step)
151
- return base;
152
- const lines = base ? [base, "", "next:"] : ["next:"];
153
- lines.push(` ${String(step.title ?? "Untitled step")} [${String(step.id ?? "unknown")}]`);
154
- if (typeof step.instructions === "string" && step.instructions.trim()) {
155
- const instrLines = step.instructions.trim().split("\n");
156
- lines.push(` instructions: ${instrLines[0]}`);
157
- for (const instrLine of instrLines.slice(1))
158
- lines.push(` ${instrLine}`);
159
- }
160
- const completion = Array.isArray(step.completionCriteria) ? step.completionCriteria : [];
161
- if (completion.length > 0) {
162
- lines.push(" completion:");
163
- for (const criterion of completion) {
164
- lines.push(` - ${String(criterion)}`);
165
- }
166
- }
167
- // T2-3: surface run-id as labeled field
168
- const run = typeof result.run === "object" && result.run !== null ? result.run : undefined;
169
- const runId = typeof run?.id === "string" ? run.id : null;
170
- const stepId = typeof step?.id === "string" ? step.id : null;
171
- if (runId) {
172
- lines.push("");
173
- lines.push(`runId: ${runId}`);
174
- }
175
- // T1-6: complete command
176
- if (runId && stepId) {
177
- lines.push("");
178
- lines.push("COMPLETE THIS STEP:");
179
- lines.push(` akm workflow complete '${runId}' --step '${stepId}'`);
180
- }
181
- else if (runId) {
182
- lines.push("");
183
- lines.push("COMPLETE THIS STEP:");
184
- lines.push(` akm workflow complete '${runId}' --step '<step-id>'`);
185
- }
186
- return lines.join("\n");
187
- }
188
111
  export function formatWorkflowRunPlain(result) {
189
112
  const run = typeof result.run === "object" && result.run !== null ? result.run : undefined;
190
113
  if (!run)
191
114
  return null;
192
115
  const lines = [`run: ${String(run.id ?? "unknown")}`, `status: ${String(run.status ?? "unknown")}`];
116
+ // Creation-time notices (e.g. the implicit engine fallback) must survive the
117
+ // text renderer: JSON/YAML pass them through, and dropping them here would
118
+ // hide the announcement from the DEFAULT output mode — where it matters most.
119
+ for (const warning of Array.isArray(result.warnings) ? result.warnings : [])
120
+ lines.push(`! ${String(warning)}`);
193
121
  const executed = Array.isArray(result.executed) ? result.executed : [];
194
122
  if (executed.length === 0) {
195
123
  lines.push("executed: (no steps — run was already done or blocked)");
@@ -214,127 +142,20 @@ export function formatWorkflowRunPlain(result) {
214
142
  for (const item of missing)
215
143
  lines.push(` missing: ${String(item)}`);
216
144
  }
145
+ if (result.aborted === true) {
146
+ lines.push(result.timedOut === true
147
+ ? "workflow timed out; the run remains resumable."
148
+ : "workflow interrupted; the run remains resumable.");
149
+ }
217
150
  if (result.done === true)
218
151
  lines.push("workflow completed.");
219
152
  return lines.join("\n");
220
153
  }
221
- export function formatWorkflowBriefPlain(result) {
222
- const run = typeof result.run === "object" && result.run !== null ? result.run : undefined;
223
- if (!run)
224
- return null;
225
- const lines = [];
226
- lines.push(`# Workflow brief: ${String(run.id ?? "unknown")}`);
227
- lines.push(`workflow: ${String(run.workflowRef ?? "?")} (${String(run.workflowTitle ?? "")})`);
228
- lines.push(`status: ${String(run.status ?? "?")}`);
229
- if (typeof result.message === "string")
230
- lines.push(result.message);
231
- const lease = typeof result.engineLease === "object" && result.engineLease !== null
232
- ? result.engineLease
233
- : undefined;
234
- if (lease) {
235
- const live = lease.live === true ? "LIVE" : "expired";
236
- lines.push(`engine lease: ${String(lease.holder ?? "?")} (until ${String(lease.until ?? "?")}) [${live}]`);
237
- }
238
- const warnings = Array.isArray(result.warnings) ? result.warnings : [];
239
- for (const w of warnings)
240
- lines.push(`! ${String(w)}`);
241
- if (result.done === true) {
242
- lines.push("");
243
- lines.push("This run is completed — no work remains.");
244
- return lines.join("\n");
245
- }
246
- const step = typeof result.step === "object" && result.step !== null ? result.step : undefined;
247
- if (!step) {
248
- return lines.join("\n");
249
- }
250
- const gate = typeof step.gate === "object" && step.gate !== null ? step.gate : undefined;
251
- lines.push("");
252
- lines.push(`## Active step: ${String(step.stepId ?? "?")} — ${String(step.title ?? "")} [${String(step.kind ?? "execute")}]`);
253
- if (gate) {
254
- const criteria = Array.isArray(gate.criteria) ? gate.criteria : [];
255
- lines.push(`gate: loop ${String(gate.currentLoop ?? 1)} of max ${String(gate.maxLoops ?? 1)}` +
256
- (criteria.length > 0 ? `; criteria: ${criteria.map(String).join("; ")}` : "; no completion criteria") +
257
- (gate.judgesArtifact === true ? " (artifact-judged)" : ""));
258
- }
259
- if (step.outputSchema !== undefined)
260
- lines.push("outputSchema: declared (see JSON output)");
261
- const feedback = typeof result.gateFeedback === "object" && result.gateFeedback !== null
262
- ? result.gateFeedback
263
- : undefined;
264
- if (feedback) {
265
- lines.push(`gate feedback (previous loop rejected): ${String(feedback.feedback ?? "")}`);
266
- const missing = Array.isArray(feedback.missing) ? feedback.missing : [];
267
- for (const m of missing)
268
- lines.push(` - missing: ${String(m)}`);
269
- }
270
- const route = typeof result.route === "object" && result.route !== null ? result.route : undefined;
271
- if (route) {
272
- lines.push("");
273
- lines.push(`## Route contract on ${String(route.input ?? "?")}`);
274
- const when = typeof route.when === "object" && route.when !== null ? route.when : {};
275
- for (const [value, target] of Object.entries(when))
276
- lines.push(` when "${value}" → ${String(target)}`);
277
- if (route.defaultStepId !== undefined)
278
- lines.push(` default → ${String(route.defaultStepId)}`);
279
- const decision = typeof route.decision === "object" && route.decision !== null
280
- ? route.decision
281
- : undefined;
282
- if (decision)
283
- lines.push(` decision NOW: value "${String(decision.value)}" → ${String(decision.selected)}`);
284
- else if (typeof route.decisionError === "string")
285
- lines.push(` decision error: ${route.decisionError}`);
286
- else
287
- lines.push(" decision: pending this step's output (evaluated after units complete)");
288
- }
289
- const workList = typeof result.workList === "object" && result.workList !== null
290
- ? result.workList
291
- : undefined;
292
- const units = workList && Array.isArray(workList.units) ? workList.units : [];
293
- if (workList?.error) {
294
- lines.push("");
295
- lines.push(`work-list error: ${String(workList.error)}`);
296
- }
297
- else if (units.length > 0) {
298
- lines.push("");
299
- lines.push(`## Units (${units.length})`);
300
- for (const u of units) {
301
- const model = u.model ? ` model=${String(u.model)}` : "";
302
- const journaled = typeof u.journaled === "object" && u.journaled !== null ? u.journaled : undefined;
303
- const jstatus = journaled ? ` [journaled: ${String(journaled.status)}]` : "";
304
- lines.push(`- ${String(u.unitId)} (runner=${String(u.runner)}${model})${jstatus}`);
305
- const env = Array.isArray(u.env) ? u.env : [];
306
- if (env.length > 0)
307
- lines.push(` env (names): ${env.map(String).join(", ")}`);
308
- if (u.outputSchema !== undefined)
309
- lines.push(" outputSchema: declared (see JSON output)");
310
- const resolved = typeof u.resolved === "object" && u.resolved !== null ? u.resolved : undefined;
311
- if (resolved && resolved.ok === false)
312
- lines.push(` RESOLUTION ERROR: ${String(resolved.error)}`);
313
- if (typeof u.report === "string")
314
- lines.push(` report: ${u.report}`);
315
- }
316
- }
317
- // Finding D: a non-dispatching step (route-only / empty / all-unresolvable)
318
- // advances via the `--settle` verb, surfaced so a driver can advance the spine.
319
- if (typeof result.settleCommand === "string") {
320
- lines.push("");
321
- lines.push("## Advance (no reportable units)");
322
- lines.push(`settle: ${result.settleCommand}`);
323
- }
324
- const guidance = typeof result.reportGuidance === "object" && result.reportGuidance !== null
325
- ? result.reportGuidance
326
- : undefined;
327
- if (guidance) {
328
- lines.push("");
329
- lines.push("## Reporting");
330
- if (typeof guidance.checkin === "string")
331
- lines.push(`heartbeat: ${guidance.checkin}`);
332
- if (typeof guidance.failure === "string")
333
- lines.push(`on failure: ${guidance.failure}`);
334
- }
335
- return lines.join("\n");
336
- }
337
154
  export function formatWorkflowCreatePlain(r) {
155
+ // `workflow create --print`: no file is written, just the template text
156
+ // (dropped `workflow template`'s output, moved onto this shape).
157
+ if (typeof r.template === "string")
158
+ return r.template;
338
159
  if (r.ref && r.path) {
339
160
  return `Created ${String(r.ref)} at ${String(r.path)}`;
340
161
  }
@@ -2,18 +2,12 @@
2
2
  // License, v. 2.0. If a copy of the MPL was not distributed with this
3
3
  // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
4
  // Output text formatters for all `akm workflow *` commands.
5
- import { formatWorkflowBriefPlain, formatWorkflowCompleteRejectedPlain, formatWorkflowCreatePlain, formatWorkflowListPlain, formatWorkflowNextPlain, formatWorkflowResumePlain, formatWorkflowRunPlain, formatWorkflowStatusPlain, formatWorkflowValidatePlain, } from "./helpers.js";
5
+ import { formatWorkflowCreatePlain, formatWorkflowListPlain, formatWorkflowResumePlain, formatWorkflowRunPlain, formatWorkflowStatusPlain, } from "./helpers.js";
6
6
  export const workflowFormatters = [
7
- { command: "workflow-start", handler: (r) => formatWorkflowStatusPlain(r) },
8
7
  { command: "workflow-status", handler: (r) => formatWorkflowStatusPlain(r) },
9
- { command: "workflow-complete", handler: (r) => formatWorkflowStatusPlain(r) },
10
- { command: "workflow-complete-rejected", handler: (r) => formatWorkflowCompleteRejectedPlain(r) },
11
- { command: "workflow-next", handler: (r) => formatWorkflowNextPlain(r) },
12
8
  { command: "workflow-list", handler: (r) => formatWorkflowListPlain(r) },
13
9
  { command: "workflow-create", handler: (r) => formatWorkflowCreatePlain(r) },
14
- { command: "workflow-validate", handler: (r) => formatWorkflowValidatePlain(r) },
15
10
  { command: "workflow-resume", handler: (r) => formatWorkflowResumePlain(r) },
16
11
  { command: "workflow-abandon", handler: (r) => formatWorkflowStatusPlain(r) },
17
12
  { command: "workflow-run", handler: (r) => formatWorkflowRunPlain(r) },
18
- { command: "workflow-brief", handler: (r) => formatWorkflowBriefPlain(r) },
19
13
  ];
@@ -2,37 +2,33 @@
2
2
  // License, v. 2.0. If a copy of the MPL was not distributed with this
3
3
  // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
4
  import { addFormatters } from "./text/add.js";
5
+ import { bundleCreateFormatters } from "./text/bundle-create.js";
6
+ import { bundleShowFormatters } from "./text/bundle-show.js";
5
7
  import { cloneFormatters } from "./text/clone.js";
6
8
  import { configFormatters } from "./text/config.js";
7
9
  import { curateFormatters } from "./text/curate.js";
8
- import { distillFormatters } from "./text/distill.js";
9
- import { enableDisableFormatters } from "./text/enable-disable.js";
10
10
  import { envFormatters } from "./text/env.js";
11
11
  import { eventsFormatters } from "./text/events.js";
12
12
  import { feedbackFormatters } from "./text/feedback.js";
13
- import { historyFormatters } from "./text/history.js";
13
+ import { healthFormatters } from "./text/health.js";
14
14
  import { importFormatters } from "./text/import.js";
15
15
  import { indexFormatters } from "./text/index.js";
16
16
  import { infoFormatters } from "./text/info.js";
17
- import { initFormatters } from "./text/init.js";
17
+ import { lintFormatters } from "./text/lint.js";
18
18
  import { listFormatters } from "./text/list.js";
19
+ import { migrateFormatters } from "./text/migrate.js";
19
20
  import { proposalProducerFormatters } from "./text/proposal/producer.js";
20
21
  import { proposalFormatters } from "./text/proposal/proposal.js";
21
22
  import { getTextFormatterHandler, registerTextFormatters } from "./text/registry.js";
22
23
  import { registryCommandFormatters } from "./text/registry-commands.js";
23
24
  import { rememberFormatters } from "./text/remember.js";
24
25
  import { removeFormatters } from "./text/remove.js";
25
- import { saveFormatters } from "./text/save.js";
26
26
  import { searchFormatters } from "./text/search.js";
27
27
  import { showFormatters } from "./text/show.js";
28
+ import { syncFormatters } from "./text/sync.js";
28
29
  import { updateFormatters } from "./text/update.js";
29
30
  import { upgradeFormatters } from "./text/upgrade.js";
30
31
  import { workflowFormatters } from "./text/workflow.js";
31
- // Re-export helpers so existing imports from `text.ts` keep working.
32
- export { formatAddPlain, formatClonePlain, formatConfigPlain, formatCuratePlain, formatDistillPlain, formatEventLine, formatEventsPlain, formatFeedbackPlain, formatHistoryPlain, formatImportPlain, formatIndexPlain, formatInfoPlain, formatInitPlain, formatListPlain, formatProposalAcceptPlain, formatProposalDiffPlain, formatProposalListPlain, formatProposalProducerPlain, formatProposalRejectPlain, formatProposalShowPlain, formatRegistryAddPlain, formatRegistryBuildIndexPlain, formatRegistryListPlain, formatRegistryRemovePlain, formatRegistrySearchPlain, formatRememberPlain, formatRemovePlain, formatSavePlain, formatSearchPlain, formatShowPlain, formatToggleComponentPlain, formatUpdatePlain, formatUpgradePlain, formatWorkflowCreatePlain, formatWorkflowListPlain, formatWorkflowNextPlain, formatWorkflowResumePlain, formatWorkflowStatusPlain, formatWorkflowValidatePlain, } from "./text/helpers.js";
33
- // Re-export registry API so callers can use this module as the single entry
34
- // point (backward compat).
35
- export { deregisterTextFormatter, registerTextFormatter } from "./text/registry.js";
36
32
  // ── Explicit built-in formatter assembly ──────────────────────────────────────
37
33
  // Each entry below is a pure exported `TextFormatterEntry[]` from a per-command
38
34
  // module. The set is registered ONCE, deterministically, with no reliance on
@@ -40,7 +36,8 @@ export { deregisterTextFormatter, registerTextFormatter } from "./text/registry.
40
36
  // and because each name is referenced statically, a deleted export fails to
41
37
  // compile instead of silently disappearing at runtime.
42
38
  const BUILT_IN_TEXT_FORMATTERS = [
43
- ...initFormatters,
39
+ ...bundleCreateFormatters,
40
+ ...bundleShowFormatters,
44
41
  ...indexFormatters,
45
42
  ...showFormatters,
46
43
  ...searchFormatters,
@@ -52,20 +49,20 @@ const BUILT_IN_TEXT_FORMATTERS = [
52
49
  ...updateFormatters,
53
50
  ...upgradeFormatters,
54
51
  ...cloneFormatters,
55
- ...historyFormatters,
56
52
  ...eventsFormatters,
57
53
  ...proposalFormatters,
58
54
  ...proposalProducerFormatters,
59
- ...distillFormatters,
60
55
  ...infoFormatters,
56
+ ...healthFormatters,
57
+ ...lintFormatters,
61
58
  ...configFormatters,
62
59
  ...feedbackFormatters,
63
60
  ...rememberFormatters,
64
61
  ...importFormatters,
65
- ...saveFormatters,
66
- ...enableDisableFormatters,
62
+ ...syncFormatters,
67
63
  ...registryCommandFormatters,
68
64
  ...envFormatters,
65
+ ...migrateFormatters,
69
66
  ];
70
67
  registerTextFormatters(BUILT_IN_TEXT_FORMATTERS);
71
68
  // ── JSONL output (unchanged — not part of the formatPlain dispatch) ───────────
@@ -88,12 +85,14 @@ export function outputJsonl(command, shaped) {
88
85
  // ── Dispatcher ────────────────────────────────────────────────────────────────
89
86
  /**
90
87
  * Return a plain-text string for commands that are better as short messages,
91
- * or null to fall through to YAML output.
88
+ * or null to fall through to the generic text rendering of the shaped
89
+ * envelope (`renderGenericText`, applied in `output()` in
90
+ * `src/cli/shared.ts` — this module stays dependency-free of that renderer).
92
91
  */
93
92
  export function formatPlain(command, result, detail) {
94
93
  const handler = getTextFormatterHandler(command);
95
94
  if (handler) {
96
95
  return handler(result, detail);
97
96
  }
98
- return null; // fall through to YAML
97
+ return null; // fall through to the generic text renderer, not YAML
99
98
  }
@@ -12,17 +12,15 @@
12
12
  * `sources/provider-factory.ts` or the installed-source operations in
13
13
  * `installed-stashes.ts`.
14
14
  *
15
- * Phase 6 (v1 architecture refactor): factories are now the
16
- * `RegistryProviderFactory` type owned by `src/registry/providers/types.ts`.
17
- * The legacy alias in `src/registry-provider.ts` is kept as a thin re-export
18
- * for transitional callers and will be removed after the dust settles.
15
+ * Factories use the `RegistryProviderFactory` type owned by
16
+ * `src/registry/providers/types.ts`.
19
17
  */
20
18
  import { createProviderRegistry } from "./create-provider-registry.js";
21
19
  // ── Factory map ─────────────────────────────────────────────────────────────
22
20
  const registry = createProviderRegistry();
23
- export function registerProvider(type, factory) {
21
+ export function registerRegistryProvider(type, factory) {
24
22
  registry.register(type, factory);
25
23
  }
26
- export function resolveProviderFactory(type) {
24
+ export function resolveRegistryProviderFactory(type) {
27
25
  return registry.resolve(type);
28
26
  }
@@ -2,56 +2,45 @@
2
2
  // License, v. 2.0. If a copy of the MPL was not distributed with this
3
3
  // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
4
  import path from "node:path";
5
+ import { isBundleSlug } from "../core/asset/asset-ref.js";
6
+ import { deriveInstallations } from "../indexer/installations.js";
5
7
  import { parseRegistryRef } from "./resolve.js";
6
8
  /**
7
9
  * Given an origin string (from an AssetRef) and the full list of stash
8
10
  * sources, return the subset of sources to search.
9
11
  *
10
- * Resolution order:
11
- * 1. undefined → all sources
12
- * 2. "local" → primary stash only (first entry)
13
- * 3. exact match → source whose registryId matches verbatim
14
- * 4. parsed match → parse origin as a registry ref, match by parsed ID
15
- * 5. path match → source whose resolved path matches the origin
16
- * 6. empty → indicates a remote/uninstalled origin (caller decides)
12
+ * Qualified asset refs use bundle identity only. Install locators and paths are
13
+ * a separate grammar handled by {@link resolveSourcesForLocator}.
17
14
  */
18
15
  export function resolveSourcesForOrigin(origin, allSources) {
19
16
  if (!origin)
20
17
  return allSources;
21
- // "local" means the primary stash (first entry)
22
- if (origin === "local") {
23
- return allSources.length > 0 ? [allSources[0]] : [];
24
- }
25
- // Exact registryId match (e.g. origin is "npm:@scope/pkg")
26
- const byExactId = allSources.filter((s) => s.registryId !== undefined && s.registryId === origin);
18
+ const installations = deriveInstallations(allSources);
19
+ return allSources.filter((_, index) => installations[index]?.id === origin);
20
+ }
21
+ /** Resolve the non-asset source locator grammar used by `akm clone`. */
22
+ export function resolveSourcesForLocator(locator, allSources) {
23
+ const byExactId = allSources.filter((source) => source.registryId === locator);
27
24
  if (byExactId.length > 0)
28
25
  return byExactId;
29
- // Parse origin as a registry ref and match by parsed ID.
30
- // Allows shorthand: "owner/repo" matches "github:owner/repo",
31
- // "@scope/pkg" matches "npm:@scope/pkg".
32
26
  try {
33
- const parsed = parseRegistryRef(origin);
27
+ const parsed = parseRegistryRef(locator);
34
28
  const byParsedId = allSources.filter((s) => s.registryId !== undefined && s.registryId === parsed.id);
35
29
  if (byParsedId.length > 0)
36
30
  return byParsedId;
37
31
  }
38
32
  catch {
39
- // Not a valid registry ref continue to path matching
33
+ // Not a registry locator; continue to path matching.
40
34
  }
41
- // Match by resolved path (any source, including installed)
42
- const resolvedOrigin = path.resolve(origin);
43
- const byPath = allSources.filter((s) => path.resolve(s.path) === resolvedOrigin);
44
- if (byPath.length > 0)
45
- return byPath;
46
- // No match — origin may be remote/uninstalled
47
- return [];
35
+ const resolvedLocator = path.resolve(locator);
36
+ return allSources.filter((source) => path.resolve(source.path) === resolvedLocator);
48
37
  }
49
38
  /**
50
39
  * Check whether an origin refers to something that could be fetched remotely
51
40
  * (i.e. it looks like a registry ref but isn't installed locally).
52
41
  */
53
42
  export function isRemoteOrigin(origin, allSources) {
54
- if (origin === "local")
43
+ if (isBundleSlug(origin))
55
44
  return false;
56
- return resolveSourcesForOrigin(origin, allSources).length === 0;
45
+ return resolveSourcesForLocator(origin, allSources).length === 0;
57
46
  }
@@ -4,7 +4,7 @@
4
4
  import { fetchWithRetry } from "../../core/common.js";
5
5
  import { md5Hex } from "../../runtime.js";
6
6
  import { fetchCachedJson } from "../../storage/repositories/registry-cache.js";
7
- import { registerProvider } from "../factory.js";
7
+ import { registerRegistryProvider } from "../factory.js";
8
8
  // ── Constants ───────────────────────────────────────────────────────────────
9
9
  /** Per-query cache TTL in milliseconds (15 minutes). */
10
10
  const QUERY_CACHE_TTL_MS = 15 * 60 * 1000;
@@ -112,7 +112,7 @@ class SkillsShProvider {
112
112
  assetName: entry.name,
113
113
  stash: { id: `skills-sh:${entry.id}`, name: entry.name },
114
114
  registryName,
115
- action: `akm add github:${ownerRepo}`,
115
+ action: `akm bundle add github:${ownerRepo}`,
116
116
  score: Math.round((entry.installs / maxInstalls) * 1000) / 1000,
117
117
  };
118
118
  });
@@ -125,7 +125,7 @@ class SkillsShProvider {
125
125
  }
126
126
  }
127
127
  // ── Self-register ───────────────────────────────────────────────────────────
128
- registerProvider("skills-sh", (config) => new SkillsShProvider(config));
128
+ registerRegistryProvider("skills-sh", (config) => new SkillsShProvider(config));
129
129
  // ── Response parsing ────────────────────────────────────────────────────────
130
130
  function parseSkillsResponse(data) {
131
131
  if (typeof data !== "object" || data === null || Array.isArray(data))
@@ -4,13 +4,11 @@
4
4
  import { fetchWithRetry, jsonWithByteCap, toErrorMessage } from "../../core/common.js";
5
5
  import { asString } from "../../integrations/github.js";
6
6
  import { fetchCachedJson } from "../../storage/repositories/registry-cache.js";
7
- import { registerProvider } from "../factory.js";
7
+ import { registerRegistryProvider } from "../factory.js";
8
8
  import { buildInstallRef } from "../resolve.js";
9
9
  // ── Constants ───────────────────────────────────────────────────────────────
10
10
  /** Cache TTL in milliseconds (1 hour). */
11
11
  const CACHE_TTL_MS = 60 * 60 * 1000;
12
- /** Maximum age before cache is considered stale but still usable as fallback (7 days). */
13
- const CACHE_STALE_MS = 7 * 24 * 60 * 60 * 1000;
14
12
  // ── Provider class ──────────────────────────────────────────────────────────
15
13
  class StaticIndexProvider {
16
14
  type = "static-index";
@@ -20,25 +18,25 @@ class StaticIndexProvider {
20
18
  }
21
19
  async search(options) {
22
20
  const warnings = [];
23
- const allKits = await this.loadAllKits(warnings);
24
- const hits = scoreKits(allKits, options.query, options.limit);
21
+ const bundles = await this.loadBundles(warnings);
22
+ const hits = scoreBundles(bundles, options.query, options.limit);
25
23
  let assetHits;
26
24
  if (options.includeAssets) {
27
- const scored = scoreAssets(allKits, options.query, options.limit);
25
+ const scored = scoreAssets(bundles, options.query, options.limit);
28
26
  if (scored.length > 0)
29
27
  assetHits = scored;
30
28
  }
31
29
  return { hits, assetHits, warnings: warnings.length > 0 ? warnings : undefined };
32
30
  }
33
31
  // ── Internals ───────────────────────────────────────────────────────────
34
- async loadAllKits(warnings) {
35
- const allKits = [];
32
+ async loadBundles(warnings) {
33
+ const bundles = [];
36
34
  try {
37
35
  const index = await loadIndex(this.config);
38
36
  if (index) {
39
37
  const regName = this.config.name;
40
38
  for (const stash of index.stashes) {
41
- allKits.push({ stash, registryName: regName });
39
+ bundles.push({ stash, registryName: regName });
42
40
  }
43
41
  }
44
42
  }
@@ -46,18 +44,18 @@ class StaticIndexProvider {
46
44
  const label = this.config.name ? `${this.config.name} (${this.config.url})` : this.config.url;
47
45
  warnings.push(`Registry ${label}: ${toErrorMessage(err)}`);
48
46
  }
49
- return allKits;
47
+ return bundles;
50
48
  }
51
49
  }
52
50
  // ── Self-register ───────────────────────────────────────────────────────────
53
- registerProvider("static-index", (config) => new StaticIndexProvider(config));
51
+ registerRegistryProvider("static-index", (config) => new StaticIndexProvider(config));
54
52
  // ── Index loading with cache ────────────────────────────────────────────────
55
53
  async function loadIndex(entry) {
56
54
  return fetchCachedJson({
57
55
  cacheKey: entry.url,
58
56
  ttlMs: CACHE_TTL_MS,
59
57
  // Both the fresh hit and the stale fallback parse identically; a corrupt
60
- // cache row lets JSON.parse throw out of the load (legacy behaviour).
58
+ // cache row lets JSON.parse throw out of the load.
61
59
  parseCache: (json) => parseRegistryIndex(JSON.parse(json)) ?? undefined,
62
60
  fetchFresh: async () => {
63
61
  const response = await fetchWithRetry(entry.url, undefined, { timeout: 10_000 });
@@ -77,12 +75,6 @@ async function loadIndex(entry) {
77
75
  },
78
76
  });
79
77
  }
80
- export function isCacheExpired(mtimeMs) {
81
- return Date.now() - mtimeMs > CACHE_TTL_MS;
82
- }
83
- export function isCacheStale(mtimeMs) {
84
- return Date.now() - mtimeMs > CACHE_STALE_MS;
85
- }
86
78
  // ── Index parsing (exported for reuse) ──────────────────────────────────────
87
79
  export function parseRegistryIndex(data) {
88
80
  if (typeof data !== "object" || data === null || Array.isArray(data))
@@ -113,9 +105,7 @@ function parseBundleEntry(raw) {
113
105
  const source = asSource(obj.source);
114
106
  if (!id || !name || !ref || !source)
115
107
  return null;
116
- // The legacy registry boolean `curated` is removed in v1. Legacy index JSON
117
- // containing a `curated` key parses normally; the key is silently ignored
118
- // (v1 spec §4.2, docs/migration/v1.md).
108
+ // Some published indexes include `curated`; it is intentionally ignored.
119
109
  return {
120
110
  id,
121
111
  name,
@@ -132,7 +122,7 @@ function parseBundleEntry(raw) {
132
122
  };
133
123
  }
134
124
  // ── Scoring ─────────────────────────────────────────────────────────────────
135
- function scoreKits(stashes, query, limit) {
125
+ function scoreBundles(stashes, query, limit) {
136
126
  const tokens = query.toLowerCase().split(/\s+/).filter(Boolean);
137
127
  const scored = [];
138
128
  for (const { stash, registryName } of stashes) {
@@ -247,7 +237,7 @@ function scoreAssets(stashes, query, limit) {
247
237
  estimatedTokens: asset.estimatedTokens,
248
238
  stash: { id: stash.id, name: stash.name },
249
239
  registryName,
250
- action: `akm add ${installRef}`,
240
+ action: `akm bundle add ${installRef}`,
251
241
  score: Math.round(score * 1000) / 1000,
252
242
  },
253
243
  score,