agentplane 0.2.6 → 0.2.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (166) hide show
  1. package/README.md +11 -0
  2. package/assets/AGENTS.md +35 -0
  3. package/assets/agents/CODER.json +0 -1
  4. package/assets/agents/INTEGRATOR.json +0 -1
  5. package/assets/agents/ORCHESTRATOR.json +1 -2
  6. package/assets/agents/PLANNER.json +1 -3
  7. package/assets/agents/TESTER.json +0 -1
  8. package/assets/agents/UPGRADER.json +17 -15
  9. package/dist/cli/archive.d.ts.map +1 -1
  10. package/dist/cli/archive.js +61 -36
  11. package/dist/cli/command-guide.d.ts.map +1 -1
  12. package/dist/cli/command-guide.js +5 -3
  13. package/dist/cli/run-cli/command-catalog.d.ts +4 -1
  14. package/dist/cli/run-cli/command-catalog.d.ts.map +1 -1
  15. package/dist/cli/run-cli/command-catalog.js +44 -26
  16. package/dist/cli/run-cli/commands/config.d.ts +5 -4
  17. package/dist/cli/run-cli/commands/config.d.ts.map +1 -1
  18. package/dist/cli/run-cli/commands/config.js +47 -58
  19. package/dist/cli/run-cli/commands/core.d.ts +2 -1
  20. package/dist/cli/run-cli/commands/core.d.ts.map +1 -1
  21. package/dist/cli/run-cli/commands/core.js +187 -51
  22. package/dist/cli/run-cli/commands/ide.d.ts +3 -1
  23. package/dist/cli/run-cli/commands/ide.d.ts.map +1 -1
  24. package/dist/cli/run-cli/commands/ide.js +7 -12
  25. package/dist/cli/run-cli/commands/init/ide-sync.d.ts.map +1 -1
  26. package/dist/cli/run-cli/commands/init/ide-sync.js +10 -1
  27. package/dist/cli/run-cli/commands/init/write-agents.d.ts.map +1 -1
  28. package/dist/cli/run-cli/commands/init/write-agents.js +4 -24
  29. package/dist/cli/run-cli/commands/init/write-gitignore.d.ts +5 -0
  30. package/dist/cli/run-cli/commands/init/write-gitignore.d.ts.map +1 -0
  31. package/dist/cli/run-cli/commands/init/write-gitignore.js +48 -0
  32. package/dist/cli/run-cli/commands/init.d.ts +1 -0
  33. package/dist/cli/run-cli/commands/init.d.ts.map +1 -1
  34. package/dist/cli/run-cli/commands/init.js +34 -8
  35. package/dist/cli/run-cli/commands/wrap-command.d.ts +6 -0
  36. package/dist/cli/run-cli/commands/wrap-command.d.ts.map +1 -0
  37. package/dist/cli/run-cli/commands/wrap-command.js +17 -0
  38. package/dist/cli/run-cli/registry.run.d.ts +6 -2
  39. package/dist/cli/run-cli/registry.run.d.ts.map +1 -1
  40. package/dist/cli/run-cli/registry.run.js +7 -2
  41. package/dist/cli/run-cli.d.ts.map +1 -1
  42. package/dist/cli/run-cli.js +96 -75
  43. package/dist/cli/run-cli.test-helpers.d.ts.map +1 -1
  44. package/dist/cli/run-cli.test-helpers.js +99 -3
  45. package/dist/cli/spec/parse-utils.d.ts +11 -0
  46. package/dist/cli/spec/parse-utils.d.ts.map +1 -0
  47. package/dist/cli/spec/parse-utils.js +28 -0
  48. package/dist/commands/block.command.d.ts +3 -18
  49. package/dist/commands/block.command.d.ts.map +1 -1
  50. package/dist/commands/block.command.js +2 -143
  51. package/dist/commands/block.run.d.ts +5 -0
  52. package/dist/commands/block.run.d.ts.map +1 -0
  53. package/dist/commands/block.run.js +22 -0
  54. package/dist/commands/block.spec.d.ts +17 -0
  55. package/dist/commands/block.spec.d.ts.map +1 -0
  56. package/dist/commands/block.spec.js +115 -0
  57. package/dist/commands/doctor.command.d.ts +2 -7
  58. package/dist/commands/doctor.command.d.ts.map +1 -1
  59. package/dist/commands/doctor.command.js +2 -137
  60. package/dist/commands/doctor.run.d.ts +4 -0
  61. package/dist/commands/doctor.run.d.ts.map +1 -0
  62. package/dist/commands/doctor.run.js +174 -0
  63. package/dist/commands/doctor.spec.d.ts +7 -0
  64. package/dist/commands/doctor.spec.d.ts.map +1 -0
  65. package/dist/commands/doctor.spec.js +20 -0
  66. package/dist/commands/finish.command.d.ts +3 -27
  67. package/dist/commands/finish.command.d.ts.map +1 -1
  68. package/dist/commands/finish.command.js +2 -237
  69. package/dist/commands/finish.run.d.ts +5 -0
  70. package/dist/commands/finish.run.d.ts.map +1 -0
  71. package/dist/commands/finish.run.js +40 -0
  72. package/dist/commands/finish.spec.d.ts +26 -0
  73. package/dist/commands/finish.spec.d.ts.map +1 -0
  74. package/dist/commands/finish.spec.js +193 -0
  75. package/dist/commands/recipes/install.command.d.ts +2 -11
  76. package/dist/commands/recipes/install.command.d.ts.map +1 -1
  77. package/dist/commands/recipes/install.command.js +2 -161
  78. package/dist/commands/recipes/install.run.d.ts +4 -0
  79. package/dist/commands/recipes/install.run.d.ts.map +1 -0
  80. package/dist/commands/recipes/install.run.js +23 -0
  81. package/dist/commands/recipes/install.spec.d.ts +11 -0
  82. package/dist/commands/recipes/install.spec.d.ts.map +1 -0
  83. package/dist/commands/recipes/install.spec.js +140 -0
  84. package/dist/commands/release/apply.command.d.ts +11 -0
  85. package/dist/commands/release/apply.command.d.ts.map +1 -0
  86. package/dist/commands/release/apply.command.js +343 -0
  87. package/dist/commands/release/plan.command.d.ts +12 -0
  88. package/dist/commands/release/plan.command.d.ts.map +1 -0
  89. package/dist/commands/release/plan.command.js +206 -0
  90. package/dist/commands/release/release.command.d.ts +5 -0
  91. package/dist/commands/release/release.command.d.ts.map +1 -0
  92. package/dist/commands/release/release.command.js +18 -0
  93. package/dist/commands/shared/git-context.d.ts +3 -0
  94. package/dist/commands/shared/git-context.d.ts.map +1 -1
  95. package/dist/commands/shared/git-context.js +10 -0
  96. package/dist/commands/shared/task-backend.d.ts +1 -0
  97. package/dist/commands/shared/task-backend.d.ts.map +1 -1
  98. package/dist/commands/start.command.d.ts +3 -18
  99. package/dist/commands/start.command.d.ts.map +1 -1
  100. package/dist/commands/start.command.js +2 -143
  101. package/dist/commands/start.run.d.ts +5 -0
  102. package/dist/commands/start.run.d.ts.map +1 -0
  103. package/dist/commands/start.run.js +22 -0
  104. package/dist/commands/start.spec.d.ts +17 -0
  105. package/dist/commands/start.spec.d.ts.map +1 -0
  106. package/dist/commands/start.spec.js +115 -0
  107. package/dist/commands/task/add.command.d.ts.map +1 -1
  108. package/dist/commands/task/add.command.js +1 -7
  109. package/dist/commands/task/derive.command.d.ts.map +1 -1
  110. package/dist/commands/task/derive.command.js +1 -7
  111. package/dist/commands/task/finish.d.ts.map +1 -1
  112. package/dist/commands/task/finish.js +34 -2
  113. package/dist/commands/task/list.command.d.ts +3 -8
  114. package/dist/commands/task/list.command.d.ts.map +1 -1
  115. package/dist/commands/task/list.command.js +2 -67
  116. package/dist/commands/task/list.run.d.ts +5 -0
  117. package/dist/commands/task/list.run.d.ts.map +1 -0
  118. package/dist/commands/task/list.run.js +10 -0
  119. package/dist/commands/task/list.spec.d.ts +7 -0
  120. package/dist/commands/task/list.spec.d.ts.map +1 -0
  121. package/dist/commands/task/list.spec.js +51 -0
  122. package/dist/commands/task/next.command.d.ts +3 -8
  123. package/dist/commands/task/next.command.d.ts.map +1 -1
  124. package/dist/commands/task/next.command.js +2 -89
  125. package/dist/commands/task/next.run.d.ts +5 -0
  126. package/dist/commands/task/next.run.d.ts.map +1 -0
  127. package/dist/commands/task/next.run.js +11 -0
  128. package/dist/commands/task/next.spec.d.ts +7 -0
  129. package/dist/commands/task/next.spec.d.ts.map +1 -0
  130. package/dist/commands/task/next.spec.js +69 -0
  131. package/dist/commands/task/search.command.d.ts +3 -10
  132. package/dist/commands/task/search.command.d.ts.map +1 -1
  133. package/dist/commands/task/search.command.js +2 -101
  134. package/dist/commands/task/search.run.d.ts +5 -0
  135. package/dist/commands/task/search.run.d.ts.map +1 -0
  136. package/dist/commands/task/search.run.js +13 -0
  137. package/dist/commands/task/search.spec.d.ts +9 -0
  138. package/dist/commands/task/search.spec.d.ts.map +1 -0
  139. package/dist/commands/task/search.spec.js +79 -0
  140. package/dist/commands/task/set-status.command.d.ts.map +1 -1
  141. package/dist/commands/task/set-status.command.js +1 -7
  142. package/dist/commands/task/shared.d.ts.map +1 -1
  143. package/dist/commands/task/shared.js +15 -8
  144. package/dist/commands/task/show.command.d.ts +3 -7
  145. package/dist/commands/task/show.command.d.ts.map +1 -1
  146. package/dist/commands/task/show.command.js +2 -19
  147. package/dist/commands/task/show.run.d.ts +5 -0
  148. package/dist/commands/task/show.run.d.ts.map +1 -0
  149. package/dist/commands/task/show.run.js +11 -0
  150. package/dist/commands/task/show.spec.d.ts +6 -0
  151. package/dist/commands/task/show.spec.d.ts.map +1 -0
  152. package/dist/commands/task/show.spec.js +8 -0
  153. package/dist/commands/task/update.command.d.ts.map +1 -1
  154. package/dist/commands/task/update.command.js +1 -7
  155. package/dist/commands/upgrade.d.ts.map +1 -1
  156. package/dist/commands/upgrade.js +171 -32
  157. package/dist/commands/verify.command.d.ts +3 -15
  158. package/dist/commands/verify.command.d.ts.map +1 -1
  159. package/dist/commands/verify.command.js +2 -113
  160. package/dist/commands/verify.run.d.ts +5 -0
  161. package/dist/commands/verify.run.d.ts.map +1 -0
  162. package/dist/commands/verify.run.js +17 -0
  163. package/dist/commands/verify.spec.d.ts +14 -0
  164. package/dist/commands/verify.spec.d.ts.map +1 -0
  165. package/dist/commands/verify.spec.js +96 -0
  166. package/package.json +1 -1
@@ -0,0 +1,343 @@
1
+ import { readFile, writeFile, readdir } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { resolveProject } from "@agentplaneorg/core";
4
+ import { usageError } from "../../cli/spec/errors.js";
5
+ import { exitCodeForError } from "../../cli/exit-codes.js";
6
+ import { CliError } from "../../shared/errors.js";
7
+ import { execFileAsync, gitEnv } from "../shared/git.js";
8
+ import { GitContext } from "../shared/git-context.js";
9
+ async function fileExists(p) {
10
+ try {
11
+ await readFile(p, "utf8");
12
+ return true;
13
+ }
14
+ catch {
15
+ return false;
16
+ }
17
+ }
18
+ async function readJsonFile(p) {
19
+ return JSON.parse(await readFile(p, "utf8"));
20
+ }
21
+ function assertNonEmptyString(value, label) {
22
+ if (typeof value !== "string" || !value.trim()) {
23
+ throw new CliError({
24
+ exitCode: exitCodeForError("E_VALIDATION"),
25
+ code: "E_VALIDATION",
26
+ message: `Invalid ${label} (expected non-empty string).`,
27
+ });
28
+ }
29
+ return value.trim();
30
+ }
31
+ function parseVersionPlan(raw) {
32
+ if (!raw || typeof raw !== "object") {
33
+ throw new CliError({
34
+ exitCode: exitCodeForError("E_VALIDATION"),
35
+ code: "E_VALIDATION",
36
+ message: "Invalid version.json (expected object).",
37
+ });
38
+ }
39
+ const obj = raw;
40
+ const bumpRaw = assertNonEmptyString(obj.bump, "bump");
41
+ if (bumpRaw !== "patch" && bumpRaw !== "minor" && bumpRaw !== "major") {
42
+ throw new CliError({
43
+ exitCode: exitCodeForError("E_VALIDATION"),
44
+ code: "E_VALIDATION",
45
+ message: `Invalid bump in version.json: ${bumpRaw}`,
46
+ });
47
+ }
48
+ const prevTagVal = obj.prevTag;
49
+ const prevTag = prevTagVal === null ? null : typeof prevTagVal === "string" ? prevTagVal : null;
50
+ const prevVersion = assertNonEmptyString(obj.prevVersion, "prevVersion");
51
+ const nextTag = assertNonEmptyString(obj.nextTag, "nextTag");
52
+ const nextVersion = assertNonEmptyString(obj.nextVersion, "nextVersion");
53
+ return { prevTag, prevVersion, nextTag, nextVersion, bump: bumpRaw };
54
+ }
55
+ async function findLatestPlanDir(gitRoot) {
56
+ const base = path.join(gitRoot, ".agentplane", ".release", "plan");
57
+ const runNames = await readdir(base);
58
+ const runs = runNames
59
+ .map((s) => s.trim())
60
+ .filter(Boolean)
61
+ .toSorted();
62
+ const latest = runs.at(-1);
63
+ if (!latest) {
64
+ throw new CliError({
65
+ exitCode: exitCodeForError("E_IO"),
66
+ code: "E_IO",
67
+ message: "No release plan runs found under .agentplane/.release/plan/. Run `agentplane release plan` first.",
68
+ });
69
+ }
70
+ return path.join(base, latest);
71
+ }
72
+ async function readPackageVersion(pkgJsonPath) {
73
+ const raw = JSON.parse(await readFile(pkgJsonPath, "utf8"));
74
+ const version = typeof raw.version === "string" ? raw.version.trim() : "";
75
+ if (!version) {
76
+ throw new CliError({
77
+ exitCode: exitCodeForError("E_VALIDATION"),
78
+ code: "E_VALIDATION",
79
+ message: `Missing package.json version: ${pkgJsonPath}`,
80
+ });
81
+ }
82
+ return version;
83
+ }
84
+ async function replacePackageVersionInFile(pkgJsonPath, nextVersion) {
85
+ const text = await readFile(pkgJsonPath, "utf8");
86
+ const replaced = text.replace(/"version"\s*:\s*"[^"]*"/u, `"version": "${nextVersion}"`);
87
+ if (replaced === text) {
88
+ throw new CliError({
89
+ exitCode: exitCodeForError("E_VALIDATION"),
90
+ code: "E_VALIDATION",
91
+ message: `Failed to update version in ${pkgJsonPath} (missing "version" field).`,
92
+ });
93
+ }
94
+ await writeFile(pkgJsonPath, replaced, "utf8");
95
+ }
96
+ function cleanHookEnv() {
97
+ const env = { ...gitEnv() };
98
+ delete env.AGENTPLANE_TASK_ID;
99
+ delete env.AGENTPLANE_STATUS_TO;
100
+ delete env.AGENTPLANE_AGENT_ID;
101
+ return env;
102
+ }
103
+ async function validateReleaseNotes(notesPath) {
104
+ const content = await readFile(notesPath, "utf8");
105
+ if (!/release\s+notes/i.test(content)) {
106
+ throw new CliError({
107
+ exitCode: exitCodeForError("E_VALIDATION"),
108
+ code: "E_VALIDATION",
109
+ message: `Release notes must include a "Release Notes" heading in ${notesPath}.`,
110
+ });
111
+ }
112
+ const bulletCount = content.split(/\r?\n/u).filter((line) => /^\s*[-*]\s+\S+/u.test(line)).length;
113
+ if (bulletCount < 3) {
114
+ throw new CliError({
115
+ exitCode: exitCodeForError("E_VALIDATION"),
116
+ code: "E_VALIDATION",
117
+ message: `Release notes must include at least 3 bullet points in ${notesPath}.`,
118
+ });
119
+ }
120
+ if (/[\u0400-\u04FF]/u.test(content)) {
121
+ throw new CliError({
122
+ exitCode: exitCodeForError("E_VALIDATION"),
123
+ code: "E_VALIDATION",
124
+ message: `Release notes must be written in English (no Cyrillic) in ${notesPath}.`,
125
+ });
126
+ }
127
+ }
128
+ async function maybeUpdateBunLockfile(gitRoot) {
129
+ // GitHub publish uses `bun install --frozen-lockfile`, which will fail if the lockfile
130
+ // needs regeneration after bumping workspace package versions.
131
+ const bunLockPath = path.join(gitRoot, "bun.lock");
132
+ const rootPkgPath = path.join(gitRoot, "package.json");
133
+ if (!(await fileExists(bunLockPath)))
134
+ return;
135
+ if (!(await fileExists(rootPkgPath)))
136
+ return;
137
+ try {
138
+ await execFileAsync("bun", ["install", "--ignore-scripts"], {
139
+ cwd: gitRoot,
140
+ env: process.env,
141
+ maxBuffer: 50 * 1024 * 1024,
142
+ });
143
+ }
144
+ catch (err) {
145
+ const e = err;
146
+ throw new CliError({
147
+ exitCode: exitCodeForError("E_IO"),
148
+ code: "E_IO",
149
+ message: "Failed to update bun.lock via `bun install --ignore-scripts`.\n" +
150
+ "Fix:\n" +
151
+ " 1) Run `bun install --ignore-scripts` manually\n" +
152
+ " 2) Re-run `agentplane release apply`\n" +
153
+ (e?.message ? `\nDetails:\n${e.message}` : ""),
154
+ });
155
+ }
156
+ }
157
+ export const releaseApplySpec = {
158
+ id: ["release", "apply"],
159
+ group: "Release",
160
+ summary: "Apply a prepared release: bump versions, validate notes, commit, and tag.",
161
+ description: "Applies a release plan generated by `agentplane release plan`. This command does not author release notes; it expects a DOCS agent to have written docs/releases/vX.Y.Z.md. By default it applies a patch bump; minor/major bumps require explicit approval.",
162
+ options: [
163
+ {
164
+ kind: "string",
165
+ name: "plan",
166
+ valueHint: "<path>",
167
+ description: "Path to a release plan directory (defaults to the latest under .agentplane/.release/plan/).",
168
+ },
169
+ {
170
+ kind: "boolean",
171
+ name: "push",
172
+ default: false,
173
+ description: "Push the release commit and tag to the remote (requires --yes).",
174
+ },
175
+ {
176
+ kind: "string",
177
+ name: "remote",
178
+ valueHint: "<name>",
179
+ description: "Git remote to push to (default: origin).",
180
+ },
181
+ {
182
+ kind: "boolean",
183
+ name: "yes",
184
+ default: false,
185
+ description: "Approve minor/major bumps and allow pushing. Patch bumps can be applied without this flag.",
186
+ },
187
+ ],
188
+ parse: (raw) => {
189
+ return {
190
+ plan: raw.opts.plan,
191
+ push: raw.opts.push === true,
192
+ remote: raw.opts.remote ?? "origin",
193
+ yes: raw.opts.yes === true,
194
+ };
195
+ },
196
+ validate: (p) => {
197
+ if (p.push && p.yes !== true) {
198
+ throw usageError({
199
+ spec: releaseApplySpec,
200
+ command: "release apply",
201
+ message: "Option --push requires explicit approval. Re-run with --yes.",
202
+ });
203
+ }
204
+ if (!p.remote.trim()) {
205
+ throw usageError({
206
+ spec: releaseApplySpec,
207
+ command: "release apply",
208
+ message: "Option --remote must be non-empty.",
209
+ });
210
+ }
211
+ },
212
+ examples: [
213
+ {
214
+ cmd: "agentplane release apply",
215
+ why: "Apply the latest release plan (expects docs/releases/vX.Y.Z.md to exist).",
216
+ },
217
+ {
218
+ cmd: "agentplane release apply --plan .agentplane/.release/plan/<runId>",
219
+ why: "Apply a specific release plan directory.",
220
+ },
221
+ {
222
+ cmd: "agentplane release apply --push --yes",
223
+ why: "Apply and push the release commit+tag to the remote.",
224
+ },
225
+ ],
226
+ };
227
+ export const runReleaseApply = async (ctx, flags) => {
228
+ const resolved = await resolveProject({ cwd: ctx.cwd, rootOverride: ctx.rootOverride ?? null });
229
+ const gitRoot = resolved.gitRoot;
230
+ const planDir = flags.plan ? path.resolve(gitRoot, flags.plan) : await findLatestPlanDir(gitRoot);
231
+ const versionJsonPath = path.join(planDir, "version.json");
232
+ if (!(await fileExists(versionJsonPath))) {
233
+ throw new CliError({
234
+ exitCode: exitCodeForError("E_IO"),
235
+ code: "E_IO",
236
+ message: `Missing version.json in plan dir: ${path.relative(gitRoot, versionJsonPath)}`,
237
+ });
238
+ }
239
+ const plan = parseVersionPlan(await readJsonFile(versionJsonPath));
240
+ if ((plan.bump === "minor" || plan.bump === "major") && flags.yes !== true) {
241
+ throw usageError({
242
+ spec: releaseApplySpec,
243
+ command: "release apply",
244
+ message: `Bump '${plan.bump}' requires explicit approval. Re-run with --yes.`,
245
+ });
246
+ }
247
+ if (!/^v\d+\.\d+\.\d+$/u.test(plan.nextTag)) {
248
+ throw new CliError({
249
+ exitCode: exitCodeForError("E_VALIDATION"),
250
+ code: "E_VALIDATION",
251
+ message: `Invalid nextTag in version.json (expected vX.Y.Z): ${plan.nextTag}`,
252
+ });
253
+ }
254
+ const notesPath = path.join(gitRoot, "docs", "releases", `${plan.nextTag}.md`);
255
+ if (!(await fileExists(notesPath))) {
256
+ throw new CliError({
257
+ exitCode: exitCodeForError("E_IO"),
258
+ code: "E_IO",
259
+ message: `Missing release notes: ${path.relative(gitRoot, notesPath)}\n` +
260
+ "Write this file using a DOCS agent before applying the release.",
261
+ });
262
+ }
263
+ await validateReleaseNotes(notesPath);
264
+ const corePkgPath = path.join(gitRoot, "packages", "core", "package.json");
265
+ const agentplanePkgPath = path.join(gitRoot, "packages", "agentplane", "package.json");
266
+ const [coreVersion, agentplaneVersion] = await Promise.all([
267
+ readPackageVersion(corePkgPath),
268
+ readPackageVersion(agentplanePkgPath),
269
+ ]);
270
+ if (coreVersion !== agentplaneVersion) {
271
+ throw new CliError({
272
+ exitCode: exitCodeForError("E_VALIDATION"),
273
+ code: "E_VALIDATION",
274
+ message: `Package versions must match before applying a release. ` +
275
+ `packages/core=${coreVersion} packages/agentplane=${agentplaneVersion}`,
276
+ });
277
+ }
278
+ const git = new GitContext({ gitRoot });
279
+ if (coreVersion === plan.prevVersion) {
280
+ await Promise.all([
281
+ replacePackageVersionInFile(corePkgPath, plan.nextVersion),
282
+ replacePackageVersionInFile(agentplanePkgPath, plan.nextVersion),
283
+ ]);
284
+ }
285
+ else if (coreVersion !== plan.nextVersion) {
286
+ throw new CliError({
287
+ exitCode: exitCodeForError("E_VALIDATION"),
288
+ code: "E_VALIDATION",
289
+ message: `Current version does not match plan. ` +
290
+ `current=${coreVersion} expected_prev=${plan.prevVersion} expected_next=${plan.nextVersion}\n` +
291
+ "Re-run `agentplane release plan` to generate a fresh plan for this repo state.",
292
+ });
293
+ }
294
+ await maybeUpdateBunLockfile(gitRoot);
295
+ const stagePaths = [
296
+ "packages/core/package.json",
297
+ "packages/agentplane/package.json",
298
+ path.relative(gitRoot, notesPath),
299
+ ];
300
+ if (await fileExists(path.join(gitRoot, "bun.lock"))) {
301
+ stagePaths.push("bun.lock");
302
+ }
303
+ await git.stage(stagePaths);
304
+ const staged = await git.statusStagedPaths();
305
+ if (staged.length === 0) {
306
+ process.stdout.write("No changes to commit.\n");
307
+ }
308
+ else {
309
+ const subject = `✨ release: ${plan.nextTag}`;
310
+ await git.commit({ message: subject, env: cleanHookEnv() });
311
+ }
312
+ // Create tag (idempotency: refuse to overwrite).
313
+ try {
314
+ await execFileAsync("git", ["rev-parse", "-q", "--verify", `refs/tags/${plan.nextTag}`], {
315
+ cwd: gitRoot,
316
+ env: gitEnv(),
317
+ });
318
+ throw new CliError({
319
+ exitCode: exitCodeForError("E_GIT"),
320
+ code: "E_GIT",
321
+ message: `Tag already exists: ${plan.nextTag}`,
322
+ });
323
+ }
324
+ catch (err) {
325
+ const code = err?.code;
326
+ if (code !== 1)
327
+ throw err;
328
+ }
329
+ await execFileAsync("git", ["tag", plan.nextTag], { cwd: gitRoot, env: gitEnv() });
330
+ process.stdout.write(`Release tag created: ${plan.nextTag}\n`);
331
+ if (flags.push) {
332
+ await execFileAsync("git", ["push", flags.remote, "HEAD"], { cwd: gitRoot, env: gitEnv() });
333
+ await execFileAsync("git", ["push", flags.remote, plan.nextTag], {
334
+ cwd: gitRoot,
335
+ env: gitEnv(),
336
+ });
337
+ process.stdout.write(`Pushed: ${flags.remote} HEAD + ${plan.nextTag}\n`);
338
+ }
339
+ else {
340
+ process.stdout.write(`Next: git push <remote> HEAD && git push <remote> ${plan.nextTag}\n`);
341
+ }
342
+ return 0;
343
+ };
@@ -0,0 +1,12 @@
1
+ import type { CommandHandler, CommandSpec } from "../../cli/spec/spec.js";
2
+ type BumpKind = "patch" | "minor" | "major";
3
+ export type ReleasePlanFlags = {
4
+ bump: BumpKind;
5
+ since?: string;
6
+ yes: boolean;
7
+ };
8
+ export type ReleasePlanParsed = ReleasePlanFlags;
9
+ export declare const releasePlanSpec: CommandSpec<ReleasePlanParsed>;
10
+ export declare const runReleasePlan: CommandHandler<ReleasePlanParsed>;
11
+ export {};
12
+ //# sourceMappingURL=plan.command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.command.d.ts","sourceRoot":"","sources":["../../../src/commands/release/plan.command.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAM1E,KAAK,QAAQ,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;AAE5C,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,OAAO,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG,gBAAgB,CAAC;AAmHjD,eAAO,MAAM,eAAe,EAAE,WAAW,CAAC,iBAAiB,CA4E1D,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,cAAc,CAAC,iBAAiB,CAyD5D,CAAC"}
@@ -0,0 +1,206 @@
1
+ import { mkdir, readFile, writeFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { resolveProject } from "@agentplaneorg/core";
4
+ import { usageError } from "../../cli/spec/errors.js";
5
+ import { exitCodeForError } from "../../cli/exit-codes.js";
6
+ import { CliError } from "../../shared/errors.js";
7
+ import { execFileAsync, gitEnv } from "../shared/git.js";
8
+ function parseSemver(version) {
9
+ const m = /^(\d+)\.(\d+)\.(\d+)$/u.exec(version.trim());
10
+ if (!m)
11
+ return null;
12
+ const major = Number(m[1]);
13
+ const minor = Number(m[2]);
14
+ const patch = Number(m[3]);
15
+ if (![major, minor, patch].every((n) => Number.isInteger(n) && n >= 0))
16
+ return null;
17
+ return { major, minor, patch };
18
+ }
19
+ function bumpVersion(version, bump) {
20
+ const parsed = parseSemver(version);
21
+ if (!parsed) {
22
+ throw new CliError({
23
+ exitCode: exitCodeForError("E_VALIDATION"),
24
+ code: "E_VALIDATION",
25
+ message: `Invalid version (expected X.Y.Z): ${version}`,
26
+ });
27
+ }
28
+ if (bump === "patch")
29
+ return `${parsed.major}.${parsed.minor}.${parsed.patch + 1}`;
30
+ if (bump === "minor")
31
+ return `${parsed.major}.${parsed.minor + 1}.0`;
32
+ return `${parsed.major + 1}.0.0`;
33
+ }
34
+ async function readPackageVersion(pkgJsonPath) {
35
+ const raw = JSON.parse(await readFile(pkgJsonPath, "utf8"));
36
+ const version = typeof raw.version === "string" ? raw.version.trim() : "";
37
+ if (!version) {
38
+ throw new CliError({
39
+ exitCode: exitCodeForError("E_VALIDATION"),
40
+ code: "E_VALIDATION",
41
+ message: `Missing package.json version: ${pkgJsonPath}`,
42
+ });
43
+ }
44
+ return version;
45
+ }
46
+ async function getLatestSemverTag(gitRoot) {
47
+ try {
48
+ const { stdout } = await execFileAsync("git", ["describe", "--tags", "--abbrev=0", "--match", "v[0-9]*.[0-9]*.[0-9]*"], { cwd: gitRoot, env: gitEnv() });
49
+ const tag = String(stdout ?? "").trim();
50
+ return tag || null;
51
+ }
52
+ catch {
53
+ return null;
54
+ }
55
+ }
56
+ async function listChanges(gitRoot, sinceRef) {
57
+ const range = sinceRef ? `${sinceRef}..HEAD` : "HEAD";
58
+ const { stdout } = await execFileAsync("git", ["log", "--no-merges", "--pretty=format:%H%x00%aI%x00%s", range], { cwd: gitRoot, env: gitEnv(), maxBuffer: 10 * 1024 * 1024 });
59
+ const text = String(stdout ?? "");
60
+ const lines = text.split("\n").filter((l) => l.length > 0);
61
+ const out = [];
62
+ for (const line of lines) {
63
+ const parts = line.split("\0");
64
+ const hash = (parts[0] ?? "").trim();
65
+ const authorDateIso = (parts[1] ?? "").trim();
66
+ const subject = (parts[2] ?? "").trim();
67
+ if (!hash || !authorDateIso || !subject)
68
+ continue;
69
+ out.push({ hash, authorDateIso, subject });
70
+ }
71
+ return out;
72
+ }
73
+ function changesMarkdown(changes) {
74
+ if (changes.length === 0)
75
+ return "_No commits found in the selected range._\n";
76
+ return (changes
77
+ .map((c) => `- ${c.subject} (${c.hash.slice(0, 7)})`)
78
+ .join("\n")
79
+ .trim() + "\n");
80
+ }
81
+ function releaseInstructions(opts) {
82
+ return (`# Release plan\n\n` +
83
+ `## Target\n\n` +
84
+ `- Tag: \`${opts.nextTag}\`\n` +
85
+ (opts.prevTag
86
+ ? `- Since: \`${opts.prevTag}\`\n`
87
+ : "- Since: (no previous semver tag found)\n") +
88
+ `- Bump: \`${opts.bump}\`\n\n` +
89
+ `## Agent task: write release notes\n\n` +
90
+ `Write English release notes as \`docs/releases/${opts.nextTag}.md\`.\n\n` +
91
+ `Rules:\n` +
92
+ `- Use human-readable bullets focused on outcomes and user-facing improvements.\n` +
93
+ `- Minimum: 3 bullet points.\n` +
94
+ `- Do not include Cyrillic.\n` +
95
+ `- Use \`docs/releases/TEMPLATE.md\` as the structure.\n\n` +
96
+ `Inputs:\n` +
97
+ `- \`changes.md\` and \`changes.json\` in this directory.\n`);
98
+ }
99
+ export const releasePlanSpec = {
100
+ id: ["release", "plan"],
101
+ group: "Release",
102
+ summary: "Generate an agent-assisted release plan (changes list + next patch version).",
103
+ description: "Generates a structured changes list since the last semver tag and writes a plan directory under .agentplane/.release/. This plan is intended for a DOCS agent to author release notes. By default, only patch bumps are allowed without explicit approval.",
104
+ options: [
105
+ {
106
+ kind: "boolean",
107
+ name: "patch",
108
+ default: false,
109
+ description: "Bump patch version (default).",
110
+ },
111
+ {
112
+ kind: "boolean",
113
+ name: "minor",
114
+ default: false,
115
+ description: "Bump minor version (requires --yes).",
116
+ },
117
+ {
118
+ kind: "boolean",
119
+ name: "major",
120
+ default: false,
121
+ description: "Bump major version (requires --yes).",
122
+ },
123
+ {
124
+ kind: "string",
125
+ name: "since",
126
+ valueHint: "<tag>",
127
+ description: "Override the starting tag/ref (defaults to the latest vX.Y.Z tag).",
128
+ },
129
+ {
130
+ kind: "boolean",
131
+ name: "yes",
132
+ default: false,
133
+ description: "Approve minor/major version bumps (required for --minor/--major).",
134
+ },
135
+ ],
136
+ validateRaw: (raw) => {
137
+ const count = [
138
+ raw.opts.patch === true,
139
+ raw.opts.minor === true,
140
+ raw.opts.major === true,
141
+ ].filter(Boolean).length;
142
+ if (count > 1) {
143
+ throw usageError({
144
+ spec: releasePlanSpec,
145
+ command: "release plan",
146
+ message: "Options --patch/--minor/--major are mutually exclusive.",
147
+ });
148
+ }
149
+ },
150
+ parse: (raw) => {
151
+ const bump = raw.opts.major === true ? "major" : raw.opts.minor === true ? "minor" : "patch";
152
+ return { bump, since: raw.opts.since, yes: raw.opts.yes === true };
153
+ },
154
+ validate: (p) => {
155
+ if ((p.bump === "minor" || p.bump === "major") && p.yes !== true) {
156
+ throw usageError({
157
+ spec: releasePlanSpec,
158
+ command: "release plan",
159
+ message: `Bump '${p.bump}' requires explicit approval. Re-run with --yes.`,
160
+ });
161
+ }
162
+ },
163
+ examples: [
164
+ {
165
+ cmd: "agentplane release plan",
166
+ why: "Generate a plan for the next patch release and hand it to a DOCS agent to write release notes.",
167
+ },
168
+ {
169
+ cmd: "agentplane release plan --minor --yes",
170
+ why: "Generate a plan for the next minor release (explicit approval required).",
171
+ },
172
+ ],
173
+ };
174
+ export const runReleasePlan = async (ctx, flags) => {
175
+ const resolved = await resolveProject({ cwd: ctx.cwd, rootOverride: ctx.rootOverride ?? null });
176
+ const gitRoot = resolved.gitRoot;
177
+ const corePkgPath = path.join(gitRoot, "packages", "core", "package.json");
178
+ const agentplanePkgPath = path.join(gitRoot, "packages", "agentplane", "package.json");
179
+ const [coreVersion, agentplaneVersion] = await Promise.all([
180
+ readPackageVersion(corePkgPath),
181
+ readPackageVersion(agentplanePkgPath),
182
+ ]);
183
+ if (coreVersion !== agentplaneVersion) {
184
+ throw new CliError({
185
+ exitCode: exitCodeForError("E_VALIDATION"),
186
+ code: "E_VALIDATION",
187
+ message: `Package versions must match before release planning. ` +
188
+ `packages/core=${coreVersion} packages/agentplane=${agentplaneVersion}`,
189
+ });
190
+ }
191
+ const prevTag = flags.since ?? (await getLatestSemverTag(gitRoot));
192
+ const nextVersion = bumpVersion(coreVersion, flags.bump);
193
+ const nextTag = `v${nextVersion}`;
194
+ const changes = await listChanges(gitRoot, prevTag);
195
+ const runId = new Date().toISOString().replaceAll(":", "-").replaceAll(".", "-");
196
+ const baseDir = path.join(gitRoot, ".agentplane", ".release", "plan", runId);
197
+ await mkdir(baseDir, { recursive: true });
198
+ await writeFile(path.join(baseDir, "version.json"), JSON.stringify({ prevTag, prevVersion: coreVersion, nextTag, nextVersion, bump: flags.bump }, null, 2) + "\n", "utf8");
199
+ await writeFile(path.join(baseDir, "changes.json"), JSON.stringify(changes, null, 2) + "\n", "utf8");
200
+ await writeFile(path.join(baseDir, "changes.md"), changesMarkdown(changes), "utf8");
201
+ await writeFile(path.join(baseDir, "instructions.md"), releaseInstructions({ nextTag, prevTag, bump: flags.bump }), "utf8");
202
+ process.stdout.write(`Release plan written: ${path.relative(gitRoot, baseDir)}\n`);
203
+ process.stdout.write(`Next tag: ${nextTag}\n`);
204
+ process.stdout.write(`Hint: Create a DOCS task to write docs/releases/${nextTag}.md based on this plan.\n`);
205
+ return 0;
206
+ };
@@ -0,0 +1,5 @@
1
+ import type { CommandHandler, CommandSpec } from "../../cli/spec/spec.js";
2
+ export type ReleaseGroupParsed = Record<string, never>;
3
+ export declare const releaseSpec: CommandSpec<ReleaseGroupParsed>;
4
+ export declare const runRelease: CommandHandler<ReleaseGroupParsed>;
5
+ //# sourceMappingURL=release.command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release.command.d.ts","sourceRoot":"","sources":["../../../src/commands/release/release.command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAG1E,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAEvD,eAAO,MAAM,WAAW,EAAE,WAAW,CAAC,kBAAkB,CAYvD,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,cAAc,CAAC,kBAAkB,CAGzD,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { usageError } from "../../cli/spec/errors.js";
2
+ export const releaseSpec = {
3
+ id: ["release"],
4
+ group: "Release",
5
+ summary: "Prepare a release (agent-assisted notes + version bump workflow).",
6
+ synopsis: ["agentplane release <command> [args] [options]"],
7
+ validateRaw: (raw) => {
8
+ if (raw.extra.length > 0) {
9
+ throw usageError({ spec: releaseSpec, message: `Unknown subcommand: ${raw.extra[0]}` });
10
+ }
11
+ throw usageError({ spec: releaseSpec, message: "Missing subcommand." });
12
+ },
13
+ parse: () => ({}),
14
+ };
15
+ export const runRelease = () => {
16
+ // Unreachable (validateRaw always throws).
17
+ return Promise.resolve(2);
18
+ };
@@ -15,6 +15,9 @@ export declare class GitContext {
15
15
  body?: string;
16
16
  env?: NodeJS.ProcessEnv;
17
17
  }): Promise<void>;
18
+ commitAmendNoEdit(opts?: {
19
+ env?: NodeJS.ProcessEnv;
20
+ }): Promise<void>;
18
21
  headHashSubject(): Promise<{
19
22
  hash: string;
20
23
  subject: string;
@@ -1 +1 @@
1
- {"version":3,"file":"git-context.d.ts","sourceRoot":"","sources":["../../../src/commands/shared/git-context.ts"],"names":[],"mappings":"AAyEA,qBAAa,UAAU;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAEzB,OAAO,CAAC,IAAI,CAGL;gBAEK,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE;YAIvB,gBAAgB;IAmBxB,kBAAkB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAKvC,iBAAiB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAKtC,0BAA0B,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAKrD,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC;IAWvB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAWrC,MAAM,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAcxF,eAAe,IAAI,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAWpE"}
1
+ {"version":3,"file":"git-context.d.ts","sourceRoot":"","sources":["../../../src/commands/shared/git-context.ts"],"names":[],"mappings":"AAyEA,qBAAa,UAAU;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAEzB,OAAO,CAAC,IAAI,CAGL;gBAEK,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE;YAIvB,gBAAgB;IAmBxB,kBAAkB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAKvC,iBAAiB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAKtC,0BAA0B,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAKrD,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC;IAWvB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAWrC,MAAM,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAcxF,iBAAiB,CAAC,IAAI,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAWpE,eAAe,IAAI,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAWpE"}
@@ -126,6 +126,16 @@ export class GitContext {
126
126
  this.memo.status = undefined;
127
127
  this.memo.headCommit = undefined;
128
128
  }
129
+ async commitAmendNoEdit(opts) {
130
+ await execFileAsync("git", ["commit", "--amend", "--no-edit"], {
131
+ cwd: this.gitRoot,
132
+ env: opts?.env ?? gitEnv(),
133
+ // Amend triggers hooks too; keep buffer aligned with regular commit.
134
+ maxBuffer: 50 * 1024 * 1024,
135
+ });
136
+ this.memo.status = undefined;
137
+ this.memo.headCommit = undefined;
138
+ }
129
139
  async headHashSubject() {
130
140
  const { stdout } = await execFileAsync("git", ["log", "-1", "--pretty=%H%x00%s"], {
131
141
  cwd: this.gitRoot,
@@ -4,6 +4,7 @@ export type CommandMemo = {
4
4
  taskList?: Promise<TaskData[]>;
5
5
  changedPaths?: Promise<string[]>;
6
6
  headCommit?: Promise<string>;
7
+ agentIds?: Promise<string[]>;
7
8
  };
8
9
  export type CommandContext = {
9
10
  resolvedProject: Awaited<ReturnType<typeof loadTaskBackend>>["resolved"];
@@ -1 +1 @@
1
- {"version":3,"file":"task-backend.d.ts","sourceRoot":"","sources":["../../../src/commands/shared/task-backend.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAE,KAAK,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAChF,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,MAAM,MAAM,WAAW,GAAG;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC/B,YAAY,CAAC,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACjC,UAAU,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;CAC9B,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;IAGlB,QAAQ,EAAE,cAAc,CAAC,iBAAiB,CAAC,CAAC;IAC5C,OAAO,EAAE,cAAc,CAAC,aAAa,CAAC,CAAC;CACxC,CAAC;AASF,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAQ3E;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA+B7E;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE;IAC7C,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B,GAAG,OAAO,CAAC,cAAc,CAAC,CAgB1B;AAED,wBAAsB,mBAAmB,CAAC,IAAI,EAAE;IAC9C,GAAG,EAAE,cAAc,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAepB;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,aAAa,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAG5E"}
1
+ {"version":3,"file":"task-backend.d.ts","sourceRoot":"","sources":["../../../src/commands/shared/task-backend.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAE,KAAK,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAChF,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,MAAM,MAAM,WAAW,GAAG;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC/B,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;CAC9B,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;IAGlB,QAAQ,EAAE,cAAc,CAAC,iBAAiB,CAAC,CAAC;IAC5C,OAAO,EAAE,cAAc,CAAC,aAAa,CAAC,CAAC;CACxC,CAAC;AASF,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAQ3E;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA+B7E;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE;IAC7C,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B,GAAG,OAAO,CAAC,cAAc,CAAC,CAgB1B;AAED,wBAAsB,mBAAmB,CAAC,IAAI,EAAE;IAC9C,GAAG,EAAE,cAAc,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAepB;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,aAAa,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAG5E"}