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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (598) hide show
  1. package/CHANGELOG.md +1283 -22
  2. package/README.md +62 -37
  3. package/SECURITY.md +46 -31
  4. package/dist/akm +162 -38
  5. package/dist/akm-migrate +44 -0
  6. package/dist/assets/backends/schtasks-template.xml +2 -1
  7. package/dist/assets/hints/cli-hints-full.md +268 -118
  8. package/dist/assets/hints/cli-hints-short.md +87 -24
  9. package/dist/assets/{profiles → improve-strategies}/catchup.json +3 -1
  10. package/dist/assets/{profiles → improve-strategies}/consolidate.json +3 -1
  11. package/dist/assets/{profiles → improve-strategies}/default.json +6 -7
  12. package/dist/assets/improve-strategies/frequent.json +15 -0
  13. package/dist/assets/{profiles → improve-strategies}/graph-refresh.json +4 -2
  14. package/dist/assets/{profiles → improve-strategies}/memory-focus.json +4 -1
  15. package/dist/assets/{profiles → improve-strategies}/proactive-maintenance.json +5 -5
  16. package/dist/assets/{profiles → improve-strategies}/quick.json +4 -2
  17. package/dist/assets/improve-strategies/reflect-distill.json +30 -0
  18. package/dist/assets/{profiles → improve-strategies}/thorough.json +1 -1
  19. package/dist/assets/prompts/consolidate-system.md +5 -5
  20. package/dist/assets/prompts/extract-session.md +2 -6
  21. package/dist/assets/prompts/memory-infer-user.md +2 -3
  22. package/dist/assets/prompts/reflect-llm-framed-contract.md +11 -0
  23. package/dist/assets/prompts/reflect-llm-schema-contract.md +3 -0
  24. package/dist/assets/prompts/reflect-output-repair.md +3 -0
  25. package/dist/assets/prompts/workflow-unit-preamble.md +26 -0
  26. package/dist/assets/stash-skeleton/README.md +38 -10
  27. package/dist/assets/stash-skeleton/facts/conventions/assets/agent.md +8 -0
  28. package/dist/assets/stash-skeleton/facts/conventions/assets/command.md +8 -0
  29. package/dist/assets/stash-skeleton/facts/conventions/assets/fact.md +14 -1
  30. package/dist/assets/stash-skeleton/facts/conventions/assets/knowledge.md +13 -1
  31. package/dist/assets/stash-skeleton/facts/conventions/assets/lesson.md +9 -1
  32. package/dist/assets/stash-skeleton/facts/conventions/assets/memory.md +11 -0
  33. package/dist/assets/stash-skeleton/facts/conventions/assets/script.md +9 -0
  34. package/dist/assets/stash-skeleton/facts/conventions/assets/skill.md +9 -0
  35. package/dist/assets/stash-skeleton/facts/conventions/assets/workflow.md +8 -0
  36. package/dist/assets/stash-skeleton/facts/conventions/backlinks.md +100 -0
  37. package/dist/assets/stash-skeleton/facts/conventions/domains.md +64 -0
  38. package/dist/assets/stash-skeleton/facts/conventions/organization.md +136 -0
  39. package/dist/assets/tasks/core/extract.yml +3 -2
  40. package/dist/assets/tasks/core/improve.yml +2 -1
  41. package/dist/assets/tasks/core/index-refresh.yml +1 -0
  42. package/dist/assets/tasks/core/sync.yml +1 -0
  43. package/dist/assets/tasks/core/version-check.yml +2 -1
  44. package/dist/assets/tasks/improve/akm-graph-refresh-weekly.yml +5 -0
  45. package/dist/assets/tasks/improve/akm-improve-catchup.yml +8 -0
  46. package/dist/assets/tasks/improve/akm-improve-consolidate.yml +5 -0
  47. package/dist/assets/tasks/improve/akm-improve-frequent.yml +5 -0
  48. package/dist/assets/tasks/improve/akm-improve-nightly.yml +5 -0
  49. package/dist/assets/templates/html/health.html +5 -4
  50. package/dist/assets/workflows/workflow-template.md +31 -15
  51. package/dist/cli/invocation.js +279 -0
  52. package/dist/cli/parse-args.js +5 -90
  53. package/dist/cli/retired-commands.js +78 -0
  54. package/dist/cli/shared.js +158 -48
  55. package/dist/cli-node.mjs +2 -1
  56. package/dist/cli.js +747 -293
  57. package/dist/commands/agent/agent-dispatch.js +19 -18
  58. package/dist/commands/agent/agent-support.js +0 -24
  59. package/dist/commands/agent/contribute-cli.js +43 -97
  60. package/dist/commands/completions.js +80 -23
  61. package/dist/commands/config-cli.js +44 -281
  62. package/dist/commands/env/env-binding.js +99 -0
  63. package/dist/commands/env/env-cli.js +84 -224
  64. package/dist/commands/env/env.js +12 -163
  65. package/dist/commands/env/marker-path.js +6 -0
  66. package/dist/commands/env/secret-cli.js +45 -61
  67. package/dist/commands/env/secret.js +32 -62
  68. package/dist/commands/feedback-cli.js +179 -85
  69. package/dist/commands/health/accept-rate.js +58 -0
  70. package/dist/commands/health/advisories.js +7 -8
  71. package/dist/commands/health/checks.js +279 -94
  72. package/dist/commands/health/html-report.js +197 -578
  73. package/dist/commands/health/improve-metrics.js +277 -246
  74. package/dist/commands/health/llm-usage.js +19 -19
  75. package/dist/commands/health/md-report.js +16 -7
  76. package/dist/commands/health/metrics.js +67 -32
  77. package/dist/commands/health/renderers.js +47 -0
  78. package/dist/commands/health/report-view-model.js +508 -0
  79. package/dist/commands/health/stash-exposure.js +1 -1
  80. package/dist/commands/health/surfaces.js +16 -56
  81. package/dist/commands/health/task-runs.js +3 -67
  82. package/dist/{migrate-storage-node.mjs → commands/health/types-checks.js} +1 -5
  83. package/dist/commands/health/types-improve.js +29 -0
  84. package/dist/{output/text/save.js → commands/health/types-metrics.js} +1 -2
  85. package/dist/commands/health/types-result.js +7 -0
  86. package/dist/commands/health/types-runs.js +4 -0
  87. package/dist/commands/health/types-session-log.js +4 -0
  88. package/dist/commands/health/types-windows.js +4 -0
  89. package/dist/commands/health/types.js +26 -21
  90. package/dist/commands/health/windows.js +2 -3
  91. package/dist/commands/health.js +296 -167
  92. package/dist/commands/improve/anti-collapse.js +5 -5
  93. package/dist/commands/improve/autonomy-gate.js +68 -0
  94. package/dist/commands/improve/collapse-detector.js +65 -52
  95. package/dist/commands/improve/consolidate/chunking.js +9 -7
  96. package/dist/commands/improve/consolidate/eligibility.js +1 -23
  97. package/dist/commands/improve/consolidate/merge.js +4 -0
  98. package/dist/commands/improve/consolidate.js +454 -1354
  99. package/dist/commands/improve/content-hash.js +39 -0
  100. package/dist/commands/improve/distill/content-repair.js +4 -10
  101. package/dist/commands/improve/distill/promote-memory.js +89 -64
  102. package/dist/commands/improve/distill/quality-gate.js +118 -42
  103. package/dist/commands/improve/distill-guards.js +1 -1
  104. package/dist/commands/improve/distill-promotion-policy.js +33 -888
  105. package/dist/commands/improve/distill.js +607 -363
  106. package/dist/commands/improve/eligibility.js +165 -79
  107. package/dist/commands/improve/extract-cli.js +35 -126
  108. package/dist/commands/improve/extract-prompt.js +6 -35
  109. package/dist/commands/improve/extract.js +640 -391
  110. package/dist/commands/improve/feedback-valence.js +2 -12
  111. package/dist/commands/improve/improve-cli.js +134 -135
  112. package/dist/commands/improve/improve-result-file.js +30 -50
  113. package/dist/commands/improve/improve-run-types.js +4 -0
  114. package/dist/commands/improve/improve-strategies.js +135 -0
  115. package/dist/commands/improve/improve.js +904 -701
  116. package/dist/commands/improve/locks.js +64 -111
  117. package/dist/commands/improve/loop-stages.js +1110 -923
  118. package/dist/commands/improve/memory/derived-ref.js +124 -0
  119. package/dist/commands/improve/memory/memory-belief.js +79 -7
  120. package/dist/commands/improve/memory/memory-contradiction-detect.js +49 -52
  121. package/dist/commands/improve/memory/memory-improve.js +25 -37
  122. package/dist/commands/improve/outcome-loop.js +25 -88
  123. package/dist/commands/improve/preparation.js +1034 -813
  124. package/dist/commands/improve/proactive-maintenance.js +34 -9
  125. package/dist/commands/improve/proposal-envelope.js +31 -0
  126. package/dist/commands/improve/reflect.js +983 -794
  127. package/dist/commands/improve/run-context.js +119 -0
  128. package/dist/commands/improve/salience.js +24 -127
  129. package/dist/commands/improve/session-asset.js +7 -3
  130. package/dist/commands/improve/shared.js +14 -34
  131. package/dist/commands/improve/source-identity.js +28 -0
  132. package/dist/commands/improve/triage.js +20 -17
  133. package/dist/commands/lint/base-linter.js +340 -313
  134. package/dist/commands/lint/env-key-rules.js +31 -47
  135. package/dist/commands/lint/index.js +185 -30
  136. package/dist/commands/{events.js → log.js} +28 -38
  137. package/dist/commands/migrate-cli.js +54 -0
  138. package/dist/commands/migration-tool.js +55 -0
  139. package/dist/commands/observability-cli.js +70 -208
  140. package/dist/commands/proposal/diff-format.js +50 -0
  141. package/dist/commands/proposal/drain-policies.js +0 -6
  142. package/dist/commands/proposal/drain.js +91 -40
  143. package/dist/commands/proposal/proposal-cli.js +134 -132
  144. package/dist/commands/proposal/proposal-types.js +56 -0
  145. package/dist/commands/proposal/proposal.js +83 -65
  146. package/dist/commands/proposal/propose-cli.js +88 -0
  147. package/dist/commands/proposal/propose.js +105 -88
  148. package/dist/commands/proposal/repository.js +1303 -278
  149. package/dist/commands/proposal/validators/proposal-quality-validators.js +16 -6
  150. package/dist/commands/proposal/validators/proposal-validators.js +61 -12
  151. package/dist/commands/proposal/validators/proposals.js +6 -8
  152. package/dist/commands/read/curate.js +78 -73
  153. package/dist/commands/read/knowledge.js +510 -13
  154. package/dist/commands/read/registry-search.js +2 -2
  155. package/dist/commands/read/remember-cli.js +84 -15
  156. package/dist/commands/read/search-cli.js +203 -96
  157. package/dist/commands/read/search.js +126 -94
  158. package/dist/commands/read/show.js +226 -250
  159. package/dist/commands/registry-cli.js +34 -60
  160. package/dist/commands/remember.js +18 -57
  161. package/dist/commands/sources/add-cli.js +104 -49
  162. package/dist/commands/sources/bundle-cli.js +166 -0
  163. package/dist/commands/sources/bundle-config-ops.js +63 -0
  164. package/dist/commands/sources/info.js +27 -15
  165. package/dist/commands/sources/init.js +30 -40
  166. package/dist/commands/sources/installed-stashes.js +469 -172
  167. package/dist/commands/sources/migration-help.js +7 -4
  168. package/dist/commands/sources/schema-repair.js +10 -9
  169. package/dist/commands/sources/self-update.js +182 -121
  170. package/dist/commands/sources/source-add.js +169 -178
  171. package/dist/commands/sources/source-clone.js +144 -41
  172. package/dist/commands/sources/source-manage.js +94 -59
  173. package/dist/commands/sources/sources-cli.js +64 -205
  174. package/dist/commands/sources/stash-cli.js +91 -54
  175. package/dist/commands/sources/stash-skeleton.js +1 -1
  176. package/dist/commands/tasks/tasks-cli.js +106 -104
  177. package/dist/commands/tasks/tasks.js +445 -262
  178. package/dist/commands/workflow-cli.js +232 -121
  179. package/dist/core/action-contributors.js +1 -1
  180. package/dist/core/activation-policy.js +49 -0
  181. package/dist/core/adapter/adapters/agent-skills-adapter.js +181 -0
  182. package/dist/core/adapter/adapters/akm-adapter.js +528 -0
  183. package/dist/core/adapter/adapters/akm-lint.js +392 -0
  184. package/dist/core/adapter/adapters/akm-metadata.js +387 -0
  185. package/dist/core/adapter/adapters/akm-task-adapter.js +149 -0
  186. package/dist/core/adapter/adapters/akm-workflow-adapter.js +180 -0
  187. package/dist/core/adapter/adapters/claude-adapter.js +61 -0
  188. package/dist/core/adapter/adapters/dotenv-adapter.js +187 -0
  189. package/dist/core/adapter/adapters/generic-files-adapter.js +119 -0
  190. package/dist/core/adapter/adapters/index.js +80 -0
  191. package/dist/core/adapter/adapters/llm-wiki-adapter.js +419 -0
  192. package/dist/core/adapter/adapters/okf-adapter.js +391 -0
  193. package/dist/core/adapter/adapters/opencode-adapter.js +68 -0
  194. package/dist/core/adapter/adapters/shared.js +286 -0
  195. package/dist/core/adapter/adapters/tool-dir-shared.js +217 -0
  196. package/dist/core/adapter/adapters/website-snapshot-adapter.js +155 -0
  197. package/dist/core/adapter/bundle-adapter.js +4 -0
  198. package/dist/core/adapter/detect-adapter.js +17 -0
  199. package/dist/core/adapter/recognize-match.js +44 -0
  200. package/dist/core/adapter/registry.js +56 -0
  201. package/dist/core/adapter/types.js +4 -0
  202. package/dist/core/asset/akm-markdown.js +30 -0
  203. package/dist/core/asset/asset-placement.js +243 -0
  204. package/dist/core/asset/asset-ref.js +110 -79
  205. package/dist/core/asset/asset-serialize.js +20 -0
  206. package/dist/core/asset/frontmatter.js +28 -12
  207. package/dist/core/asset/markdown.js +40 -51
  208. package/dist/core/asset/resolve-ref.js +274 -0
  209. package/dist/core/asset/stash-meta.js +2 -2
  210. package/dist/core/bundle-id.js +51 -0
  211. package/dist/core/common.js +281 -86
  212. package/dist/core/config/config-io.js +42 -128
  213. package/dist/core/config/config-schema.js +233 -834
  214. package/dist/core/config/config-sources.js +162 -39
  215. package/dist/core/config/config-types.js +16 -11
  216. package/dist/core/config/config-version.js +29 -0
  217. package/dist/core/config/config-walker.js +126 -37
  218. package/dist/core/config/config.js +154 -331
  219. package/dist/core/config/deep-merge.js +41 -0
  220. package/dist/core/config/engine-semantics.js +28 -0
  221. package/dist/core/config/experimental.js +21 -0
  222. package/dist/core/config/schema/embedding.js +38 -0
  223. package/dist/core/config/schema/engines.js +116 -0
  224. package/dist/core/config/schema/experimental.js +47 -0
  225. package/dist/core/config/schema/feedback.js +31 -0
  226. package/dist/core/config/schema/improve-processes.js +389 -0
  227. package/dist/core/config/schema/improve.js +94 -0
  228. package/dist/core/config/schema/index-config.js +176 -0
  229. package/dist/core/config/schema/output.js +18 -0
  230. package/dist/core/config/schema/primitives.js +94 -0
  231. package/dist/core/config/schema/search.js +30 -0
  232. package/dist/core/config/schema/setup.js +18 -0
  233. package/dist/core/config/schema/sources-bundles.js +169 -0
  234. package/dist/core/config/schema/workflow.js +29 -0
  235. package/dist/core/env-secret-ref.js +155 -20
  236. package/dist/core/errors.js +17 -15
  237. package/dist/core/events-types.js +4 -0
  238. package/dist/core/events.js +46 -128
  239. package/dist/core/extra-params.js +62 -0
  240. package/dist/core/file-change.js +17 -0
  241. package/dist/core/file-lock.js +202 -57
  242. package/dist/core/fs-txn.js +392 -0
  243. package/dist/core/git-message.js +59 -0
  244. package/dist/core/improve-result.js +167 -0
  245. package/dist/core/json-schema.js +142 -0
  246. package/dist/core/lesson-lint.js +1 -17
  247. package/dist/core/logs-db.js +1 -1
  248. package/dist/core/maintenance-barrier.js +135 -0
  249. package/dist/core/migration-operation.js +44 -0
  250. package/dist/core/mutation-target.js +78 -0
  251. package/dist/core/paths.js +22 -25
  252. package/dist/core/platform.js +10 -0
  253. package/dist/core/recognition-util.js +128 -0
  254. package/dist/core/redaction.js +392 -0
  255. package/dist/core/standards/resolve-standards-context.js +36 -65
  256. package/dist/core/standards/resolve-stash-standards.js +2 -2
  257. package/dist/core/standards/resolve-type-conventions.js +5 -5
  258. package/dist/core/state/migrations.js +242 -11
  259. package/dist/core/state-db.js +98 -10
  260. package/dist/core/structured.js +1 -1
  261. package/dist/core/subprocess.js +303 -0
  262. package/dist/core/text-truncation.js +9 -5
  263. package/dist/core/time.js +20 -0
  264. package/dist/core/type-presentation.js +130 -0
  265. package/dist/core/warn.js +0 -3
  266. package/dist/core/write-source.js +834 -118
  267. package/dist/indexer/bundle-identity-guard.js +92 -0
  268. package/dist/indexer/db/graph-db.js +1 -25
  269. package/dist/indexer/db/llm-cache.js +1 -1
  270. package/dist/indexer/ensure-index.js +30 -9
  271. package/dist/indexer/graph/graph-boost.js +9 -30
  272. package/dist/indexer/graph/graph-extraction.js +41 -27
  273. package/dist/indexer/graph/graph-types.js +4 -0
  274. package/dist/indexer/index-writer-lock.js +93 -49
  275. package/dist/indexer/index-written-assets.js +100 -53
  276. package/dist/indexer/indexer.js +746 -329
  277. package/dist/indexer/init.js +18 -25
  278. package/dist/indexer/installations.js +142 -0
  279. package/dist/indexer/passes/dir-staleness.js +18 -10
  280. package/dist/indexer/passes/memory-inference.js +25 -15
  281. package/dist/indexer/passes/metadata.js +412 -243
  282. package/dist/indexer/scan/doc-to-entry.js +160 -0
  283. package/dist/indexer/scan/drain-dir.js +134 -0
  284. package/dist/indexer/search/db-search.js +292 -108
  285. package/dist/indexer/search/fts-query.js +64 -0
  286. package/dist/indexer/search/ranking-contributors.js +145 -25
  287. package/dist/indexer/search/ranking-types.js +4 -0
  288. package/dist/indexer/search/ranking.js +28 -71
  289. package/dist/indexer/search/search-attribution.js +67 -0
  290. package/dist/indexer/search/search-fields.js +18 -3
  291. package/dist/indexer/search/search-hit-enrichers.js +30 -40
  292. package/dist/indexer/search/search-source.js +157 -111
  293. package/dist/indexer/search/semantic-status.js +4 -1
  294. package/dist/indexer/usage/usage-events.js +10 -30
  295. package/dist/indexer/walk/file-context.js +3 -45
  296. package/dist/indexer/walk/matchers.js +42 -34
  297. package/dist/indexer/walk/path-resolver.js +11 -5
  298. package/dist/indexer/walk/walker.js +42 -14
  299. package/dist/integrations/agent/builder-shared.js +7 -0
  300. package/dist/integrations/agent/builders.js +5 -56
  301. package/dist/integrations/agent/config.js +3 -143
  302. package/dist/integrations/agent/detect.js +17 -2
  303. package/dist/integrations/agent/engine-resolution.js +231 -0
  304. package/dist/integrations/agent/index.js +1 -2
  305. package/dist/integrations/agent/model-aliases.js +16 -2
  306. package/dist/integrations/agent/profiles.js +36 -62
  307. package/dist/integrations/agent/prompts.js +46 -18
  308. package/dist/integrations/agent/runner-dispatch.js +93 -4
  309. package/dist/integrations/agent/runner.js +76 -208
  310. package/dist/integrations/agent/spawn.js +88 -196
  311. package/dist/integrations/harnesses/aider/agent-builder.js +114 -0
  312. package/dist/integrations/harnesses/aider/index.js +48 -0
  313. package/dist/integrations/harnesses/aider/result-extractor.js +53 -0
  314. package/dist/integrations/harnesses/amazonq/agent-builder.js +147 -0
  315. package/dist/integrations/harnesses/amazonq/index.js +45 -0
  316. package/dist/integrations/harnesses/amazonq/result-extractor.js +48 -0
  317. package/dist/integrations/harnesses/claude/agent-builder.js +46 -8
  318. package/dist/integrations/harnesses/claude/config-import.js +1 -3
  319. package/dist/integrations/harnesses/claude/index.js +24 -35
  320. package/dist/integrations/harnesses/claude/result-extractor.js +52 -0
  321. package/dist/integrations/harnesses/claude/session-log.js +27 -75
  322. package/dist/integrations/harnesses/codex/agent-builder.js +138 -0
  323. package/dist/integrations/harnesses/codex/index.js +52 -0
  324. package/dist/integrations/harnesses/codex/result-extractor.js +73 -0
  325. package/dist/integrations/harnesses/copilot/agent-builder.js +122 -0
  326. package/dist/integrations/harnesses/copilot/index.js +48 -0
  327. package/dist/integrations/harnesses/copilot/result-extractor.js +151 -0
  328. package/dist/integrations/harnesses/gemini/agent-builder.js +120 -0
  329. package/dist/integrations/harnesses/gemini/index.js +48 -0
  330. package/dist/integrations/harnesses/gemini/result-extractor.js +121 -0
  331. package/dist/integrations/harnesses/ids.js +24 -0
  332. package/dist/integrations/harnesses/index.js +54 -34
  333. package/dist/integrations/harnesses/opencode/agent-builder.js +23 -5
  334. package/dist/integrations/harnesses/opencode/config-import.js +1 -3
  335. package/dist/integrations/harnesses/opencode/index.js +14 -32
  336. package/dist/integrations/harnesses/opencode/session-log.js +67 -125
  337. package/dist/integrations/harnesses/opencode-sdk/harness.js +51 -0
  338. package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +681 -108
  339. package/dist/integrations/harnesses/openhands/agent-builder.js +128 -0
  340. package/dist/integrations/harnesses/openhands/index.js +48 -0
  341. package/dist/integrations/harnesses/openhands/result-extractor.js +103 -0
  342. package/dist/integrations/harnesses/pi/agent-builder.js +97 -0
  343. package/dist/integrations/harnesses/pi/index.js +45 -0
  344. package/dist/integrations/harnesses/pi/result-extractor.js +135 -0
  345. package/dist/integrations/harnesses/shared.js +17 -0
  346. package/dist/integrations/harnesses/types.js +43 -32
  347. package/dist/integrations/lockfile.js +211 -24
  348. package/dist/integrations/session-logs/index.js +36 -39
  349. package/dist/integrations/session-logs/provider-base.js +113 -0
  350. package/dist/llm/client.js +182 -110
  351. package/dist/llm/embedders/deterministic.js +2 -2
  352. package/dist/llm/embedders/remote.js +21 -9
  353. package/dist/llm/feature-gate.js +17 -57
  354. package/dist/llm/graph-extract.js +12 -13
  355. package/dist/llm/index-passes.js +8 -42
  356. package/dist/llm/memory-infer.js +144 -1
  357. package/dist/llm/metadata-enhance.js +45 -30
  358. package/dist/llm/structured-call.js +16 -8
  359. package/dist/llm/usage-persist.js +30 -5
  360. package/dist/llm/usage-telemetry.js +59 -6
  361. package/dist/output/cli-hints.js +1 -2
  362. package/dist/output/command-registry.js +27 -0
  363. package/dist/output/context.js +22 -7
  364. package/dist/output/format-exempt.js +80 -0
  365. package/dist/output/generic-render.js +251 -0
  366. package/dist/output/html-render.js +11 -16
  367. package/dist/output/render-registry.js +57 -0
  368. package/dist/output/renderers.js +14 -279
  369. package/dist/output/shapes/curate.js +10 -1
  370. package/dist/output/shapes/events.js +12 -7
  371. package/dist/output/shapes/helpers.js +58 -84
  372. package/dist/output/shapes/passthrough.js +11 -39
  373. package/dist/output/shapes/proposal/producer.js +15 -7
  374. package/dist/output/shapes/registry.js +12 -6
  375. package/dist/output/shapes.js +0 -9
  376. package/dist/output/text/{init.js → bundle-create.js} +3 -1
  377. package/dist/output/text/bundle-show.js +7 -0
  378. package/dist/output/text/command-format.js +562 -0
  379. package/dist/output/text/env.js +1 -3
  380. package/dist/output/text/events.js +8 -7
  381. package/dist/output/text/helpers.js +15 -1164
  382. package/dist/output/text/proposal/producer.js +4 -2
  383. package/dist/output/text/proposal-format.js +202 -0
  384. package/dist/output/text/registry-commands.js +1 -2
  385. package/dist/output/text/registry.js +12 -6
  386. package/dist/output/text/show-directives.js +117 -0
  387. package/dist/output/text/show-format.js +103 -0
  388. package/dist/output/text/sync.js +5 -0
  389. package/dist/output/text/workflow-format.js +332 -0
  390. package/dist/output/text/workflow.js +3 -2
  391. package/dist/output/text.js +10 -19
  392. package/dist/registry/factory.js +4 -6
  393. package/dist/registry/origin-resolve.js +16 -27
  394. package/dist/registry/providers/skills-sh.js +3 -3
  395. package/dist/registry/providers/static-index.js +15 -25
  396. package/dist/registry/resolve.js +43 -94
  397. package/dist/registry/semver.js +43 -0
  398. package/dist/runtime.js +81 -12
  399. package/dist/scripts/akm-migrate.js +35529 -0
  400. package/dist/setup/detect.js +5 -7
  401. package/dist/setup/detected-engines.js +136 -0
  402. package/dist/setup/engine-config.js +100 -0
  403. package/dist/setup/registry-stash-loader.js +3 -3
  404. package/dist/setup/semantic-assets.js +12 -9
  405. package/dist/setup/setup.js +444 -208
  406. package/dist/setup/steps/connection-shared.js +120 -0
  407. package/dist/setup/steps/connection.js +108 -305
  408. package/dist/setup/steps/platforms.js +13 -12
  409. package/dist/setup/steps/semantic.js +15 -3
  410. package/dist/setup/steps/sources.js +21 -15
  411. package/dist/setup/steps/stashdir.js +6 -4
  412. package/dist/setup/steps/tasks.js +236 -119
  413. package/dist/setup/steps.js +3 -2
  414. package/dist/sources/freshness.js +39 -0
  415. package/dist/sources/provider-factory.js +11 -17
  416. package/dist/sources/providers/filesystem.js +2 -3
  417. package/dist/sources/providers/git-install.js +278 -34
  418. package/dist/sources/providers/git-provider.js +54 -56
  419. package/dist/sources/providers/git-stash.js +420 -91
  420. package/dist/sources/providers/git.js +2 -2
  421. package/dist/sources/providers/npm.js +16 -19
  422. package/dist/sources/providers/provider-utils.js +47 -22
  423. package/dist/sources/providers/sync-from-ref.js +3 -9
  424. package/dist/sources/providers/website.js +2 -2
  425. package/dist/sources/resolve.js +11 -10
  426. package/dist/sources/snapshot-fetchers/types.js +4 -0
  427. package/dist/sources/{website-ingest.js → snapshot-fetchers/website-ingest.js} +110 -41
  428. package/dist/storage/database.js +60 -4
  429. package/dist/storage/engines/sqlite-migrations.js +156 -5
  430. package/dist/storage/locations.js +1 -2
  431. package/dist/storage/repositories/canaries-repository.js +1 -1
  432. package/dist/storage/repositories/events-repository.js +51 -11
  433. package/dist/storage/repositories/improve-runs-repository.js +6 -32
  434. package/dist/storage/repositories/index-connection.js +79 -0
  435. package/dist/storage/repositories/index-db.js +4 -3
  436. package/dist/storage/repositories/index-entries-repository.js +863 -0
  437. package/dist/{indexer/db/entry-mapper.js → storage/repositories/index-entry-mapper.js} +19 -2
  438. package/dist/storage/repositories/index-entry-types.js +4 -0
  439. package/dist/storage/repositories/index-fts-repository.js +167 -0
  440. package/dist/storage/repositories/index-llm-cache-repository.js +108 -0
  441. package/dist/storage/repositories/index-meta-repository.js +49 -0
  442. package/dist/{indexer/db/schema.js → storage/repositories/index-schema.js} +226 -100
  443. package/dist/storage/repositories/index-sql.js +12 -0
  444. package/dist/storage/repositories/index-utility-repository.js +356 -0
  445. package/dist/storage/repositories/index-vec-repository.js +250 -0
  446. package/dist/storage/repositories/outcome-repository.js +119 -0
  447. package/dist/storage/repositories/proposals-repository.js +317 -75
  448. package/dist/storage/repositories/registry-cache.js +1 -1
  449. package/dist/storage/repositories/salience-repository.js +172 -0
  450. package/dist/storage/repositories/task-history-repository.js +110 -3
  451. package/dist/storage/repositories/workflow-runs-repository.js +240 -19
  452. package/dist/tasks/backends/cron.js +169 -46
  453. package/dist/tasks/backends/exec-utils.js +76 -3
  454. package/dist/tasks/backends/index.js +6 -9
  455. package/dist/tasks/backends/launchd.js +292 -55
  456. package/dist/tasks/backends/schtasks.js +557 -70
  457. package/dist/tasks/backends/types.js +4 -0
  458. package/dist/tasks/command-executable.js +93 -0
  459. package/dist/tasks/embedded.js +56 -38
  460. package/dist/tasks/parser.js +156 -64
  461. package/dist/tasks/resolve-akm-bin.js +144 -51
  462. package/dist/tasks/runner.js +377 -209
  463. package/dist/tasks/schedule.js +108 -19
  464. package/dist/tasks/scheduler-invocation.js +296 -0
  465. package/dist/tasks/schema.js +1 -1
  466. package/dist/tasks/task-id.js +35 -0
  467. package/dist/tasks/validator.js +30 -16
  468. package/dist/text-import-hook.mjs +1 -1
  469. package/dist/workflows/authoring/authoring.js +104 -43
  470. package/dist/workflows/authoring/scope-key.js +1 -1
  471. package/dist/workflows/cli.js +0 -16
  472. package/dist/workflows/concurrency-policy.js +15 -0
  473. package/dist/workflows/exec/brief.js +450 -0
  474. package/dist/workflows/exec/frozen-judge.js +47 -0
  475. package/dist/workflows/exec/native-executor.js +1038 -0
  476. package/dist/workflows/exec/param-secrets.js +115 -0
  477. package/dist/workflows/exec/report.js +1460 -0
  478. package/dist/workflows/exec/run-workflow.js +602 -0
  479. package/dist/workflows/exec/scheduler.js +71 -0
  480. package/dist/workflows/exec/step-work.js +1190 -0
  481. package/dist/workflows/exec/unit-writer.js +23 -0
  482. package/dist/workflows/exec/workflow-engine-gate.js +67 -0
  483. package/dist/workflows/exec/worktree.js +171 -0
  484. package/dist/workflows/ir/compile.js +246 -0
  485. package/dist/workflows/ir/freeze.js +233 -0
  486. package/dist/workflows/ir/params.js +54 -0
  487. package/dist/workflows/ir/plan-hash.js +68 -0
  488. package/dist/workflows/ir/schema.js +540 -0
  489. package/dist/workflows/parser.js +878 -304
  490. package/dist/workflows/program/expressions.js +181 -0
  491. package/dist/workflows/program/schema.js +51 -0
  492. package/dist/workflows/renderer.js +100 -45
  493. package/dist/workflows/resource-limits.js +22 -0
  494. package/dist/workflows/runtime/agent-identity.js +59 -14
  495. package/dist/workflows/runtime/checkin.js +1 -1
  496. package/dist/workflows/runtime/plan-classifier.js +131 -0
  497. package/dist/workflows/runtime/runs.js +376 -119
  498. package/dist/workflows/runtime/unit-checkin.js +45 -0
  499. package/dist/workflows/runtime/unit-phases.js +20 -0
  500. package/dist/workflows/runtime/workflow-asset-loader.js +241 -40
  501. package/dist/workflows/schema.js +1 -11
  502. package/dist/workflows/validate-summary.js +2 -3
  503. package/dist/workflows/validator.js +52 -30
  504. package/docs/README.md +42 -78
  505. package/docs/migration/README.md +8 -0
  506. package/docs/migration/release-notes/0.6.0.md +1 -1
  507. package/docs/migration/release-notes/0.7.0.md +9 -8
  508. package/docs/migration/release-notes/0.9.0.md +158 -14
  509. package/docs/migration/v0.7-to-v0.8.md +46 -47
  510. package/docs/migration/v0.8-to-v0.9.md +844 -0
  511. package/docs/reference/README.md +12 -0
  512. package/docs/reference/data-and-telemetry.md +333 -0
  513. package/package.json +21 -17
  514. package/schemas/akm-asset-envelope.json +93 -0
  515. package/schemas/akm-config.json +4636 -0
  516. package/schemas/akm-task.json +87 -0
  517. package/schemas/akm-workflow.json +373 -0
  518. package/dist/akm-migrate-storage +0 -38
  519. package/dist/assets/help/help-accept.md +0 -12
  520. package/dist/assets/help/help-improve.md +0 -84
  521. package/dist/assets/help/help-proposals.md +0 -17
  522. package/dist/assets/help/help-propose.md +0 -17
  523. package/dist/assets/help/help-reject.md +0 -11
  524. package/dist/assets/profiles/frequent.json +0 -13
  525. package/dist/assets/profiles/recombine-only.json +0 -21
  526. package/dist/assets/profiles/reflect-distill.json +0 -30
  527. package/dist/assets/profiles/synthesize.json +0 -15
  528. package/dist/assets/prompts/procedural-system.md +0 -44
  529. package/dist/assets/prompts/recombine-system.md +0 -40
  530. package/dist/assets/prompts/staleness-detect-system.md +0 -6
  531. package/dist/assets/tasks/core/backup.yml +0 -4
  532. package/dist/assets/tasks/graph-refresh-weekly.yml +0 -10
  533. package/dist/assets/templates/html/default.html +0 -78
  534. package/dist/assets/templates/html/vendor/echarts.min.js +0 -45
  535. package/dist/assets/wiki/index-template.md +0 -12
  536. package/dist/assets/wiki/ingest-workflow-template.md +0 -83
  537. package/dist/assets/wiki/log-template.md +0 -8
  538. package/dist/assets/wiki/schema-template.md +0 -61
  539. package/dist/cli/config-migrate.js +0 -150
  540. package/dist/cli/config-validate.js +0 -39
  541. package/dist/commands/graph/graph-cli.js +0 -124
  542. package/dist/commands/graph/graph.js +0 -487
  543. package/dist/commands/improve/calibration.js +0 -161
  544. package/dist/commands/improve/dedup.js +0 -482
  545. package/dist/commands/improve/extract-watch.js +0 -140
  546. package/dist/commands/improve/hot-probation.js +0 -45
  547. package/dist/commands/improve/improve-auto-accept.js +0 -276
  548. package/dist/commands/improve/improve-profiles.js +0 -168
  549. package/dist/commands/improve/procedural.js +0 -398
  550. package/dist/commands/improve/recombine.js +0 -818
  551. package/dist/commands/improve/schema-similarity-gate.js +0 -168
  552. package/dist/commands/lint/agent-linter.js +0 -44
  553. package/dist/commands/lint/command-linter.js +0 -44
  554. package/dist/commands/lint/default-linter.js +0 -16
  555. package/dist/commands/lint/fact-linter.js +0 -39
  556. package/dist/commands/lint/knowledge-linter.js +0 -16
  557. package/dist/commands/lint/memory-linter.js +0 -61
  558. package/dist/commands/lint/registry.js +0 -41
  559. package/dist/commands/lint/skill-linter.js +0 -45
  560. package/dist/commands/lint/task-linter.js +0 -50
  561. package/dist/commands/lint/workflow-linter.js +0 -81
  562. package/dist/commands/proposal/legacy-import.js +0 -115
  563. package/dist/commands/sources/history.js +0 -196
  564. package/dist/commands/tasks/default-tasks.js +0 -186
  565. package/dist/commands/wiki-cli.js +0 -292
  566. package/dist/core/asset/asset-registry.js +0 -76
  567. package/dist/core/asset/asset-spec.js +0 -259
  568. package/dist/core/config/config-migration.js +0 -602
  569. package/dist/core/deep-merge.js +0 -38
  570. package/dist/core/eval/rank-metrics.js +0 -113
  571. package/dist/core/ripgrep/install.js +0 -163
  572. package/dist/core/ripgrep/resolve.js +0 -81
  573. package/dist/indexer/db/db.js +0 -1413
  574. package/dist/indexer/manifest.js +0 -170
  575. package/dist/indexer/passes/metadata-contributors.js +0 -31
  576. package/dist/indexer/usage/unmigrated-vaults-guard.js +0 -94
  577. package/dist/integrations/harnesses/opencode-sdk/index.js +0 -49
  578. package/dist/llm/call-ai.js +0 -62
  579. package/dist/llm/memory-infer-impl.js +0 -138
  580. package/dist/output/shapes/distill.js +0 -14
  581. package/dist/output/shapes/history.js +0 -11
  582. package/dist/output/text/distill.js +0 -6
  583. package/dist/output/text/enable-disable.js +0 -8
  584. package/dist/output/text/history.js +0 -6
  585. package/dist/output/text/wiki.js +0 -16
  586. package/dist/registry/build-index.js +0 -386
  587. package/dist/scripts/migrate-storage.js +0 -19108
  588. package/dist/scripts/migrations/import-fs-improve-runs-to-db.js +0 -9411
  589. package/dist/scripts/migrations/v16-to-v17.js +0 -141
  590. package/dist/setup/legacy-config.js +0 -106
  591. package/dist/storage/repositories/consolidation-repository.js +0 -38
  592. package/dist/storage/repositories/recombine-repository.js +0 -213
  593. package/dist/wiki/wiki-templates.js +0 -15
  594. package/dist/wiki/wiki.js +0 -1012
  595. package/dist/workflows/db.js +0 -215
  596. package/docs/data-and-telemetry.md +0 -226
  597. /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/registry.js +0 -0
  598. /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/youtube.js +0 -0
@@ -0,0 +1,279 @@
1
+ // This Source Code Form is subject to the terms of the Mozilla Public
2
+ // License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
+ /**
5
+ * Single-parse argv normalization (plan §10.7, chunk-9 WI-9.9).
6
+ *
7
+ * Before this module, ~46 `process.argv` read sites were scattered across
8
+ * `src/**` (32 outside `src/cli.ts`), each re-scanning the raw argv array for
9
+ * repeated flags (`parseAllFlagValues`), `--`-passthrough tails (`env run`,
10
+ * `secret run`), or first-occurrence flag values (`parseFlagValue`). This
11
+ * module normalizes argv into one typed {@link ParsedInvocation} object,
12
+ * minted ONCE by `src/cli.ts` at startup, so every downstream reader shares
13
+ * one parse instead of re-scanning the raw array.
14
+ *
15
+ * Deliberately import-free: this module must never join an import cycle
16
+ * (cycle ratchet, plan §10.7 / chunk-9 D.3), so it depends on nothing but
17
+ * global `process` — no `output/context`, no `core/errors`. The flag-parsing
18
+ * primitives below are intentionally small, self-contained re-implementations
19
+ * of the same algorithms `output/context.ts`'s `parseFlagValue`/
20
+ * `hasBooleanFlag` and (the now-retired) `cli/shared.ts` `parseAllFlagValues`
21
+ * used, kept byte-identical so every converted call site is behavior-
22
+ * preserving — with ONE deliberate exception (R-033a): `getAllFlagValuesFrom`
23
+ * now stops at a literal `--` separator instead of scanning past it, fixing a
24
+ * bug where a repeatable flag's value placed after `--` (meant to end flag
25
+ * parsing) was still read as a real flag occurrence. See that function's
26
+ * docstring.
27
+ *
28
+ * Singleton + fallback semantics (the design decision this module encodes):
29
+ * - `setParsedInvocation(argv)` is called exactly once, by `src/cli.ts`, in
30
+ * its startup block before any command handler can run. It
31
+ * snapshots that argv into an immutable {@link ParsedInvocation} that
32
+ * every subsequent `getParsedInvocation()` call returns unchanged for the
33
+ * rest of the process lifetime — "normalize argv exactly once at entry".
34
+ * - `getParsedInvocation()` is the ONLY way leaf command modules read
35
+ * invocation state. When the singleton was never set — the common case
36
+ * for unit tests that call command logic directly, and for
37
+ * `tests/_helpers/cli.ts`'s in-process CLI harness, which drives citty's
38
+ * `runCommand` WITHOUT running `src/cli.ts`'s `import.meta.main` startup
39
+ * block (see that file's docstring) — it falls back to parsing the
40
+ * CURRENT `process.argv` fresh, on every call, uncached. That harness
41
+ * mutates `process.argv` itself per invocation and restores it in
42
+ * `finally`, and many suites issue several back-to-back in-process runs
43
+ * per test; caching the fallback parse would leak one run's flags into
44
+ * the next. So "lazily parses process.argv once" means "once PER CALL",
45
+ * not "once for the life of the process" — the fallback is intentionally
46
+ * request-scoped, mirroring how every pre-WI-9.9 leaf site read
47
+ * `process.argv` fresh at call time. Production code never touches the
48
+ * fallback path: the real entry point sets the singleton before any
49
+ * command handler can run.
50
+ * - `_resetParsedInvocationForTests()` clears an explicitly-set singleton
51
+ * (symmetry with `resetOutputMode`/`resetConfigCache` in
52
+ * `tests/_helpers/cli.ts`); no suite currently needs it because the
53
+ * startup block that calls `setParsedInvocation` never runs under
54
+ * `bun test`, but it exists so a test that DOES call
55
+ * `setParsedInvocation` directly can clean up after itself.
56
+ *
57
+ * Also folds three argv re-scanners that pre-dated this module (plan §10.7):
58
+ * - `parseAllFlagValues` (moved from `cli/shared.ts`) — repeated-flag
59
+ * collection (`--tag foo --tag bar`), re-exported from `cli/shared.ts` so
60
+ * every existing importer (feedback-cli, observability-cli, remember-cli,
61
+ * search-cli, stash-cli, cli.ts) is unaffected.
62
+ * - `findCittyTopLevelCommand`/`findCittyTopLevelCommandIndex` (moved from
63
+ * `cli/parse-args.ts`, which had zero internal imports for this cluster) —
64
+ * re-exported from `cli/parse-args.ts` for `tests/tasks-embedded.test.ts`.
65
+ * - `resolveHelpMigrateVersionArg` (moved from `cli.ts`, where it was
66
+ * private) — the `akm help migrate <version>` positional/flag
67
+ * disambiguation guard.
68
+ */
69
+ // ── Repeated-flag / `--`-passthrough primitives (byte-identical to the
70
+ // pre-WI-9.9 per-site implementations they replace) ─────────────────────────
71
+ function getFlagValueFrom(argv, flag) {
72
+ for (let i = 0; i < argv.length; i++) {
73
+ const arg = argv[i];
74
+ if (arg === "--")
75
+ break;
76
+ if (arg === flag)
77
+ return argv[i + 1];
78
+ if (arg.startsWith(`${flag}=`))
79
+ return arg.slice(flag.length + 1);
80
+ }
81
+ return undefined;
82
+ }
83
+ function hasFlagIn(argv, flag) {
84
+ for (const arg of argv) {
85
+ if (arg === "--")
86
+ return false;
87
+ if (arg === flag || arg === `${flag}=true`)
88
+ return true;
89
+ }
90
+ return false;
91
+ }
92
+ /**
93
+ * Collect every `--flag value` / `--flag=value` occurrence, stopping at a
94
+ * literal `--` separator (R-033a). `--` conventionally ends flag parsing —
95
+ * everything after it is positional/passthrough, never a flag akm should
96
+ * interpret. Before this fix, a token like `--tag leaked:yes` placed AFTER
97
+ * `--` (e.g. `akm feedback <ref> --positive -- --tag leaked:yes`) was still
98
+ * picked up as a real `--tag` value, letting argv content past the boundary
99
+ * leak into structured output. This is a deliberate BEHAVIOR CHANGE from the
100
+ * pre-WI-9.9 per-site implementation this module otherwise keeps
101
+ * byte-identical (see the module docstring) — every caller of
102
+ * `parseAllFlagValues`/`getAllFlagValues` inherits the fix for free.
103
+ */
104
+ function getAllFlagValuesFrom(argv, flag) {
105
+ const values = [];
106
+ for (let i = 0; i < argv.length; i++) {
107
+ const arg = argv[i];
108
+ if (arg === "--")
109
+ break;
110
+ if (arg === flag && i + 1 < argv.length) {
111
+ values.push(argv[i + 1]);
112
+ // BUG-M4: skip the value index so `--tag --tag` (literal `--tag` value)
113
+ // does not double-count the second `--tag` as a separate flag occurrence.
114
+ i++;
115
+ }
116
+ else if (arg.startsWith(`${flag}=`)) {
117
+ values.push(arg.slice(flag.length + 1));
118
+ }
119
+ }
120
+ return values;
121
+ }
122
+ /**
123
+ * Tokens after a literal `--` marker in argv, or `[]` when there is no `--`
124
+ * OR nothing follows it. Callers that previously threw a "Missing command"
125
+ * UsageError on `dashIndex < 0 || dashIndex === argv.length - 1` now check
126
+ * `passthroughArgs().length === 0` — the two conditions are equivalent.
127
+ */
128
+ function passthroughArgsFrom(argv) {
129
+ const dashIndex = argv.indexOf("--");
130
+ if (dashIndex < 0 || dashIndex === argv.length - 1)
131
+ return [];
132
+ return argv.slice(dashIndex + 1);
133
+ }
134
+ function createParsedInvocation(argv) {
135
+ const snapshot = Object.freeze([...argv]);
136
+ const userArgs = Object.freeze(snapshot.slice(2));
137
+ return {
138
+ argv: snapshot,
139
+ userArgs,
140
+ getFlagValue: (flag) => getFlagValueFrom(snapshot, flag),
141
+ hasFlag: (flag) => hasFlagIn(snapshot, flag),
142
+ getAllFlagValues: (flag) => getAllFlagValuesFrom(snapshot, flag),
143
+ passthroughArgs: () => passthroughArgsFrom(snapshot),
144
+ };
145
+ }
146
+ let _invocation;
147
+ /**
148
+ * Mint the process-wide {@link ParsedInvocation} singleton. Called exactly
149
+ * once, by `src/cli.ts`, at startup — "normalize argv exactly once at entry"
150
+ * (plan §10.7).
151
+ */
152
+ export function setParsedInvocation(argv) {
153
+ _invocation = createParsedInvocation(argv);
154
+ return _invocation;
155
+ }
156
+ /**
157
+ * Read the process-wide {@link ParsedInvocation}. Returns the singleton set
158
+ * by `setParsedInvocation` when one exists; otherwise falls back to parsing
159
+ * the CURRENT `process.argv` fresh (uncached — see the module docstring for
160
+ * why caching the fallback would be wrong). The fallback is what every
161
+ * leaf-command unit test and `tests/_helpers/cli.ts`'s in-process harness
162
+ * exercise; production CLI runs always hit the singleton.
163
+ */
164
+ export function getParsedInvocation() {
165
+ if (_invocation)
166
+ return _invocation;
167
+ return createParsedInvocation(process.argv);
168
+ }
169
+ /** Test-only: clear an explicitly-set singleton. Symmetry with resetOutputMode/resetConfigCache. */
170
+ export function _resetParsedInvocationForTests() {
171
+ _invocation = undefined;
172
+ }
173
+ // ── Folded re-scanner #1: parseAllFlagValues (moved from cli/shared.ts) ─────
174
+ /**
175
+ * Collect all occurrences of a repeatable flag from the current invocation's
176
+ * argv. Citty's StringArgDef only exposes the last value when a flag is
177
+ * repeated, so for repeatable CLI args (like `--tag foo --tag bar`) callers
178
+ * read argv directly via this helper. Supports both `--flag value` and
179
+ * `--flag=value` forms.
180
+ */
181
+ export function parseAllFlagValues(flag) {
182
+ return getParsedInvocation().getAllFlagValues(flag);
183
+ }
184
+ function cittyComparableName(name) {
185
+ return name.replace(/[-_]+([a-zA-Z0-9])/g, (_match, char) => char.toUpperCase());
186
+ }
187
+ function toAliasArray(alias) {
188
+ if (Array.isArray(alias))
189
+ return alias;
190
+ return typeof alias === "string" ? [alias] : [];
191
+ }
192
+ function isCittyValueFlag(flag, argsDef) {
193
+ const name = flag.replace(/^-{1,2}/, "");
194
+ const normalized = cittyComparableName(name);
195
+ for (const [key, def] of Object.entries(argsDef)) {
196
+ if (def.type !== "string" && def.type !== "enum")
197
+ continue;
198
+ if (normalized === cittyComparableName(key))
199
+ return true;
200
+ if (toAliasArray(def.alias).includes(name))
201
+ return true;
202
+ }
203
+ return false;
204
+ }
205
+ /**
206
+ * Match citty's top-level subcommand scan (`findSubCommandIndex`).
207
+ *
208
+ * Citty does not assume `rawArgs[0]` is the command: global string flags may
209
+ * appear first and consume the following token. The CLI startup guard uses this
210
+ * to classify the requested command before any command handler can run.
211
+ */
212
+ export function findCittyTopLevelCommandIndex(rawArgs, argsDef) {
213
+ for (let i = 0; i < rawArgs.length; i += 1) {
214
+ const arg = rawArgs[i];
215
+ if (arg === "--")
216
+ return -1;
217
+ if (arg.startsWith("-")) {
218
+ if (!arg.includes("=") && isCittyValueFlag(arg, argsDef))
219
+ i += 1;
220
+ continue;
221
+ }
222
+ return i;
223
+ }
224
+ return -1;
225
+ }
226
+ export function findCittyTopLevelCommand(rawArgs, argsDef) {
227
+ const index = findCittyTopLevelCommandIndex(rawArgs, argsDef);
228
+ return index >= 0 ? rawArgs[index] : undefined;
229
+ }
230
+ // ── Folded re-scanner #3: resolveHelpMigrateVersionArg (moved from cli.ts,
231
+ // where it was a private, unexported function) ──────────────────────────────
232
+ /**
233
+ * Guard against citty consuming a global flag value as the `help migrate`
234
+ * version positional (mirrors `resolveRememberContentArg` /
235
+ * `wasFormatValueConsumedAsName` in the read/sources leaf modules).
236
+ *
237
+ * When the user runs `akm help migrate --format json` without a version
238
+ * argument, citty may assign `"json"` to the `version` positional. This
239
+ * detects that case and returns `undefined` so the caller surfaces the
240
+ * "missing version" UsageError instead of treating a flag value as a version.
241
+ */
242
+ export function resolveHelpMigrateVersionArg(version) {
243
+ if (version === undefined)
244
+ return undefined;
245
+ const invocation = getParsedInvocation();
246
+ const parsedFormat = invocation.getFlagValue("--format");
247
+ if (parsedFormat !== undefined &&
248
+ version === parsedFormat &&
249
+ wasHelpMigrateFlagValueConsumedAsVersion(version, parsedFormat, "--format")) {
250
+ return undefined;
251
+ }
252
+ const parsedDetail = invocation.getFlagValue("--detail");
253
+ if (parsedDetail !== undefined &&
254
+ version === parsedDetail &&
255
+ wasHelpMigrateFlagValueConsumedAsVersion(version, parsedDetail, "--detail")) {
256
+ return undefined;
257
+ }
258
+ return version;
259
+ }
260
+ function wasHelpMigrateFlagValueConsumedAsVersion(version, flagValue, flagName) {
261
+ const argv = getParsedInvocation().userArgs;
262
+ const helpIndex = argv.indexOf("help");
263
+ const tokens = helpIndex >= 0 ? argv.slice(helpIndex + 1) : argv;
264
+ const migrateIndex = tokens.indexOf("migrate");
265
+ const relevant = migrateIndex >= 0 ? tokens.slice(migrateIndex + 1) : tokens;
266
+ let flagIndex = -1;
267
+ for (let i = 0; i < relevant.length; i += 1) {
268
+ const token = relevant[i];
269
+ if (token === flagName || token === `${flagName}=${flagValue}`) {
270
+ flagIndex = i;
271
+ break;
272
+ }
273
+ }
274
+ if (flagIndex === -1)
275
+ return false;
276
+ if (relevant.slice(0, flagIndex).includes(version))
277
+ return false;
278
+ return relevant[flagIndex] === flagName ? relevant[flagIndex + 1] === version : true;
279
+ }
@@ -8,52 +8,11 @@
8
8
  * main CLI file focused on command definitions and routing.
9
9
  */
10
10
  import { UsageError } from "../core/errors.js";
11
- function cittyComparableName(name) {
12
- return name.replace(/[-_]+([a-zA-Z0-9])/g, (_match, char) => char.toUpperCase());
13
- }
14
- function toAliasArray(alias) {
15
- if (Array.isArray(alias))
16
- return alias;
17
- return typeof alias === "string" ? [alias] : [];
18
- }
19
- function isCittyValueFlag(flag, argsDef) {
20
- const name = flag.replace(/^-{1,2}/, "");
21
- const normalized = cittyComparableName(name);
22
- for (const [key, def] of Object.entries(argsDef)) {
23
- if (def.type !== "string" && def.type !== "enum")
24
- continue;
25
- if (normalized === cittyComparableName(key))
26
- return true;
27
- if (toAliasArray(def.alias).includes(name))
28
- return true;
29
- }
30
- return false;
31
- }
32
- /**
33
- * Match citty's top-level subcommand scan (`findSubCommandIndex`).
34
- *
35
- * Citty does not assume `rawArgs[0]` is the command: global string flags may
36
- * appear first and consume the following token. The CLI startup guard uses this
37
- * to classify the requested command before any command handler can run.
38
- */
39
- export function findCittyTopLevelCommandIndex(rawArgs, argsDef) {
40
- for (let i = 0; i < rawArgs.length; i += 1) {
41
- const arg = rawArgs[i];
42
- if (arg === "--")
43
- return -1;
44
- if (arg.startsWith("-")) {
45
- if (!arg.includes("=") && isCittyValueFlag(arg, argsDef))
46
- i += 1;
47
- continue;
48
- }
49
- return i;
50
- }
51
- return -1;
52
- }
53
- export function findCittyTopLevelCommand(rawArgs, argsDef) {
54
- const index = findCittyTopLevelCommandIndex(rawArgs, argsDef);
55
- return index >= 0 ? rawArgs[index] : undefined;
56
- }
11
+ // findCittyTopLevelCommand(Index) + CittyArg(s)DefinitionForScan moved to
12
+ // ./invocation (chunk-9 WI-9.9 argv-normalization fold — that cluster had no
13
+ // internal imports, so it relocated cleanly); re-exported here so existing
14
+ // importers (tests/tasks-embedded.test.ts, commands/read/show.ts) are unaffected.
15
+ export { findCittyTopLevelCommand, findCittyTopLevelCommandIndex, } from "./invocation.js";
57
16
  /**
58
17
  * Return true when `args._[0]` is a member of `validSet`.
59
18
  *
@@ -113,50 +72,6 @@ export function parseNonNegativeIntFlag(raw, flagName) {
113
72
  }
114
73
  return parseInt(trimmed, 10);
115
74
  }
116
- // ── Auto-accept flag parsing ─────────────────────────────────────────────────
117
- /**
118
- * Parse the value of `akm improve --auto-accept` into a confidence threshold.
119
- *
120
- * Semantics (see docs/migration/v0.7-to-v0.8.md):
121
- * - `undefined` (flag absent) → `undefined` (default-OFF; pre-prod flip)
122
- * - `""` (bare `--auto-accept`, no value) → `undefined` (treated as flag absent)
123
- * - `"false"` (case-insensitive) → `undefined` (explicit disable)
124
- * - `"safe"` (case-insensitive) → `90` (permanent back-compat alias)
125
- * - integer string `"0".."100"` → that integer
126
- * - anything else → throws `UsageError("INVALID_FLAG_VALUE")`
127
- *
128
- * Citty's `type: "string"` resolves bare flags to `""` and an absent flag to
129
- * `undefined`. Both forms now disable auto-accept; users must pass an explicit
130
- * threshold (`--auto-accept=N` or `--auto-accept=safe`) to opt in. This is a
131
- * deliberate flip from the earlier 0.8.0-RC behaviour, which defaulted to ON
132
- * at threshold 90 and surprised users who didn't expect Phase B operations to
133
- * apply without confirmation.
134
- *
135
- * Until proposals expose per-operation confidence scores, any non-`undefined`
136
- * threshold causes the consolidate path to auto-accept the whole batch
137
- * (legacy "safe" behaviour). The threshold value is preserved for the eventual
138
- * per-operation comparison; see the TODO in `consolidate.ts`.
139
- */
140
- export function parseAutoAcceptFlag(raw) {
141
- if (raw === undefined)
142
- return undefined;
143
- const trimmed = raw.trim();
144
- if (trimmed === "")
145
- return undefined;
146
- const lower = trimmed.toLowerCase();
147
- if (lower === "false")
148
- return undefined;
149
- if (lower === "safe")
150
- return 90;
151
- if (!/^\d+$/.test(trimmed)) {
152
- throw new UsageError(`Invalid --auto-accept value: "${raw}". Must be an integer 0-100, 'safe', or 'false'.`, "INVALID_FLAG_VALUE");
153
- }
154
- const parsed = parseInt(trimmed, 10);
155
- if (parsed < 0 || parsed > 100) {
156
- throw new UsageError(`Invalid --auto-accept value: "${raw}". Must be an integer 0-100, 'safe', or 'false'.`, "INVALID_FLAG_VALUE");
157
- }
158
- return parsed;
159
- }
160
75
  // ── String flag parsing ──────────────────────────────────────────────────────
161
76
  /**
162
77
  * Extract a string value from a parsed citty argument object by key.
@@ -0,0 +1,78 @@
1
+ // This Source Code Form is subject to the terms of the Mozilla Public
2
+ // License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
+ /**
5
+ * Replacement hints for command spellings retired by the 0.9 CLI overhaul
6
+ * (hard break — no aliases). Consulted by the unknown-command error path
7
+ * BEFORE the edit-distance did-you-mean: distance-based suggestions are
8
+ * actively misleading for retired spellings (`init` → "did you mean
9
+ * `info`?", `update` → "did you mean `upgrade`?" — the latter replaces the
10
+ * BINARY, not the sources), and an agent following them gets steered into
11
+ * the wrong command instead of the renamed one.
12
+ *
13
+ * Keys are either a bare retired top-level token (`"init"`) or a
14
+ * group-scoped `"<group> <sub>"` pair (`"env set"`). Keep entries one
15
+ * sentence; the migration pointer is appended by the caller.
16
+ */
17
+ const RETIRED_COMMAND_HINTS = {
18
+ // Top-level verbs absorbed by the `bundle` group.
19
+ init: "`akm init` moved in 0.9 — use `akm bundle create`.",
20
+ add: "`akm add` moved in 0.9 — use `akm bundle add <source>`.",
21
+ list: "`akm list` moved in 0.9 — use `akm bundle list`.",
22
+ remove: "`akm remove` moved in 0.9 — use `akm bundle remove <source>`.",
23
+ update: "`akm update` moved in 0.9 — use `akm bundle update` (to update akm itself, use `akm upgrade`).",
24
+ // Group renamed to the singular.
25
+ tasks: "the `tasks` group was renamed in 0.9 — use `akm task <subcommand>`.",
26
+ // Verbs absorbed by the `proposal` group.
27
+ extract: "`akm extract` moved in 0.9 — use `akm proposal extract`.",
28
+ propose: "`akm propose` moved in 0.9 — use `akm proposal new`.",
29
+ proposals: "`akm proposals` moved in 0.9 — use `akm proposal list`.",
30
+ accept: "`akm accept` moved in 0.9 — use `akm proposal accept <id>`.",
31
+ reject: '`akm reject` moved in 0.9 — use `akm proposal reject <id> --reason "..."`.',
32
+ diff: "`akm diff` moved in 0.9 — use `akm proposal diff <id>`.",
33
+ revert: "`akm revert` moved in 0.9 — use `akm proposal revert <id>`.",
34
+ reflect: "`akm reflect` was folded into 0.9 — use `akm improve <ref>`.",
35
+ distill: "`akm distill` was folded into 0.9 — use `akm improve <ref>`.",
36
+ // Renamed persistence and observability verbs.
37
+ save: "`akm save` moved in 0.9 — use `akm sync`.",
38
+ events: "`akm events` moved in 0.9 — use `akm log`.",
39
+ // Removed observability surfaces.
40
+ history: "`akm history` was removed in 0.9 — use `akm log --ref <ref>` for an asset's event trail.",
41
+ graph: "`akm graph` was removed in 0.9 — graph counts appear in `akm health`; refresh extraction with `akm improve --strategy graph-refresh`.",
42
+ lessons: "`akm lessons` was removed in 0.9 — lesson strength is indexed; use `akm search --type lesson`.",
43
+ lesson: "`akm lesson` was removed in 0.9 — lesson strength is indexed; use `akm search --type lesson`.",
44
+ // Relocated guidance / removed asset verbs.
45
+ mv: "`akm mv` was removed in 0.9 — move the file, then run `akm index` and `akm lint` (to carry ranking signal: `bun scripts/rekey-asset-ref.ts <old-ref> <new-ref>`).",
46
+ // Pre-0.9 removals agents still trip over.
47
+ wiki: "the `akm wiki` family was removed in 0.9 — wikis are ordinary knowledge assets; ingest with `akm import <url> --path <subdir>`.",
48
+ backup: "`akm backup` was removed in 0.9 — backups belong to the standalone `akm-migrate backup` tool.",
49
+ // Group-scoped retirements.
50
+ "env set": "`akm env set` was removed in 0.9 — edit the `.env` file directly; akm loads it as-is.",
51
+ "env unset": "`akm env unset` was removed in 0.9 — edit the `.env` file directly; akm loads it as-is.",
52
+ "registry search": "`akm registry search` was folded into `akm search --from registry` in 0.9.",
53
+ "registry build-index": "`akm registry build-index` moved in 0.9 — maintainers run `bun scripts/build-registry-index.ts`.",
54
+ "workflow template": "`akm workflow template` was folded into `akm workflow create --print` in 0.9.",
55
+ "workflow validate": "`akm workflow validate` was folded into `akm lint --type workflows` in 0.9 (add `--fail-on-flagged` for CI gates).",
56
+ "workflow watch": "`akm workflow watch` was removed in 0.9 — use `akm log --run <run-id>`.",
57
+ "config show": "`akm config show` was removed in 0.9 — use `akm config list`.",
58
+ "config validate": "`akm config validate` was removed in 0.9 — the config file is validated on every load.",
59
+ "task enable": "`akm task enable` was removed in 0.9 — set `enabled: true` in the task YAML, then `akm task sync`.",
60
+ "task disable": "`akm task disable` was removed in 0.9 — set `enabled: false` in the task YAML, then `akm task sync`.",
61
+ "task init": "`akm task init` was removed in 0.9 — `akm setup` seeds the default schedules.",
62
+ "task list": "there is no `task list` — task files are indexed assets; use `akm search --type task`.",
63
+ "task remove": "there is no `task remove` — delete the task YAML, then run `akm task sync` to unbind it.",
64
+ "log tail": "`akm log tail` was removed in 0.9 — poll `akm log --since @offset:<id>` (the durable cursor).",
65
+ "log list": "`akm log list` was flattened in 0.9 — bare `akm log` is the same surface.",
66
+ };
67
+ const MIGRATION_POINTER = "Full rename table: `akm help migrate 0.9.0`.";
68
+ /**
69
+ * Replacement hint for a retired spelling, or undefined when the attempted
70
+ * token isn't a known retirement. `parentPath` is the group path already
71
+ * resolved before the unknown token (empty at root), so `env set` and a
72
+ * hypothetical top-level `set` can't collide.
73
+ */
74
+ export function retiredCommandHint(parentPath, attempted) {
75
+ const key = parentPath.length === 0 ? attempted : `${parentPath[parentPath.length - 1]} ${attempted}`;
76
+ const entry = RETIRED_COMMAND_HINTS[key];
77
+ return entry === undefined ? undefined : `${entry} ${MIGRATION_POINTER}`;
78
+ }