agentplane 0.3.5 → 0.3.6

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 (187) hide show
  1. package/README.md +103 -75
  2. package/assets/AGENTS.md +4 -2
  3. package/bin/dist-guard.js +13 -3
  4. package/bin/runtime-watch.d.ts +1 -0
  5. package/bin/runtime-watch.js +22 -5
  6. package/bin/stale-dist-policy.js +9 -2
  7. package/dist/.build-manifest.json +196 -776
  8. package/dist/backends/task-backend.test-helpers.d.ts +4 -0
  9. package/dist/backends/task-backend.test-helpers.d.ts.map +1 -0
  10. package/dist/backends/task-backend.test-helpers.js +33 -0
  11. package/dist/cli/bootstrap-guide.d.ts.map +1 -1
  12. package/dist/cli/bootstrap-guide.js +1 -0
  13. package/dist/cli/command-guide.d.ts.map +1 -1
  14. package/dist/cli/command-guide.js +3 -2
  15. package/dist/cli/reason-codes.d.ts.map +1 -1
  16. package/dist/cli/reason-codes.js +30 -0
  17. package/dist/cli/run-cli/command-catalog/core.d.ts +3 -0
  18. package/dist/cli/run-cli/command-catalog/core.d.ts.map +1 -0
  19. package/dist/cli/run-cli/command-catalog/core.js +137 -0
  20. package/dist/cli/run-cli/command-catalog/lifecycle.d.ts +3 -0
  21. package/dist/cli/run-cli/command-catalog/lifecycle.d.ts.map +1 -0
  22. package/dist/cli/run-cli/command-catalog/lifecycle.js +52 -0
  23. package/dist/cli/run-cli/command-catalog/project.d.ts +3 -0
  24. package/dist/cli/run-cli/command-catalog/project.d.ts.map +1 -0
  25. package/dist/cli/run-cli/command-catalog/project.js +78 -0
  26. package/dist/cli/run-cli/command-catalog/shared.d.ts +19 -0
  27. package/dist/cli/run-cli/command-catalog/shared.d.ts.map +1 -0
  28. package/dist/cli/run-cli/command-catalog/shared.js +9 -0
  29. package/dist/cli/run-cli/command-catalog/task.d.ts +3 -0
  30. package/dist/cli/run-cli/command-catalog/task.d.ts.map +1 -0
  31. package/dist/cli/run-cli/command-catalog/task.js +85 -0
  32. package/dist/cli/run-cli/command-catalog.d.ts +3 -18
  33. package/dist/cli/run-cli/command-catalog.d.ts.map +1 -1
  34. package/dist/cli/run-cli/command-catalog.js +8 -337
  35. package/dist/cli/run-cli/commands/ide.d.ts.map +1 -1
  36. package/dist/cli/run-cli/commands/ide.js +64 -2
  37. package/dist/cli/run-cli/commands/init/ui.d.ts.map +1 -1
  38. package/dist/cli/run-cli/commands/init/ui.js +33 -13
  39. package/dist/cli/run-cli.core.pr-flow.test-helpers.d.ts +3 -0
  40. package/dist/cli/run-cli.core.pr-flow.test-helpers.d.ts.map +1 -0
  41. package/dist/cli/run-cli.core.pr-flow.test-helpers.js +41 -0
  42. package/dist/cli/run-cli.core.tasks.test-helpers.d.ts +2 -0
  43. package/dist/cli/run-cli.core.tasks.test-helpers.d.ts.map +1 -0
  44. package/dist/cli/run-cli.core.tasks.test-helpers.js +6 -0
  45. package/dist/cli/run-cli.test-helpers.d.ts +3 -0
  46. package/dist/cli/run-cli.test-helpers.d.ts.map +1 -1
  47. package/dist/cli/run-cli.test-helpers.js +138 -6
  48. package/dist/commands/commit.spec.d.ts.map +1 -1
  49. package/dist/commands/commit.spec.js +2 -2
  50. package/dist/commands/doctor/runtime.d.ts.map +1 -1
  51. package/dist/commands/doctor/runtime.js +3 -6
  52. package/dist/commands/guard/commit.command.js +1 -1
  53. package/dist/commands/guard/impl/allow.d.ts +5 -0
  54. package/dist/commands/guard/impl/allow.d.ts.map +1 -1
  55. package/dist/commands/guard/impl/allow.js +15 -10
  56. package/dist/commands/guard/impl/commands.d.ts.map +1 -1
  57. package/dist/commands/guard/impl/commands.js +137 -18
  58. package/dist/commands/guard/impl/comment-commit.d.ts.map +1 -1
  59. package/dist/commands/guard/impl/comment-commit.js +2 -0
  60. package/dist/commands/hooks/index.d.ts.map +1 -1
  61. package/dist/commands/hooks/index.js +8 -35
  62. package/dist/commands/recipes/impl/apply.d.ts +4 -0
  63. package/dist/commands/recipes/impl/apply.d.ts.map +1 -1
  64. package/dist/commands/recipes/impl/apply.js +34 -0
  65. package/dist/commands/recipes/impl/commands/explain.d.ts.map +1 -1
  66. package/dist/commands/recipes/impl/commands/explain.js +70 -11
  67. package/dist/commands/recipes/impl/commands/info.d.ts.map +1 -1
  68. package/dist/commands/recipes/impl/commands/info.js +24 -12
  69. package/dist/commands/recipes/impl/commands/install.d.ts.map +1 -1
  70. package/dist/commands/recipes/impl/commands/install.js +32 -36
  71. package/dist/commands/recipes/impl/commands/list.d.ts.map +1 -1
  72. package/dist/commands/recipes/impl/commands/list.js +7 -4
  73. package/dist/commands/recipes/impl/commands/remove.d.ts.map +1 -1
  74. package/dist/commands/recipes/impl/commands/remove.js +9 -11
  75. package/dist/commands/recipes/impl/constants.d.ts +2 -0
  76. package/dist/commands/recipes/impl/constants.d.ts.map +1 -1
  77. package/dist/commands/recipes/impl/constants.js +2 -0
  78. package/dist/commands/recipes/impl/manifest.d.ts.map +1 -1
  79. package/dist/commands/recipes/impl/manifest.js +219 -23
  80. package/dist/commands/recipes/impl/normalize.d.ts +3 -0
  81. package/dist/commands/recipes/impl/normalize.d.ts.map +1 -1
  82. package/dist/commands/recipes/impl/normalize.js +28 -24
  83. package/dist/commands/recipes/impl/paths.d.ts +9 -0
  84. package/dist/commands/recipes/impl/paths.d.ts.map +1 -1
  85. package/dist/commands/recipes/impl/paths.js +10 -1
  86. package/dist/commands/recipes/impl/project-installed-recipes.d.ts +7 -0
  87. package/dist/commands/recipes/impl/project-installed-recipes.d.ts.map +1 -0
  88. package/dist/commands/recipes/impl/project-installed-recipes.js +102 -0
  89. package/dist/commands/recipes/impl/resolver.d.ts +20 -0
  90. package/dist/commands/recipes/impl/resolver.d.ts.map +1 -0
  91. package/dist/commands/recipes/impl/resolver.js +220 -0
  92. package/dist/commands/recipes/impl/scenario.d.ts.map +1 -1
  93. package/dist/commands/recipes/impl/scenario.js +40 -11
  94. package/dist/commands/recipes/impl/types.d.ts +145 -16
  95. package/dist/commands/recipes/impl/types.d.ts.map +1 -1
  96. package/dist/commands/recipes/install.spec.d.ts.map +1 -1
  97. package/dist/commands/recipes/install.spec.js +3 -2
  98. package/dist/commands/recipes.d.ts +6 -4
  99. package/dist/commands/recipes.d.ts.map +1 -1
  100. package/dist/commands/recipes.js +5 -3
  101. package/dist/commands/recipes.test-helpers.d.ts +185 -0
  102. package/dist/commands/recipes.test-helpers.d.ts.map +1 -0
  103. package/dist/commands/recipes.test-helpers.js +339 -0
  104. package/dist/commands/scenario/impl/commands.d.ts.map +1 -1
  105. package/dist/commands/scenario/impl/commands.js +192 -336
  106. package/dist/commands/scenario/info.command.d.ts.map +1 -1
  107. package/dist/commands/scenario/info.command.js +7 -2
  108. package/dist/commands/scenario/list.command.js +2 -2
  109. package/dist/commands/scenario/run.command.d.ts.map +1 -1
  110. package/dist/commands/scenario/run.command.js +7 -2
  111. package/dist/commands/shared/reconcile-check.d.ts.map +1 -1
  112. package/dist/commands/shared/reconcile-check.js +77 -2
  113. package/dist/commands/shared/task-store.d.ts +32 -1
  114. package/dist/commands/shared/task-store.d.ts.map +1 -1
  115. package/dist/commands/shared/task-store.js +166 -42
  116. package/dist/commands/task/block.d.ts.map +1 -1
  117. package/dist/commands/task/block.js +46 -29
  118. package/dist/commands/task/close-duplicate.d.ts.map +1 -1
  119. package/dist/commands/task/close-duplicate.js +12 -37
  120. package/dist/commands/task/close-noop.d.ts.map +1 -1
  121. package/dist/commands/task/close-noop.js +12 -30
  122. package/dist/commands/task/close-shared.d.ts +14 -0
  123. package/dist/commands/task/close-shared.d.ts.map +1 -0
  124. package/dist/commands/task/close-shared.js +76 -0
  125. package/dist/commands/task/comment.d.ts.map +1 -1
  126. package/dist/commands/task/comment.js +35 -17
  127. package/dist/commands/task/doc-set.command.d.ts +2 -1
  128. package/dist/commands/task/doc-set.command.d.ts.map +1 -1
  129. package/dist/commands/task/doc-set.command.js +36 -4
  130. package/dist/commands/task/doc-template.d.ts.map +1 -1
  131. package/dist/commands/task/doc-template.js +2 -7
  132. package/dist/commands/task/doc.command.js +1 -1
  133. package/dist/commands/task/doc.d.ts +2 -1
  134. package/dist/commands/task/doc.d.ts.map +1 -1
  135. package/dist/commands/task/doc.js +123 -71
  136. package/dist/commands/task/finish.d.ts.map +1 -1
  137. package/dist/commands/task/finish.js +138 -76
  138. package/dist/commands/task/migrate-doc.d.ts.map +1 -1
  139. package/dist/commands/task/migrate-doc.js +2 -8
  140. package/dist/commands/task/plan-set.command.js +1 -1
  141. package/dist/commands/task/plan.command.d.ts +8 -0
  142. package/dist/commands/task/plan.command.d.ts.map +1 -0
  143. package/dist/commands/task/plan.command.js +37 -0
  144. package/dist/commands/task/plan.d.ts.map +1 -1
  145. package/dist/commands/task/plan.js +190 -93
  146. package/dist/commands/task/set-status.command.d.ts.map +1 -1
  147. package/dist/commands/task/set-status.command.js +1 -1
  148. package/dist/commands/task/set-status.d.ts.map +1 -1
  149. package/dist/commands/task/set-status.js +40 -3
  150. package/dist/commands/task/shared/docs.d.ts +1 -0
  151. package/dist/commands/task/shared/docs.d.ts.map +1 -1
  152. package/dist/commands/task/shared/docs.js +7 -0
  153. package/dist/commands/task/shared/transitions.d.ts +0 -2
  154. package/dist/commands/task/shared/transitions.d.ts.map +1 -1
  155. package/dist/commands/task/shared/transitions.js +0 -6
  156. package/dist/commands/task/shared.d.ts +2 -2
  157. package/dist/commands/task/shared.d.ts.map +1 -1
  158. package/dist/commands/task/shared.js +2 -2
  159. package/dist/commands/task/start.d.ts.map +1 -1
  160. package/dist/commands/task/start.js +88 -63
  161. package/dist/commands/task/task.command.d.ts +8 -0
  162. package/dist/commands/task/task.command.d.ts.map +1 -0
  163. package/dist/commands/task/task.command.js +71 -0
  164. package/dist/commands/task/verify-command-shared.d.ts +16 -0
  165. package/dist/commands/task/verify-command-shared.d.ts.map +1 -0
  166. package/dist/commands/task/verify-command-shared.js +53 -0
  167. package/dist/commands/task/verify-ok.command.d.ts +2 -6
  168. package/dist/commands/task/verify-ok.command.d.ts.map +1 -1
  169. package/dist/commands/task/verify-ok.command.js +8 -50
  170. package/dist/commands/task/verify-record.d.ts.map +1 -1
  171. package/dist/commands/task/verify-record.js +119 -140
  172. package/dist/commands/task/verify-rework.command.d.ts +2 -6
  173. package/dist/commands/task/verify-rework.command.d.ts.map +1 -1
  174. package/dist/commands/task/verify-rework.command.js +8 -50
  175. package/dist/commands/verify.spec.d.ts.map +1 -1
  176. package/dist/commands/verify.spec.js +3 -12
  177. package/dist/policy/rules/allowlist.d.ts.map +1 -1
  178. package/dist/policy/rules/allowlist.js +13 -4
  179. package/dist/policy/rules/protected-paths.d.ts.map +1 -1
  180. package/dist/policy/rules/protected-paths.js +6 -1
  181. package/dist/shared/agent-emoji.d.ts.map +1 -1
  182. package/dist/shared/protected-paths.d.ts +7 -0
  183. package/dist/shared/protected-paths.d.ts.map +1 -1
  184. package/dist/shared/protected-paths.js +26 -10
  185. package/dist/shared/repo-cli-version.d.ts.map +1 -1
  186. package/dist/shared/repo-cli-version.js +9 -3
  187. package/package.json +2 -2
@@ -0,0 +1,14 @@
1
+ import { type TaskData } from "../../backends/task-backend.js";
2
+ import { type CommandContext } from "../shared/task-backend.js";
3
+ export declare function recordVerifiedNoopClosure(opts: {
4
+ ctx: CommandContext;
5
+ task: TaskData;
6
+ taskId: string;
7
+ author: string;
8
+ body: string;
9
+ resultSummary: string;
10
+ quiet: boolean;
11
+ successMessage: string;
12
+ force: boolean;
13
+ }): Promise<void>;
14
+ //# sourceMappingURL=close-shared.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"close-shared.d.ts","sourceRoot":"","sources":["../../../src/commands/task/close-shared.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAE/D,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAShE,wBAAsB,yBAAyB,CAAC,IAAI,EAAE;IACpD,GAAG,EAAE,cAAc,CAAC;IACpB,IAAI,EAAE,QAAQ,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,OAAO,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,OAAO,CAAC;CAChB,GAAG,OAAO,CAAC,IAAI,CAAC,CA2EhB"}
@@ -0,0 +1,76 @@
1
+ import { CliError } from "../../shared/errors.js";
2
+ import { backendIsLocalFileBackend, getTaskStore } from "../shared/task-store.js";
3
+ import { appendTaskEvent, normalizeTaskDocVersion, nowIso, requireStructuredComment, } from "./shared.js";
4
+ export async function recordVerifiedNoopClosure(opts) {
5
+ if (!opts.force && String(opts.task.status || "TODO").toUpperCase() === "DONE") {
6
+ throw new CliError({
7
+ exitCode: 2,
8
+ code: "E_USAGE",
9
+ message: `Task is already DONE: ${opts.taskId} (use --force to override)`,
10
+ });
11
+ }
12
+ const verifiedCfg = opts.ctx.config.tasks.comments.verified;
13
+ requireStructuredComment(opts.body, verifiedCfg.prefix, verifiedCfg.min_chars);
14
+ const at = nowIso();
15
+ const useStore = backendIsLocalFileBackend(opts.ctx);
16
+ const store = useStore ? getTaskStore(opts.ctx) : null;
17
+ await (useStore
18
+ ? store.patch(opts.taskId, (current) => {
19
+ if (!opts.force && String(current.status || "TODO").toUpperCase() === "DONE") {
20
+ throw new CliError({
21
+ exitCode: 2,
22
+ code: "E_USAGE",
23
+ message: `Task is already DONE: ${opts.taskId} (use --force to override)`,
24
+ });
25
+ }
26
+ return {
27
+ task: {
28
+ status: "DONE",
29
+ result_summary: opts.resultSummary,
30
+ risk_level: "low",
31
+ breaking: false,
32
+ },
33
+ appendComments: [{ author: opts.author, body: opts.body }],
34
+ appendEvents: [
35
+ {
36
+ type: "status",
37
+ at,
38
+ author: opts.author,
39
+ from: String(current.status || "TODO").toUpperCase(),
40
+ to: "DONE",
41
+ note: opts.body,
42
+ },
43
+ ],
44
+ docMeta: {
45
+ touch: true,
46
+ updatedBy: opts.author,
47
+ version: normalizeTaskDocVersion(current.doc_version),
48
+ },
49
+ };
50
+ })
51
+ : opts.ctx.taskBackend.writeTask({
52
+ ...opts.task,
53
+ status: "DONE",
54
+ comments: [
55
+ ...(Array.isArray(opts.task.comments) ? opts.task.comments : []),
56
+ { author: opts.author, body: opts.body },
57
+ ],
58
+ events: appendTaskEvent(opts.task, {
59
+ type: "status",
60
+ at,
61
+ author: opts.author,
62
+ from: String(opts.task.status || "TODO").toUpperCase(),
63
+ to: "DONE",
64
+ note: opts.body,
65
+ }),
66
+ result_summary: opts.resultSummary,
67
+ risk_level: "low",
68
+ breaking: false,
69
+ doc_version: normalizeTaskDocVersion(opts.task.doc_version),
70
+ doc_updated_at: at,
71
+ doc_updated_by: opts.author,
72
+ }));
73
+ if (!opts.quiet) {
74
+ process.stdout.write(`${opts.successMessage}\n`);
75
+ }
76
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"comment.d.ts","sourceRoot":"","sources":["../../../src/commands/task/comment.ts"],"names":[],"mappings":"AAIA,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,2BAA2B,CAAC;AAInC,wBAAsB,cAAc,CAAC,IAAI,EAAE;IACzC,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd,GAAG,OAAO,CAAC,MAAM,CAAC,CAoClB"}
1
+ {"version":3,"file":"comment.d.ts","sourceRoot":"","sources":["../../../src/commands/task/comment.ts"],"names":[],"mappings":"AAGA,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,2BAA2B,CAAC;AAInC,wBAAsB,cAAc,CAAC,IAAI,EAAE;IACzC,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd,GAAG,OAAO,CAAC,MAAM,CAAC,CAsDlB"}
@@ -12,24 +12,42 @@ export async function cmdTaskComment(opts) {
12
12
  const task = useStore
13
13
  ? await store.get(opts.taskId)
14
14
  : await loadTaskFromContext({ ctx, taskId: opts.taskId });
15
- const existing = Array.isArray(task.comments)
16
- ? task.comments.filter((item) => !!item && typeof item.author === "string" && typeof item.body === "string")
17
- : [];
18
15
  const at = nowIso();
19
- const next = {
20
- ...task,
21
- comments: [...existing, { author: opts.author, body: opts.body }],
22
- events: appendTaskEvent(task, {
23
- type: "comment",
24
- at,
25
- author: opts.author,
26
- body: opts.body,
27
- }),
28
- doc_version: normalizeTaskDocVersion(task.doc_version),
29
- doc_updated_at: at,
30
- doc_updated_by: opts.author,
31
- };
32
- await (useStore ? store.update(opts.taskId, () => next) : ctx.taskBackend.writeTask(next));
16
+ await (useStore
17
+ ? store.patch(opts.taskId, () => ({
18
+ appendComments: [{ author: opts.author, body: opts.body }],
19
+ appendEvents: [
20
+ {
21
+ type: "comment",
22
+ at,
23
+ author: opts.author,
24
+ body: opts.body,
25
+ },
26
+ ],
27
+ docMeta: {
28
+ touch: true,
29
+ updatedBy: opts.author,
30
+ version: normalizeTaskDocVersion(task.doc_version),
31
+ },
32
+ }))
33
+ : ctx.taskBackend.writeTask({
34
+ ...task,
35
+ comments: [
36
+ ...(Array.isArray(task.comments)
37
+ ? task.comments.filter((item) => !!item && typeof item.author === "string" && typeof item.body === "string")
38
+ : []),
39
+ { author: opts.author, body: opts.body },
40
+ ],
41
+ events: appendTaskEvent(task, {
42
+ type: "comment",
43
+ at,
44
+ author: opts.author,
45
+ body: opts.body,
46
+ }),
47
+ doc_version: normalizeTaskDocVersion(task.doc_version),
48
+ doc_updated_at: at,
49
+ doc_updated_by: opts.author,
50
+ }));
33
51
  process.stdout.write(`${successMessage("commented", opts.taskId)}\n`);
34
52
  return 0;
35
53
  }
@@ -2,10 +2,11 @@ import type { CommandCtx, CommandSpec } from "../../cli/spec/spec.js";
2
2
  import type { CommandContext } from "../shared/task-backend.js";
3
3
  export type TaskDocSetParsed = {
4
4
  taskId: string;
5
- section: string;
5
+ section?: string;
6
6
  text?: string;
7
7
  file?: string;
8
8
  updatedBy?: string;
9
+ fullDoc: boolean;
9
10
  };
10
11
  export declare const taskDocSetSpec: CommandSpec<TaskDocSetParsed>;
11
12
  export declare function makeRunTaskDocSetHandler(getCtx: (cmd: string) => Promise<CommandContext>): (ctx: CommandCtx, p: TaskDocSetParsed) => Promise<number>;
@@ -1 +1 @@
1
- {"version":3,"file":"doc-set.command.d.ts","sourceRoot":"","sources":["../../../src/commands/task/doc-set.command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAEtE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAIhE,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,WAAW,CAAC,gBAAgB,CAiExD,CAAC;AAEF,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,IACzE,KAAK,UAAU,EAAE,GAAG,gBAAgB,KAAG,OAAO,CAAC,MAAM,CAAC,CAYrE"}
1
+ {"version":3,"file":"doc-set.command.d.ts","sourceRoot":"","sources":["../../../src/commands/task/doc-set.command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAEtE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAIhE,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,WAAW,CAAC,gBAAgB,CAiGxD,CAAC;AAEF,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,IACzE,KAAK,UAAU,EAAE,GAAG,gBAAgB,KAAG,OAAO,CAAC,MAAM,CAAC,CAarE"}
@@ -4,20 +4,29 @@ export const taskDocSetSpec = {
4
4
  id: ["task", "doc", "set"],
5
5
  group: "Task",
6
6
  summary: "Update a task README section.",
7
+ synopsis: [
8
+ "agentplane task doc set <task-id> --section <name> (--text <text> | --file <path>) [--updated-by <id>]",
9
+ "agentplane task doc set <task-id> --full-doc (--text <text> | --file <path>) [--updated-by <id>]",
10
+ ],
7
11
  args: [{ name: "task-id", required: true, valueHint: "<task-id>" }],
8
12
  options: [
9
13
  {
10
14
  kind: "string",
11
15
  name: "section",
12
16
  valueHint: "<name>",
13
- required: true,
14
- description: "Target section heading (must be one of config.tasks.doc.sections).",
17
+ description: "Target section heading (must be one of config.tasks.doc.sections). Required unless --full-doc is set.",
18
+ },
19
+ {
20
+ kind: "boolean",
21
+ name: "full-doc",
22
+ default: false,
23
+ description: "Treat the provided text/file as the full task README payload.",
15
24
  },
16
25
  {
17
26
  kind: "string",
18
27
  name: "text",
19
28
  valueHint: "<text>",
20
- description: "Section content (mutually exclusive with --file).",
29
+ description: String.raw `Section content (mutually exclusive with --file). Literal escaped newlines (\n) are normalized for inline text.`,
21
30
  },
22
31
  {
23
32
  kind: "string",
@@ -41,8 +50,29 @@ export const taskDocSetSpec = {
41
50
  cmd: "agentplane task doc set 202602030608-F1Q8AB --section Plan --file ./plan.md",
42
51
  why: "Update one section using a file.",
43
52
  },
53
+ {
54
+ cmd: "agentplane task doc set 202602030608-F1Q8AB --full-doc --file ./task-readme.md",
55
+ why: "Replace the full task README payload explicitly.",
56
+ },
44
57
  ],
45
58
  validateRaw: (raw) => {
59
+ const fullDoc = raw.opts["full-doc"] === true;
60
+ const section = typeof raw.opts.section === "string" ? raw.opts.section.trim() : "";
61
+ if (fullDoc && section) {
62
+ throw usageError({
63
+ spec: taskDocSetSpec,
64
+ message: "Use either --section or --full-doc (not both).",
65
+ });
66
+ }
67
+ if (!fullDoc && !section) {
68
+ throw usageError({
69
+ spec: taskDocSetSpec,
70
+ message: "Missing required option: --section (or pass --full-doc).",
71
+ });
72
+ }
73
+ if (typeof raw.opts.section === "string" && section === "") {
74
+ throw usageError({ spec: taskDocSetSpec, message: "Invalid value for --section: empty." });
75
+ }
46
76
  const hasText = typeof raw.opts.text === "string";
47
77
  const hasFile = typeof raw.opts.file === "string";
48
78
  if (hasText === hasFile) {
@@ -59,10 +89,11 @@ export const taskDocSetSpec = {
59
89
  parse: (raw) => {
60
90
  return {
61
91
  taskId: String(raw.args["task-id"]),
62
- section: String(raw.opts.section),
92
+ section: typeof raw.opts.section === "string" ? raw.opts.section : undefined,
63
93
  text: typeof raw.opts.text === "string" ? raw.opts.text : undefined,
64
94
  file: typeof raw.opts.file === "string" ? raw.opts.file : undefined,
65
95
  updatedBy: typeof raw.opts["updated-by"] === "string" ? raw.opts["updated-by"] : undefined,
96
+ fullDoc: raw.opts["full-doc"] === true,
66
97
  };
67
98
  },
68
99
  };
@@ -77,6 +108,7 @@ export function makeRunTaskDocSetHandler(getCtx) {
77
108
  text: p.text,
78
109
  file: p.file,
79
110
  updatedBy: p.updatedBy,
111
+ fullDoc: p.fullDoc,
80
112
  });
81
113
  };
82
114
  }
@@ -1 +1 @@
1
- {"version":3,"file":"doc-template.d.ts","sourceRoot":"","sources":["../../../src/commands/task/doc-template.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,mBAAmB,IAAI,CAAC;AAkErC,wBAAgB,gBAAgB,CAAC,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAkCrF;AAED,wBAAgB,8BAA8B,CAAC,IAAI,EAAE;IACnD,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B,GAAG,MAAM,CA2BT"}
1
+ {"version":3,"file":"doc-template.d.ts","sourceRoot":"","sources":["../../../src/commands/task/doc-template.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,mBAAmB,IAAI,CAAC;AA2DrC,wBAAgB,gBAAgB,CAAC,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAkCrF;AAED,wBAAgB,8BAA8B,CAAC,IAAI,EAAE;IACnD,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B,GAAG,MAAM,CA2BT"}
@@ -1,13 +1,8 @@
1
1
  import { setMarkdownSection } from "@agentplaneorg/core";
2
+ import { decodeEscapedTaskTextNewlines } from "./shared/docs.js";
2
3
  export const TASK_DOC_VERSION_V3 = 3;
3
4
  function normalizeTaskHumanText(text) {
4
- let next = text.replaceAll("\r\n", "\n");
5
- const escapedDoubleNewline = next.includes(String.raw `\n\n`) || next.includes(String.raw `\r\n\r\n`);
6
- const escapedNewlineMatches = next.match(/\\n/g) ?? [];
7
- if (escapedDoubleNewline || escapedNewlineMatches.length >= 2) {
8
- next = next.replaceAll(String.raw `\r\n`, "\n").replaceAll(String.raw `\n`, "\n");
9
- }
10
- return next.trim();
5
+ return decodeEscapedTaskTextNewlines(text).trim();
11
6
  }
12
7
  function normalizeTaskHumanInlineText(text) {
13
8
  return normalizeTaskHumanText(text)
@@ -6,7 +6,7 @@ export const taskDocSpec = {
6
6
  synopsis: [
7
7
  "agentplane task doc show <task-id> [--section <name>] [--quiet]",
8
8
  "agentplane task doc set <task-id> --section <name> (--text <text> | --file <path>) [--updated-by <id>]",
9
- "agentplane task doc set <task-id> --section Summary --file ./task-readme.md # if payload contains multiple known ## headings, apply as full-doc update",
9
+ "agentplane task doc set <task-id> --full-doc (--text <text> | --file <path>) [--updated-by <id>]",
10
10
  ],
11
11
  args: [{ name: "subcommand", required: false, valueHint: "<show|set>" }],
12
12
  parse: (raw) => {
@@ -4,10 +4,11 @@ export declare function cmdTaskDocSet(opts: {
4
4
  cwd: string;
5
5
  rootOverride?: string;
6
6
  taskId: string;
7
- section: string;
7
+ section?: string;
8
8
  text?: string;
9
9
  file?: string;
10
10
  updatedBy?: string;
11
+ fullDoc: boolean;
11
12
  }): Promise<number>;
12
13
  export declare function cmdTaskDocShow(opts: {
13
14
  ctx?: CommandContext;
@@ -1 +1 @@
1
- {"version":3,"file":"doc.d.ts","sourceRoot":"","sources":["../../../src/commands/task/doc.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAsB,KAAK,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAmBpF,wBAAsB,aAAa,CAAC,IAAI,EAAE;IACxC,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC,MAAM,CAAC,CA2IlB;AAED,wBAAsB,cAAc,CAAC,IAAI,EAAE;IACzC,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;CAChB,GAAG,OAAO,CAAC,MAAM,CAAC,CA4ClB"}
1
+ {"version":3,"file":"doc.d.ts","sourceRoot":"","sources":["../../../src/commands/task/doc.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAsB,KAAK,cAAc,EAAE,MAAM,2BAA2B,CAAC;AA6CpF,wBAAsB,aAAa,CAAC,IAAI,EAAE;IACxC,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;CAClB,GAAG,OAAO,CAAC,MAAM,CAAC,CAgLlB;AAED,wBAAsB,cAAc,CAAC,IAAI,EAAE;IACzC,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;CAChB,GAAG,OAAO,CAAC,MAAM,CAAC,CA4ClB"}
@@ -1,24 +1,36 @@
1
1
  import { readFile } from "node:fs/promises";
2
2
  import path from "node:path";
3
- import { ensureDocSections, normalizeDocSectionName, parseDocSections, setMarkdownSection, } from "@agentplaneorg/core";
3
+ import { ensureDocSections, normalizeDocSectionName, normalizeTaskDoc, parseDocSections, setMarkdownSection, } from "@agentplaneorg/core";
4
4
  import { mapBackendError, mapCoreError } from "../../cli/error-map.js";
5
5
  import { infoMessage, unknownEntityMessage, backendNotSupportedMessage, warnMessage, } from "../../cli/output.js";
6
6
  import { CliError } from "../../shared/errors.js";
7
7
  import { loadCommandContext } from "../shared/task-backend.js";
8
8
  import { backendIsLocalFileBackend, getTaskStore } from "../shared/task-store.js";
9
- function normalizeOutcomeText(value) {
10
- return value
11
- .replaceAll("\r\n", "\n")
12
- .split("\n")
13
- .map((line) => line.trimEnd())
14
- .join("\n")
15
- .trim();
16
- }
17
- function readSectionContent(doc, section) {
18
- const sectionKey = normalizeDocSectionName(section);
9
+ import { decodeEscapedTaskTextNewlines } from "./shared.js";
10
+ function extractSectionTextForPatch(doc, section) {
19
11
  const { sections } = parseDocSections(doc);
20
- const lines = sections.get(sectionKey)?.lines ?? [];
21
- return normalizeOutcomeText(lines.join("\n"));
12
+ const entry = sections.get(normalizeDocSectionName(section));
13
+ return entry ? entry.lines.join("\n").trimEnd() : null;
14
+ }
15
+ function buildUpdatedTaskDoc(opts) {
16
+ const baseDoc = ensureDocSections(opts.baseDocRaw, opts.requiredSections);
17
+ if (opts.requestMode === "full-doc") {
18
+ return ensureDocSections(opts.text, opts.requiredSections);
19
+ }
20
+ let nextText = opts.text;
21
+ if (opts.headingKeys.size > 0 && opts.headingKeys.has(opts.targetKey)) {
22
+ const lines = nextText.replaceAll("\r\n", "\n").split("\n");
23
+ let firstContent = 0;
24
+ while (firstContent < lines.length && lines[firstContent]?.trim() === "")
25
+ firstContent++;
26
+ if ((lines[firstContent]?.trim() ?? "") === `## ${opts.section}`) {
27
+ lines.splice(firstContent, 1);
28
+ if (lines[firstContent]?.trim() === "")
29
+ lines.splice(firstContent, 1);
30
+ nextText = lines.join("\n");
31
+ }
32
+ }
33
+ return ensureDocSections(setMarkdownSection(baseDoc, opts.section ?? "", nextText), opts.requiredSections);
22
34
  }
23
35
  export async function cmdTaskDocSet(opts) {
24
36
  let updatedBy;
@@ -43,6 +55,9 @@ export async function cmdTaskDocSet(opts) {
43
55
  });
44
56
  }
45
57
  let text = opts.text ?? "";
58
+ if (hasText) {
59
+ text = decodeEscapedTaskTextNewlines(text);
60
+ }
46
61
  if (hasFile) {
47
62
  try {
48
63
  text = await readFile(path.resolve(opts.cwd, opts.file ?? ""), "utf8");
@@ -67,15 +82,29 @@ export async function cmdTaskDocSet(opts) {
67
82
  const useStore = backendIsLocalFileBackend(ctx);
68
83
  const store = useStore ? getTaskStore(ctx) : null;
69
84
  const allowed = config.tasks.doc.sections;
70
- if (!allowed.includes(opts.section)) {
85
+ if (!opts.fullDoc && !opts.section) {
86
+ throw new CliError({
87
+ exitCode: 2,
88
+ code: "E_USAGE",
89
+ message: "Missing required option: --section (or pass --full-doc)",
90
+ });
91
+ }
92
+ if (opts.fullDoc && opts.section) {
93
+ throw new CliError({
94
+ exitCode: 2,
95
+ code: "E_USAGE",
96
+ message: "Use either --section or --full-doc (not both)",
97
+ });
98
+ }
99
+ if (!opts.fullDoc && !allowed.includes(opts.section ?? "")) {
71
100
  throw new CliError({
72
101
  exitCode: 2,
73
102
  code: "E_USAGE",
74
- message: unknownEntityMessage("doc section", opts.section),
103
+ message: unknownEntityMessage("doc section", opts.section ?? ""),
75
104
  });
76
105
  }
77
106
  const normalizedAllowed = new Set(allowed.map((section) => normalizeDocSectionName(section)));
78
- const targetKey = normalizeDocSectionName(opts.section);
107
+ const targetKey = normalizeDocSectionName(opts.section ?? "");
79
108
  const headingKeys = new Set();
80
109
  for (const line of text.replaceAll("\r\n", "\n").split("\n")) {
81
110
  const match = /^##\s+(.*)$/.exec(line.trim());
@@ -85,68 +114,91 @@ export async function cmdTaskDocSet(opts) {
85
114
  if (key && normalizedAllowed.has(key))
86
115
  headingKeys.add(key);
87
116
  }
88
- const storeTask = useStore ? await store.get(opts.taskId) : null;
89
- const baseDocRaw = useStore
90
- ? String(storeTask.doc ?? "")
91
- : ((await backend.getTaskDoc(opts.taskId)) ?? "");
92
- const baseDoc = ensureDocSections(baseDocRaw, config.tasks.doc.required_sections);
93
- const baseSection = readSectionContent(baseDoc, opts.section);
94
- const requestMode = headingKeys.size > 0 && (headingKeys.size > 1 || !headingKeys.has(targetKey))
117
+ const requestMode = opts.fullDoc
95
118
  ? "full-doc"
96
- : "section";
97
- if (headingKeys.size > 0 && (headingKeys.size > 1 || !headingKeys.has(targetKey))) {
98
- const fullDoc = ensureDocSections(text, config.tasks.doc.required_sections);
99
- await (useStore
100
- ? store.update(opts.taskId, (current) => ({
101
- ...current,
102
- doc: fullDoc,
103
- ...(updatedBy ? { doc_updated_by: updatedBy } : {}),
104
- }))
105
- : backend.setTaskDoc(opts.taskId, fullDoc, updatedBy));
119
+ : headingKeys.size > 0 && (headingKeys.size > 1 || !headingKeys.has(targetKey))
120
+ ? "full-doc"
121
+ : "section";
122
+ let changed = false;
123
+ if (useStore) {
124
+ let expectedCurrentDoc;
125
+ let expectedCurrentSectionText;
126
+ const result = await store.patch(opts.taskId, (current) => {
127
+ const currentDocRaw = String(current.doc ?? "");
128
+ const nextDoc = buildUpdatedTaskDoc({
129
+ baseDocRaw: currentDocRaw,
130
+ section: opts.section,
131
+ text,
132
+ requestMode,
133
+ requiredSections: config.tasks.doc.required_sections,
134
+ headingKeys,
135
+ targetKey,
136
+ });
137
+ const docChanged = normalizeTaskDoc(currentDocRaw) !== normalizeTaskDoc(nextDoc);
138
+ const shouldWrite = docChanged || updatedBy !== undefined;
139
+ if (!shouldWrite)
140
+ return null;
141
+ if (!docChanged) {
142
+ return {
143
+ docMeta: {
144
+ touch: true,
145
+ ...(updatedBy ? { updatedBy } : {}),
146
+ },
147
+ };
148
+ }
149
+ if (requestMode === "full-doc") {
150
+ expectedCurrentDoc ??= currentDocRaw;
151
+ return {
152
+ doc: {
153
+ kind: "replace-doc",
154
+ doc: nextDoc,
155
+ expectedCurrentDoc,
156
+ },
157
+ ...(updatedBy ? { docMeta: { updatedBy } } : {}),
158
+ };
159
+ }
160
+ expectedCurrentSectionText ??= extractSectionTextForPatch(currentDocRaw, opts.section ?? "");
161
+ return {
162
+ doc: {
163
+ kind: "set-section",
164
+ section: opts.section ?? "",
165
+ text: extractSectionTextForPatch(nextDoc, opts.section ?? "") ?? "",
166
+ requiredSections: config.tasks.doc.required_sections,
167
+ expectedCurrentText: expectedCurrentSectionText,
168
+ },
169
+ ...(updatedBy ? { docMeta: { updatedBy } } : {}),
170
+ };
171
+ });
172
+ changed = result.changed;
106
173
  }
107
174
  else {
108
- let nextText = text;
109
- if (headingKeys.size > 0 && headingKeys.has(targetKey)) {
110
- const lines = nextText.replaceAll("\r\n", "\n").split("\n");
111
- let firstContent = 0;
112
- while (firstContent < lines.length && lines[firstContent]?.trim() === "")
113
- firstContent++;
114
- if ((lines[firstContent]?.trim() ?? "") === `## ${opts.section}`) {
115
- lines.splice(firstContent, 1);
116
- if (lines[firstContent]?.trim() === "")
117
- lines.splice(firstContent, 1);
118
- nextText = lines.join("\n");
119
- }
175
+ const baseDocRaw = (await backend.getTaskDoc(opts.taskId)) ?? "";
176
+ const nextDoc = buildUpdatedTaskDoc({
177
+ baseDocRaw,
178
+ section: opts.section,
179
+ text,
180
+ requestMode,
181
+ requiredSections: config.tasks.doc.required_sections,
182
+ headingKeys,
183
+ targetKey,
184
+ });
185
+ const docChanged = normalizeTaskDoc(baseDocRaw) !== normalizeTaskDoc(nextDoc);
186
+ const shouldWrite = docChanged || updatedBy !== undefined;
187
+ if (shouldWrite) {
188
+ await backend.setTaskDoc(opts.taskId, nextDoc, updatedBy);
120
189
  }
121
- const nextDoc = setMarkdownSection(baseDoc, opts.section, nextText);
122
- const normalized = ensureDocSections(nextDoc, config.tasks.doc.required_sections);
123
- await (useStore
124
- ? store.update(opts.taskId, (current) => ({
125
- ...current,
126
- doc: normalized,
127
- ...(updatedBy ? { doc_updated_by: updatedBy } : {}),
128
- }))
129
- : backend.setTaskDoc(opts.taskId, normalized, updatedBy));
190
+ changed = shouldWrite;
130
191
  }
131
- const updatedTask = useStore ? await store.get(opts.taskId) : null;
132
- const updatedDocRaw = useStore
133
- ? String(updatedTask?.doc ?? "")
134
- : ((await backend.getTaskDoc(opts.taskId)) ?? "");
135
- const updatedDoc = ensureDocSections(updatedDocRaw, config.tasks.doc.required_sections);
136
- const updatedSection = readSectionContent(updatedDoc, opts.section);
137
- const docChanged = normalizeOutcomeText(baseDoc) !== normalizeOutcomeText(updatedDoc);
138
- const sectionChanged = baseSection !== updatedSection;
192
+ const outcome = changed
193
+ ? requestMode === "full-doc"
194
+ ? "full-doc-updated"
195
+ : "section-updated"
196
+ : "no-change";
139
197
  const tasksDir = path.join(resolved.gitRoot, config.paths.workflow_dir);
140
198
  process.stdout.write(`${path.join(tasksDir, opts.taskId, "README.md")}\n`);
141
- if (!docChanged) {
142
- process.stderr.write(`${warnMessage(`task doc set wrote no effective README change for section ${opts.section}`)}\n`);
143
- }
144
- else if (requestMode === "full-doc") {
145
- process.stderr.write(`${infoMessage(`task doc set applied a full-doc update; target section ${opts.section} ${sectionChanged ? "changed" : "did not change"}`)}\n`);
146
- }
147
- else {
148
- process.stderr.write(`${infoMessage(`task doc set updated section ${opts.section}${sectionChanged ? "" : " (effective section content unchanged)"}`)}\n`);
149
- }
199
+ const outcomeTarget = opts.fullDoc ? "<full-doc>" : (opts.section ?? "");
200
+ const outcomeText = `task doc set outcome=${outcome} section=${outcomeTarget}`;
201
+ process.stderr.write(`${outcome === "no-change" ? warnMessage(outcomeText) : infoMessage(outcomeText)}\n`);
150
202
  return 0;
151
203
  }
152
204
  catch (err) {
@@ -1 +1 @@
1
- {"version":3,"file":"finish.d.ts","sourceRoot":"","sources":["../../../src/commands/task/finish.ts"],"names":[],"mappings":"AAYA,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,2BAA2B,CAAC;AAqCnC,wBAAsB,SAAS,CAAC,IAAI,EAAE;IACpC,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,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,CAAC,EAAE,OAAO,CAAC;IACd,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,CAAC,EAAE,OAAO,CAAC;IACtB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,KAAK,EAAE,OAAO,CAAC;CAChB,GAAG,OAAO,CAAC,MAAM,CAAC,CA4XlB"}
1
+ {"version":3,"file":"finish.d.ts","sourceRoot":"","sources":["../../../src/commands/task/finish.ts"],"names":[],"mappings":"AAYA,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,2BAA2B,CAAC;AAwFnC,wBAAsB,SAAS,CAAC,IAAI,EAAE;IACpC,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,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,CAAC,EAAE,OAAO,CAAC;IACd,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,CAAC,EAAE,OAAO,CAAC;IACtB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,KAAK,EAAE,OAAO,CAAC;CAChB,GAAG,OAAO,CAAC,MAAM,CAAC,CAgZlB"}