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
@@ -1,41 +0,0 @@
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
- * `akm config validate` — verify the on-disk config matches the schema.
6
- *
7
- * Reads the user config file, validates against AkmConfigSchema, and either
8
- * prints "All checks passed." or a list of structured errors (path + message).
9
- * Exits non-zero on errors so it composes well in CI hooks.
10
- */
11
- import { parseConfigText, readConfigText } from "../core/config/config-io.js";
12
- import { CURRENT_CONFIG_VERSION, validateConfigShape } from "../core/config/config-schema.js";
13
- import { ConfigError } from "../core/errors.js";
14
- import { getConfigPath } from "../core/paths.js";
15
- export async function runConfigValidate() {
16
- const configPath = getConfigPath();
17
- let text;
18
- try {
19
- text = readConfigText(configPath);
20
- }
21
- catch (err) {
22
- const detail = err instanceof Error ? err.message : String(err);
23
- throw new ConfigError(`Could not read config at ${configPath}: ${detail}`, "INVALID_CONFIG_FILE");
24
- }
25
- if (text === undefined) {
26
- console.log(`No config file at ${configPath} — nothing to validate.`);
27
- return;
28
- }
29
- // parseConfigText throws ConfigError on malformed JSON (#458). Surface as-is.
30
- const raw = parseConfigText(text, configPath);
31
- if (raw.configVersion !== CURRENT_CONFIG_VERSION) {
32
- throw new ConfigError(`Unsupported configVersion at ${configPath}: expected "${CURRENT_CONFIG_VERSION}".`, "UNSUPPORTED_CONFIG_VERSION", "Recreate engines and improve.strategies manually; AKM 0.9 never translates profile-based configuration.");
33
- }
34
- const result = validateConfigShape(raw);
35
- if (result.ok) {
36
- console.log(`All checks passed. (${configPath})`);
37
- return;
38
- }
39
- const lines = result.errors.map((e) => ` - ${e.path || "(root)"}: ${e.message}`).join("\n");
40
- throw new ConfigError(`Config at ${configPath} has ${result.errors.length} validation error${result.errors.length === 1 ? "" : "s"}:\n${lines}`, "INVALID_CONFIG_FILE", "Fix the listed fields, or run `akm config migrate` if the errors look like legacy-shape leftovers.");
41
- }
@@ -1,56 +0,0 @@
1
- // This Source Code Form is subject to the terms of the Mozilla Public
2
- // License, v. 2.0. If a copy of the MPL was not distributed with this
3
- // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
- import { defineGroupCommand, defineJsonCommand, output } from "../cli/shared.js";
5
- import { UsageError } from "../core/errors.js";
6
- import { createMigrationBackup, MIGRATION_BACKUP_VERSION, restoreMigrationBackup } from "../core/migration-backup.js";
7
- function requireVersion(value) {
8
- if (value !== MIGRATION_BACKUP_VERSION) {
9
- throw new UsageError(`Unsupported migration backup target ${JSON.stringify(value)}; expected ${MIGRATION_BACKUP_VERSION}.`, "INVALID_FLAG_VALUE");
10
- }
11
- }
12
- export const backupCommand = defineGroupCommand({
13
- meta: { name: "backup", description: "Create or restore a verified migration recovery run" },
14
- subCommands: {
15
- create: defineJsonCommand({
16
- meta: { name: "create", description: "Create a unique installation-scoped migration recovery run" },
17
- args: {
18
- for: { type: "string", required: true, description: "Migration target version (0.9.0)" },
19
- },
20
- run({ args }) {
21
- requireVersion(args.for);
22
- const result = createMigrationBackup();
23
- output("backup", {
24
- action: "create",
25
- for: MIGRATION_BACKUP_VERSION,
26
- path: result.path,
27
- created: result.created,
28
- manifest: result.manifest,
29
- });
30
- },
31
- }),
32
- restore: defineJsonCommand({
33
- meta: { name: "restore", description: "Restore a recovery run after preserving a rescue snapshot" },
34
- args: {
35
- for: { type: "string", required: true, description: "Migration target version (0.9.0)" },
36
- run: { type: "string", description: "Backup run ID (defaults to the newest applicable run)" },
37
- confirm: { type: "boolean", default: false, description: "Confirm destructive restoration" },
38
- },
39
- run({ args }) {
40
- requireVersion(args.for);
41
- const result = restoreMigrationBackup(args.confirm, args.run);
42
- output("backup", {
43
- action: "restore",
44
- for: MIGRATION_BACKUP_VERSION,
45
- path: result.path,
46
- restored: true,
47
- rescuePath: result.rescuePath,
48
- manifest: result.manifest,
49
- });
50
- },
51
- }),
52
- },
53
- defaultRun() {
54
- throw new UsageError("Choose `backup create` or `backup restore`.", "MISSING_REQUIRED_ARGUMENT");
55
- },
56
- });
@@ -1,68 +0,0 @@
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
- * `akm bundle` command family (normative spec §29 CLI convergence). Groups the
6
- * 0.9.0 read verbs over the workspace bundle state:
7
- *
8
- * akm bundle list — configured bundles + resolved lock state
9
- * akm bundle show <id> — one bundle's config, lock state, item count
10
- * akm bundle items <id> — a bundle's indexed items (by canonical ref)
11
- *
12
- * Mirrors the existing group-command wiring (`graph`, `env`, `secret`): a
13
- * `defineGroupCommand` whose `defaultRun` fires only on the bare `akm bundle`
14
- * invocation (falls back to `list`), and `defineJsonCommand` leaves that emit
15
- * the standard JSON envelope with `--format` parity. The lifecycle verbs
16
- * (`create`/`install`/`update`/`remove`/`sync`/`export`) stay on their existing
17
- * top-level commands for 0.9.0; `bind`/`unbind`/`bindings` are Tier B and are
18
- * intentionally not registered here (spec §18 staging note, §29).
19
- */
20
- import { defineGroupCommand, defineJsonCommand, output } from "../../cli/shared.js";
21
- import { akmBundleItems, akmBundleList, akmBundleShow } from "./bundle.js";
22
- const bundleSubCommands = {
23
- list: defineJsonCommand({
24
- meta: {
25
- name: "list",
26
- description: "List configured bundles (desired config + resolved lock state), defaultBundle marked",
27
- },
28
- run() {
29
- output("bundle-list", akmBundleList());
30
- },
31
- }),
32
- show: defineJsonCommand({
33
- meta: {
34
- name: "show",
35
- description: "Show one bundle's source descriptor, resolved lock state, components, and item count",
36
- },
37
- args: {
38
- // Optional in citty so run() is invoked even when omitted; the body then
39
- // throws a structured UsageError (exit 2) instead of citty's raw
40
- // required-positional error (which escapes as an unclassified exit 70).
41
- id: { type: "positional", description: "Bundle id (a key in the workspace `bundles` config)", required: false },
42
- },
43
- run({ args }) {
44
- output("bundle-show", akmBundleShow({ id: typeof args.id === "string" ? args.id : "" }));
45
- },
46
- }),
47
- items: defineJsonCommand({
48
- meta: {
49
- name: "items",
50
- description: "List a bundle's indexed items by canonical `bundle//conceptId` ref, with a per-type count",
51
- },
52
- args: {
53
- // Optional for the same reason as `show` above: a missing id must surface
54
- // as a structured UsageError (exit 2), not citty's unclassified exit 70.
55
- id: { type: "positional", description: "Bundle id (a key in the workspace `bundles` config)", required: false },
56
- },
57
- run({ args }) {
58
- output("bundle-items", akmBundleItems({ id: typeof args.id === "string" ? args.id : "" }));
59
- },
60
- }),
61
- };
62
- export const bundleCommand = defineGroupCommand({
63
- meta: { name: "bundle", description: "Inspect the workspace's configured bundles and their resolved lock state" },
64
- subCommands: bundleSubCommands,
65
- defaultRun() {
66
- output("bundle-list", akmBundleList());
67
- },
68
- });
@@ -1,219 +0,0 @@
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
- * `akm bundle` read surface — the 0.9.0 CLI convergence toward the bundle
6
- * command family (normative spec §29). This module owns the READ verbs
7
- * (`list`, `show`, `items`) over the workspace's resolved bundle state:
8
- *
9
- * - the desired configuration (`bundles` / `defaultBundle`, spec §10.1), and
10
- * - the resolved lock state (`akm.lock`, spec §10.2), joined by bundle id, and
11
- * - the persisted index (`item_ref` / `bundle_id` provenance columns) for the
12
- * per-bundle item listing.
13
- *
14
- * Scope note (deliberate): the lifecycle verbs the §29 direction also lists
15
- * (`create`/`install`/`update`/`remove`/`sync`/`export`) keep their existing
16
- * top-level commands (`akm add`/`update`/`remove`/`sync`, …) for 0.9.0 — this
17
- * chunk adds the new read namespace over the freshly-landed `bundles` config +
18
- * lock state, nothing more. `akm bind|unbind|bindings` are Tier B and are NOT
19
- * implemented (spec §18 staging note, §29). No trust/activation machinery lives
20
- * here — these are pure reads of already-persisted state.
21
- */
22
- import fs from "node:fs";
23
- import { loadConfig } from "../../core/config/config.js";
24
- import { NotFoundError, UsageError } from "../../core/errors.js";
25
- import { getDbPath } from "../../core/paths.js";
26
- import { readLockfile } from "../../integrations/lockfile.js";
27
- import { closeDatabase, openExistingDatabase } from "../../storage/repositories/index-connection.js";
28
- import { getAllEntries } from "../../storage/repositories/index-entries-repository.js";
29
- // ── Helpers ───────────────────────────────────────────────────────────────────
30
- /** Derive the single source descriptor view from a validated bundle entry. */
31
- function describeBundleSource(entry) {
32
- if (typeof entry.path === "string" && entry.path.length > 0) {
33
- return { kind: "path", locator: entry.path };
34
- }
35
- if (typeof entry.git === "string" && entry.git.length > 0) {
36
- return { kind: "git", locator: entry.git };
37
- }
38
- if (entry.website && typeof entry.website.url === "string") {
39
- return {
40
- kind: "website",
41
- locator: entry.website.url,
42
- ...(typeof entry.website.maxPages === "number" ? { maxPages: entry.website.maxPages } : {}),
43
- };
44
- }
45
- if (typeof entry.npm === "string" && entry.npm.length > 0) {
46
- return { kind: "npm", locator: entry.npm };
47
- }
48
- // A validated config always carries exactly one descriptor; this fallback
49
- // only fires for a hand-corrupted entry that bypassed schema validation.
50
- return { kind: "path", locator: "" };
51
- }
52
- /** Project a lockfile entry onto the §10.2 view (drops the redundant `id`). */
53
- function toLockView(entry) {
54
- if (!entry)
55
- return null;
56
- return {
57
- source: entry.source,
58
- ref: entry.ref,
59
- ...(entry.resolvedVersion !== undefined ? { resolvedVersion: entry.resolvedVersion } : {}),
60
- ...(entry.resolvedRevision !== undefined ? { resolvedRevision: entry.resolvedRevision } : {}),
61
- ...(entry.integrity !== undefined ? { integrity: entry.integrity } : {}),
62
- ...(entry.localRoot !== undefined ? { localRoot: entry.localRoot } : {}),
63
- ...(entry.manifestDigest !== undefined ? { manifestDigest: entry.manifestDigest } : {}),
64
- ...(entry.adapterIds !== undefined ? { adapterIds: entry.adapterIds } : {}),
65
- ...(entry.installedAt !== undefined ? { installedAt: entry.installedAt } : {}),
66
- };
67
- }
68
- /** Component views for a bundle entry (transitional single-entry `components` map). */
69
- function describeComponents(entry) {
70
- const components = entry.components;
71
- if (!components)
72
- return [];
73
- return Object.entries(components).map(([name, component]) => ({
74
- name,
75
- ...(typeof component.root === "string" ? { root: component.root } : {}),
76
- ...(typeof component.adapter === "string" ? { adapter: component.adapter } : {}),
77
- ...(typeof component.writable === "boolean" ? { writable: component.writable } : {}),
78
- }));
79
- }
80
- /**
81
- * Enumerate the indexed items whose durable `bundle_id` provenance equals
82
- * `bundleId`. Returns `[]` when the index has not been built yet — a bundle
83
- * with no index rows is a valid (just-installed, not-yet-indexed) state, not an
84
- * error. Deterministically ordered (type, then conceptId) so the JSON is stable.
85
- */
86
- export function readBundleItems(bundleId, dbPath) {
87
- const resolvedPath = dbPath ?? getDbPath();
88
- if (!fs.existsSync(resolvedPath))
89
- return [];
90
- let db;
91
- try {
92
- db = openExistingDatabase(resolvedPath);
93
- const items = [];
94
- for (const row of getAllEntries(db)) {
95
- if (row.bundleId !== bundleId)
96
- continue;
97
- const conceptId = row.conceptId ?? row.entry.name;
98
- items.push({
99
- ref: `${bundleId}//${conceptId}`,
100
- conceptId,
101
- type: row.entry.type,
102
- name: row.entry.name,
103
- });
104
- }
105
- items.sort((a, b) => a.type.localeCompare(b.type) || a.conceptId.localeCompare(b.conceptId));
106
- return items;
107
- }
108
- catch (err) {
109
- // Surface (don't swallow) so an operator can diagnose a corrupt/locked index
110
- // rather than silently seeing an empty bundle. Mirrors `akm info` behavior.
111
- process.stderr.write(`[akm bundle] failed to read index items from ${resolvedPath}: ${String(err)}\n`);
112
- return [];
113
- }
114
- finally {
115
- if (db) {
116
- try {
117
- closeDatabase(db);
118
- }
119
- catch {
120
- /* ignore close error */
121
- }
122
- }
123
- }
124
- }
125
- /** Resolve one bundle config entry by id or throw a not-found naming the bundle. */
126
- function requireBundle(config, id) {
127
- const trimmed = id.trim();
128
- if (!trimmed) {
129
- throw new UsageError("A bundle id is required.", "MISSING_REQUIRED_ARGUMENT");
130
- }
131
- const bundles = config.bundles;
132
- const entry = bundles?.[trimmed];
133
- if (!entry) {
134
- throw new NotFoundError(bundles
135
- ? `No bundle named "${trimmed}". Run \`akm bundle list\` to see configured bundles.`
136
- : `No bundles are configured. This workspace still uses the pre-0.9.0 source shape; run \`akm migrate apply\` to adopt bundles.`, "SOURCE_NOT_FOUND");
137
- }
138
- return entry;
139
- }
140
- // ── Commands ──────────────────────────────────────────────────────────────────
141
- /**
142
- * `akm bundle list` — the configured bundles (spec §10.1 desired config) joined
143
- * with their resolved lock state (spec §10.2), defaultBundle marked. Empty (with
144
- * a migration `note`) for a workspace that still uses the pre-0.9.0 source shape.
145
- */
146
- export function akmBundleList() {
147
- const config = loadConfig();
148
- const bundles = config.bundles;
149
- const defaultBundle = config.defaultBundle ?? null;
150
- if (!bundles) {
151
- return {
152
- schemaVersion: 1,
153
- defaultBundle: null,
154
- bundles: [],
155
- totalBundles: 0,
156
- note: "No bundles configured. This workspace still uses the pre-0.9.0 source shape (`stashDir`/`sources`/`installed`); run `akm migrate apply` to adopt the bundle model.",
157
- };
158
- }
159
- const locks = readLockfile();
160
- const lockById = new Map(locks.map((entry) => [entry.id, entry]));
161
- const summaries = Object.entries(bundles).map(([id, entry]) => ({
162
- id,
163
- default: id === defaultBundle,
164
- source: describeBundleSource(entry),
165
- writable: entry.writable === true,
166
- ...(typeof entry.registryId === "string" ? { registryId: entry.registryId } : {}),
167
- lock: toLockView(lockById.get(id)),
168
- }));
169
- return {
170
- schemaVersion: 1,
171
- defaultBundle,
172
- bundles: summaries,
173
- totalBundles: summaries.length,
174
- };
175
- }
176
- /**
177
- * `akm bundle show <id>` — one bundle's desired config (source descriptor,
178
- * writable, registryId, components), its resolved lock state, and its indexed
179
- * item count. Not-found (exit 1) for an unknown or unconfigured bundle.
180
- */
181
- export function akmBundleShow(input) {
182
- const config = loadConfig();
183
- const entry = requireBundle(config, input.id);
184
- const id = input.id.trim();
185
- const lock = readLockfile().find((e) => e.id === id);
186
- return {
187
- schemaVersion: 1,
188
- id,
189
- default: id === config.defaultBundle,
190
- source: describeBundleSource(entry),
191
- writable: entry.writable === true,
192
- ...(typeof entry.registryId === "string" ? { registryId: entry.registryId } : {}),
193
- components: describeComponents(entry),
194
- lock: toLockView(lock),
195
- itemCount: readBundleItems(id, input.dbPath).length,
196
- };
197
- }
198
- /**
199
- * `akm bundle items <id>` — the indexed items belonging to a bundle, keyed by
200
- * their canonical `bundle//conceptId` ref, with a per-type count. Not-found
201
- * (exit 1) for an unknown or unconfigured bundle.
202
- */
203
- export function akmBundleItems(input) {
204
- const config = loadConfig();
205
- requireBundle(config, input.id);
206
- const id = input.id.trim();
207
- const items = readBundleItems(id, input.dbPath);
208
- const byType = {};
209
- for (const item of items) {
210
- byType[item.type] = (byType[item.type] ?? 0) + 1;
211
- }
212
- return {
213
- schemaVersion: 1,
214
- bundle: id,
215
- items,
216
- totalItems: items.length,
217
- byType,
218
- };
219
- }
@@ -1,124 +0,0 @@
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
- * `akm graph` command family. Extracted verbatim from src/cli.ts (WS6) so the
6
- * God Module shrinks; the `main.subCommands.graph` key and every subcommand's
7
- * args/output shape are byte-identical. Each handler is migrated to
8
- * `defineJsonCommand`, which wraps the body in `runWithJsonErrors` and emits the
9
- * same JSON envelope (stdout/stderr/exit-code) as the inline `runWithJsonErrors`
10
- * form it replaces.
11
- */
12
- import { parsePositiveIntFlag } from "../../cli/parse-args.js";
13
- import { defineGroupCommand, defineJsonCommand, output } from "../../cli/shared.js";
14
- import { akmGraphEntities, akmGraphEntity, akmGraphExport, akmGraphOrphans, akmGraphRelated, akmGraphRelations, akmGraphSummary, akmGraphUpdate, } from "./graph.js";
15
- const graphSubCommands = {
16
- summary: defineJsonCommand({
17
- meta: { name: "summary", description: "Show entity-graph counts and quality telemetry" },
18
- args: {
19
- source: { type: "string", description: "Source name/path (default: primary stash source)" },
20
- },
21
- run({ args }) {
22
- output("graph-summary", akmGraphSummary({ source: args.source }));
23
- },
24
- }),
25
- entities: defineJsonCommand({
26
- meta: { name: "entities", description: "List entities with per-file occurrence counts" },
27
- args: {
28
- source: { type: "string", description: "Source name/path (default: primary stash source)" },
29
- limit: { type: "string", description: "Maximum entities to return" },
30
- },
31
- run({ args }) {
32
- output("graph-entities", akmGraphEntities({ source: args.source, limit: parsePositiveIntFlag(args.limit ?? undefined) }));
33
- },
34
- }),
35
- relations: defineJsonCommand({
36
- meta: { name: "relations", description: "List relations with occurrence counts" },
37
- args: {
38
- source: { type: "string", description: "Source name/path (default: primary stash source)" },
39
- limit: { type: "string", description: "Maximum relations to return" },
40
- },
41
- run({ args }) {
42
- output("graph-relations", akmGraphRelations({ source: args.source, limit: parsePositiveIntFlag(args.limit ?? undefined) }));
43
- },
44
- }),
45
- related: defineJsonCommand({
46
- meta: { name: "related", description: "Show graph-related neighboring assets for a ref" },
47
- args: {
48
- ref: { type: "positional", description: "Asset ref", required: true },
49
- source: { type: "string", description: "Source name/path (default: primary stash source)" },
50
- limit: { type: "string", description: "Maximum related assets to return" },
51
- },
52
- async run({ args }) {
53
- output("graph-related", await akmGraphRelated({
54
- ref: args.ref ?? "",
55
- source: args.source,
56
- limit: parsePositiveIntFlag(args.limit ?? undefined),
57
- }));
58
- },
59
- }),
60
- entity: defineJsonCommand({
61
- meta: { name: "entity", description: "List assets that contain the given entity" },
62
- args: {
63
- name: { type: "positional", description: "Entity name", required: true },
64
- source: { type: "string", description: "Source name/path (default: primary stash source)" },
65
- limit: { type: "string", description: "Maximum matches to return" },
66
- },
67
- run({ args }) {
68
- output("graph-entity", akmGraphEntity({
69
- name: args.name ?? "",
70
- source: args.source,
71
- limit: parsePositiveIntFlag(args.limit ?? undefined),
72
- }));
73
- },
74
- }),
75
- orphans: defineJsonCommand({
76
- meta: { name: "orphans", description: "List assets with no extracted graph entities" },
77
- args: {
78
- source: { type: "string", description: "Source name/path (default: primary stash source)" },
79
- limit: { type: "string", description: "Maximum orphans to return" },
80
- },
81
- run({ args }) {
82
- output("graph-orphans", akmGraphOrphans({ source: args.source, limit: parsePositiveIntFlag(args.limit ?? undefined) }));
83
- },
84
- }),
85
- export: defineJsonCommand({
86
- meta: { name: "export", description: "Export graph artifact as JSON or JSONL" },
87
- args: {
88
- source: { type: "string", description: "Source name/path (default: primary stash source)" },
89
- out: { type: "string", description: "Output path" },
90
- format: { type: "string", description: "Export format (json|jsonl)", default: "json" },
91
- },
92
- run({ args }) {
93
- output("graph-export", akmGraphExport({
94
- source: args.source,
95
- out: args.out ?? "",
96
- format: args.format,
97
- }));
98
- },
99
- }),
100
- update: defineJsonCommand({
101
- meta: { name: "update", description: "Re-run graph extraction, optionally scoped to specific asset refs" },
102
- args: {
103
- refs: {
104
- type: "positional",
105
- description: "Zero or more asset refs to scope extraction (omit for a full re-extract)",
106
- required: false,
107
- default: "",
108
- },
109
- source: { type: "string", description: "Source name/path (default: primary stash source)" },
110
- },
111
- async run({ args }) {
112
- // `refs` is a single positional; collect remaining argv tokens as well.
113
- const rawRefs = [args.refs, ...(Array.isArray(args._) ? args._ : [])].filter((r) => typeof r === "string" && r.trim().length > 0);
114
- output("graph-update", await akmGraphUpdate({ refs: rawRefs.length > 0 ? rawRefs : undefined, source: args.source }));
115
- },
116
- }),
117
- };
118
- export const graphCommand = defineGroupCommand({
119
- meta: { name: "graph", description: "Inspect the indexed entity graph stored in SQLite" },
120
- subCommands: graphSubCommands,
121
- defaultRun() {
122
- output("graph-summary", akmGraphSummary());
123
- },
124
- });