agentplane 0.2.19 → 0.2.22

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 (122) hide show
  1. package/assets/AGENTS.md +6 -4
  2. package/bin/agentplane.js +24 -0
  3. package/dist/backends/task-backend/load.d.ts +2 -0
  4. package/dist/backends/task-backend/load.d.ts.map +1 -1
  5. package/dist/backends/task-backend/load.js +38 -18
  6. package/dist/backends/task-backend/local-backend.d.ts.map +1 -1
  7. package/dist/backends/task-backend/local-backend.js +27 -7
  8. package/dist/cli/command-guide.d.ts.map +1 -1
  9. package/dist/cli/command-guide.js +12 -11
  10. package/dist/cli/run-cli/command-catalog.d.ts +1 -1
  11. package/dist/cli/run-cli/command-catalog.d.ts.map +1 -1
  12. package/dist/cli/run-cli/command-catalog.js +72 -13
  13. package/dist/cli/run-cli/commands/core.d.ts +11 -1
  14. package/dist/cli/run-cli/commands/core.d.ts.map +1 -1
  15. package/dist/cli/run-cli/commands/core.js +295 -8
  16. package/dist/cli/run-cli/commands/init/write-agents.d.ts.map +1 -1
  17. package/dist/cli/run-cli/commands/init/write-agents.js +33 -1
  18. package/dist/cli/run-cli/commands/init/write-config.d.ts.map +1 -1
  19. package/dist/cli/run-cli/commands/init/write-config.js +4 -0
  20. package/dist/cli/run-cli/commands/init/write-gitignore.d.ts.map +1 -1
  21. package/dist/cli/run-cli/commands/init/write-gitignore.js +3 -18
  22. package/dist/cli/run-cli/commands/init.d.ts +1 -0
  23. package/dist/cli/run-cli/commands/init.d.ts.map +1 -1
  24. package/dist/cli/run-cli/commands/init.js +96 -31
  25. package/dist/cli/run-cli.d.ts.map +1 -1
  26. package/dist/cli/run-cli.js +86 -17
  27. package/dist/cli/spec/docs-render.d.ts.map +1 -1
  28. package/dist/cli/spec/docs-render.js +13 -6
  29. package/dist/commands/backend/sync.command.d.ts +3 -2
  30. package/dist/commands/backend/sync.command.d.ts.map +1 -1
  31. package/dist/commands/backend/sync.command.js +13 -15
  32. package/dist/commands/commit.command.d.ts.map +1 -1
  33. package/dist/commands/commit.command.js +2 -0
  34. package/dist/commands/commit.spec.d.ts +2 -0
  35. package/dist/commands/commit.spec.d.ts.map +1 -1
  36. package/dist/commands/commit.spec.js +26 -0
  37. package/dist/commands/doctor.run.d.ts.map +1 -1
  38. package/dist/commands/doctor.run.js +15 -6
  39. package/dist/commands/finish.run.d.ts.map +1 -1
  40. package/dist/commands/finish.run.js +2 -0
  41. package/dist/commands/finish.spec.d.ts +2 -0
  42. package/dist/commands/finish.spec.d.ts.map +1 -1
  43. package/dist/commands/finish.spec.js +36 -0
  44. package/dist/commands/guard/impl/allow.d.ts.map +1 -1
  45. package/dist/commands/guard/impl/allow.js +33 -7
  46. package/dist/commands/guard/impl/commands.d.ts +2 -0
  47. package/dist/commands/guard/impl/commands.d.ts.map +1 -1
  48. package/dist/commands/guard/impl/commands.js +24 -4
  49. package/dist/commands/guard/impl/comment-commit.d.ts +1 -0
  50. package/dist/commands/guard/impl/comment-commit.d.ts.map +1 -1
  51. package/dist/commands/guard/impl/comment-commit.js +16 -24
  52. package/dist/commands/pr/pr.command.d.ts +1 -1
  53. package/dist/commands/pr/pr.command.d.ts.map +1 -1
  54. package/dist/commands/pr/pr.command.js +15 -15
  55. package/dist/commands/release/apply.command.d.ts.map +1 -1
  56. package/dist/commands/release/apply.command.js +51 -3
  57. package/dist/commands/release/plan.command.d.ts.map +1 -1
  58. package/dist/commands/release/plan.command.js +25 -1
  59. package/dist/commands/shared/task-backend.d.ts +3 -0
  60. package/dist/commands/shared/task-backend.d.ts.map +1 -1
  61. package/dist/commands/shared/task-backend.js +4 -1
  62. package/dist/commands/task/block.d.ts.map +1 -1
  63. package/dist/commands/task/block.js +16 -16
  64. package/dist/commands/task/close-duplicate.command.d.ts +14 -0
  65. package/dist/commands/task/close-duplicate.command.d.ts.map +1 -0
  66. package/dist/commands/task/close-duplicate.command.js +102 -0
  67. package/dist/commands/task/close-duplicate.d.ts +14 -0
  68. package/dist/commands/task/close-duplicate.d.ts.map +1 -0
  69. package/dist/commands/task/close-duplicate.js +90 -0
  70. package/dist/commands/task/close-noop.command.d.ts +14 -0
  71. package/dist/commands/task/close-noop.command.d.ts.map +1 -0
  72. package/dist/commands/task/close-noop.command.js +77 -0
  73. package/dist/commands/task/close-noop.d.ts +13 -0
  74. package/dist/commands/task/close-noop.d.ts.map +1 -0
  75. package/dist/commands/task/close-noop.js +77 -0
  76. package/dist/commands/task/finish.d.ts +2 -0
  77. package/dist/commands/task/finish.d.ts.map +1 -1
  78. package/dist/commands/task/finish.js +63 -14
  79. package/dist/commands/task/index.d.ts +3 -0
  80. package/dist/commands/task/index.d.ts.map +1 -1
  81. package/dist/commands/task/index.js +3 -0
  82. package/dist/commands/task/new.d.ts.map +1 -1
  83. package/dist/commands/task/new.js +34 -6
  84. package/dist/commands/task/new.spec.js +1 -1
  85. package/dist/commands/task/plan.d.ts.map +1 -1
  86. package/dist/commands/task/plan.js +16 -5
  87. package/dist/commands/task/ready.d.ts.map +1 -1
  88. package/dist/commands/task/ready.js +6 -8
  89. package/dist/commands/task/set-status.d.ts.map +1 -1
  90. package/dist/commands/task/set-status.js +19 -21
  91. package/dist/commands/task/shared.d.ts +35 -1
  92. package/dist/commands/task/shared.d.ts.map +1 -1
  93. package/dist/commands/task/shared.js +188 -0
  94. package/dist/commands/task/start-ready.command.d.ts +14 -0
  95. package/dist/commands/task/start-ready.command.d.ts.map +1 -0
  96. package/dist/commands/task/start-ready.command.js +77 -0
  97. package/dist/commands/task/start-ready.d.ts +13 -0
  98. package/dist/commands/task/start-ready.d.ts.map +1 -0
  99. package/dist/commands/task/start-ready.js +37 -0
  100. package/dist/commands/task/start.d.ts.map +1 -1
  101. package/dist/commands/task/start.js +20 -23
  102. package/dist/commands/task/update.command.d.ts +1 -0
  103. package/dist/commands/task/update.command.d.ts.map +1 -1
  104. package/dist/commands/task/update.command.js +8 -0
  105. package/dist/commands/task/update.d.ts +1 -0
  106. package/dist/commands/task/update.d.ts.map +1 -1
  107. package/dist/commands/task/update.js +19 -3
  108. package/dist/commands/upgrade.d.ts.map +1 -1
  109. package/dist/commands/upgrade.js +67 -19
  110. package/dist/shared/errors.d.ts +9 -1
  111. package/dist/shared/errors.d.ts.map +1 -1
  112. package/dist/shared/errors.js +3 -1
  113. package/dist/shared/runtime-artifacts.d.ts +3 -0
  114. package/dist/shared/runtime-artifacts.d.ts.map +1 -0
  115. package/dist/shared/runtime-artifacts.js +18 -0
  116. package/dist/usecases/context/resolve-context.d.ts +3 -0
  117. package/dist/usecases/context/resolve-context.d.ts.map +1 -1
  118. package/dist/usecases/context/resolve-context.js +6 -1
  119. package/package.json +2 -2
  120. package/dist/cli/parse/lifecycle.d.ts +0 -64
  121. package/dist/cli/parse/lifecycle.d.ts.map +0 -1
  122. package/dist/cli/parse/lifecycle.js +0 -285
@@ -18,6 +18,32 @@ import { ensureAgentsFiles } from "./init/write-agents.js";
18
18
  import { ensureInitGitignore } from "./init/write-gitignore.js";
19
19
  import { ensureInitRedmineEnvTemplate } from "./init/write-env.js";
20
20
  import { renderInitSection, renderInitWelcome } from "./init/ui.js";
21
+ const setupProfilePresets = {
22
+ prod: {
23
+ mode: "prod",
24
+ description: "Production bootstrap: compact flow with default managed-file and approval settings.",
25
+ defaultHooks: false,
26
+ defaultStrictUnsafeConfirm: false,
27
+ },
28
+ "prod-strict": {
29
+ mode: "prod",
30
+ description: "Production bootstrap + strict defaults for safer installs (hooks on, strict unsafe confirmations).",
31
+ defaultHooks: true,
32
+ defaultStrictUnsafeConfirm: true,
33
+ },
34
+ dev: {
35
+ mode: "dev",
36
+ description: "Developer bootstrap: full questionnaire for every init aspect.",
37
+ defaultHooks: false,
38
+ defaultStrictUnsafeConfirm: false,
39
+ },
40
+ "dev-safe": {
41
+ mode: "dev",
42
+ description: "Developer bootstrap with explicit unsafe-action confirmation by default.",
43
+ defaultHooks: false,
44
+ defaultStrictUnsafeConfirm: true,
45
+ },
46
+ };
21
47
  function parseBooleanValueForInit(flag, value) {
22
48
  const normalized = value.trim().toLowerCase();
23
49
  if (["1", "true", "yes", "y", "on"].includes(normalized))
@@ -45,6 +71,13 @@ export const initSpec = {
45
71
  summary: "Initialize agentplane project files under .agentplane/.",
46
72
  description: "Creates .agentplane/ config, backend stubs, and agent templates in the target directory. If the target directory is not a git repository, it initializes one and (by default) writes an initial install commit. Use --gitignore-agents to keep agent templates local (gitignored) and skip the install commit. In interactive mode it prompts for missing inputs; use --yes for non-interactive mode.",
47
73
  options: [
74
+ {
75
+ kind: "string",
76
+ name: "setup-profile",
77
+ valueHint: "<prod|dev>",
78
+ choices: ["prod", "dev"],
79
+ description: "Interactive preset. prod is the default and asks only essential questions; dev asks the full setup questionnaire.",
80
+ },
48
81
  {
49
82
  kind: "string",
50
83
  name: "ide",
@@ -167,6 +200,7 @@ export const initSpec = {
167
200
  const requireVerifyRaw = raw.opts["require-verify-approval"];
168
201
  const recipesRaw = raw.opts.recipes;
169
202
  return {
203
+ setupProfile: raw.opts["setup-profile"],
170
204
  ide: raw.opts.ide,
171
205
  workflow: raw.opts.workflow,
172
206
  backend: raw.opts.backend,
@@ -226,6 +260,8 @@ async function cmdInit(opts) {
226
260
  let requireVerifyApproval = flags.requireVerifyApproval ?? defaults.requireVerifyApproval;
227
261
  let executionProfile = flags.executionProfile ?? defaults.executionProfile;
228
262
  let strictUnsafeConfirm = flags.strictUnsafeConfirm ?? defaults.strictUnsafeConfirm;
263
+ let setupProfile = flags.setupProfile ?? "prod";
264
+ let setupProfilePreset = flags.setupProfile ?? "prod";
229
265
  const isInteractive = process.stdin.isTTY && !flags.yes;
230
266
  if (!process.stdin.isTTY &&
231
267
  !flags.yes &&
@@ -257,9 +293,26 @@ async function cmdInit(opts) {
257
293
  return result;
258
294
  };
259
295
  process.stdout.write(renderInitWelcome());
260
- process.stdout.write(renderInitSection("Workflow", "Choose how branches/backends/approvals should be initialized for this repository."));
296
+ const presetLines = Object.entries(setupProfilePresets).map(([id, preset]) => `- ${id}: ${preset.description}`);
297
+ process.stdout.write(renderInitSection("Setup Preset", "Choose a bootstrap preset. It controls what questions are shown and safe defaults used."));
298
+ process.stdout.write(`${presetLines.join("\n")}\n\n`);
299
+ if (flags.setupProfile) {
300
+ setupProfilePreset = flags.setupProfile;
301
+ }
302
+ else {
303
+ const selected = await askChoice("Setup preset", ["prod", "prod-strict", "dev", "dev-safe"], "prod");
304
+ setupProfilePreset = selected;
305
+ }
306
+ const selectedPreset = setupProfilePresets[setupProfilePreset];
307
+ setupProfile = selectedPreset.mode;
308
+ if (flags.hooks === undefined)
309
+ hooks = selectedPreset.defaultHooks;
310
+ if (flags.strictUnsafeConfirm === undefined) {
311
+ strictUnsafeConfirm = selectedPreset.defaultStrictUnsafeConfirm;
312
+ }
313
+ process.stdout.write(renderInitSection("Workflow", "Choose how this repository will be orchestrated: direct means one branch, branch_pr means PR-first tasks."));
261
314
  ide = flags.ide ?? defaults.ide;
262
- if (!flags.workflow) {
315
+ if (!flags.workflow && setupProfile === "dev") {
263
316
  const choice = await askChoice("Workflow mode", ["direct", "branch_pr"], workflow);
264
317
  workflow = choice === "branch_pr" ? "branch_pr" : "direct";
265
318
  }
@@ -267,36 +320,48 @@ async function cmdInit(opts) {
267
320
  const choice = await askChoice("Task backend", ["local", "redmine"], backend);
268
321
  backend = choice === "redmine" ? "redmine" : "local";
269
322
  }
270
- if (flags.hooks === undefined) {
271
- hooks = await askYesNo("Install managed git hooks now?", hooks);
272
- }
273
- process.stdout.write(renderInitSection("Execution Profile", "Set default autonomy/effort for agents. You can change this later in config."));
274
- if (!flags.executionProfile) {
275
- executionProfile = (await askChoice("Execution profile", ["conservative", "balanced", "aggressive"], executionProfile));
276
- }
277
- if (flags.strictUnsafeConfirm === undefined) {
278
- strictUnsafeConfirm = await askYesNo("Require strict explicit confirmation for extra unsafe actions?", strictUnsafeConfirm);
279
- }
280
- process.stdout.write(renderInitSection("Approvals", "Control whether plan/network/verification actions require explicit approval by default."));
281
- if (flags.requirePlanApproval === undefined) {
282
- requirePlanApproval = await askYesNo("Require plan approval before work starts?", requirePlanApproval);
283
- }
284
- if (flags.requireNetworkApproval === undefined) {
285
- requireNetworkApproval = await askYesNo("Require explicit approval for network actions?", requireNetworkApproval);
286
- }
287
- if (flags.requireVerifyApproval === undefined) {
288
- requireVerifyApproval = await askYesNo("Require explicit approval before recording verification?", requireVerifyApproval);
323
+ if (setupProfile === "dev") {
324
+ if (flags.hooks === undefined) {
325
+ hooks = await askYesNo("Install managed git hooks now?", hooks);
326
+ }
327
+ process.stdout.write(renderInitSection("Execution Profile", "Set default autonomy/effort for agents. You can change this later in config."));
328
+ if (!flags.executionProfile) {
329
+ executionProfile = (await askChoice("Execution profile", ["conservative", "balanced", "aggressive"], executionProfile));
330
+ }
331
+ if (flags.strictUnsafeConfirm === undefined) {
332
+ strictUnsafeConfirm = await askYesNo("Require strict explicit confirmation for extra unsafe actions?", strictUnsafeConfirm);
333
+ }
334
+ process.stdout.write(renderInitSection("Approvals", "Control whether plan/network/verification actions require explicit approval by default."));
335
+ if (flags.requirePlanApproval === undefined) {
336
+ requirePlanApproval = await askYesNo("Require plan approval before work starts?", requirePlanApproval);
337
+ }
338
+ if (flags.requireNetworkApproval === undefined) {
339
+ requireNetworkApproval = await askYesNo("Require explicit approval for network actions?", requireNetworkApproval);
340
+ }
341
+ if (flags.requireVerifyApproval === undefined) {
342
+ requireVerifyApproval = await askYesNo("Require explicit approval before recording verification?", requireVerifyApproval);
343
+ }
344
+ process.stdout.write(renderInitSection("Recipes", "Optional: install recipe packs now (comma-separated IDs) or choose none."));
345
+ if (!flags.recipes) {
346
+ process.stdout.write(`${renderBundledRecipesHint()}\n`);
347
+ const answer = await askInput("Install optional recipes (comma separated, or none): ");
348
+ recipes = answer
349
+ ? answer
350
+ .split(",")
351
+ .map((item) => item.trim())
352
+ .filter(Boolean)
353
+ : [];
354
+ }
289
355
  }
290
- process.stdout.write(renderInitSection("Recipes", "Optional: install recipe packs now (comma-separated IDs) or choose none."));
291
- if (!flags.recipes) {
292
- process.stdout.write(`${renderBundledRecipesHint()}\n`);
293
- const answer = await askInput("Install optional recipes (comma separated, or none): ");
294
- recipes = answer
295
- ? answer
296
- .split(",")
297
- .map((item) => item.trim())
298
- .filter(Boolean)
299
- : [];
356
+ else {
357
+ hooks = flags.hooks ?? selectedPreset.defaultHooks;
358
+ recipes = flags.recipes ?? defaults.recipes;
359
+ requirePlanApproval = flags.requirePlanApproval ?? defaults.requirePlanApproval;
360
+ requireNetworkApproval = flags.requireNetworkApproval ?? defaults.requireNetworkApproval;
361
+ requireVerifyApproval = flags.requireVerifyApproval ?? defaults.requireVerifyApproval;
362
+ executionProfile = flags.executionProfile ?? defaults.executionProfile;
363
+ strictUnsafeConfirm = flags.strictUnsafeConfirm ?? selectedPreset.defaultStrictUnsafeConfirm;
364
+ process.stdout.write(renderInitSection("Defaults Applied", "Using compact prod defaults for hooks, approvals, execution profile, and recipes."));
300
365
  }
301
366
  }
302
367
  if (flags.yes) {
@@ -1 +1 @@
1
- {"version":3,"file":"run-cli.d.ts","sourceRoot":"","sources":["../../src/cli/run-cli.ts"],"names":[],"mappings":"AAoWA,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA0K5D"}
1
+ {"version":3,"file":"run-cli.d.ts","sourceRoot":"","sources":["../../src/cli/run-cli.ts"],"names":[],"mappings":"AAibA,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAiL5D"}
@@ -134,9 +134,9 @@ function matchCommandCatalog(tokens) {
134
134
  return best;
135
135
  }
136
136
  function writeError(err, jsonErrors) {
137
- const hint = renderErrorHint(err);
137
+ const guidance = resolveErrorGuidance(err);
138
138
  if (jsonErrors) {
139
- process.stdout.write(`${formatJsonError(err)}\n`);
139
+ process.stdout.write(`${formatJsonError(err, { hint: guidance.hint, nextAction: guidance.nextAction })}\n`);
140
140
  }
141
141
  else {
142
142
  const header = `error [${err.code}]`;
@@ -146,8 +146,11 @@ function writeError(err, jsonErrors) {
146
146
  else {
147
147
  process.stderr.write(`${header}: ${err.message}\n`);
148
148
  }
149
- if (hint) {
150
- process.stderr.write(`hint: ${hint}\n`);
149
+ if (guidance.hint) {
150
+ process.stderr.write(`hint: ${guidance.hint}\n`);
151
+ }
152
+ if (guidance.nextAction) {
153
+ process.stderr.write(`next_action: ${guidance.nextAction.command} (${guidance.nextAction.reason})\n`);
151
154
  }
152
155
  }
153
156
  }
@@ -158,33 +161,92 @@ function resolveAgentplaneHome() {
158
161
  return overridden;
159
162
  return path.join(os.homedir(), ".agentplane");
160
163
  }
161
- function renderErrorHint(err) {
164
+ function resolveErrorGuidance(err) {
162
165
  const command = typeof err.context?.command === "string" ? err.context.command : undefined;
163
166
  const usage = command ? `agentplane help ${command} --compact` : "agentplane help";
164
167
  switch (err.code) {
165
168
  case "E_USAGE": {
166
- return `See \`${usage}\` for usage.`;
169
+ return {
170
+ hint: `See \`${usage}\` for usage.`,
171
+ nextAction: {
172
+ command: usage,
173
+ reason: "inspect required arguments and flags",
174
+ reasonCode: "usage_help",
175
+ },
176
+ };
167
177
  }
168
178
  case "E_GIT": {
169
179
  if (command?.startsWith("branch")) {
170
- return "Check git repo/branch; run `git branch` or pass --root <path>.";
180
+ return {
181
+ hint: "Check git repo/branch; run `git branch` or pass --root <path>.",
182
+ nextAction: {
183
+ command: "git branch",
184
+ reason: "inspect repository branch state",
185
+ reasonCode: "git_branch_state",
186
+ },
187
+ };
171
188
  }
172
189
  if (command === "guard commit" || command === "commit") {
173
- return "Check git status/index; stage changes and retry.";
190
+ return {
191
+ hint: "Check git status/index; stage changes and retry.",
192
+ nextAction: {
193
+ command: "git status --short",
194
+ reason: "inspect staged/unstaged changes before commit",
195
+ reasonCode: "git_index_state",
196
+ },
197
+ };
174
198
  }
175
- return "Check git repo context; pass --root <path> if needed.";
199
+ return {
200
+ hint: "Check git repo context; pass --root <path> if needed.",
201
+ nextAction: {
202
+ command: "git status --short --untracked-files=no",
203
+ reason: "confirm repository context and tracked changes",
204
+ reasonCode: "git_context",
205
+ },
206
+ };
176
207
  }
177
208
  case "E_NETWORK": {
178
- return "Check network access and credentials.";
209
+ return {
210
+ hint: "Check network access and credentials.",
211
+ nextAction: {
212
+ command: "agentplane preflight --json",
213
+ reason: "recheck approvals and network requirements",
214
+ reasonCode: "network_gate",
215
+ },
216
+ };
179
217
  }
180
218
  case "E_BACKEND": {
181
219
  if (command?.includes("sync")) {
182
- return "Check backend config under .agentplane/backends and retry.";
220
+ return {
221
+ hint: "Check backend config under .agentplane/backends and retry.",
222
+ nextAction: {
223
+ command: "agentplane config show",
224
+ reason: "verify backend config path and active settings",
225
+ reasonCode: "backend_sync_config",
226
+ },
227
+ };
183
228
  }
184
- return "Check backend config under .agentplane/backends.";
229
+ return {
230
+ hint: "Check backend config under .agentplane/backends.",
231
+ nextAction: {
232
+ command: "agentplane config show",
233
+ reason: "inspect backend configuration",
234
+ reasonCode: "backend_config",
235
+ },
236
+ };
237
+ }
238
+ case "E_VALIDATION": {
239
+ return {
240
+ hint: "Fix invalid config/input shape and rerun.",
241
+ nextAction: {
242
+ command: "agentplane preflight --json",
243
+ reason: "pinpoint validation failure in one report",
244
+ reasonCode: "validation_preflight",
245
+ },
246
+ };
185
247
  }
186
248
  default: {
187
- return undefined;
249
+ return {};
188
250
  }
189
251
  }
190
252
  }
@@ -342,9 +404,6 @@ export async function runCli(argv) {
342
404
  const resolved = matched?.entry.needsProject === false
343
405
  ? null
344
406
  : await maybeResolveProject({ cwd, rootOverride: globals.root });
345
- if (resolved) {
346
- await loadDotEnv(resolved.gitRoot);
347
- }
348
407
  let projectPromise = resolved
349
408
  ? Promise.resolve(resolved)
350
409
  : null;
@@ -361,6 +420,7 @@ export async function runCli(argv) {
361
420
  const getLoadedConfig = async (commandForErrorContext) => {
362
421
  configPromise ??= (async () => {
363
422
  const project = await getResolvedProject(commandForErrorContext);
423
+ await loadDotEnv(project.gitRoot);
364
424
  return await loadConfig(project.agentplaneDir);
365
425
  })();
366
426
  try {
@@ -395,7 +455,16 @@ export async function runCli(argv) {
395
455
  });
396
456
  let ctxPromise = null;
397
457
  const getCtx = async (commandForErrorContext) => {
398
- ctxPromise ??= resolveContext({ cwd, rootOverride: globals.root ?? null });
458
+ ctxPromise ??= (async () => {
459
+ const resolvedProject = await getResolvedProject(commandForErrorContext);
460
+ const loadedConfig = await getLoadedConfig(commandForErrorContext);
461
+ return await resolveContext({
462
+ cwd,
463
+ rootOverride: globals.root ?? null,
464
+ resolvedProject,
465
+ config: loadedConfig.config,
466
+ });
467
+ })();
399
468
  try {
400
469
  return await ctxPromise;
401
470
  }
@@ -1 +1 @@
1
- {"version":3,"file":"docs-render.d.ts","sourceRoot":"","sources":["../../../src/cli/spec/docs-render.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AA2BjD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,GAAG,MAAM,CAsGnE"}
1
+ {"version":3,"file":"docs-render.d.ts","sourceRoot":"","sources":["../../../src/cli/spec/docs-render.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAmCjD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,GAAG,MAAM,CAsGnE"}
@@ -1,6 +1,13 @@
1
- function escInline(text) {
1
+ function escCode(text) {
2
2
  return text.replaceAll("`", "\\`");
3
3
  }
4
+ function escText(text) {
5
+ return text
6
+ .replaceAll("&", "&amp;")
7
+ .replaceAll("<", "&lt;")
8
+ .replaceAll(">", "&gt;")
9
+ .replaceAll("`", "\\`");
10
+ }
4
11
  function toAnchor(text) {
5
12
  return text
6
13
  .toLowerCase()
@@ -49,8 +56,8 @@ export function renderCliDocsMdx(specs) {
49
56
  const groupHeader = ["", `## ${group}`];
50
57
  const commandBlocks = specs.flatMap((s) => {
51
58
  const summaryLines = s.description
52
- ? ["", escInline(s.summary), "", escInline(s.description)]
53
- : ["", escInline(s.summary)];
59
+ ? ["", escText(s.summary), "", escText(s.description)]
60
+ : ["", escText(s.summary)];
54
61
  const usageLines = ["", "Usage:", "", "```text", ...(s.usage ?? []), "```"];
55
62
  const visibleOpts = (s.options ?? []).filter((o) => !o.hidden);
56
63
  const optionLines = visibleOpts.length === 0
@@ -73,11 +80,11 @@ export function renderCliDocsMdx(specs) {
73
80
  o.deprecated ? `deprecated=${o.deprecated}` : null,
74
81
  ].filter((x) => x !== null);
75
82
  const suffix = meta.length > 0 ? ` (${meta.join(", ")})` : "";
76
- return `- \`${escInline(head)}\`: ${escInline(o.description)}${escInline(suffix)}`;
83
+ return `- \`${escCode(head)}\`: ${escText(o.description)}${escText(suffix)}`;
77
84
  }),
78
85
  ];
79
86
  const notesLines = s.notes && s.notes.length > 0
80
- ? ["", "Notes:", "", ...s.notes.map((n) => `- ${escInline(n)}`)]
87
+ ? ["", "Notes:", "", ...s.notes.map((n) => `- ${escText(n)}`)]
81
88
  : [];
82
89
  const examplesLines = s.examples && s.examples.length > 0
83
90
  ? [
@@ -85,7 +92,7 @@ export function renderCliDocsMdx(specs) {
85
92
  "Examples:",
86
93
  "",
87
94
  ...s.examples.flatMap((ex) => {
88
- const why = ex.why ? [`- ${escInline(ex.why)}`] : [];
95
+ const why = ex.why ? [`- ${escText(ex.why)}`] : [];
89
96
  return ["```sh", ex.cmd, "```", ...why];
90
97
  }),
91
98
  ]
@@ -1,4 +1,4 @@
1
- import type { CommandCtx, CommandHandler, CommandSpec } from "../../cli/spec/spec.js";
1
+ import type { CommandCtx, CommandSpec } from "../../cli/spec/spec.js";
2
2
  import type { CommandContext } from "../shared/task-backend.js";
3
3
  import { type BackendSyncParsed } from "../backend.js";
4
4
  type BackendRootParsed = {
@@ -6,7 +6,8 @@ type BackendRootParsed = {
6
6
  };
7
7
  export declare const backendSpec: CommandSpec<BackendRootParsed>;
8
8
  export declare const backendSyncSpec: CommandSpec<BackendSyncParsed>;
9
- export declare function makeRunBackendHandler(getCtx: (cmd: string) => Promise<CommandContext>): CommandHandler<BackendRootParsed>;
9
+ declare function runBackendRootGroup(_ctx: CommandCtx, p: BackendRootParsed): Promise<number>;
10
+ export declare function makeRunBackendHandler(_getCtx: (cmd: string) => Promise<CommandContext>): typeof runBackendRootGroup;
10
11
  export declare function makeRunBackendSyncHandler(getCtx: (cmd: string) => Promise<CommandContext>): (ctx: CommandCtx, p: BackendSyncParsed) => Promise<number>;
11
12
  export {};
12
13
  //# sourceMappingURL=sync.command.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sync.command.d.ts","sourceRoot":"","sources":["../../../src/commands/backend/sync.command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAGtF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAwB,KAAK,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAE7E,KAAK,iBAAiB,GAAG;IAAE,GAAG,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAE3C,eAAO,MAAM,WAAW,EAAE,WAAW,CAAC,iBAAiB,CAQtD,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,WAAW,CAAC,iBAAiB,CAuC1D,CAAC;AAEF,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,qCAgBrF;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,IAC1E,KAAK,UAAU,EAAE,GAAG,iBAAiB,KAAG,OAAO,CAAC,MAAM,CAAC,CAStE"}
1
+ {"version":3,"file":"sync.command.d.ts","sourceRoot":"","sources":["../../../src/commands/backend/sync.command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAGtE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAwB,KAAK,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAE7E,KAAK,iBAAiB,GAAG;IAAE,GAAG,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAE3C,eAAO,MAAM,WAAW,EAAE,WAAW,CAAC,iBAAiB,CAQtD,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,WAAW,CAAC,iBAAiB,CAuC1D,CAAC;AAEF,iBAAS,mBAAmB,CAAC,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CAUpF;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,8BAEtF;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,IAC1E,KAAK,UAAU,EAAE,GAAG,iBAAiB,KAAG,OAAO,CAAC,MAAM,CAAC,CAStE"}
@@ -50,21 +50,19 @@ export const backendSyncSpec = {
50
50
  quiet: raw.opts.quiet === true,
51
51
  }),
52
52
  };
53
- export function makeRunBackendHandler(getCtx) {
54
- const handler = async (_ctx, p) => {
55
- // Resolve context once for consistent error mapping and approval gating.
56
- await getCtx("backend");
57
- const input = p.cmd.join(" ");
58
- const suggestion = suggestOne(input, ["sync"]);
59
- const suffix = suggestion ? ` Did you mean: ${suggestion}?` : "";
60
- const msg = p.cmd.length === 0 ? "Missing subcommand." : `Unknown subcommand: ${p.cmd[0]}.`;
61
- throw usageError({
62
- spec: backendSyncSpec,
63
- message: `${msg}${suffix}`,
64
- context: { command: "backend sync" },
65
- });
66
- };
67
- return handler;
53
+ function runBackendRootGroup(_ctx, p) {
54
+ const input = p.cmd.join(" ");
55
+ const suggestion = suggestOne(input, ["sync"]);
56
+ const suffix = suggestion ? ` Did you mean: ${suggestion}?` : "";
57
+ const msg = p.cmd.length === 0 ? "Missing subcommand." : `Unknown subcommand: ${p.cmd[0]}.`;
58
+ throw usageError({
59
+ spec: backendSyncSpec,
60
+ message: `${msg}${suffix}`,
61
+ context: { command: "backend sync" },
62
+ });
63
+ }
64
+ export function makeRunBackendHandler(_getCtx) {
65
+ return runBackendRootGroup;
68
66
  }
69
67
  export function makeRunBackendSyncHandler(getCtx) {
70
68
  return async (ctx, p) => {
@@ -1 +1 @@
1
- {"version":3,"file":"commit.command.d.ts","sourceRoot":"","sources":["../../src/commands/commit.command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAI/D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,IACrE,KAAK,UAAU,EAAE,GAAG,YAAY,KAAG,OAAO,CAAC,MAAM,CAAC,CAoBjE"}
1
+ {"version":3,"file":"commit.command.d.ts","sourceRoot":"","sources":["../../src/commands/commit.command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAI/D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,IACrE,KAAK,UAAU,EAAE,GAAG,YAAY,KAAG,OAAO,CAAC,MAAM,CAAC,CAsBjE"}
@@ -19,6 +19,8 @@ export function makeRunCommitHandler(getCtx) {
19
19
  allowCI: p.allowCI,
20
20
  requireClean: p.requireClean,
21
21
  quiet: p.quiet,
22
+ closeUnstageOthers: p.closeUnstageOthers,
23
+ closeCheckOnly: p.closeCheckOnly,
22
24
  });
23
25
  };
24
26
  }
@@ -13,6 +13,8 @@ export type CommitParsed = {
13
13
  allowCI: boolean;
14
14
  requireClean: boolean;
15
15
  quiet: boolean;
16
+ closeUnstageOthers: boolean;
17
+ closeCheckOnly: boolean;
16
18
  };
17
19
  export declare const commitSpec: CommandSpec<CommitParsed>;
18
20
  //# sourceMappingURL=commit.spec.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"commit.spec.d.ts","sourceRoot":"","sources":["../../src/commands/commit.spec.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGvD,MAAM,MAAM,YAAY,GAAG;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,OAAO,CAAC;IACtB,KAAK,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,WAAW,CAAC,YAAY,CAuHhD,CAAC"}
1
+ {"version":3,"file":"commit.spec.d.ts","sourceRoot":"","sources":["../../src/commands/commit.spec.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGvD,MAAM,MAAM,YAAY,GAAG;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,OAAO,CAAC;IACtB,KAAK,EAAE,OAAO,CAAC;IACf,kBAAkB,EAAE,OAAO,CAAC;IAC5B,cAAc,EAAE,OAAO,CAAC;CACzB,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,WAAW,CAAC,YAAY,CAmJhD,CAAC"}
@@ -18,6 +18,18 @@ export const commitSpec = {
18
18
  default: false,
19
19
  description: "Generate a deterministic close commit message from task snapshot + verification + recorded implementation commit; stages only the task README.",
20
20
  },
21
+ {
22
+ kind: "boolean",
23
+ name: "unstage-others",
24
+ default: false,
25
+ description: "With --close: unstage any currently staged paths before staging the task README.",
26
+ },
27
+ {
28
+ kind: "boolean",
29
+ name: "check-only",
30
+ default: false,
31
+ description: "With --close: run preflight checks and print the planned close commit subject without creating a commit.",
32
+ },
21
33
  {
22
34
  kind: "string",
23
35
  name: "allow",
@@ -92,6 +104,18 @@ export const commitSpec = {
92
104
  message: "Use either --message or --close (not both).",
93
105
  });
94
106
  }
107
+ if (!close && raw.opts["unstage-others"] === true) {
108
+ throw usageError({
109
+ spec: commitSpec,
110
+ message: "--unstage-others requires --close.",
111
+ });
112
+ }
113
+ if (!close && raw.opts["check-only"] === true) {
114
+ throw usageError({
115
+ spec: commitSpec,
116
+ message: "--check-only requires --close.",
117
+ });
118
+ }
95
119
  const allow = raw.opts.allow;
96
120
  if (Array.isArray(allow) && allow.some((s) => typeof s === "string" && s.trim() === "")) {
97
121
  throw usageError({ spec: commitSpec, message: "Invalid value for --allow: empty." });
@@ -115,5 +139,7 @@ export const commitSpec = {
115
139
  allowCI: raw.opts["allow-ci"] === true,
116
140
  requireClean: raw.opts["require-clean"] === true,
117
141
  quiet: raw.opts.quiet === true,
142
+ closeUnstageOthers: raw.opts["unstage-others"] === true,
143
+ closeCheckOnly: raw.opts["check-only"] === true,
118
144
  }),
119
145
  };
@@ -1 +1 @@
1
- {"version":3,"file":"doctor.run.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.run.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAI1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AA+OrD,eAAO,MAAM,SAAS,EAAE,cAAc,CAAC,YAAY,CAwBlD,CAAC"}
1
+ {"version":3,"file":"doctor.run.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.run.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAK1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAsPrD,eAAO,MAAM,SAAS,EAAE,cAAc,CAAC,YAAY,CAwBlD,CAAC"}
@@ -2,6 +2,7 @@ import fs from "node:fs/promises";
2
2
  import path from "node:path";
3
3
  import { resolveProject } from "@agentplaneorg/core";
4
4
  import { warnMessage, successMessage } from "../cli/output.js";
5
+ import { RUNTIME_GITIGNORE_LINES } from "../shared/runtime-artifacts.js";
5
6
  import { execFileAsync, gitEnv } from "./shared/git.js";
6
7
  import { loadCommandContext } from "./shared/task-backend.js";
7
8
  async function listTsFiles(rootDir) {
@@ -132,13 +133,21 @@ async function safeFixGitignore(repoRoot) {
132
133
  return { changed: false, note: "Skip: .gitignore not found." };
133
134
  }
134
135
  const lines = existing.split(/\r?\n/);
135
- const entry = ".agentplane/.upgrade/";
136
- if (lines.some((l) => l.trim() === entry)) {
137
- return { changed: false, note: "OK: .gitignore already ignores .agentplane/.upgrade/." };
138
- }
139
- const next = `${existing.trimEnd()}\n${entry}\n`;
136
+ const existingSet = new Set(lines.map((line) => line.trimEnd()));
137
+ const missing = RUNTIME_GITIGNORE_LINES.filter((line) => !existingSet.has(line));
138
+ if (missing.length === 0) {
139
+ return { changed: false, note: "OK: .gitignore already contains agentplane runtime ignores." };
140
+ }
141
+ const nextLines = [...lines];
142
+ if (nextLines.length > 0 && nextLines.at(-1) !== "")
143
+ nextLines.push("");
144
+ nextLines.push(...missing, "");
145
+ const next = `${nextLines.join("\n")}`.replaceAll(/\n{2,}$/g, "\n");
140
146
  await fs.writeFile(gitignorePath, next, "utf8");
141
- return { changed: true, note: "Fixed: added .agentplane/.upgrade/ to .gitignore." };
147
+ return {
148
+ changed: true,
149
+ note: `Fixed: added agentplane runtime ignores to .gitignore (${missing.length} lines).`,
150
+ };
142
151
  }
143
152
  async function safeFixTaskIndex(repoRoot) {
144
153
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"finish.run.d.ts","sourceRoot":"","sources":["../../src/commands/finish.run.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAG/D,OAAO,EAAc,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEjE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,IACrE,KAAK,UAAU,EAAE,GAAG,YAAY,KAAG,OAAO,CAAC,MAAM,CAAC,CAoCjE"}
1
+ {"version":3,"file":"finish.run.d.ts","sourceRoot":"","sources":["../../src/commands/finish.run.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAG/D,OAAO,EAAc,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEjE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,IACrE,KAAK,UAAU,EAAE,GAAG,YAAY,KAAG,OAAO,CAAC,MAAM,CAAC,CAsCjE"}
@@ -35,6 +35,8 @@ export function makeRunFinishHandler(getCtx) {
35
35
  statusCommitAutoAllow: p.statusCommitAutoAllow,
36
36
  statusCommitRequireClean: p.statusCommitRequireClean,
37
37
  confirmStatusCommit: p.confirmStatusCommit,
38
+ closeCommit: p.closeCommit,
39
+ closeUnstageOthers: p.closeUnstageOthers,
38
40
  quiet: p.quiet,
39
41
  });
40
42
  };
@@ -21,6 +21,8 @@ export type FinishParsed = {
21
21
  statusCommitAutoAllow: boolean;
22
22
  statusCommitRequireClean: boolean;
23
23
  confirmStatusCommit: boolean;
24
+ closeCommit: boolean;
25
+ closeUnstageOthers: boolean;
24
26
  quiet: boolean;
25
27
  };
26
28
  export declare const finishSpec: CommandSpec<FinishParsed>;
@@ -1 +1 @@
1
- {"version":3,"file":"finish.spec.d.ts","sourceRoot":"","sources":["../../src/commands/finish.spec.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAKvD,MAAM,MAAM,YAAY,GAAG;IACzB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC;IAC9B,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;IACf,GAAG,EAAE,OAAO,CAAC;IACb,iBAAiB,EAAE,OAAO,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,eAAe,EAAE,OAAO,CAAC;IACzB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,YAAY,EAAE,OAAO,CAAC;IACtB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,qBAAqB,EAAE,OAAO,CAAC;IAC/B,wBAAwB,EAAE,OAAO,CAAC;IAClC,mBAAmB,EAAE,OAAO,CAAC;IAC7B,KAAK,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,WAAW,CAAC,YAAY,CA6MhD,CAAC"}
1
+ {"version":3,"file":"finish.spec.d.ts","sourceRoot":"","sources":["../../src/commands/finish.spec.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAKvD,MAAM,MAAM,YAAY,GAAG;IACzB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC;IAC9B,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;IACf,GAAG,EAAE,OAAO,CAAC;IACb,iBAAiB,EAAE,OAAO,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,eAAe,EAAE,OAAO,CAAC;IACzB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,YAAY,EAAE,OAAO,CAAC;IACtB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,qBAAqB,EAAE,OAAO,CAAC;IAC/B,wBAAwB,EAAE,OAAO,CAAC;IAClC,mBAAmB,EAAE,OAAO,CAAC;IAC7B,WAAW,EAAE,OAAO,CAAC;IACrB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,KAAK,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,WAAW,CAAC,YAAY,CAqPhD,CAAC"}