agentplane 0.3.13 → 0.3.15

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 (278) hide show
  1. package/assets/RUNNER.md +1 -1
  2. package/assets/agents/ORCHESTRATOR.json +1 -1
  3. package/assets/agents/SKILL_EXTRACTOR.json +31 -0
  4. package/assets/framework.manifest.json +7 -0
  5. package/assets/policy/incidents.md +5 -3
  6. package/assets/policy/workflow.branch_pr.md +10 -5
  7. package/dist/.build-manifest.json +280 -180
  8. package/dist/cli/output.d.ts +29 -0
  9. package/dist/cli/output.d.ts.map +1 -1
  10. package/dist/cli/output.js +33 -0
  11. package/dist/cli/run-cli/command-catalog/core.d.ts.map +1 -1
  12. package/dist/cli/run-cli/command-catalog/core.js +29 -87
  13. package/dist/cli/run-cli/command-catalog/lifecycle.d.ts.map +1 -1
  14. package/dist/cli/run-cli/command-catalog/lifecycle.js +4 -12
  15. package/dist/cli/run-cli/command-catalog/project.d.ts +1 -1
  16. package/dist/cli/run-cli/command-catalog/project.d.ts.map +1 -1
  17. package/dist/cli/run-cli/command-catalog/project.js +16 -38
  18. package/dist/cli/run-cli/command-catalog/shared.d.ts +9 -6
  19. package/dist/cli/run-cli/command-catalog/shared.d.ts.map +1 -1
  20. package/dist/cli/run-cli/command-catalog/shared.js +23 -6
  21. package/dist/cli/run-cli/command-catalog/task.d.ts.map +1 -1
  22. package/dist/cli/run-cli/command-catalog/task.js +6 -18
  23. package/dist/cli/run-cli/command-catalog.d.ts +1 -1
  24. package/dist/cli/run-cli/command-catalog.d.ts.map +1 -1
  25. package/dist/cli/run-cli/commands/init/recipes.d.ts.map +1 -1
  26. package/dist/cli/run-cli/commands/init/recipes.js +1 -0
  27. package/dist/cli/run-cli.js +1 -1
  28. package/dist/cli/run-cli.test-helpers.d.ts +1 -74
  29. package/dist/cli/run-cli.test-helpers.d.ts.map +1 -1
  30. package/dist/cli/run-cli.test-helpers.js +1 -769
  31. package/dist/commands/branch/cleanup-merged.d.ts.map +1 -1
  32. package/dist/commands/branch/cleanup-merged.js +5 -9
  33. package/dist/commands/branch/work-start.command.d.ts.map +1 -1
  34. package/dist/commands/branch/work-start.command.js +1 -0
  35. package/dist/commands/commit.spec.d.ts.map +1 -1
  36. package/dist/commands/commit.spec.js +2 -0
  37. package/dist/commands/doctor/branch-pr.d.ts +1 -1
  38. package/dist/commands/doctor/branch-pr.d.ts.map +1 -1
  39. package/dist/commands/doctor/branch-pr.js +5 -2
  40. package/dist/commands/guard/impl/commands.d.ts.map +1 -1
  41. package/dist/commands/guard/impl/commands.js +4 -1
  42. package/dist/commands/guard/impl/comment-commit.d.ts.map +1 -1
  43. package/dist/commands/guard/impl/comment-commit.js +2 -1
  44. package/dist/commands/guard/impl/env.d.ts +6 -0
  45. package/dist/commands/guard/impl/env.d.ts.map +1 -1
  46. package/dist/commands/guard/impl/env.js +41 -0
  47. package/dist/commands/pr/internal/auto-commit.d.ts.map +1 -1
  48. package/dist/commands/pr/internal/auto-commit.js +2 -1
  49. package/dist/commands/pr/internal/sync-branch.d.ts +36 -0
  50. package/dist/commands/pr/internal/sync-branch.d.ts.map +1 -0
  51. package/dist/commands/pr/internal/sync-branch.js +113 -0
  52. package/dist/commands/pr/internal/sync-github.d.ts +28 -0
  53. package/dist/commands/pr/internal/sync-github.d.ts.map +1 -0
  54. package/dist/commands/pr/internal/sync-github.js +178 -0
  55. package/dist/commands/pr/internal/sync-model.d.ts +36 -0
  56. package/dist/commands/pr/internal/sync-model.d.ts.map +1 -0
  57. package/dist/commands/pr/internal/sync-model.js +1 -0
  58. package/dist/commands/pr/internal/sync-open-step.d.ts +10 -0
  59. package/dist/commands/pr/internal/sync-open-step.d.ts.map +1 -0
  60. package/dist/commands/pr/internal/sync-open-step.js +128 -0
  61. package/dist/commands/pr/internal/sync-support.d.ts +7 -0
  62. package/dist/commands/pr/internal/sync-support.d.ts.map +1 -0
  63. package/dist/commands/pr/internal/sync-support.js +29 -0
  64. package/dist/commands/pr/internal/sync-update-step.d.ts +6 -0
  65. package/dist/commands/pr/internal/sync-update-step.d.ts.map +1 -0
  66. package/dist/commands/pr/internal/sync-update-step.js +68 -0
  67. package/dist/commands/pr/internal/sync.d.ts +2 -6
  68. package/dist/commands/pr/internal/sync.d.ts.map +1 -1
  69. package/dist/commands/pr/internal/sync.js +83 -529
  70. package/dist/commands/pr/open.d.ts.map +1 -1
  71. package/dist/commands/pr/open.js +25 -8
  72. package/dist/commands/pr/pr.command.d.ts.map +1 -1
  73. package/dist/commands/pr/pr.command.js +7 -2
  74. package/dist/commands/recipes/impl/apply.d.ts +1 -1
  75. package/dist/commands/recipes/impl/apply.d.ts.map +1 -1
  76. package/dist/commands/recipes/impl/apply.js +1 -2
  77. package/dist/commands/recipes/impl/commands/active.d.ts.map +1 -1
  78. package/dist/commands/recipes/impl/commands/active.js +6 -5
  79. package/dist/commands/recipes/impl/commands/add.d.ts +1 -0
  80. package/dist/commands/recipes/impl/commands/add.d.ts.map +1 -1
  81. package/dist/commands/recipes/impl/commands/add.js +32 -27
  82. package/dist/commands/recipes/impl/commands/detach.d.ts.map +1 -1
  83. package/dist/commands/recipes/impl/commands/detach.js +35 -21
  84. package/dist/commands/recipes/impl/commands/disable.d.ts.map +1 -1
  85. package/dist/commands/recipes/impl/commands/disable.js +5 -3
  86. package/dist/commands/recipes/impl/commands/enable.d.ts.map +1 -1
  87. package/dist/commands/recipes/impl/commands/enable.js +5 -3
  88. package/dist/commands/recipes/impl/commands/explain.d.ts.map +1 -1
  89. package/dist/commands/recipes/impl/commands/explain.js +57 -47
  90. package/dist/commands/recipes/impl/commands/info.d.ts.map +1 -1
  91. package/dist/commands/recipes/impl/commands/info.js +25 -21
  92. package/dist/commands/recipes/impl/commands/install.d.ts +1 -1
  93. package/dist/commands/recipes/impl/commands/install.d.ts.map +1 -1
  94. package/dist/commands/recipes/impl/commands/install.js +3 -13
  95. package/dist/commands/recipes/impl/commands/list-remote.d.ts.map +1 -1
  96. package/dist/commands/recipes/impl/commands/list-remote.js +2 -3
  97. package/dist/commands/recipes/impl/commands/list.d.ts.map +1 -1
  98. package/dist/commands/recipes/impl/commands/list.js +7 -6
  99. package/dist/commands/recipes/impl/commands/remove.d.ts.map +1 -1
  100. package/dist/commands/recipes/impl/commands/remove.js +12 -7
  101. package/dist/commands/recipes/impl/commands/update.d.ts.map +1 -1
  102. package/dist/commands/recipes/impl/commands/update.js +38 -24
  103. package/dist/commands/recipes/impl/index.d.ts +1 -1
  104. package/dist/commands/recipes/impl/index.d.ts.map +1 -1
  105. package/dist/commands/recipes/impl/installed-recipes.d.ts +1 -1
  106. package/dist/commands/recipes/impl/installed-recipes.d.ts.map +1 -1
  107. package/dist/commands/recipes/impl/installed-recipes.js +1 -2
  108. package/dist/commands/recipes/impl/mutation-transaction.d.ts +7 -0
  109. package/dist/commands/recipes/impl/mutation-transaction.d.ts.map +1 -0
  110. package/dist/commands/recipes/impl/mutation-transaction.js +47 -0
  111. package/dist/commands/recipes/impl/overlay-project.d.ts +19 -3
  112. package/dist/commands/recipes/impl/overlay-project.d.ts.map +1 -1
  113. package/dist/commands/recipes/impl/overlay-project.js +76 -38
  114. package/dist/commands/recipes/impl/paths.d.ts +0 -3
  115. package/dist/commands/recipes/impl/paths.d.ts.map +1 -1
  116. package/dist/commands/recipes/impl/paths.js +0 -3
  117. package/dist/commands/recipes/impl/project-installed-recipes.d.ts +4 -1
  118. package/dist/commands/recipes/impl/project-installed-recipes.d.ts.map +1 -1
  119. package/dist/commands/recipes/impl/project-installed-recipes.js +6 -4
  120. package/dist/commands/recipes/impl/project-recipe-state.d.ts +1 -1
  121. package/dist/commands/recipes/impl/project-recipe-state.d.ts.map +1 -1
  122. package/dist/commands/recipes/impl/project-registry.d.ts +5 -1
  123. package/dist/commands/recipes/impl/project-registry.d.ts.map +1 -1
  124. package/dist/commands/recipes/impl/project-registry.js +34 -14
  125. package/dist/commands/recipes/impl/resolver.d.ts +1 -1
  126. package/dist/commands/recipes/impl/resolver.d.ts.map +1 -1
  127. package/dist/commands/recipes/impl/resolver.js +1 -1
  128. package/dist/commands/recipes/impl/types.d.ts +1 -1
  129. package/dist/commands/recipes/impl/types.d.ts.map +1 -1
  130. package/dist/commands/recipes/impl/version.d.ts +5 -0
  131. package/dist/commands/recipes/impl/version.d.ts.map +1 -0
  132. package/dist/commands/recipes/impl/version.js +9 -0
  133. package/dist/commands/recipes.d.ts +5 -4
  134. package/dist/commands/recipes.d.ts.map +1 -1
  135. package/dist/commands/recipes.js +3 -3
  136. package/dist/commands/release/apply.command.d.ts +1 -1
  137. package/dist/commands/release/apply.command.d.ts.map +1 -1
  138. package/dist/commands/release/apply.command.js +15 -379
  139. package/dist/commands/release/apply.mutation.d.ts +1 -0
  140. package/dist/commands/release/apply.mutation.d.ts.map +1 -1
  141. package/dist/commands/release/apply.mutation.js +24 -1
  142. package/dist/commands/release/apply.pipeline.d.ts +22 -0
  143. package/dist/commands/release/apply.pipeline.d.ts.map +1 -0
  144. package/dist/commands/release/apply.pipeline.js +371 -0
  145. package/dist/commands/release/apply.preflight.d.ts +2 -0
  146. package/dist/commands/release/apply.preflight.d.ts.map +1 -1
  147. package/dist/commands/release/apply.preflight.js +13 -4
  148. package/dist/commands/release/apply.types.d.ts +27 -0
  149. package/dist/commands/release/apply.types.d.ts.map +1 -1
  150. package/dist/commands/release.test-helpers.d.ts +4 -0
  151. package/dist/commands/release.test-helpers.d.ts.map +1 -1
  152. package/dist/commands/release.test-helpers.js +7 -0
  153. package/dist/commands/shared/reconcile-check.d.ts.map +1 -1
  154. package/dist/commands/shared/reconcile-check.js +2 -2
  155. package/dist/commands/shared/task-backend.d.ts +6 -1
  156. package/dist/commands/shared/task-backend.d.ts.map +1 -1
  157. package/dist/commands/shared/task-backend.js +34 -2
  158. package/dist/commands/shared/task-mutation.d.ts.map +1 -1
  159. package/dist/commands/shared/task-mutation.js +4 -4
  160. package/dist/commands/shared/task-store/intents.d.ts +34 -0
  161. package/dist/commands/shared/task-store/intents.d.ts.map +1 -0
  162. package/dist/commands/shared/task-store/intents.js +265 -0
  163. package/dist/commands/shared/task-store/readme.d.ts +28 -0
  164. package/dist/commands/shared/task-store/readme.d.ts.map +1 -0
  165. package/dist/commands/shared/task-store/readme.js +125 -0
  166. package/dist/commands/shared/task-store/store.d.ts +26 -0
  167. package/dist/commands/shared/task-store/store.d.ts.map +1 -0
  168. package/dist/commands/shared/task-store/store.js +105 -0
  169. package/dist/commands/shared/task-store/types.d.ts +94 -0
  170. package/dist/commands/shared/task-store/types.d.ts.map +1 -0
  171. package/dist/commands/shared/task-store/types.js +1 -0
  172. package/dist/commands/shared/task-store.d.ts +3 -109
  173. package/dist/commands/shared/task-store.d.ts.map +1 -1
  174. package/dist/commands/shared/task-store.js +2 -493
  175. package/dist/commands/task/block.d.ts.map +1 -1
  176. package/dist/commands/task/block.js +7 -2
  177. package/dist/commands/task/comment.d.ts.map +1 -1
  178. package/dist/commands/task/comment.js +7 -2
  179. package/dist/commands/task/finish-shared.d.ts.map +1 -1
  180. package/dist/commands/task/finish-shared.js +3 -3
  181. package/dist/commands/task/finish.d.ts.map +1 -1
  182. package/dist/commands/task/finish.js +102 -15
  183. package/dist/commands/task/hosted-close.command.d.ts.map +1 -1
  184. package/dist/commands/task/hosted-close.command.js +23 -2
  185. package/dist/commands/task/hosted-merge-sync.d.ts.map +1 -1
  186. package/dist/commands/task/hosted-merge-sync.js +9 -4
  187. package/dist/commands/task/list.run.d.ts.map +1 -1
  188. package/dist/commands/task/list.run.js +14 -4
  189. package/dist/commands/task/new.command.d.ts.map +1 -1
  190. package/dist/commands/task/new.command.js +16 -2
  191. package/dist/commands/task/new.js +2 -2
  192. package/dist/commands/task/show.d.ts.map +1 -1
  193. package/dist/commands/task/show.js +3 -3
  194. package/dist/commands/task/update.d.ts.map +1 -1
  195. package/dist/commands/task/update.js +11 -3
  196. package/dist/runner/adapters/codex.d.ts.map +1 -1
  197. package/dist/runner/adapters/codex.js +3 -33
  198. package/dist/runner/adapters/custom.d.ts.map +1 -1
  199. package/dist/runner/adapters/custom.js +3 -30
  200. package/dist/runner/adapters/runtime-shared.d.ts +14 -0
  201. package/dist/runner/adapters/runtime-shared.d.ts.map +1 -0
  202. package/dist/runner/adapters/runtime-shared.js +36 -0
  203. package/dist/runner/context/base-prompt-sources.d.ts +30 -0
  204. package/dist/runner/context/base-prompt-sources.d.ts.map +1 -0
  205. package/dist/runner/context/base-prompt-sources.js +144 -0
  206. package/dist/runner/context/base-prompts.d.ts +3 -22
  207. package/dist/runner/context/base-prompts.d.ts.map +1 -1
  208. package/dist/runner/context/base-prompts.js +6 -450
  209. package/dist/runner/context/overlay-prompt-blocks.d.ts +7 -0
  210. package/dist/runner/context/overlay-prompt-blocks.d.ts.map +1 -0
  211. package/dist/runner/context/overlay-prompt-blocks.js +72 -0
  212. package/dist/runner/context/prompt-block-shared.d.ts +54 -0
  213. package/dist/runner/context/prompt-block-shared.d.ts.map +1 -0
  214. package/dist/runner/context/prompt-block-shared.js +106 -0
  215. package/dist/runner/context/recipe-context.d.ts +2 -1
  216. package/dist/runner/context/recipe-context.d.ts.map +1 -1
  217. package/dist/runner/context/recipe-context.js +2 -1
  218. package/dist/runner/context/recipe-prompt-blocks.d.ts +6 -0
  219. package/dist/runner/context/recipe-prompt-blocks.d.ts.map +1 -0
  220. package/dist/runner/context/recipe-prompt-blocks.js +143 -0
  221. package/dist/runner/usecases/scenario-materialize-task.js +2 -2
  222. package/dist/runner/usecases/task-run-inspect.js +2 -2
  223. package/dist/runner/usecases/task-run-lifecycle-shared.js +2 -2
  224. package/dist/runner/usecases/task-run.d.ts.map +1 -1
  225. package/dist/runner/usecases/task-run.js +4 -2
  226. package/dist/runtime/capabilities/recipe.d.ts +1 -1
  227. package/dist/runtime/capabilities/recipe.d.ts.map +1 -1
  228. package/dist/runtime/execution-context.d.ts +63 -0
  229. package/dist/runtime/execution-context.d.ts.map +1 -0
  230. package/dist/{usecases/context/resolve-context.js → runtime/execution-context.js} +23 -26
  231. package/dist/runtime/incidents/advice-strategy.d.ts +15 -0
  232. package/dist/runtime/incidents/advice-strategy.d.ts.map +1 -0
  233. package/dist/runtime/incidents/advice-strategy.js +54 -0
  234. package/dist/runtime/incidents/plan-strategy.d.ts +9 -0
  235. package/dist/runtime/incidents/plan-strategy.d.ts.map +1 -0
  236. package/dist/runtime/incidents/plan-strategy.js +205 -0
  237. package/dist/runtime/incidents/registry-strategy.d.ts +6 -0
  238. package/dist/runtime/incidents/registry-strategy.d.ts.map +1 -0
  239. package/dist/runtime/incidents/registry-strategy.js +280 -0
  240. package/dist/runtime/incidents/resolve.d.ts +3 -25
  241. package/dist/runtime/incidents/resolve.d.ts.map +1 -1
  242. package/dist/runtime/incidents/resolve.js +3 -683
  243. package/dist/runtime/incidents/shared.d.ts +34 -0
  244. package/dist/runtime/incidents/shared.d.ts.map +1 -0
  245. package/dist/runtime/incidents/shared.js +171 -0
  246. package/dist/testing/cli-harness/recipe-archives.d.ts +28 -0
  247. package/dist/testing/cli-harness/recipe-archives.d.ts.map +1 -0
  248. package/dist/testing/cli-harness/recipe-archives.js +374 -0
  249. package/dist/testing/cli-harness/stdio.d.ts +26 -0
  250. package/dist/testing/cli-harness/stdio.d.ts.map +1 -0
  251. package/dist/testing/cli-harness/stdio.js +84 -0
  252. package/dist/testing/cli-harness.d.ts +25 -0
  253. package/dist/testing/cli-harness.d.ts.map +1 -0
  254. package/dist/testing/cli-harness.js +313 -0
  255. package/dist/testing/index.d.ts +2 -0
  256. package/dist/testing/index.d.ts.map +1 -0
  257. package/dist/testing/index.js +1 -0
  258. package/package.json +7 -4
  259. package/dist/commands/recipes/impl/manifest.d.ts +0 -4
  260. package/dist/commands/recipes/impl/manifest.d.ts.map +0 -1
  261. package/dist/commands/recipes/impl/manifest.js +0 -7
  262. package/dist/commands/recipes/impl/normalize.d.ts +0 -8
  263. package/dist/commands/recipes/impl/normalize.d.ts.map +0 -1
  264. package/dist/commands/recipes/impl/normalize.js +0 -54
  265. package/dist/commands/recipes/impl/scenario.d.ts +0 -16
  266. package/dist/commands/recipes/impl/scenario.d.ts.map +0 -1
  267. package/dist/commands/recipes/impl/scenario.js +0 -262
  268. package/dist/recipes/bundled-recipes.d.ts +0 -17
  269. package/dist/recipes/bundled-recipes.d.ts.map +0 -1
  270. package/dist/recipes/bundled-recipes.js +0 -15
  271. package/dist/usecases/context/resolve-context.d.ts +0 -68
  272. package/dist/usecases/context/resolve-context.d.ts.map +0 -1
  273. package/dist/usecases/task/task-list-usecase.d.ts +0 -9
  274. package/dist/usecases/task/task-list-usecase.d.ts.map +0 -1
  275. package/dist/usecases/task/task-list-usecase.js +0 -17
  276. package/dist/usecases/task/task-new-usecase.d.ts +0 -9
  277. package/dist/usecases/task/task-new-usecase.d.ts.map +0 -1
  278. package/dist/usecases/task/task-new-usecase.js +0 -17
@@ -0,0 +1,371 @@
1
+ import path from "node:path";
2
+ import { extractTaskSuffix, loadConfig, resolveProject, } from "@agentplaneorg/core";
3
+ import { createCliEmitter, emitCommandResult } from "../../cli/output.js";
4
+ import { exitCodeForError } from "../../cli/exit-codes.js";
5
+ import { usageError } from "../../cli/spec/errors.js";
6
+ import { withDiagnosticContext } from "../../shared/diagnostics.js";
7
+ import { CliError } from "../../shared/errors.js";
8
+ import { execFileAsync, gitEnv } from "../shared/git.js";
9
+ import { GitContext } from "../shared/git-context.js";
10
+ import { ensureActionApproved } from "../shared/approval-requirements.js";
11
+ import { ensureNetworkApproved } from "../shared/network-approval.js";
12
+ import { runOperatorPipeline } from "../shared/operator-pipeline.js";
13
+ import { parseTaskIdFromBranch } from "../shared/git-worktree.js";
14
+ import { cleanHookEnv, maybePersistExpectedCliVersion, maybeRefreshGeneratedReference, maybeUpdateBunLockfile, replaceAgentplanePackageMetadata, replacePackageDependencyVersion, replacePackageVersionInFile, } from "./apply.mutation.js";
15
+ import { ensureCleanTrackedTree, ensureNpmVersionsAvailable, ensureRemoteExists, ensureRemoteTagDoesNotExist, ensureTagDoesNotExist, fileExists, loadReleasePlan, readAgentplaneDependencyVersion, readCoreDependencyVersion, readPackageVersion, readRecipesDependencyVersion, runReleasePrepublishGate, validateReleaseNotes, } from "./apply.preflight.js";
16
+ import { pushReleaseCandidateBranch, pushReleaseRefs, writeReleaseApplyReport, } from "./apply.reporting.js";
17
+ const output = createCliEmitter();
18
+ function emitReleaseLine(text) {
19
+ emitCommandResult(output, { kind: "line", text });
20
+ }
21
+ async function resolveReleasePlanInputs(opts) {
22
+ const { planDir, plan, minBullets } = await loadReleasePlan({
23
+ gitRoot: opts.gitRoot,
24
+ planOverride: opts.planOverride,
25
+ });
26
+ if (!/^v\d+\.\d+\.\d+$/u.test(plan.nextTag)) {
27
+ throw new CliError({
28
+ exitCode: exitCodeForError("E_VALIDATION"),
29
+ code: "E_VALIDATION",
30
+ message: `Invalid nextTag in version.json (expected vX.Y.Z): ${plan.nextTag}`,
31
+ });
32
+ }
33
+ const notesPath = path.join(opts.gitRoot, "docs", "releases", `${plan.nextTag}.md`);
34
+ if (!(await fileExists(notesPath))) {
35
+ throw new CliError({
36
+ exitCode: exitCodeForError("E_IO"),
37
+ code: "E_IO",
38
+ message: `Missing release notes: ${path.relative(opts.gitRoot, notesPath)}\n` +
39
+ "Write this file using a DOCS agent before applying the release.",
40
+ });
41
+ }
42
+ await validateReleaseNotes(notesPath, minBullets);
43
+ return { planDir, plan, notesPath };
44
+ }
45
+ async function ensureReleasePlanMatchesRepoState(opts) {
46
+ const [coreVersion, agentplaneVersion, recipesVersion, coreDependencyVersion, recipesDependencyVersion,] = await Promise.all([
47
+ readPackageVersion(opts.corePkgPath),
48
+ readPackageVersion(opts.agentplanePkgPath),
49
+ readPackageVersion(opts.recipesPkgPath),
50
+ readCoreDependencyVersion(opts.agentplanePkgPath),
51
+ readRecipesDependencyVersion(opts.agentplanePkgPath),
52
+ ]);
53
+ if (coreVersion !== agentplaneVersion || coreVersion !== recipesVersion) {
54
+ throw new CliError({
55
+ exitCode: exitCodeForError("E_VALIDATION"),
56
+ code: "E_VALIDATION",
57
+ message: `Package versions must match before applying a release. ` +
58
+ `packages/core=${coreVersion} packages/agentplane=${agentplaneVersion} packages/recipes=${recipesVersion}`,
59
+ });
60
+ }
61
+ if (coreDependencyVersion !== coreVersion) {
62
+ throw new CliError({
63
+ exitCode: exitCodeForError("E_VALIDATION"),
64
+ code: "E_VALIDATION",
65
+ message: "Release dependency parity check failed before apply. " +
66
+ `packages/agentplane dependency @agentplaneorg/core=${coreDependencyVersion} ` +
67
+ `must match packages/core version ${coreVersion}.`,
68
+ });
69
+ }
70
+ if (recipesDependencyVersion !== coreVersion) {
71
+ throw new CliError({
72
+ exitCode: exitCodeForError("E_VALIDATION"),
73
+ code: "E_VALIDATION",
74
+ message: "Release dependency parity check failed before apply. " +
75
+ `packages/agentplane dependency @agentplaneorg/recipes=${recipesDependencyVersion} ` +
76
+ `must match packages/recipes version ${coreVersion}.`,
77
+ });
78
+ }
79
+ if (await fileExists(opts.testkitPkgPath)) {
80
+ const testkitAgentplaneDependencyVersion = await readAgentplaneDependencyVersion(opts.testkitPkgPath);
81
+ if (testkitAgentplaneDependencyVersion !== agentplaneVersion) {
82
+ throw new CliError({
83
+ exitCode: exitCodeForError("E_VALIDATION"),
84
+ code: "E_VALIDATION",
85
+ message: "Release dependency parity check failed before apply. " +
86
+ `packages/testkit dependency agentplane=${testkitAgentplaneDependencyVersion} ` +
87
+ `must match packages/agentplane version ${agentplaneVersion}.`,
88
+ });
89
+ }
90
+ }
91
+ await ensureCleanTrackedTree(opts.gitRoot);
92
+ await ensureTagDoesNotExist(opts.gitRoot, opts.plan.nextTag);
93
+ if (coreVersion !== opts.plan.prevVersion) {
94
+ throw new CliError({
95
+ exitCode: exitCodeForError("E_VALIDATION"),
96
+ code: "E_VALIDATION",
97
+ message: `Current version does not match the release-plan baseline. ` +
98
+ `current=${coreVersion} expected_prev=${opts.plan.prevVersion} expected_next=${opts.plan.nextVersion}\n` +
99
+ "Re-run `agentplane release plan` to generate a fresh plan for this repo state.",
100
+ context: withDiagnosticContext({ command: "release apply" }, {
101
+ state: "the repository version no longer matches the prepared release-plan baseline",
102
+ likelyCause: "package versions changed after the plan was generated, so continuing would apply the release over a partially drifted local state",
103
+ nextAction: {
104
+ command: "agentplane release plan",
105
+ reason: "generate a fresh release plan from the current repository state before applying the release",
106
+ reasonCode: "release_plan_drifted",
107
+ },
108
+ }),
109
+ });
110
+ }
111
+ }
112
+ async function runPushPreflight(opts) {
113
+ const loaded = await loadConfig(opts.agentplaneDir);
114
+ const pushReason = opts.route.kind === "release_candidate"
115
+ ? `${opts.commandLabel} will push current branch ${opts.route.current_branch} to ${opts.remote} as a release candidate for ${opts.nextTag}; final publication remains gated on merge to ${opts.route.base_branch}`
116
+ : `${opts.commandLabel} will push HEAD and ${opts.nextTag} to ${opts.remote}`;
117
+ await ensureNetworkApproved({
118
+ action: opts.route.kind === "release_candidate" ? "release_candidate" : "release_apply",
119
+ config: loaded.config,
120
+ yes: opts.yes,
121
+ reason: `${opts.commandLabel} validates npm version availability and pushes over network`,
122
+ interactive: Boolean(process.stdin.isTTY),
123
+ });
124
+ await ensureActionApproved({
125
+ action: "git_push",
126
+ config: loaded.config,
127
+ yes: opts.yes,
128
+ reason: pushReason,
129
+ interactive: Boolean(process.stdin.isTTY),
130
+ });
131
+ await ensureRemoteExists(opts.gitRoot, opts.remote);
132
+ await ensureRemoteTagDoesNotExist(opts.gitRoot, opts.remote, opts.nextTag);
133
+ await ensureNpmVersionsAvailable(opts.gitRoot, opts.nextVersion);
134
+ await runReleasePrepublishGate(opts.gitRoot);
135
+ return true;
136
+ }
137
+ async function applyReleaseMutation(opts) {
138
+ let releaseCommit = null;
139
+ await Promise.all([
140
+ replacePackageVersionInFile(opts.corePkgPath, opts.nextVersion),
141
+ replacePackageVersionInFile(opts.recipesPkgPath, opts.nextVersion),
142
+ replaceAgentplanePackageMetadata(opts.agentplanePkgPath, opts.nextVersion),
143
+ ]);
144
+ if (await fileExists(opts.testkitPkgPath)) {
145
+ await replacePackageDependencyVersion(opts.testkitPkgPath, "agentplane", opts.nextVersion);
146
+ }
147
+ const expectedCliVersionPersisted = await maybePersistExpectedCliVersion(opts.agentplaneDir, opts.nextVersion);
148
+ await maybeUpdateBunLockfile(opts.gitRoot, fileExists);
149
+ const generatedReferenceExists = await maybeRefreshGeneratedReference(opts.gitRoot, fileExists);
150
+ const stagePaths = [
151
+ "packages/core/package.json",
152
+ "packages/agentplane/package.json",
153
+ "packages/recipes/package.json",
154
+ path.relative(opts.gitRoot, opts.notesPath),
155
+ ];
156
+ if (await fileExists(opts.testkitPkgPath)) {
157
+ stagePaths.push("packages/testkit/package.json");
158
+ }
159
+ if (expectedCliVersionPersisted) {
160
+ stagePaths.push(".agentplane/config.json");
161
+ }
162
+ if (generatedReferenceExists) {
163
+ stagePaths.push("docs/reference/generated-reference.mdx");
164
+ }
165
+ if (await fileExists(path.join(opts.gitRoot, "bun.lock"))) {
166
+ stagePaths.push("bun.lock");
167
+ }
168
+ await opts.git.stage(stagePaths);
169
+ const staged = await opts.git.statusStagedPaths();
170
+ if (staged.length === 0) {
171
+ emitReleaseLine("No changes to commit.");
172
+ return { releaseCommit };
173
+ }
174
+ const taskId = opts.route.kind === "release_candidate"
175
+ ? parseTaskIdFromBranch(opts.taskBranchPrefix, opts.route.current_branch)
176
+ : null;
177
+ const subject = taskId
178
+ ? `✨ ${extractTaskSuffix(taskId)} release: publish ${opts.nextTag}`
179
+ : `✨ release: publish ${opts.nextTag}`;
180
+ await opts.git.commit({ message: subject, env: cleanHookEnv() });
181
+ const { stdout: headHash } = await execFileAsync("git", ["rev-parse", "HEAD"], {
182
+ cwd: opts.gitRoot,
183
+ env: gitEnv(),
184
+ });
185
+ releaseCommit = { hash: String(headHash ?? "").trim(), subject };
186
+ return { releaseCommit };
187
+ }
188
+ async function finalizeReleaseApply(opts) {
189
+ const tagCreated = opts.route.kind === "direct_release";
190
+ const pushedRefs = [];
191
+ if (tagCreated) {
192
+ await execFileAsync("git", ["tag", opts.plan.nextTag], {
193
+ cwd: opts.gitRoot,
194
+ env: gitEnv(),
195
+ });
196
+ emitReleaseLine(`Release tag created: ${opts.plan.nextTag}`);
197
+ }
198
+ else {
199
+ emitReleaseLine(`Release candidate prepared on ${opts.route.current_branch}; skipped local tag creation for ${opts.plan.nextTag} because final publication is deferred until merge to ${opts.route.base_branch}.`);
200
+ }
201
+ if (opts.push) {
202
+ if (opts.route.kind === "release_candidate") {
203
+ await pushReleaseCandidateBranch(opts.gitRoot, opts.remote);
204
+ pushedRefs.push("HEAD");
205
+ emitReleaseLine(`Pushed: ${opts.remote} ${opts.route.current_branch} (release candidate branch only; no tag pushed)`);
206
+ }
207
+ else {
208
+ await pushReleaseRefs(opts.gitRoot, opts.remote, opts.plan.nextTag);
209
+ pushedRefs.push("HEAD", opts.plan.nextTag);
210
+ emitReleaseLine(`Pushed: ${opts.remote} HEAD + ${opts.plan.nextTag}`);
211
+ }
212
+ }
213
+ else if (opts.route.kind === "release_candidate") {
214
+ emitReleaseLine(`Next: git push <remote> HEAD # merge ${opts.route.current_branch} into ${opts.route.base_branch} before publishing ${opts.plan.nextTag}`);
215
+ }
216
+ else {
217
+ emitReleaseLine(`Next: git push <remote> HEAD && git push <remote> ${opts.plan.nextTag}`);
218
+ }
219
+ const reportPath = await writeReleaseApplyReport(opts.gitRoot, {
220
+ applied_at: new Date().toISOString(),
221
+ plan_dir: path.relative(opts.gitRoot, opts.planDir),
222
+ notes_path: path.relative(opts.gitRoot, opts.notesPath),
223
+ prev_version: opts.plan.prevVersion,
224
+ next_version: opts.plan.nextVersion,
225
+ prev_tag: opts.plan.prevTag,
226
+ next_tag: opts.plan.nextTag,
227
+ bump: opts.plan.bump,
228
+ checks: {
229
+ clean_tracked_tree: true,
230
+ tag_absent: true,
231
+ notes_validated: true,
232
+ npm_version_available_checked: opts.npmVersionChecked,
233
+ },
234
+ commit: opts.releaseCommit,
235
+ route: opts.route,
236
+ tag: {
237
+ name: opts.plan.nextTag,
238
+ created: tagCreated,
239
+ pushed: tagCreated && opts.push,
240
+ },
241
+ push: {
242
+ requested: opts.push,
243
+ remote: opts.remote,
244
+ performed: pushedRefs.length > 0,
245
+ refs: pushedRefs,
246
+ },
247
+ });
248
+ emitReleaseLine(`Release report: ${path.relative(opts.gitRoot, reportPath)}`);
249
+ return 0;
250
+ }
251
+ async function buildReleaseCommandState(opts) {
252
+ const resolved = await resolveProject({
253
+ cwd: opts.cwd,
254
+ rootOverride: opts.rootOverride ?? null,
255
+ });
256
+ const gitRoot = resolved.gitRoot;
257
+ const { planDir, plan, notesPath } = await resolveReleasePlanInputs({
258
+ gitRoot,
259
+ planOverride: opts.planOverride,
260
+ });
261
+ const loaded = await loadConfig(resolved.agentplaneDir);
262
+ return {
263
+ resolved,
264
+ gitRoot,
265
+ planDir,
266
+ plan,
267
+ notesPath,
268
+ taskBranchPrefix: loaded.config.branch.task_prefix,
269
+ route: await opts.routeResolver({
270
+ cwd: opts.cwd,
271
+ rootOverride: opts.rootOverride ?? null,
272
+ gitRoot,
273
+ agentplaneDir: resolved.agentplaneDir,
274
+ }),
275
+ corePkgPath: path.join(gitRoot, "packages", "core", "package.json"),
276
+ agentplanePkgPath: path.join(gitRoot, "packages", "agentplane", "package.json"),
277
+ recipesPkgPath: path.join(gitRoot, "packages", "recipes", "package.json"),
278
+ testkitPkgPath: path.join(gitRoot, "packages", "testkit", "package.json"),
279
+ npmVersionChecked: false,
280
+ };
281
+ }
282
+ function assertReleaseBumpApproved(opts) {
283
+ if ((opts.plan.bump === "minor" || opts.plan.bump === "major") && opts.flags.yes !== true) {
284
+ throw usageError({
285
+ spec: opts.spec,
286
+ command: opts.commandLabel,
287
+ message: `Bump '${opts.plan.bump}' requires explicit approval. Re-run with --yes.`,
288
+ });
289
+ }
290
+ }
291
+ async function runReleaseCommandPreflight(opts) {
292
+ assertReleaseBumpApproved({
293
+ flags: opts.flags,
294
+ plan: opts.state.plan,
295
+ spec: opts.spec,
296
+ commandLabel: opts.commandLabel,
297
+ });
298
+ await ensureReleasePlanMatchesRepoState({
299
+ gitRoot: opts.state.gitRoot,
300
+ plan: opts.state.plan,
301
+ corePkgPath: opts.state.corePkgPath,
302
+ agentplanePkgPath: opts.state.agentplanePkgPath,
303
+ recipesPkgPath: opts.state.recipesPkgPath,
304
+ testkitPkgPath: opts.state.testkitPkgPath,
305
+ });
306
+ if (opts.flags.push) {
307
+ opts.state.npmVersionChecked = await runPushPreflight({
308
+ agentplaneDir: opts.state.resolved.agentplaneDir,
309
+ gitRoot: opts.state.gitRoot,
310
+ remote: opts.flags.remote,
311
+ nextTag: opts.state.plan.nextTag,
312
+ nextVersion: opts.state.plan.nextVersion,
313
+ route: opts.state.route,
314
+ yes: opts.flags.yes,
315
+ commandLabel: `${opts.commandLabel} --push`,
316
+ });
317
+ }
318
+ }
319
+ async function runReleaseCommandExecute(state) {
320
+ const git = new GitContext({ gitRoot: state.gitRoot });
321
+ return await applyReleaseMutation({
322
+ agentplaneDir: state.resolved.agentplaneDir,
323
+ gitRoot: state.gitRoot,
324
+ git,
325
+ notesPath: state.notesPath,
326
+ corePkgPath: state.corePkgPath,
327
+ agentplanePkgPath: state.agentplanePkgPath,
328
+ recipesPkgPath: state.recipesPkgPath,
329
+ testkitPkgPath: state.testkitPkgPath,
330
+ nextTag: state.plan.nextTag,
331
+ nextVersion: state.plan.nextVersion,
332
+ route: state.route,
333
+ taskBranchPrefix: state.taskBranchPrefix,
334
+ });
335
+ }
336
+ async function runReleaseCommandFinalize(opts) {
337
+ return await finalizeReleaseApply({
338
+ gitRoot: opts.state.gitRoot,
339
+ planDir: opts.state.planDir,
340
+ notesPath: opts.state.notesPath,
341
+ plan: opts.state.plan,
342
+ npmVersionChecked: opts.state.npmVersionChecked,
343
+ releaseCommit: opts.mutation.releaseCommit,
344
+ route: opts.state.route,
345
+ push: opts.flags.push,
346
+ remote: opts.flags.remote,
347
+ });
348
+ }
349
+ export async function runReleaseCommandPipeline(opts) {
350
+ return await runOperatorPipeline({
351
+ init: async () => await buildReleaseCommandState({
352
+ cwd: opts.ctx.cwd,
353
+ rootOverride: opts.ctx.rootOverride ?? null,
354
+ planOverride: opts.flags.plan,
355
+ routeResolver: opts.routeResolver,
356
+ }),
357
+ preflight: async (state) => await runReleaseCommandPreflight({
358
+ state,
359
+ flags: opts.flags,
360
+ spec: opts.spec,
361
+ commandLabel: opts.commandLabel,
362
+ }),
363
+ execute: async (state) => await runReleaseCommandExecute(state),
364
+ finalize: async (state, mutation) => await runReleaseCommandFinalize({
365
+ state,
366
+ mutation,
367
+ flags: opts.flags,
368
+ }),
369
+ });
370
+ }
371
+ export { pushReleaseCandidateBranch, pushReleaseRefs } from "./apply.reporting.js";
@@ -5,6 +5,8 @@ export declare function parseVersionPlan(raw: unknown): ReleaseVersionPlan;
5
5
  export declare function findLatestPlanDir(gitRoot: string): Promise<string>;
6
6
  export declare function readPackageVersion(pkgJsonPath: string): Promise<string>;
7
7
  export declare function readCoreDependencyVersion(pkgJsonPath: string): Promise<string>;
8
+ export declare function readRecipesDependencyVersion(pkgJsonPath: string): Promise<string>;
9
+ export declare function readAgentplaneDependencyVersion(pkgJsonPath: string): Promise<string>;
8
10
  export declare function validateReleaseNotes(notesPath: string, minBullets: number): Promise<void>;
9
11
  export declare function ensureCleanTrackedTree(gitRoot: string): Promise<void>;
10
12
  export declare function ensureTagDoesNotExist(gitRoot: string, tag: string): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"apply.preflight.d.ts","sourceRoot":"","sources":["../../../src/commands/release/apply.preflight.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEvE,wBAAsB,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAO5D;AAED,wBAAsB,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAE3D;AAaD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,kBAAkB,CAuBjE;AAED,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAiBxE;AAED,wBAAsB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAW7E;AAED,wBAAsB,yBAAyB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAgBpF;AAED,wBAAsB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAwB/F;AAED,wBAAsB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgC3E;AAED,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA6BvF;AAED,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA+BvF;AAED,wBAAsB,2BAA2B,CAC/C,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,IAAI,CAAC,CAyDf;AAED,wBAAsB,0BAA0B,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmChG;AAED,wBAAsB,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA0C7E;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC;IAC/F,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,CAAC;IACxB,IAAI,EAAE,kBAAkB,CAAC;IACzB,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC,CAwBD"}
1
+ {"version":3,"file":"apply.preflight.d.ts","sourceRoot":"","sources":["../../../src/commands/release/apply.preflight.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEvE,wBAAsB,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAO5D;AAED,wBAAsB,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAE3D;AAaD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,kBAAkB,CAuBjE;AAED,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAiBxE;AAED,wBAAsB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAW7E;AAoBD,wBAAsB,yBAAyB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAEpF;AAED,wBAAsB,4BAA4B,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAEvF;AAED,wBAAsB,+BAA+B,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAE1F;AAED,wBAAsB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAwB/F;AAED,wBAAsB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgC3E;AAED,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA6BvF;AAED,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA+BvF;AAED,wBAAsB,2BAA2B,CAC/C,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,IAAI,CAAC,CAyDf;AAED,wBAAsB,0BAA0B,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmChG;AAED,wBAAsB,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA0C7E;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC;IAC/F,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,CAAC;IACxB,IAAI,EAAE,kBAAkB,CAAC;IACzB,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC,CAwBD"}
@@ -79,20 +79,29 @@ export async function readPackageVersion(pkgJsonPath) {
79
79
  }
80
80
  return version;
81
81
  }
82
- export async function readCoreDependencyVersion(pkgJsonPath) {
82
+ async function readDependencyVersion(pkgJsonPath, dependencyName) {
83
83
  const raw = JSON.parse(await readFile(pkgJsonPath, "utf8"));
84
- const value = raw.dependencies?.["@agentplaneorg/core"];
84
+ const value = raw.dependencies?.[dependencyName];
85
85
  const version = typeof value === "string" ? value.trim() : "";
86
86
  if (!version) {
87
87
  throw new CliError({
88
88
  exitCode: exitCodeForError("E_VALIDATION"),
89
89
  code: "E_VALIDATION",
90
- message: `Missing dependency @agentplaneorg/core in ${pkgJsonPath}. ` +
91
- "Release parity requires packages/agentplane to pin @agentplaneorg/core to the same version.",
90
+ message: `Missing dependency ${dependencyName} in ${pkgJsonPath}. ` +
91
+ `Release parity requires packages/agentplane to pin ${dependencyName} to the same version.`,
92
92
  });
93
93
  }
94
94
  return version;
95
95
  }
96
+ export async function readCoreDependencyVersion(pkgJsonPath) {
97
+ return await readDependencyVersion(pkgJsonPath, "@agentplaneorg/core");
98
+ }
99
+ export async function readRecipesDependencyVersion(pkgJsonPath) {
100
+ return await readDependencyVersion(pkgJsonPath, "@agentplaneorg/recipes");
101
+ }
102
+ export async function readAgentplaneDependencyVersion(pkgJsonPath) {
103
+ return await readDependencyVersion(pkgJsonPath, "agentplane");
104
+ }
96
105
  export async function validateReleaseNotes(notesPath, minBullets) {
97
106
  const content = await readFile(notesPath, "utf8");
98
107
  if (!/release\s+notes/i.test(content)) {
@@ -1,3 +1,4 @@
1
+ import type { ResolvedProject } from "@agentplaneorg/core";
1
2
  export type BumpKind = "patch" | "minor" | "major";
2
3
  export type ReleaseApplyFlags = {
3
4
  plan?: string;
@@ -56,4 +57,30 @@ export type ReleaseApplyReport = {
56
57
  refs: string[];
57
58
  };
58
59
  };
60
+ export type ReleaseCommandState = {
61
+ resolved: ResolvedProject;
62
+ gitRoot: string;
63
+ planDir: string;
64
+ plan: ReleaseVersionPlan;
65
+ notesPath: string;
66
+ taskBranchPrefix: string;
67
+ route: ReleaseApplyRoute;
68
+ corePkgPath: string;
69
+ agentplanePkgPath: string;
70
+ recipesPkgPath: string;
71
+ testkitPkgPath: string;
72
+ npmVersionChecked: boolean;
73
+ };
74
+ export type ReleaseCommandMutation = {
75
+ releaseCommit: {
76
+ hash: string;
77
+ subject: string;
78
+ } | null;
79
+ };
80
+ export type ReleaseCommandRouteResolver = (opts: {
81
+ cwd: string;
82
+ rootOverride?: string | null;
83
+ gitRoot: string;
84
+ agentplaneDir: string;
85
+ }) => Promise<ReleaseApplyRoute>;
59
86
  //# sourceMappingURL=apply.types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"apply.types.d.ts","sourceRoot":"","sources":["../../../src/commands/release/apply.types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;AAEnD,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,OAAO,CAAC;IACb,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,iBAAiB,CAAC;AAEnD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,QAAQ,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,gBAAgB,GAAG,mBAAmB,CAAC;IAC7C,aAAa,EAAE,QAAQ,GAAG,WAAW,CAAC;IACtC,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,QAAQ,CAAC;IACf,MAAM,EAAE;QACN,kBAAkB,EAAE,IAAI,CAAC;QACzB,UAAU,EAAE,IAAI,CAAC;QACjB,eAAe,EAAE,IAAI,CAAC;QACtB,6BAA6B,EAAE,OAAO,CAAC;KACxC,CAAC;IACF,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACjD,KAAK,EAAE,iBAAiB,CAAC;IACzB,GAAG,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,CAAC;IACzD,IAAI,EAAE;QAAE,SAAS,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;CAClF,CAAC"}
1
+ {"version":3,"file":"apply.types.d.ts","sourceRoot":"","sources":["../../../src/commands/release/apply.types.ts"],"names":[],"mappings":"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"}
@@ -3,7 +3,9 @@ export declare function writeReleaseNotes(root: string, version: string, body?:
3
3
  export declare function seedReleaseWorkspace(root: string, opts?: {
4
4
  coreVersion?: string;
5
5
  cliVersion?: string;
6
+ recipesVersion?: string;
6
7
  dependencyVersion?: string;
8
+ recipesDependencyVersion?: string;
7
9
  extraDependencies?: Record<string, string>;
8
10
  extraWorkspacePackages?: {
9
11
  relDir: string;
@@ -19,7 +21,9 @@ export declare function initReleaseWorkspace(opts?: {
19
21
  prefix?: string;
20
22
  coreVersion?: string;
21
23
  cliVersion?: string;
24
+ recipesVersion?: string;
22
25
  dependencyVersion?: string;
26
+ recipesDependencyVersion?: string;
23
27
  extraDependencies?: Record<string, string>;
24
28
  extraWorkspacePackages?: {
25
29
  relDir: string;
@@ -1 +1 @@
1
- {"version":3,"file":"release.test-helpers.d.ts","sourceRoot":"","sources":["../../src/commands/release.test-helpers.ts"],"names":[],"mappings":"AAIA,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,IAAI,CAAC,CAIf;AAED,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,IAAI,SAAc,GACjB,OAAO,CAAC,IAAI,CAAC,CAIf;AAED,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE;IACJ,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3C,sBAAsB,CAAC,EAAE;QACvB,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,OAAO,CAAC;KACnB,EAAE,CAAC;IACJ,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACf,GACL,OAAO,CAAC,IAAI,CAAC,CA6Bf;AAED,wBAAsB,oBAAoB,CACxC,IAAI,GAAE;IACJ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3C,sBAAsB,CAAC,EAAE;QACvB,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,OAAO,CAAC;KACnB,EAAE,CAAC;IACJ,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACf,GACL,OAAO,CAAC,MAAM,CAAC,CAIjB"}
1
+ {"version":3,"file":"release.test-helpers.d.ts","sourceRoot":"","sources":["../../src/commands/release.test-helpers.ts"],"names":[],"mappings":"AAIA,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,IAAI,CAAC,CAIf;AAED,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,IAAI,SAAc,GACjB,OAAO,CAAC,IAAI,CAAC,CAIf;AAED,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE;IACJ,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3C,sBAAsB,CAAC,EAAE;QACvB,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,OAAO,CAAC;KACnB,EAAE,CAAC;IACJ,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACf,GACL,OAAO,CAAC,IAAI,CAAC,CAoCf;AAED,wBAAsB,oBAAoB,CACxC,IAAI,GAAE;IACJ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3C,sBAAsB,CAAC,EAAE;QACvB,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,OAAO,CAAC;KACnB,EAAE,CAAC;IACJ,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACf,GACL,OAAO,CAAC,MAAM,CAAC,CAIjB"}
@@ -14,9 +14,12 @@ export async function writeReleaseNotes(root, version, body = "# Notes\n") {
14
14
  export async function seedReleaseWorkspace(root, opts = {}) {
15
15
  const coreVersion = opts.coreVersion ?? "1.2.3";
16
16
  const cliVersion = opts.cliVersion ?? coreVersion;
17
+ const recipesVersion = opts.recipesVersion ?? cliVersion;
17
18
  const dependencyVersion = opts.dependencyVersion ?? coreVersion;
19
+ const recipesDependencyVersion = opts.recipesDependencyVersion ?? recipesVersion;
18
20
  const dependencies = {
19
21
  "@agentplaneorg/core": dependencyVersion,
22
+ "@agentplaneorg/recipes": recipesDependencyVersion,
20
23
  };
21
24
  if (opts.extraDependencies) {
22
25
  Object.assign(dependencies, opts.extraDependencies);
@@ -30,6 +33,10 @@ export async function seedReleaseWorkspace(root, opts = {}) {
30
33
  version: cliVersion,
31
34
  dependencies,
32
35
  });
36
+ await writePackageJson(root, "packages/recipes", {
37
+ name: "@agentplaneorg/recipes",
38
+ version: recipesVersion,
39
+ });
33
40
  for (const pkg of opts.extraWorkspacePackages ?? []) {
34
41
  await writePackageJson(root, pkg.relDir, {
35
42
  name: pkg.name,
@@ -1 +1 @@
1
- {"version":3,"file":"reconcile-check.d.ts","sourceRoot":"","sources":["../../../src/commands/shared/reconcile-check.ts"],"names":[],"mappings":"AAKA,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,mBAAmB,CAAC;AAuG3B,wBAAsB,8BAA8B,CAAC,IAAI,EAAE;IACzD,GAAG,EAAE,cAAc,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,GAAG,OAAO,CAAC,IAAI,CAAC,CAkDhB"}
1
+ {"version":3,"file":"reconcile-check.d.ts","sourceRoot":"","sources":["../../../src/commands/shared/reconcile-check.ts"],"names":[],"mappings":"AAKA,OAAO,EAIL,KAAK,cAAc,EACpB,MAAM,mBAAmB,CAAC;AAuG3B,wBAAsB,8BAA8B,CAAC,IAAI,EAAE;IACzD,GAAG,EAAE,cAAc,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,GAAG,OAAO,CAAC,IAAI,CAAC,CAkDhB"}
@@ -2,7 +2,7 @@ import { exitCodeForError } from "../../cli/exit-codes.js";
2
2
  import { withDiagnosticContext } from "../../shared/diagnostics.js";
3
3
  import { CliError } from "../../shared/errors.js";
4
4
  import path from "node:path";
5
- import { listTaskSummariesMemo, loadTaskFromBranchSnapshot, } from "./task-backend.js";
5
+ import { backendUsesLocalTaskStore, listTaskSummariesMemo, loadTaskFromBranchSnapshot, } from "./task-backend.js";
6
6
  function compactError(err) {
7
7
  if (err instanceof Error) {
8
8
  const text = err.message.trim();
@@ -135,7 +135,7 @@ export async function ensureReconciledBeforeMutation(opts) {
135
135
  });
136
136
  }
137
137
  async function filterWarningsResolvedFromTaskBranch(ctx, warnings) {
138
- if (warnings.length === 0 || ctx.backendId !== "local") {
138
+ if (warnings.length === 0 || !backendUsesLocalTaskStore(ctx)) {
139
139
  return warnings;
140
140
  }
141
141
  const kept = [];
@@ -1,6 +1,6 @@
1
1
  import { type AgentplaneConfig, type ResolvedProject } from "@agentplaneorg/core";
2
2
  import type { ResolvedHarnessContract } from "../../runtime/harness/index.js";
3
- import { loadTaskBackend, type TaskBackend, type TaskData, type TaskSummary } from "../../backends/task-backend.js";
3
+ import { loadTaskBackend, type TaskBackendCapabilities, type TaskBackend, type TaskData, type TaskSummary } from "../../backends/task-backend.js";
4
4
  import { GitContext } from "./git-context.js";
5
5
  export type CommandMemo = {
6
6
  taskProjection?: Promise<TaskSummary[]>;
@@ -20,6 +20,11 @@ export type CommandContext = {
20
20
  };
21
21
  export declare function resolveDocUpdatedBy(task: TaskData, author?: string): string;
22
22
  export declare function taskDataToFrontmatter(task: TaskData): Record<string, unknown>;
23
+ export declare function getTaskBackendCapabilities(ctx: CommandContext): TaskBackendCapabilities;
24
+ export declare function backendHasLocalCanonicalSource(ctx: CommandContext): boolean;
25
+ export declare function backendWritesTaskReadmes(ctx: CommandContext): boolean;
26
+ export declare function backendSupportsTaskBranchSnapshots(ctx: CommandContext): boolean;
27
+ export declare function backendUsesLocalTaskStore(ctx: CommandContext): boolean;
23
28
  export declare function loadCommandContext(opts: {
24
29
  cwd: string;
25
30
  rootOverride?: string | null;
@@ -1 +1 @@
1
- {"version":3,"file":"task-backend.d.ts","sourceRoot":"","sources":["../../../src/commands/shared/task-backend.ts"],"names":[],"mappings":"AAEA,OAAO,EAOL,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACrB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAE9E,OAAO,EACL,eAAe,EAEf,KAAK,WAAW,EAEhB,KAAK,QAAQ,EACb,KAAK,WAAW,EACjB,MAAM,gCAAgC,CAAC;AAExC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAO9C,MAAM,MAAM,WAAW,GAAG;IACxB,cAAc,CAAC,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IACxC,YAAY,CAAC,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACjC,UAAU,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7B,QAAQ,CAAC,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC,uBAAuB,CAAC,CAAC;CAC5C,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,eAAe,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IACzE,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC9D,WAAW,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACpE,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,GAAG,EAAE,UAAU,CAAC;IAEhB,IAAI,EAAE,WAAW,CAAC;CACnB,CAAC;AASF,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAW3E;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA2C7E;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE;IAC7C,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,MAAM,CAAC,EAAE,gBAAgB,CAAC;CAC3B,GAAG,OAAO,CAAC,cAAc,CAAC,CAiB1B;AAED,wBAAsB,mBAAmB,CAAC,IAAI,EAAE;IAC9C,GAAG,EAAE,cAAc,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,oBAAoB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACtC,GAAG,OAAO,CAAC,QAAQ,CAAC,CA2BpB;AAED,wBAAsB,4BAA4B,CAAC,IAAI,EAAE;IACvD,GAAG,EAAE,cAAc,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAmBzB;AAED,wBAAsB,0BAA0B,CAAC,IAAI,EAAE;IACrD,GAAG,EAAE,cAAc,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CA2E3B;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE;IAC1C,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC;IACV,OAAO,EAAE,cAAc,CAAC,aAAa,CAAC,CAAC;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,cAAc,CAAC,iBAAiB,CAAC,CAAC;IAC5C,MAAM,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC;IACjC,IAAI,EAAE,QAAQ,CAAC;CAChB,CAAC,CAaD;AAED,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,WAAW,GAAG,YAAY,CAAC,EACtD,KAAK,EAAE,SAAS,QAAQ,EAAE,GACzB,OAAO,CAAC,IAAI,CAAC,CASf;AAED,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAgBvF;AAED,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,CAQ3F;AAED,wBAAsB,4BAA4B,CAAC,IAAI,EAAE;IACvD,GAAG,EAAE,cAAc,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC,IAAI,CAAC,CAchB"}
1
+ {"version":3,"file":"task-backend.d.ts","sourceRoot":"","sources":["../../../src/commands/shared/task-backend.ts"],"names":[],"mappings":"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"}
@@ -61,6 +61,38 @@ export function taskDataToFrontmatter(task) {
61
61
  dirty: task.dirty,
62
62
  };
63
63
  }
64
+ export function getTaskBackendCapabilities(ctx) {
65
+ const capabilities = ctx.taskBackend?.capabilities;
66
+ if (capabilities)
67
+ return capabilities;
68
+ const isLocal = ctx.backendId === "local";
69
+ return {
70
+ canonical_source: isLocal ? "local" : "remote",
71
+ projection: isLocal ? "canonical" : "cache",
72
+ projection_read_mode: "native",
73
+ reads_from_projection_by_default: !isLocal,
74
+ writes_task_readmes: isLocal,
75
+ supports_task_revisions: isLocal,
76
+ supports_revision_guarded_writes: isLocal,
77
+ may_access_network_on_read: !isLocal,
78
+ may_access_network_on_write: !isLocal,
79
+ supports_projection_refresh: !isLocal,
80
+ supports_push_sync: !isLocal,
81
+ supports_snapshot_export: true,
82
+ };
83
+ }
84
+ export function backendHasLocalCanonicalSource(ctx) {
85
+ return getTaskBackendCapabilities(ctx).canonical_source === "local";
86
+ }
87
+ export function backendWritesTaskReadmes(ctx) {
88
+ return getTaskBackendCapabilities(ctx).writes_task_readmes === true;
89
+ }
90
+ export function backendSupportsTaskBranchSnapshots(ctx) {
91
+ return backendHasLocalCanonicalSource(ctx) && backendWritesTaskReadmes(ctx);
92
+ }
93
+ export function backendUsesLocalTaskStore(ctx) {
94
+ return backendSupportsTaskBranchSnapshots(ctx);
95
+ }
64
96
  export async function loadCommandContext(opts) {
65
97
  const backendLoaded = await loadTaskBackend({
66
98
  cwd: opts.cwd,
@@ -106,7 +138,7 @@ export async function loadTaskFromContext(opts) {
106
138
  });
107
139
  }
108
140
  export async function resolveTaskBranchFromContext(opts) {
109
- if (opts.ctx.backendId !== "local") {
141
+ if (!backendSupportsTaskBranchSnapshots(opts.ctx)) {
110
142
  return null;
111
143
  }
112
144
  const prefix = opts.ctx.config.branch.task_prefix;
@@ -124,7 +156,7 @@ export async function resolveTaskBranchFromContext(opts) {
124
156
  return null;
125
157
  }
126
158
  export async function loadTaskFromBranchSnapshot(opts) {
127
- if (opts.ctx.backendId !== "local") {
159
+ if (!backendSupportsTaskBranchSnapshots(opts.ctx)) {
128
160
  return null;
129
161
  }
130
162
  const branch = typeof opts.branch === "string" && opts.branch.trim().length > 0
@@ -1 +1 @@
1
- {"version":3,"file":"task-mutation.d.ts","sourceRoot":"","sources":["../../../src/commands/shared/task-mutation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAEjF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAA6C,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnG,OAAO,EAGL,YAAY,EACZ,KAAK,qBAAqB,EAC3B,MAAM,iBAAiB,CAAC;AAEzB,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,CAAC,EAAE,qBAAqB,CAAC;IAChC,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,gBAAgB,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,0BAA0B,CAAC,OAAO,IAAI;IAChD,YAAY,CAAC,EAAE,SAAS,QAAQ,EAAE,CAAC;IACnC,MAAM,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF,wBAAsB,uBAAuB,CAAC,OAAO,EAAE,IAAI,EAAE;IAC3D,GAAG,EAAE,cAAc,CAAC;IACpB,KAAK,EAAE,CAAC,KAAK,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;IAC9E,MAAM,EAAE,CAAC,OAAO,EAAE,cAAc,CAAC,aAAa,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;CAChF,GAAG,OAAO,CAAC,OAAO,CAAC,CAKnB;AAED,wBAAsB,iBAAiB,CAAC,IAAI,EAAE;IAC5C,GAAG,EAAE,cAAc,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,cAAc,CAAC;IAC9B,KAAK,EAAE,CACL,OAAO,EAAE,QAAQ,KACd,OAAO,CAAC,gBAAgB,GAAG,IAAI,GAAG,SAAS,CAAC,GAAG,gBAAgB,GAAG,IAAI,GAAG,SAAS,CAAC;IACxF,YAAY,CAAC,EAAE,gBAAgB,CAAC;CACjC,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,aAAa,GAAG,SAAS,CAAA;CAAE,CAAC,CA8DjF;AAED,wBAAsB,2BAA2B,CAAC,OAAO,EAAE,IAAI,EAAE;IAC/D,GAAG,EAAE,cAAc,CAAC;IACpB,KAAK,EAAE,CACL,OAAO,EAAE,QAAQ,EAAE,KAChB,OAAO,CAAC,0BAA0B,CAAC,OAAO,CAAC,CAAC,GAAG,0BAA0B,CAAC,OAAO,CAAC,CAAC;CACzF,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,YAAY,EAAE,QAAQ,EAAE,CAAA;CAAE,CAAC,CAQzD"}
1
+ {"version":3,"file":"task-mutation.d.ts","sourceRoot":"","sources":["../../../src/commands/shared/task-mutation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAEjF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAIL,KAAK,cAAc,EACpB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAEL,YAAY,EACZ,KAAK,qBAAqB,EAC3B,MAAM,iBAAiB,CAAC;AAEzB,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,CAAC,EAAE,qBAAqB,CAAC;IAChC,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,gBAAgB,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,0BAA0B,CAAC,OAAO,IAAI;IAChD,YAAY,CAAC,EAAE,SAAS,QAAQ,EAAE,CAAC;IACnC,MAAM,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF,wBAAsB,uBAAuB,CAAC,OAAO,EAAE,IAAI,EAAE;IAC3D,GAAG,EAAE,cAAc,CAAC;IACpB,KAAK,EAAE,CAAC,KAAK,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;IAC9E,MAAM,EAAE,CAAC,OAAO,EAAE,cAAc,CAAC,aAAa,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;CAChF,GAAG,OAAO,CAAC,OAAO,CAAC,CAKnB;AAED,wBAAsB,iBAAiB,CAAC,IAAI,EAAE;IAC5C,GAAG,EAAE,cAAc,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,cAAc,CAAC;IAC9B,KAAK,EAAE,CACL,OAAO,EAAE,QAAQ,KACd,OAAO,CAAC,gBAAgB,GAAG,IAAI,GAAG,SAAS,CAAC,GAAG,gBAAgB,GAAG,IAAI,GAAG,SAAS,CAAC;IACxF,YAAY,CAAC,EAAE,gBAAgB,CAAC;CACjC,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,aAAa,GAAG,SAAS,CAAA;CAAE,CAAC,CA8DjF;AAED,wBAAsB,2BAA2B,CAAC,OAAO,EAAE,IAAI,EAAE;IAC/D,GAAG,EAAE,cAAc,CAAC;IACpB,KAAK,EAAE,CACL,OAAO,EAAE,QAAQ,EAAE,KAChB,OAAO,CAAC,0BAA0B,CAAC,OAAO,CAAC,CAAC,GAAG,0BAA0B,CAAC,OAAO,CAAC,CAAC;CACzF,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,YAAY,EAAE,QAAQ,EAAE,CAAA;CAAE,CAAC,CAQzD"}