akm-cli 0.8.1 → 0.9.0-beta.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 (318) hide show
  1. package/CHANGELOG.md +258 -0
  2. package/dist/assets/help/help-proposals.md +1 -2
  3. package/dist/assets/hints/cli-hints-full.md +34 -19
  4. package/dist/assets/hints/cli-hints-short.md +1 -1
  5. package/dist/assets/profiles/catchup.json +13 -0
  6. package/dist/assets/profiles/consolidate.json +13 -0
  7. package/dist/assets/profiles/frequent.json +13 -0
  8. package/dist/assets/stash-skeleton/README.md +76 -0
  9. package/dist/assets/tasks/core/backup.yml +4 -0
  10. package/dist/assets/tasks/core/extract.yml +4 -0
  11. package/dist/assets/tasks/core/improve.yml +4 -0
  12. package/dist/assets/tasks/core/index-refresh.yml +4 -0
  13. package/dist/assets/tasks/core/sync.yml +4 -0
  14. package/dist/assets/tasks/core/update-stashes.yml +4 -0
  15. package/dist/assets/tasks/core/version-check.yml +4 -0
  16. package/dist/cli/config-migrate.js +6 -6
  17. package/dist/cli/config-validate.js +4 -4
  18. package/dist/cli/confirm.js +3 -3
  19. package/dist/cli/parse-args.js +1 -1
  20. package/dist/cli/shared.js +51 -14
  21. package/dist/cli-node.mjs +26 -0
  22. package/dist/cli.js +171 -3857
  23. package/dist/commands/{agent-dispatch.js → agent/agent-dispatch.js} +6 -6
  24. package/dist/commands/{agent-support.js → agent/agent-support.js} +2 -2
  25. package/dist/commands/agent/contribute-cli.js +200 -0
  26. package/dist/commands/completions.js +1 -1
  27. package/dist/commands/config-cli.js +240 -3
  28. package/dist/commands/config-edit.js +344 -0
  29. package/dist/commands/db-cli.js +2 -2
  30. package/dist/commands/env/env-cli.js +529 -0
  31. package/dist/commands/env/env.js +410 -0
  32. package/dist/commands/env/secret-cli.js +259 -0
  33. package/dist/commands/{secret.js → env/secret.js} +6 -47
  34. package/dist/commands/events.js +4 -4
  35. package/dist/commands/feedback-cli.js +18 -34
  36. package/dist/commands/graph/graph-cli.js +132 -0
  37. package/dist/commands/{graph.js → graph/graph.js} +22 -16
  38. package/dist/commands/health/checks.js +279 -0
  39. package/dist/commands/health.js +101 -249
  40. package/dist/commands/{consolidate.js → improve/consolidate.js} +52 -40
  41. package/dist/commands/{distill-promotion-policy.js → improve/distill-promotion-policy.js} +3 -3
  42. package/dist/commands/{distill.js → improve/distill.js} +39 -18
  43. package/dist/commands/{eval-cases.js → improve/eval-cases.js} +1 -1
  44. package/dist/commands/{extract-cli.js → improve/extract-cli.js} +4 -4
  45. package/dist/commands/{extract-prompt.js → improve/extract-prompt.js} +2 -2
  46. package/dist/commands/{extract.js → improve/extract.js} +185 -26
  47. package/dist/commands/{improve-auto-accept.js → improve/improve-auto-accept.js} +4 -4
  48. package/dist/commands/{improve-cli.js → improve/improve-cli.js} +45 -23
  49. package/dist/commands/{improve-profiles.js → improve/improve-profiles.js} +13 -7
  50. package/dist/commands/{improve-result-file.js → improve/improve-result-file.js} +10 -5
  51. package/dist/commands/{improve.js → improve/improve.js} +536 -248
  52. package/dist/{core → commands/improve/memory}/memory-belief.js +2 -2
  53. package/dist/{core → commands/improve/memory}/memory-contradiction-detect.js +5 -5
  54. package/dist/{core → commands/improve/memory}/memory-improve.js +4 -4
  55. package/dist/commands/{reflect.js → improve/reflect.js} +33 -28
  56. package/dist/commands/improve/session-asset.js +248 -0
  57. package/dist/commands/lint/agent-linter.js +1 -1
  58. package/dist/commands/lint/base-linter.js +55 -37
  59. package/dist/commands/lint/command-linter.js +1 -1
  60. package/dist/commands/lint/default-linter.js +1 -1
  61. package/dist/commands/lint/env-key-rules.js +1 -1
  62. package/dist/commands/lint/index.js +19 -25
  63. package/dist/commands/lint/knowledge-linter.js +1 -1
  64. package/dist/commands/lint/memory-linter.js +1 -1
  65. package/dist/commands/lint/registry.js +8 -8
  66. package/dist/commands/lint/skill-linter.js +1 -1
  67. package/dist/commands/lint/task-linter.js +1 -1
  68. package/dist/commands/lint/workflow-linter.js +1 -1
  69. package/dist/commands/lint.js +1 -1
  70. package/dist/commands/observability-cli.js +244 -0
  71. package/dist/commands/{proposal-drain-policies.js → proposal/drain-policies.js} +3 -3
  72. package/dist/commands/{proposal-drain.js → proposal/drain.js} +15 -10
  73. package/dist/commands/proposal/proposal-cli.js +478 -0
  74. package/dist/commands/{proposal.js → proposal/proposal.js} +5 -5
  75. package/dist/commands/{propose.js → proposal/propose.js} +11 -11
  76. package/dist/{core → commands/proposal/validators}/proposal-quality-validators.js +8 -3
  77. package/dist/{core → commands/proposal/validators}/proposal-validators.js +5 -5
  78. package/dist/{core → commands/proposal/validators}/proposals.js +13 -7
  79. package/dist/commands/{curate.js → read/curate.js} +7 -7
  80. package/dist/commands/{knowledge.js → read/knowledge.js} +22 -9
  81. package/dist/commands/{registry-search.js → read/registry-search.js} +5 -5
  82. package/dist/commands/{remember-cli.js → read/remember-cli.js} +15 -7
  83. package/dist/commands/read/search-cli.js +207 -0
  84. package/dist/commands/{search.js → read/search.js} +22 -27
  85. package/dist/commands/{show.js → read/show.js} +77 -44
  86. package/dist/commands/registry-cli.js +8 -8
  87. package/dist/commands/remember.js +8 -8
  88. package/dist/commands/sources/add-cli.js +293 -0
  89. package/dist/commands/{history.js → sources/history.js} +27 -25
  90. package/dist/commands/{info.js → sources/info.js} +6 -6
  91. package/dist/commands/{init.js → sources/init.js} +10 -5
  92. package/dist/commands/{installed-stashes.js → sources/installed-stashes.js} +12 -12
  93. package/dist/commands/{migration-help.js → sources/migration-help.js} +3 -2
  94. package/dist/commands/{schema-repair.js → sources/schema-repair.js} +8 -8
  95. package/dist/commands/{self-update.js → sources/self-update.js} +10 -9
  96. package/dist/commands/{source-add.js → sources/source-add.js} +10 -10
  97. package/dist/commands/{source-clone.js → sources/source-clone.js} +7 -7
  98. package/dist/commands/{source-manage.js → sources/source-manage.js} +4 -4
  99. package/dist/commands/sources/sources-cli.js +305 -0
  100. package/dist/commands/sources/stash-cli.js +219 -0
  101. package/dist/commands/sources/stash-skeleton.js +79 -0
  102. package/dist/commands/tasks/default-tasks.js +173 -0
  103. package/dist/commands/tasks/tasks-cli.js +210 -0
  104. package/dist/commands/{tasks.js → tasks/tasks.js} +14 -14
  105. package/dist/commands/wiki-cli.js +307 -0
  106. package/dist/commands/workflow-cli.js +329 -0
  107. package/dist/core/action-contributors.js +1 -1
  108. package/dist/core/assert.js +40 -0
  109. package/dist/core/asset/asset-create.js +54 -0
  110. package/dist/core/{asset-ref.js → asset/asset-ref.js} +21 -4
  111. package/dist/core/{asset-registry.js → asset/asset-registry.js} +3 -3
  112. package/dist/core/{asset-spec.js → asset/asset-spec.js} +17 -31
  113. package/dist/core/{markdown.js → asset/markdown.js} +1 -1
  114. package/dist/core/asset/stash-meta.js +110 -0
  115. package/dist/core/best-effort.js +64 -0
  116. package/dist/core/common.js +32 -18
  117. package/dist/core/{config-io.js → config/config-io.js} +29 -19
  118. package/dist/core/{config-migration.js → config/config-migration.js} +11 -9
  119. package/dist/core/{config-schema.js → config/config-schema.js} +45 -1
  120. package/dist/core/config/config-types.js +16 -0
  121. package/dist/core/{config-walker.js → config/config-walker.js} +2 -2
  122. package/dist/core/{config.js → config/config.js} +10 -8
  123. package/dist/core/env-secret-ref.js +90 -0
  124. package/dist/core/errors.js +13 -3
  125. package/dist/core/events.js +27 -4
  126. package/dist/core/file-lock.js +1 -1
  127. package/dist/core/improve-types.js +48 -0
  128. package/dist/core/lesson-lint.js +2 -2
  129. package/dist/core/paths.js +2 -2
  130. package/dist/{setup/ripgrep-install.js → core/ripgrep/install.js} +2 -2
  131. package/dist/{setup/ripgrep-resolve.js → core/ripgrep/resolve.js} +2 -2
  132. package/dist/core/state-db.js +88 -46
  133. package/dist/core/text-truncation.js +148 -0
  134. package/dist/core/time.js +1 -1
  135. package/dist/core/write-source.js +98 -85
  136. package/dist/indexer/{db-backup.js → db/db-backup.js} +9 -24
  137. package/dist/indexer/{db.js → db/db.js} +126 -116
  138. package/dist/indexer/{graph-db.js → db/graph-db.js} +9 -4
  139. package/dist/indexer/{llm-cache.js → db/llm-cache.js} +15 -12
  140. package/dist/indexer/ensure-index.js +4 -4
  141. package/dist/indexer/{graph-boost.js → graph/graph-boost.js} +1 -1
  142. package/dist/indexer/{graph-extraction.js → graph/graph-extraction.js} +55 -13
  143. package/dist/indexer/indexer.js +37 -30
  144. package/dist/indexer/init.js +54 -0
  145. package/dist/indexer/manifest.js +10 -10
  146. package/dist/indexer/{memory-inference.js → passes/memory-inference.js} +92 -23
  147. package/dist/indexer/{metadata-contributors.js → passes/metadata-contributors.js} +10 -8
  148. package/dist/indexer/{metadata.js → passes/metadata.js} +15 -19
  149. package/dist/indexer/{staleness-detect.js → passes/staleness-detect.js} +53 -12
  150. package/dist/indexer/{db-search.js → search/db-search.js} +28 -16
  151. package/dist/indexer/{ranking-contributors.js → search/ranking-contributors.js} +1 -1
  152. package/dist/indexer/{ranking.js → search/ranking.js} +2 -2
  153. package/dist/indexer/{search-hit-enrichers.js → search/search-hit-enrichers.js} +3 -3
  154. package/dist/indexer/{search-source.js → search/search-source.js} +8 -8
  155. package/dist/indexer/{semantic-status.js → search/semantic-status.js} +3 -3
  156. package/dist/indexer/usage/unmigrated-vaults-guard.js +94 -0
  157. package/dist/indexer/{usage-events.js → usage/usage-events.js} +32 -0
  158. package/dist/indexer/{file-context.js → walk/file-context.js} +10 -15
  159. package/dist/indexer/{matchers.js → walk/matchers.js} +13 -9
  160. package/dist/indexer/{path-resolver.js → walk/path-resolver.js} +6 -6
  161. package/dist/indexer/{project-context.js → walk/project-context.js} +1 -1
  162. package/dist/indexer/{walker.js → walk/walker.js} +4 -3
  163. package/dist/integrations/agent/builder-shared.js +39 -0
  164. package/dist/integrations/agent/builders.js +14 -81
  165. package/dist/integrations/agent/config.js +6 -4
  166. package/dist/integrations/agent/detect.js +1 -1
  167. package/dist/integrations/agent/index.js +23 -8
  168. package/dist/integrations/agent/prompts.js +2 -3
  169. package/dist/integrations/agent/runner.js +22 -3
  170. package/dist/integrations/agent/spawn.js +9 -10
  171. package/dist/integrations/harnesses/claude/agent-builder.js +48 -0
  172. package/dist/integrations/harnesses/claude/config-import.js +70 -0
  173. package/dist/integrations/harnesses/claude/index.js +64 -0
  174. package/dist/integrations/{session-logs/providers/claude-code.js → harnesses/claude/session-log.js} +16 -1
  175. package/dist/integrations/harnesses/index.js +144 -0
  176. package/dist/integrations/harnesses/opencode/agent-builder.js +43 -0
  177. package/dist/integrations/harnesses/opencode/config-import.js +82 -0
  178. package/dist/integrations/harnesses/opencode/index.js +59 -0
  179. package/dist/integrations/{session-logs/providers/opencode.js → harnesses/opencode/session-log.js} +1 -1
  180. package/dist/integrations/harnesses/opencode-sdk/index.js +49 -0
  181. package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +234 -0
  182. package/dist/integrations/harnesses/types.js +43 -0
  183. package/dist/integrations/lockfile.js +7 -16
  184. package/dist/integrations/session-logs/index.js +82 -9
  185. package/dist/llm/call-ai.js +4 -4
  186. package/dist/llm/client.js +131 -6
  187. package/dist/llm/embedder.js +6 -6
  188. package/dist/llm/embedders/local.js +9 -22
  189. package/dist/llm/embedders/remote.js +2 -2
  190. package/dist/llm/embedders/types.js +1 -1
  191. package/dist/llm/graph-extract.js +31 -12
  192. package/dist/llm/index-passes.js +1 -1
  193. package/dist/llm/memory-infer.js +12 -5
  194. package/dist/llm/metadata-enhance.js +2 -2
  195. package/dist/output/context.js +6 -44
  196. package/dist/output/renderers.js +88 -58
  197. package/dist/output/shapes/curate.js +7 -3
  198. package/dist/output/shapes/distill.js +7 -3
  199. package/dist/output/shapes/env-list.js +18 -16
  200. package/dist/output/shapes/events.js +5 -4
  201. package/dist/output/shapes/helpers.js +2 -4
  202. package/dist/output/shapes/history.js +7 -3
  203. package/dist/output/shapes/passthrough.js +8 -11
  204. package/dist/output/shapes/{proposal-accept.js → proposal/accept.js} +7 -3
  205. package/dist/output/shapes/{proposal-diff.js → proposal/diff.js} +7 -3
  206. package/dist/output/shapes/{proposal-list.js → proposal/list.js} +7 -3
  207. package/dist/output/shapes/{proposal-producer.js → proposal/producer.js} +5 -4
  208. package/dist/output/shapes/{proposal-reject.js → proposal/reject.js} +7 -3
  209. package/dist/output/shapes/{proposal-show.js → proposal/show.js} +7 -3
  210. package/dist/output/shapes/registry-search.js +7 -3
  211. package/dist/output/shapes/registry.js +12 -0
  212. package/dist/output/shapes/search.js +7 -3
  213. package/dist/output/shapes/secret-list.js +18 -16
  214. package/dist/output/shapes/show.js +7 -3
  215. package/dist/output/shapes.js +55 -30
  216. package/dist/output/text/add.js +2 -3
  217. package/dist/output/text/clone.js +2 -3
  218. package/dist/output/text/config.js +2 -3
  219. package/dist/output/text/curate.js +4 -3
  220. package/dist/output/text/distill.js +2 -3
  221. package/dist/output/text/enable-disable.js +5 -4
  222. package/dist/output/text/env.js +13 -0
  223. package/dist/output/text/events.js +5 -4
  224. package/dist/output/text/feedback.js +4 -3
  225. package/dist/output/text/helpers.js +54 -39
  226. package/dist/output/text/history.js +2 -3
  227. package/dist/output/text/import.js +2 -3
  228. package/dist/output/text/index.js +2 -3
  229. package/dist/output/text/info.js +2 -3
  230. package/dist/output/text/init.js +2 -3
  231. package/dist/output/text/list.js +2 -3
  232. package/dist/output/text/proposal/producer.js +9 -0
  233. package/dist/output/text/proposal/proposal.js +13 -0
  234. package/dist/output/text/registry-commands.js +8 -7
  235. package/dist/output/text/registry.js +12 -0
  236. package/dist/output/text/remember.js +4 -3
  237. package/dist/output/text/remove.js +2 -3
  238. package/dist/output/text/save.js +2 -3
  239. package/dist/output/text/search.js +4 -3
  240. package/dist/output/text/show.js +4 -3
  241. package/dist/output/text/update.js +2 -3
  242. package/dist/output/text/upgrade.js +2 -3
  243. package/dist/output/text/wiki.js +12 -11
  244. package/dist/output/text/workflow.js +12 -10
  245. package/dist/output/text.js +66 -32
  246. package/dist/registry/build-index.js +11 -10
  247. package/dist/registry/factory.js +1 -1
  248. package/dist/registry/origin-resolve.js +1 -1
  249. package/dist/registry/providers/index.js +2 -2
  250. package/dist/registry/providers/skills-sh.js +91 -72
  251. package/dist/registry/providers/static-index.js +75 -52
  252. package/dist/registry/resolve.js +3 -3
  253. package/dist/runtime.js +242 -0
  254. package/dist/scripts/migrate-storage.js +1594 -673
  255. package/dist/scripts/migrations/import-fs-improve-runs-to-db.js +240 -166
  256. package/dist/setup/detect.js +338 -9
  257. package/dist/setup/harness-config-import.js +56 -0
  258. package/dist/setup/registry-stash-loader.js +99 -0
  259. package/dist/setup/setup.js +664 -96
  260. package/dist/sources/include.js +1 -1
  261. package/dist/sources/provider-factory.js +2 -2
  262. package/dist/sources/providers/filesystem.js +3 -3
  263. package/dist/sources/providers/git.js +9 -9
  264. package/dist/sources/providers/index.js +4 -4
  265. package/dist/sources/providers/npm.js +6 -6
  266. package/dist/sources/providers/provider-utils.js +13 -20
  267. package/dist/sources/providers/sync-from-ref.js +5 -5
  268. package/dist/sources/providers/tar-utils.js +2 -2
  269. package/dist/sources/providers/website.js +2 -2
  270. package/dist/sources/resolve.js +5 -5
  271. package/dist/sources/website-ingest.js +5 -5
  272. package/dist/storage/database.js +102 -0
  273. package/dist/storage/engines/sqlite-migrations.js +42 -0
  274. package/dist/storage/locations.js +25 -0
  275. package/dist/storage/repositories/index-db.js +43 -0
  276. package/dist/storage/repositories/workflow-runs-repository.js +141 -0
  277. package/dist/tasks/backends/cron.js +4 -4
  278. package/dist/tasks/backends/exec-utils.js +32 -0
  279. package/dist/tasks/backends/index.js +3 -3
  280. package/dist/tasks/backends/launchd.js +7 -14
  281. package/dist/tasks/backends/schtasks.js +7 -16
  282. package/dist/tasks/embedded.js +71 -0
  283. package/dist/tasks/parser.js +2 -2
  284. package/dist/tasks/resolveAkmBin.js +1 -1
  285. package/dist/tasks/runner.js +28 -15
  286. package/dist/tasks/schedule.js +1 -1
  287. package/dist/tasks/validator.js +7 -7
  288. package/dist/text-import-hook.mjs +51 -0
  289. package/dist/version.js +2 -1
  290. package/dist/wiki/wiki.js +7 -7
  291. package/dist/workflows/{authoring.js → authoring/authoring.js} +6 -6
  292. package/dist/workflows/{scope-key.js → authoring/scope-key.js} +1 -1
  293. package/dist/workflows/cli.js +1 -1
  294. package/dist/workflows/db.js +50 -32
  295. package/dist/workflows/parser.js +4 -4
  296. package/dist/workflows/renderer.js +5 -5
  297. package/dist/workflows/runtime/agent-identity.js +56 -0
  298. package/dist/workflows/runtime/checkin.js +57 -0
  299. package/dist/workflows/{runs.js → runtime/runs.js} +197 -101
  300. package/dist/workflows/validate-summary.js +82 -0
  301. package/docs/README.md +1 -1
  302. package/docs/data-and-telemetry.md +6 -6
  303. package/package.json +16 -8
  304. package/dist/commands/add-cli.js +0 -279
  305. package/dist/commands/env.js +0 -213
  306. package/dist/integrations/agent/sdk-runner.js +0 -126
  307. package/dist/output/shapes/vault-list.js +0 -19
  308. package/dist/output/text/proposal-producer.js +0 -8
  309. package/dist/output/text/proposal.js +0 -12
  310. package/dist/output/text/vault.js +0 -16
  311. /package/dist/core/{asset-serialize.js → asset/asset-serialize.js} +0 -0
  312. /package/dist/core/{frontmatter.js → asset/frontmatter.js} +0 -0
  313. /package/dist/core/{config-sources.js → config/config-sources.js} +0 -0
  314. /package/dist/indexer/{graph-dedup.js → graph/graph-dedup.js} +0 -0
  315. /package/dist/{core/config-types.js → indexer/passes/pass-context.js} +0 -0
  316. /package/dist/indexer/{search-fields.js → search/search-fields.js} +0 -0
  317. /package/dist/indexer/{index-context.js → walk/index-context.js} +0 -0
  318. /package/dist/workflows/{document-cache.js → runtime/document-cache.js} +0 -0
@@ -10,11 +10,12 @@
10
10
  import { spawnSync } from "node:child_process";
11
11
  import fs from "node:fs";
12
12
  import path from "node:path";
13
- import { TYPE_DIRS } from "../core/asset-spec";
14
- import { loadUserConfig, saveConfig } from "../core/config";
15
- import { ConfigError } from "../core/errors";
16
- import { assertSafeStashDir, getBinDir, getConfigPath, getDefaultStashDir } from "../core/paths";
17
- import { ensureRg } from "../setup/ripgrep-install";
13
+ import { TYPE_DIRS } from "../../core/asset/asset-spec.js";
14
+ import { loadUserConfig, saveConfig } from "../../core/config/config.js";
15
+ import { ConfigError } from "../../core/errors.js";
16
+ import { assertSafeStashDir, getBinDir, getConfigPath, getDefaultStashDir } from "../../core/paths.js";
17
+ import { ensureRg } from "../../core/ripgrep/install.js";
18
+ import { copyStashSkeleton, scaffoldStashMeta } from "./stash-skeleton.js";
18
19
  /**
19
20
  * Refuse to persist a temporary-directory stashDir to the user's config when
20
21
  * running under a test runner AND `--dir <tempdir>` was passed explicitly.
@@ -74,6 +75,10 @@ export async function akmInit(options) {
74
75
  }
75
76
  // Ensure the default stash is a local git repo (no remote required)
76
77
  ensureGitRepo(stashDir);
78
+ if (created) {
79
+ copyStashSkeleton(stashDir);
80
+ scaffoldStashMeta(stashDir);
81
+ }
77
82
  // Persist stashDir in config.json
78
83
  const configPath = getConfigPath();
79
84
  const existing = loadUserConfig();
@@ -9,18 +9,18 @@
9
9
  */
10
10
  import fs from "node:fs";
11
11
  import path from "node:path";
12
- import { isWithin, resolveStashDir } from "../core/common";
13
- import { getSources, loadConfig } from "../core/config";
14
- import { NotFoundError, UsageError } from "../core/errors";
15
- import { akmIndex } from "../indexer/indexer";
16
- import { removeLockEntry, upsertLockEntry } from "../integrations/lockfile";
17
- import { parseRegistryRef } from "../registry/resolve";
18
- import { parseGitRepoUrl, syncMirroredRepo } from "../sources/providers/git";
19
- import { syncFromRef } from "../sources/providers/sync-from-ref";
20
- import { ensureWebsiteMirror } from "../sources/website-ingest";
21
- import { listWikis, resolveWikisRoot } from "../wiki/wiki";
22
- import { removeInstalledRegistryEntry, upsertInstalledRegistryEntry } from "./source-add";
23
- import { removeStash } from "./source-manage";
12
+ import { isWithin, resolveStashDir } from "../../core/common.js";
13
+ import { getSources, loadConfig } from "../../core/config/config.js";
14
+ import { NotFoundError, UsageError } from "../../core/errors.js";
15
+ import { akmIndex } from "../../indexer/indexer.js";
16
+ import { removeLockEntry, upsertLockEntry } from "../../integrations/lockfile.js";
17
+ import { parseRegistryRef } from "../../registry/resolve.js";
18
+ import { parseGitRepoUrl, syncMirroredRepo } from "../../sources/providers/git.js";
19
+ import { syncFromRef } from "../../sources/providers/sync-from-ref.js";
20
+ import { ensureWebsiteMirror } from "../../sources/website-ingest.js";
21
+ import { listWikis, resolveWikisRoot } from "../../wiki/wiki.js";
22
+ import { removeInstalledRegistryEntry, upsertInstalledRegistryEntry } from "./source-add.js";
23
+ import { removeStash } from "./source-manage.js";
24
24
  export async function akmListSources(input) {
25
25
  const stashDir = input?.stashDir ?? resolveStashDir();
26
26
  const config = loadConfig();
@@ -3,6 +3,7 @@
3
3
  // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
4
  import fs from "node:fs";
5
5
  import path from "node:path";
6
+ import { getDirname } from "../../runtime.js";
6
7
  const CHANGELOG_URL = "https://github.com/itlackey/akm/blob/main/CHANGELOG.md";
7
8
  const MIGRATION_DOC_URL = "https://github.com/itlackey/akm/blob/main/docs/migration/v0.5-to-v0.6.md";
8
9
  /**
@@ -13,11 +14,11 @@ const MIGRATION_DOC_URL = "https://github.com/itlackey/akm/blob/main/docs/migrat
13
14
  * `files[]` array in `package.json`.
14
15
  */
15
16
  function releaseNotesDir() {
16
- return path.resolve(import.meta.dir, "../../docs/migration/release-notes");
17
+ return path.resolve(getDirname(import.meta.url), "../../../docs/migration/release-notes");
17
18
  }
18
19
  function loadChangelog() {
19
20
  try {
20
- const changelogPath = path.resolve(import.meta.dir, "../../CHANGELOG.md");
21
+ const changelogPath = path.resolve(getDirname(import.meta.url), "../../../CHANGELOG.md");
21
22
  if (fs.existsSync(changelogPath)) {
22
23
  return fs.readFileSync(changelogPath, "utf8");
23
24
  }
@@ -14,14 +14,14 @@
14
14
  */
15
15
  import fs from "node:fs";
16
16
  import path from "node:path";
17
- import { parseAssetRef } from "../core/asset-ref";
18
- import { assembleAsset } from "../core/asset-serialize";
19
- import { appendEvent, readEvents } from "../core/events";
20
- import { parseFrontmatter } from "../core/frontmatter";
21
- import { createProposal, isProposalSkipped } from "../core/proposals";
22
- import { info, warn } from "../core/warn";
23
- import { resolveAssetPath } from "../indexer/path-resolver";
24
- import { chatCompletion, parseEmbeddedJsonResponse } from "../llm/client";
17
+ import { parseAssetRef } from "../../core/asset/asset-ref.js";
18
+ import { assembleAsset } from "../../core/asset/asset-serialize.js";
19
+ import { parseFrontmatter } from "../../core/asset/frontmatter.js";
20
+ import { appendEvent, readEvents } from "../../core/events.js";
21
+ import { info, warn } from "../../core/warn.js";
22
+ import { resolveAssetPath } from "../../indexer/walk/path-resolver.js";
23
+ import { chatCompletion, parseEmbeddedJsonResponse } from "../../llm/client.js";
24
+ import { createProposal, isProposalSkipped } from "../proposal/validators/proposals.js";
25
25
  // ── Constants ────────────────────────────────────────────────────────────────
26
26
  /** Minimum gap between schema-repair attempts on the same asset. */
27
27
  const SCHEMA_REPAIR_COOLDOWN_MS = 7 * 24 * 60 * 60 * 1000; // 7 days
@@ -5,9 +5,10 @@ import * as childProcess from "node:child_process";
5
5
  import { createHash } from "node:crypto";
6
6
  import fs from "node:fs";
7
7
  import path from "node:path";
8
- import { fetchWithRetry, IS_WINDOWS } from "../core/common";
9
- import { warn } from "../core/warn";
10
- import { githubHeaders } from "../integrations/github";
8
+ import { fetchWithRetry, IS_WINDOWS } from "../../core/common.js";
9
+ import { warn } from "../../core/warn.js";
10
+ import { githubHeaders } from "../../integrations/github.js";
11
+ import { getDirname, mainPath, semverOrder } from "../../runtime.js";
11
12
  const REPO = "itlackey/akm";
12
13
  const DEFAULT_PACKAGE_NAME = "akm-cli";
13
14
  const NODE_MODULES_SEGMENT = "/node_modules/";
@@ -16,8 +17,8 @@ const PNPM_GLOBAL_INSTALL_PATTERN = /(^|\/)(?:pnpm\/global|\.pnpm-global)(?:\/\d
16
17
  /** Read live runtime signals. */
17
18
  export function getInstallSignals() {
18
19
  return {
19
- bunMain: typeof Bun !== "undefined" ? Bun.main : undefined,
20
- importMetaDir: import.meta.dir ?? undefined,
20
+ bunMain: mainPath,
21
+ importMetaDir: getDirname(import.meta.url),
21
22
  hasAkmVersion: typeof AKM_VERSION !== "undefined",
22
23
  };
23
24
  }
@@ -34,8 +35,8 @@ export function detectInstallMethod(signals) {
34
35
  }
35
36
  return "npm";
36
37
  }
37
- // Bun-compiled binaries: Bun.main points to a virtual /$bunfs/ path,
38
- // NOT process.execPath. The old check (Bun.main === process.execPath) was
38
+ // Bun-compiled binaries: mainPath points to a virtual /$bunfs/
39
+ // path, NOT process.execPath. The old check (mainPath === process.execPath) was
39
40
  // always false for compiled binaries, causing "unknown" for every binary user.
40
41
  if (s.bunMain !== undefined) {
41
42
  // Primary check: compiled binaries embed sources under /$bunfs/
@@ -77,7 +78,7 @@ export async function checkForUpdate(currentVersion) {
77
78
  return {
78
79
  currentVersion,
79
80
  latestVersion,
80
- updateAvailable: latestVersion !== "" && Bun.semver.order(currentVersion, latestVersion) < 0,
81
+ updateAvailable: latestVersion !== "" && semverOrder(currentVersion, latestVersion) < 0,
81
82
  installMethod,
82
83
  };
83
84
  }
@@ -373,7 +374,7 @@ function normalizePathSeparators(value) {
373
374
  }
374
375
  function getInstalledPackageName() {
375
376
  try {
376
- const pkgPath = path.resolve(import.meta.dir ?? __dirname, "../../package.json");
377
+ const pkgPath = path.resolve(getDirname(import.meta.url), "../../../package.json");
377
378
  if (fs.existsSync(pkgPath)) {
378
379
  const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf-8"));
379
380
  if (typeof pkg.name === "string" && pkg.name.trim()) {
@@ -3,16 +3,16 @@
3
3
  // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
4
  import fs from "node:fs";
5
5
  import path from "node:path";
6
- import { isHttpUrl, resolveStashDir } from "../core/common";
7
- import { getSources, loadConfig, loadUserConfig, saveConfig } from "../core/config";
8
- import { ConfigError, UsageError } from "../core/errors";
9
- import { akmIndex } from "../indexer/indexer";
10
- import { upsertLockEntry } from "../integrations/lockfile";
11
- import { parseRegistryRef } from "../registry/resolve";
12
- import { detectStashRoot } from "../sources/providers/provider-utils";
13
- import { syncFromRef } from "../sources/providers/sync-from-ref";
14
- import { ensureWebsiteMirror, validateWebsiteInputUrl } from "../sources/website-ingest";
15
- import { ensureWikiNameAvailable, validateWikiName } from "../wiki/wiki";
6
+ import { isHttpUrl, resolveStashDir } from "../../core/common.js";
7
+ import { getSources, loadConfig, loadUserConfig, saveConfig } from "../../core/config/config.js";
8
+ import { ConfigError, UsageError } from "../../core/errors.js";
9
+ import { akmIndex } from "../../indexer/indexer.js";
10
+ import { upsertLockEntry } from "../../integrations/lockfile.js";
11
+ import { parseRegistryRef } from "../../registry/resolve.js";
12
+ import { detectStashRoot } from "../../sources/providers/provider-utils.js";
13
+ import { syncFromRef } from "../../sources/providers/sync-from-ref.js";
14
+ import { ensureWebsiteMirror, validateWebsiteInputUrl } from "../../sources/website-ingest.js";
15
+ import { ensureWikiNameAvailable, validateWikiName } from "../../wiki/wiki.js";
16
16
  const VALID_OVERRIDE_TYPES = new Set(["wiki"]);
17
17
  export async function akmAdd(input) {
18
18
  const ref = input.ref.trim();
@@ -3,13 +3,13 @@
3
3
  // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
4
  import fs from "node:fs";
5
5
  import path from "node:path";
6
- import { makeAssetRef, parseAssetRef } from "../core/asset-ref";
7
- import { TYPE_DIRS } from "../core/asset-spec";
8
- import { NotFoundError, UsageError } from "../core/errors";
9
- import { findSourceForPath, getPrimarySource, resolveSourceEntries } from "../indexer/search-source";
10
- import { isRemoteOrigin, resolveSourcesForOrigin } from "../registry/origin-resolve";
11
- import { syncFromRef } from "../sources/providers/sync-from-ref";
12
- import { resolveAssetPath } from "../sources/resolve";
6
+ import { makeAssetRef, parseAssetRef } from "../../core/asset/asset-ref.js";
7
+ import { TYPE_DIRS } from "../../core/asset/asset-spec.js";
8
+ import { NotFoundError, UsageError } from "../../core/errors.js";
9
+ import { findSourceForPath, getPrimarySource, resolveSourceEntries, } from "../../indexer/search/search-source.js";
10
+ import { isRemoteOrigin, resolveSourcesForOrigin } from "../../registry/origin-resolve.js";
11
+ import { syncFromRef } from "../../sources/providers/sync-from-ref.js";
12
+ import { resolveAssetPath } from "../../sources/resolve.js";
13
13
  export async function akmClone(options) {
14
14
  const parsed = parseAssetRef(options.sourceRef);
15
15
  // When --dest is provided, the working stash is optional
@@ -2,10 +2,10 @@
2
2
  // License, v. 2.0. If a copy of the MPL was not distributed with this
3
3
  // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
4
  import path from "node:path";
5
- import { isRemoteUrl } from "../core/common";
6
- import { getSources, loadConfig, loadUserConfig, saveConfig } from "../core/config";
7
- import { ConfigError, UsageError } from "../core/errors";
8
- import { resolveSourceEntries } from "../indexer/search-source";
5
+ import { isRemoteUrl } from "../../core/common.js";
6
+ import { getSources, loadConfig, loadUserConfig, saveConfig } from "../../core/config/config.js";
7
+ import { ConfigError, UsageError } from "../../core/errors.js";
8
+ import { resolveSourceEntries } from "../../indexer/search/search-source.js";
9
9
  // ── Operations ──────────────────────────────────────────────────────────────
10
10
  /**
11
11
  * Add a stash source (filesystem path or remote provider URL) to config.
@@ -0,0 +1,305 @@
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
+ * Source-management CLI commands — `akm list/remove/update/upgrade/sync/clone/history`.
6
+ *
7
+ * Extracted verbatim from src/cli.ts (WS6). Each `main.subCommands.<key>`
8
+ * registration line stays byte-identical; the args/output shape of every
9
+ * subcommand is unchanged. The `--kind` filter helper (`parseKindFilter` +
10
+ * `VALID_SOURCE_KINDS`), the `runSyncBody` git-commit/push body, and the
11
+ * `wasFormatValueConsumedAsName` citty-mis-parse workaround are used ONLY by
12
+ * this cluster, so they move with it.
13
+ *
14
+ * Leaf handlers whose body is a plain `runWithJsonErrors(async () => { … })`
15
+ * are migrated to `defineJsonCommand`, which emits the same JSON envelope
16
+ * (stdout/stderr/exit-code) as the inline form. `sync` keeps `defineCommand`
17
+ * because its `run` delegates to `runSyncBody` (which owns the
18
+ * `runWithJsonErrors` wrapper) rather than wrapping inline.
19
+ */
20
+ import { defineCommand } from "citty";
21
+ import { defineJsonCommand, output, runWithJsonErrors } from "../../cli/shared.js";
22
+ import { loadConfig } from "../../core/config/config.js";
23
+ import { UsageError } from "../../core/errors.js";
24
+ import { appendEvent } from "../../core/events.js";
25
+ import { resolveSourceEntries } from "../../indexer/search/search-source.js";
26
+ import { getHyphenatedBoolean, parseFlagValue } from "../../output/context.js";
27
+ import { resolveWritableOverride, saveGitStash } from "../../sources/providers/git.js";
28
+ import { pkgVersion } from "../../version.js";
29
+ import { akmHistory } from "./history.js";
30
+ import { akmListSources, akmRemove, akmUpdate } from "./installed-stashes.js";
31
+ import { checkForUpdate, performUpgrade } from "./self-update.js";
32
+ import { akmClone } from "./source-clone.js";
33
+ const VALID_SOURCE_KINDS = new Set(["local", "managed", "remote"]);
34
+ function parseKindFilter(raw) {
35
+ if (!raw)
36
+ return undefined;
37
+ const kinds = raw.split(",").map((s) => s.trim());
38
+ for (const k of kinds) {
39
+ if (!VALID_SOURCE_KINDS.has(k)) {
40
+ throw new UsageError(`Invalid --kind value: "${k}". Expected one of: local, managed, remote`);
41
+ }
42
+ }
43
+ return kinds;
44
+ }
45
+ export const listCommand = defineJsonCommand({
46
+ meta: { name: "list", description: "List all sources (local directories, managed packages, remote providers)" },
47
+ args: {
48
+ kind: { type: "string", description: "Filter by source kind (local, managed, remote). Comma-separated." },
49
+ },
50
+ async run({ args }) {
51
+ const kind = parseKindFilter(args.kind);
52
+ const result = await akmListSources({ kind });
53
+ output("list", result);
54
+ },
55
+ });
56
+ export const removeCommand = defineJsonCommand({
57
+ meta: { name: "remove", description: "Remove a source by id, ref, path, URL, or name" },
58
+ args: {
59
+ target: { type: "positional", description: "Source to remove (id, ref, path, URL, or name)", required: true },
60
+ yes: { type: "boolean", alias: "y", description: "Skip confirmation prompt", default: false },
61
+ },
62
+ async run({ args }) {
63
+ const { confirmDestructive } = await import("../../cli/confirm.js");
64
+ const confirmed = await confirmDestructive(`Remove source "${args.target}"? This cannot be undone.`, {
65
+ yes: args.yes === true,
66
+ });
67
+ if (!confirmed) {
68
+ process.stderr.write("Aborted.\n");
69
+ return;
70
+ }
71
+ const result = await akmRemove({ target: args.target });
72
+ appendEvent({
73
+ eventType: "remove",
74
+ metadata: {
75
+ target: args.target,
76
+ ref: typeof result.removed?.ref === "string" ? result.removed.ref : null,
77
+ id: typeof result.removed?.id === "string" ? result.removed.id : null,
78
+ },
79
+ });
80
+ output("remove", result);
81
+ },
82
+ });
83
+ export const updateCommand = defineJsonCommand({
84
+ meta: { name: "update", description: "Update one or all managed sources" },
85
+ args: {
86
+ target: { type: "positional", description: "Source to update (id or ref)", required: false },
87
+ all: { type: "boolean", description: "Update all installed entries", default: false },
88
+ force: { type: "boolean", description: "Force fresh download even if version is unchanged", default: false },
89
+ },
90
+ async run({ args }) {
91
+ const result = await akmUpdate({ target: args.target, all: args.all, force: args.force });
92
+ appendEvent({
93
+ eventType: "update",
94
+ metadata: {
95
+ target: args.target ?? null,
96
+ all: args.all === true,
97
+ force: args.force === true,
98
+ processed: Array.isArray(result.processed)
99
+ ? result.processed.length
100
+ : 0,
101
+ },
102
+ });
103
+ output("update", result);
104
+ },
105
+ });
106
+ export const upgradeCommand = defineJsonCommand({
107
+ meta: { name: "upgrade", description: "Upgrade akm to the latest release" },
108
+ args: {
109
+ check: { type: "boolean", description: "Check for updates without installing", default: false },
110
+ force: { type: "boolean", description: "Force upgrade even if on latest", default: false },
111
+ "skip-checksum": {
112
+ type: "boolean",
113
+ description: "Skip checksum verification (not recommended)",
114
+ default: false,
115
+ },
116
+ "skip-post-upgrade": {
117
+ type: "boolean",
118
+ description: "Skip the post-upgrade `akm index` rebuild (config auto-migration still runs on next `akm` invocation)",
119
+ default: false,
120
+ },
121
+ },
122
+ async run({ args }) {
123
+ const check = await checkForUpdate(pkgVersion);
124
+ if (args.check) {
125
+ output("upgrade", check);
126
+ return;
127
+ }
128
+ const skipChecksum = getHyphenatedBoolean(args, "skip-checksum");
129
+ const skipPostUpgrade = getHyphenatedBoolean(args, "skip-post-upgrade");
130
+ const result = await performUpgrade(check, { force: args.force, skipChecksum, skipPostUpgrade });
131
+ output("upgrade", result);
132
+ },
133
+ });
134
+ // `sync` body. Kept as a standalone function so the git-commit/push logic and
135
+ // the `--format`-as-name workaround stay in one place.
136
+ async function runSyncBody(args, verb) {
137
+ await runWithJsonErrors(async () => {
138
+ // Fix: citty can consume `--format json` (space-separated) as the
139
+ // positional `name` argument (e.g. `akm sync --format json` parses
140
+ // name="json"). Detect the mis-parse by checking argv order — only
141
+ // treat the positional as consumed by --format when --format appears
142
+ // before any standalone occurrence of the same value in the sync
143
+ // subcommand's argv slice. This preserves legitimate invocations
144
+ // like `akm sync json --format json`.
145
+ const parsedFormat = parseFlagValue(process.argv, "--format");
146
+ const effectiveName = args.name !== undefined &&
147
+ parsedFormat !== undefined &&
148
+ args.name === parsedFormat &&
149
+ wasFormatValueConsumedAsName(args.name, parsedFormat, verb)
150
+ ? undefined
151
+ : args.name;
152
+ let writable;
153
+ if (effectiveName === undefined) {
154
+ // Primary stash — honour the root-level writable flag from config.
155
+ writable = resolveWritableOverride(loadConfig());
156
+ }
157
+ const result = saveGitStash(effectiveName, args.message, writable, { push: args.push !== false });
158
+ appendEvent({
159
+ eventType: "save",
160
+ metadata: {
161
+ name: effectiveName ?? null,
162
+ message: args.message ?? null,
163
+ ok: result.ok !== false,
164
+ },
165
+ });
166
+ output("save", result);
167
+ });
168
+ }
169
+ export const syncCommand = defineCommand({
170
+ meta: {
171
+ name: "sync",
172
+ description: "Sync changes in a git-backed stash: commits (and pushes when writable + remote is configured). No-op for non-git stashes.",
173
+ },
174
+ args: {
175
+ name: {
176
+ type: "positional",
177
+ description: "Name of the git stash to sync (default: primary stash directory)",
178
+ required: false,
179
+ },
180
+ message: {
181
+ type: "string",
182
+ alias: "m",
183
+ description: "Commit message (default: timestamp)",
184
+ },
185
+ push: {
186
+ type: "boolean",
187
+ description: "Push after commit when writable + remote configured (use --no-push to commit only). Default: true.",
188
+ default: true,
189
+ },
190
+ },
191
+ async run({ args }) {
192
+ await runSyncBody(args, "sync");
193
+ },
194
+ });
195
+ /**
196
+ * Detect whether `--format <value>` was consumed by citty as the optional
197
+ * `name` positional of `akm sync`. Returns true only when `--format` appears
198
+ * in the sync subcommand's argv slice AND the candidate name does NOT
199
+ * appear as a standalone positional elsewhere (before or after the flag).
200
+ *
201
+ * This keeps `akm sync json --format json` routing `json` as the stash name,
202
+ * while `akm sync --format json` (no separate positional) is treated as a
203
+ * primary-stash sync. `verb` is the subcommand token to anchor on.
204
+ */
205
+ function wasFormatValueConsumedAsName(name, formatValue, verb) {
206
+ const argv = process.argv.slice(2);
207
+ const verbIndex = argv.indexOf(verb);
208
+ const tokens = verbIndex >= 0 ? argv.slice(verbIndex + 1) : argv;
209
+ let formatIndex = -1;
210
+ let formatConsumesNextToken = false;
211
+ for (let i = 0; i < tokens.length; i += 1) {
212
+ const token = tokens[i];
213
+ if (token === "--format") {
214
+ formatIndex = i;
215
+ formatConsumesNextToken = true;
216
+ break;
217
+ }
218
+ if (token === `--format=${formatValue}`) {
219
+ formatIndex = i;
220
+ break;
221
+ }
222
+ }
223
+ if (formatIndex === -1)
224
+ return false;
225
+ // If the name appears as a standalone token before --format, it's the
226
+ // real positional and --format did not consume it.
227
+ if (tokens.slice(0, formatIndex).includes(name))
228
+ return false;
229
+ // If --format has a space-separated value, skip past the value token
230
+ // when scanning after the flag; otherwise start right after the flag.
231
+ const firstTokenAfterFormat = formatIndex + (formatConsumesNextToken ? 2 : 1);
232
+ if (tokens.slice(firstTokenAfterFormat).includes(name))
233
+ return false;
234
+ return true;
235
+ }
236
+ export const cloneCommand = defineJsonCommand({
237
+ meta: {
238
+ name: "clone",
239
+ description: "Clone an asset from any source into the working stash or a custom destination",
240
+ },
241
+ args: {
242
+ ref: { type: "positional", description: "Asset ref (e.g. npm:@scope/pkg//script:deploy.sh)", required: true },
243
+ name: { type: "string", description: "New name for the cloned asset" },
244
+ force: { type: "boolean", description: "Overwrite if asset already exists in working stash", default: false },
245
+ dest: { type: "string", description: "Destination directory (default: working stash)" },
246
+ },
247
+ async run({ args }) {
248
+ const result = await akmClone({
249
+ sourceRef: args.ref,
250
+ newName: args.name,
251
+ force: args.force,
252
+ dest: args.dest,
253
+ });
254
+ output("clone", result);
255
+ },
256
+ });
257
+ export const historyCommand = defineJsonCommand({
258
+ meta: {
259
+ name: "history",
260
+ description: "Show mutation/usage history for a single asset (--ref) or stash-wide.\n\n" +
261
+ "Event sources:\n" +
262
+ " usage_events (default): search, show, and feedback events from the local index.\n" +
263
+ " state.db events (--include-proposals): proposal lifecycle events (promoted, rejected)\n" +
264
+ " emitted by `akm accept` / `akm reject`.\n\n" +
265
+ "Results from all active sources are merged and sorted chronologically.",
266
+ },
267
+ args: {
268
+ ref: { type: "string", description: "Asset ref (type:name). Omit for stash-wide history." },
269
+ since: { type: "string", description: "ISO timestamp or epoch ms — only events on/after this time" },
270
+ generator: {
271
+ type: "string",
272
+ description: 'Filter by event generator: "user" (default) or "improve" (akm improve operations).',
273
+ },
274
+ "include-proposals": {
275
+ type: "boolean",
276
+ description: "Also include proposal lifecycle events (promoted, rejected) from state.db events. " +
277
+ "Default: false (usage_events only).",
278
+ default: false,
279
+ },
280
+ "accept-rate-by-source": {
281
+ type: "boolean",
282
+ description: "Compute accept-rate-per-source metrics from the proposal store and include them in the output (F-4 / #385). " +
283
+ "Useful for measuring which generators (reflect, distill, …) produce the most accepted proposals.",
284
+ default: false,
285
+ },
286
+ format: { type: "string", description: "Output format (json|jsonl|text|yaml)" },
287
+ },
288
+ async run({ args }) {
289
+ const generatorFlag = args.generator;
290
+ if (generatorFlag !== undefined && generatorFlag !== "user" && generatorFlag !== "improve") {
291
+ throw new UsageError(`Invalid --generator value: "${generatorFlag}". Must be "user" or "improve".`, "INVALID_FLAG_VALUE");
292
+ }
293
+ const sources = resolveSourceEntries();
294
+ const stashDir = sources[0]?.path;
295
+ const result = await akmHistory({
296
+ ref: args.ref,
297
+ since: args.since,
298
+ source: generatorFlag,
299
+ includeProposals: args["include-proposals"],
300
+ acceptRateBySource: args["accept-rate-by-source"],
301
+ stashDir,
302
+ });
303
+ output("history", result);
304
+ },
305
+ });