agentplane 0.3.6 → 0.3.7

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 (120) hide show
  1. package/dist/.build-manifest.json +106 -96
  2. package/dist/adapters/task-backend/task-backend-adapter.d.ts +2 -2
  3. package/dist/adapters/task-backend/task-backend-adapter.d.ts.map +1 -1
  4. package/dist/adapters/task-backend/task-backend-adapter.js +2 -2
  5. package/dist/backends/task-backend/local-backend.d.ts +7 -5
  6. package/dist/backends/task-backend/local-backend.d.ts.map +1 -1
  7. package/dist/backends/task-backend/local-backend.js +79 -7
  8. package/dist/backends/task-backend/redmine/env.d.ts +1 -1
  9. package/dist/backends/task-backend/redmine/env.d.ts.map +1 -1
  10. package/dist/backends/task-backend/redmine/env.js +3 -0
  11. package/dist/backends/task-backend/redmine/inspect.d.ts +11 -0
  12. package/dist/backends/task-backend/redmine/inspect.d.ts.map +1 -0
  13. package/dist/backends/task-backend/redmine/inspect.js +75 -0
  14. package/dist/backends/task-backend/redmine/mapping.d.ts.map +1 -1
  15. package/dist/backends/task-backend/redmine/mapping.js +21 -2
  16. package/dist/backends/task-backend/redmine/state.d.ts +17 -0
  17. package/dist/backends/task-backend/redmine/state.d.ts.map +1 -0
  18. package/dist/backends/task-backend/redmine/state.js +95 -0
  19. package/dist/backends/task-backend/redmine-backend.d.ts +10 -16
  20. package/dist/backends/task-backend/redmine-backend.d.ts.map +1 -1
  21. package/dist/backends/task-backend/redmine-backend.js +205 -15
  22. package/dist/backends/task-backend/shared/constants.d.ts +1 -1
  23. package/dist/backends/task-backend/shared/constants.js +1 -1
  24. package/dist/backends/task-backend/shared/record.d.ts.map +1 -1
  25. package/dist/backends/task-backend/shared/record.js +20 -1
  26. package/dist/backends/task-backend/shared/types.d.ts +42 -4
  27. package/dist/backends/task-backend/shared/types.d.ts.map +1 -1
  28. package/dist/backends/task-backend/shared.d.ts +1 -1
  29. package/dist/backends/task-backend/shared.d.ts.map +1 -1
  30. package/dist/backends/task-backend.d.ts +1 -1
  31. package/dist/backends/task-backend.d.ts.map +1 -1
  32. package/dist/backends/task-index.d.ts.map +1 -1
  33. package/dist/backends/task-index.js +1 -0
  34. package/dist/cli/run-cli/command-catalog/project.d.ts +1 -1
  35. package/dist/cli/run-cli/command-catalog/project.d.ts.map +1 -1
  36. package/dist/cli/run-cli/command-catalog/project.js +3 -1
  37. package/dist/cli/run-cli/command-catalog.d.ts +1 -1
  38. package/dist/cli/run-cli/command-catalog.d.ts.map +1 -1
  39. package/dist/cli/run-cli/commands/init/write-env.d.ts.map +1 -1
  40. package/dist/cli/run-cli/commands/init/write-env.js +12 -0
  41. package/dist/cli/run-cli.test-helpers.d.ts.map +1 -1
  42. package/dist/cli/run-cli.test-helpers.js +2 -0
  43. package/dist/commands/backend/sync.command.d.ts +5 -1
  44. package/dist/commands/backend/sync.command.d.ts.map +1 -1
  45. package/dist/commands/backend/sync.command.js +67 -3
  46. package/dist/commands/backend.d.ts +22 -0
  47. package/dist/commands/backend.d.ts.map +1 -1
  48. package/dist/commands/backend.js +110 -1
  49. package/dist/commands/commit.spec.d.ts.map +1 -1
  50. package/dist/commands/commit.spec.js +30 -6
  51. package/dist/commands/doctor/workspace.d.ts +8 -0
  52. package/dist/commands/doctor/workspace.d.ts.map +1 -1
  53. package/dist/commands/doctor/workspace.js +127 -3
  54. package/dist/commands/guard/commit.command.d.ts.map +1 -1
  55. package/dist/commands/guard/commit.command.js +30 -6
  56. package/dist/commands/guard/impl/allow.d.ts +4 -0
  57. package/dist/commands/guard/impl/allow.d.ts.map +1 -1
  58. package/dist/commands/guard/impl/allow.js +14 -3
  59. package/dist/commands/guard/impl/commands.d.ts.map +1 -1
  60. package/dist/commands/guard/impl/commands.js +11 -2
  61. package/dist/commands/shared/task-backend.d.ts +1 -1
  62. package/dist/commands/shared/task-backend.d.ts.map +1 -1
  63. package/dist/commands/shared/task-backend.js +9 -0
  64. package/dist/commands/shared/task-store.d.ts +61 -2
  65. package/dist/commands/shared/task-store.d.ts.map +1 -1
  66. package/dist/commands/shared/task-store.js +298 -60
  67. package/dist/commands/task/block.d.ts.map +1 -1
  68. package/dist/commands/task/block.js +58 -37
  69. package/dist/commands/task/close-shared.d.ts.map +1 -1
  70. package/dist/commands/task/close-shared.js +17 -20
  71. package/dist/commands/task/comment.d.ts.map +1 -1
  72. package/dist/commands/task/comment.js +14 -19
  73. package/dist/commands/task/derive.command.d.ts +1 -0
  74. package/dist/commands/task/derive.command.d.ts.map +1 -1
  75. package/dist/commands/task/derive.command.js +15 -2
  76. package/dist/commands/task/derive.d.ts +1 -0
  77. package/dist/commands/task/derive.d.ts.map +1 -1
  78. package/dist/commands/task/derive.js +27 -4
  79. package/dist/commands/task/doc.d.ts.map +1 -1
  80. package/dist/commands/task/doc.js +16 -5
  81. package/dist/commands/task/finish.d.ts.map +1 -1
  82. package/dist/commands/task/finish.js +41 -41
  83. package/dist/commands/task/migrate-doc.d.ts +15 -0
  84. package/dist/commands/task/migrate-doc.d.ts.map +1 -1
  85. package/dist/commands/task/migrate-doc.js +126 -35
  86. package/dist/commands/task/new.d.ts.map +1 -1
  87. package/dist/commands/task/new.js +3 -1
  88. package/dist/commands/task/plan.js +28 -28
  89. package/dist/commands/task/set-status.d.ts.map +1 -1
  90. package/dist/commands/task/set-status.js +104 -61
  91. package/dist/commands/task/shared/dependencies.d.ts +1 -0
  92. package/dist/commands/task/shared/dependencies.d.ts.map +1 -1
  93. package/dist/commands/task/shared/dependencies.js +10 -0
  94. package/dist/commands/task/shared/docs.js +1 -1
  95. package/dist/commands/task/shared/transitions.d.ts +17 -0
  96. package/dist/commands/task/shared/transitions.d.ts.map +1 -1
  97. package/dist/commands/task/shared/transitions.js +20 -7
  98. package/dist/commands/task/shared.d.ts +2 -2
  99. package/dist/commands/task/shared.d.ts.map +1 -1
  100. package/dist/commands/task/shared.js +2 -2
  101. package/dist/commands/task/start.d.ts.map +1 -1
  102. package/dist/commands/task/start.js +33 -28
  103. package/dist/commands/task/verify-record.d.ts.map +1 -1
  104. package/dist/commands/task/verify-record.js +32 -32
  105. package/dist/commands/upgrade/apply.d.ts +2 -0
  106. package/dist/commands/upgrade/apply.d.ts.map +1 -1
  107. package/dist/commands/upgrade/apply.js +33 -1
  108. package/dist/commands/upgrade.command.d.ts.map +1 -1
  109. package/dist/commands/upgrade.command.js +25 -0
  110. package/dist/commands/upgrade.d.ts +1 -0
  111. package/dist/commands/upgrade.d.ts.map +1 -1
  112. package/dist/commands/upgrade.js +34 -0
  113. package/dist/policy/rules/allowlist.d.ts.map +1 -1
  114. package/dist/policy/rules/allowlist.js +12 -9
  115. package/dist/ports/task-backend-port.d.ts +2 -2
  116. package/dist/ports/task-backend-port.d.ts.map +1 -1
  117. package/dist/shared/protected-paths.d.ts +10 -0
  118. package/dist/shared/protected-paths.d.ts.map +1 -1
  119. package/dist/shared/protected-paths.js +33 -0
  120. package/package.json +2 -2
@@ -234,11 +234,6 @@ export async function cmdTaskPlanApprove(opts) {
234
234
  });
235
235
  }
236
236
  const note = typeof opts.note === "string" ? opts.note.trim() : "";
237
- const existingDoc = useStore
238
- ? String(task.doc ?? "")
239
- : (typeof task.doc === "string" ? task.doc : "") || (await backend.getTaskDoc(task.id));
240
- const baseDoc = ensureDocSections(existingDoc ?? "", config.tasks.doc.required_sections);
241
- assertPlanCanBeApproved({ task, config, doc: baseDoc });
242
237
  const approvedAt = nowIso();
243
238
  await (useStore
244
239
  ? store.patch(opts.taskId, (current) => {
@@ -255,15 +250,20 @@ export async function cmdTaskPlanApprove(opts) {
255
250
  },
256
251
  };
257
252
  })
258
- : backend.writeTask({
259
- ...task,
260
- plan_approval: {
261
- state: "approved",
262
- updated_at: approvedAt,
263
- updated_by: by,
264
- note: note || null,
265
- },
266
- }));
253
+ : (async () => {
254
+ const existingDoc = (typeof task.doc === "string" ? task.doc : "") || (await backend.getTaskDoc(task.id));
255
+ const baseDoc = ensureDocSections(existingDoc ?? "", config.tasks.doc.required_sections);
256
+ assertPlanCanBeApproved({ task, config, doc: baseDoc });
257
+ await backend.writeTask({
258
+ ...task,
259
+ plan_approval: {
260
+ state: "approved",
261
+ updated_at: approvedAt,
262
+ updated_by: by,
263
+ note: note || null,
264
+ },
265
+ });
266
+ })());
267
267
  return 0;
268
268
  }
269
269
  catch (err) {
@@ -297,11 +297,6 @@ export async function cmdTaskPlanReject(opts) {
297
297
  message: "Invalid value for --note: empty.",
298
298
  });
299
299
  }
300
- const existingDoc = useStore
301
- ? String(task.doc ?? "")
302
- : (typeof task.doc === "string" ? task.doc : "") || (await backend.getTaskDoc(task.id));
303
- const baseDoc = ensureDocSections(existingDoc ?? "", config.tasks.doc.required_sections);
304
- assertPlanSectionPresent(task.id, baseDoc, "reject");
305
300
  const rejectedAt = nowIso();
306
301
  await (useStore
307
302
  ? store.patch(opts.taskId, (current) => {
@@ -318,15 +313,20 @@ export async function cmdTaskPlanReject(opts) {
318
313
  },
319
314
  };
320
315
  })
321
- : backend.writeTask({
322
- ...task,
323
- plan_approval: {
324
- state: "rejected",
325
- updated_at: rejectedAt,
326
- updated_by: by,
327
- note: note || null,
328
- },
329
- }));
316
+ : (async () => {
317
+ const existingDoc = (typeof task.doc === "string" ? task.doc : "") || (await backend.getTaskDoc(task.id));
318
+ const baseDoc = ensureDocSections(existingDoc ?? "", config.tasks.doc.required_sections);
319
+ assertPlanSectionPresent(task.id, baseDoc, "reject");
320
+ await backend.writeTask({
321
+ ...task,
322
+ plan_approval: {
323
+ state: "rejected",
324
+ updated_at: rejectedAt,
325
+ updated_by: by,
326
+ note: note || null,
327
+ },
328
+ });
329
+ })());
330
330
  return 0;
331
331
  }
332
332
  catch (err) {
@@ -1 +1 @@
1
- {"version":3,"file":"set-status.d.ts","sourceRoot":"","sources":["../../../src/commands/task/set-status.ts"],"names":[],"mappings":"AAQA,OAAO,EAIL,KAAK,cAAc,EACpB,MAAM,2BAA2B,CAAC;AAiBnC,wBAAsB,gBAAgB,CAAC,IAAI,EAAE;IAC3C,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,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,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,mBAAmB,EAAE,OAAO,CAAC;IAC7B,KAAK,EAAE,OAAO,CAAC;CAChB,GAAG,OAAO,CAAC,MAAM,CAAC,CA6LlB"}
1
+ {"version":3,"file":"set-status.d.ts","sourceRoot":"","sources":["../../../src/commands/task/set-status.ts"],"names":[],"mappings":"AAQA,OAAO,EAIL,KAAK,cAAc,EACpB,MAAM,2BAA2B,CAAC;AA2BnC,wBAAsB,gBAAgB,CAAC,IAAI,EAAE;IAC3C,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,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,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,mBAAmB,EAAE,OAAO,CAAC;IAC7B,KAAK,EAAE,OAAO,CAAC;CAChB,GAAG,OAAO,CAAC,MAAM,CAAC,CA2OlB"}
@@ -5,8 +5,8 @@ import { CliError } from "../../shared/errors.js";
5
5
  import { commitFromComment } from "../guard/index.js";
6
6
  import { ensureActionApproved } from "../shared/approval-requirements.js";
7
7
  import { loadCommandContext, loadTaskFromContext, resolveDocUpdatedBy, } from "../shared/task-backend.js";
8
- import { backendIsLocalFileBackend, getTaskStore } from "../shared/task-store.js";
9
- import { appendTaskEvent, defaultCommitEmojiForStatus, ensureCommentCommitAllowed, ensureStatusTransitionAllowed, normalizeTaskDocVersion, normalizeTaskStatus, nowIso, readCommitInfo, resolveTaskDependencyState, resolvePrimaryTag, toStringArray, } from "./shared.js";
8
+ import { appendTaskCommentIntent, appendTaskEventIntent, backendIsLocalFileBackend, getTaskStore, mutateTaskStore, setTaskFieldsIntent, touchTaskDocMetaIntent, } from "../shared/task-store.js";
9
+ import { appendTaskEvent, dependencyWarningMessages, defaultCommitEmojiForStatus, ensureCommentCommitAllowed, resolveCommentCommitWarning, ensureStatusTransitionAllowed, normalizeTaskDocVersion, normalizeTaskStatus, nowIso, readCommitInfo, resolveTaskDependencyState, resolvePrimaryTag, toStringArray, } from "./shared.js";
10
10
  export async function cmdTaskSetStatus(opts) {
11
11
  const nextStatus = normalizeTaskStatus(opts.status);
12
12
  if (nextStatus === "DONE" && !opts.force) {
@@ -42,38 +42,40 @@ export async function cmdTaskSetStatus(opts) {
42
42
  ? await store.get(opts.taskId)
43
43
  : await loadTaskFromContext({ ctx, taskId: opts.taskId });
44
44
  const currentStatus = String(task.status || "TODO").toUpperCase();
45
- ensureStatusTransitionAllowed({
46
- currentStatus,
47
- nextStatus,
48
- force: opts.force,
49
- });
50
- if (!opts.force && (nextStatus === "DOING" || nextStatus === "DONE")) {
51
- const dep = await resolveTaskDependencyState(task, ctx.taskBackend);
52
- if (dep.missing.length > 0 || dep.incomplete.length > 0) {
53
- if (!opts.quiet) {
54
- if (dep.missing.length > 0) {
55
- process.stderr.write(`${warnMessage(`missing deps: ${dep.missing.join(", ")}`)}\n`);
56
- }
57
- if (dep.incomplete.length > 0) {
58
- process.stderr.write(`${warnMessage(`incomplete deps: ${dep.incomplete.join(", ")}`)}\n`);
45
+ if (!useStore) {
46
+ ensureStatusTransitionAllowed({
47
+ currentStatus,
48
+ nextStatus,
49
+ force: opts.force,
50
+ });
51
+ if (!opts.force && (nextStatus === "DOING" || nextStatus === "DONE")) {
52
+ const dep = await resolveTaskDependencyState(task, ctx.taskBackend);
53
+ if (dep.missing.length > 0 || dep.incomplete.length > 0) {
54
+ if (!opts.quiet) {
55
+ if (dep.missing.length > 0) {
56
+ process.stderr.write(`${warnMessage(`missing deps: ${dep.missing.join(", ")}`)}\n`);
57
+ }
58
+ if (dep.incomplete.length > 0) {
59
+ process.stderr.write(`${warnMessage(`incomplete deps: ${dep.incomplete.join(", ")}`)}\n`);
60
+ }
59
61
  }
62
+ throw new CliError({
63
+ exitCode: 2,
64
+ code: "E_USAGE",
65
+ message: `Task is not ready: ${task.id} (use --force to override)`,
66
+ });
60
67
  }
61
- throw new CliError({
62
- exitCode: 2,
63
- code: "E_USAGE",
64
- message: `Task is not ready: ${task.id} (use --force to override)`,
65
- });
66
68
  }
69
+ ensureCommentCommitAllowed({
70
+ enabled: opts.commitFromComment,
71
+ config,
72
+ action: "task set-status",
73
+ confirmed: opts.confirmStatusCommit,
74
+ quiet: opts.quiet,
75
+ statusFrom: currentStatus,
76
+ statusTo: nextStatus,
77
+ });
67
78
  }
68
- ensureCommentCommitAllowed({
69
- enabled: opts.commitFromComment,
70
- config,
71
- action: "task set-status",
72
- confirmed: opts.confirmStatusCommit,
73
- quiet: opts.quiet,
74
- statusFrom: currentStatus,
75
- statusTo: nextStatus,
76
- });
77
79
  const existingComments = Array.isArray(task.comments)
78
80
  ? task.comments.filter((item) => !!item && typeof item.author === "string" && typeof item.body === "string")
79
81
  : [];
@@ -91,6 +93,9 @@ export async function cmdTaskSetStatus(opts) {
91
93
  const nextCommit = opts.commit
92
94
  ? { hash: commitInfo.hash, message: commitInfo.message }
93
95
  : undefined;
96
+ let currentStatusForCommit = currentStatus;
97
+ let primaryTagForCommit = resolvePrimaryTag(toStringArray(task.tags), ctx).primary;
98
+ let deferredWarnings = [];
94
99
  const next = {
95
100
  ...task,
96
101
  status: nextStatus,
@@ -110,41 +115,79 @@ export async function cmdTaskSetStatus(opts) {
110
115
  if (opts.commit) {
111
116
  next.commit = nextCommit;
112
117
  }
113
- await (useStore
114
- ? store.patch(opts.taskId, (current) => {
115
- const currentStatus = String(current.status || "TODO").toUpperCase();
116
- ensureStatusTransitionAllowed({
117
- currentStatus,
118
- nextStatus,
119
- force: opts.force,
120
- });
121
- const currentEventAuthor = resolveDocUpdatedBy(current, opts.author);
122
- return {
123
- task: {
124
- status: nextStatus,
125
- ...(nextCommit ? { commit: nextCommit } : {}),
126
- },
127
- ...(commentBody
128
- ? { appendComments: [{ author: opts.author, body: commentBody }] }
129
- : {}),
130
- appendEvents: [
131
- {
118
+ try {
119
+ await (useStore
120
+ ? mutateTaskStore(store, opts.taskId, async (current) => {
121
+ deferredWarnings = [];
122
+ const currentStatus = String(current.status || "TODO").toUpperCase();
123
+ currentStatusForCommit = currentStatus;
124
+ primaryTagForCommit = resolvePrimaryTag(toStringArray(current.tags), ctx).primary;
125
+ ensureStatusTransitionAllowed({
126
+ currentStatus,
127
+ nextStatus,
128
+ force: opts.force,
129
+ });
130
+ if (!opts.force && (nextStatus === "DOING" || nextStatus === "DONE")) {
131
+ const dep = await resolveTaskDependencyState(current, ctx.taskBackend);
132
+ deferredWarnings = [...deferredWarnings, ...dependencyWarningMessages(dep)];
133
+ if (dep.missing.length > 0 || dep.incomplete.length > 0) {
134
+ throw new CliError({
135
+ exitCode: 2,
136
+ code: "E_USAGE",
137
+ message: `Task is not ready: ${current.id} (use --force to override)`,
138
+ });
139
+ }
140
+ }
141
+ const commitWarning = resolveCommentCommitWarning({
142
+ enabled: opts.commitFromComment,
143
+ config,
144
+ action: "task set-status",
145
+ confirmed: opts.confirmStatusCommit,
146
+ quiet: opts.quiet,
147
+ statusFrom: currentStatus,
148
+ statusTo: nextStatus,
149
+ });
150
+ if (commitWarning)
151
+ deferredWarnings.push(commitWarning);
152
+ const currentEventAuthor = resolveDocUpdatedBy(current, opts.author);
153
+ const intents = [
154
+ setTaskFieldsIntent({
155
+ status: nextStatus,
156
+ ...(nextCommit ? { commit: nextCommit } : {}),
157
+ }),
158
+ appendTaskEventIntent({
132
159
  type: "status",
133
160
  at,
134
161
  author: currentEventAuthor,
135
162
  from: currentStatus,
136
163
  to: nextStatus,
137
164
  note: commentBody,
138
- },
139
- ],
140
- docMeta: {
141
- touch: true,
142
- updatedBy: currentEventAuthor,
143
- version: normalizeTaskDocVersion(current.doc_version),
144
- },
145
- };
146
- })
147
- : ctx.taskBackend.writeTask(next));
165
+ }),
166
+ touchTaskDocMetaIntent({
167
+ updatedBy: currentEventAuthor,
168
+ version: normalizeTaskDocVersion(current.doc_version),
169
+ }),
170
+ ];
171
+ if (commentBody) {
172
+ intents.splice(1, 0, appendTaskCommentIntent({ author: opts.author, body: commentBody }));
173
+ }
174
+ return intents;
175
+ })
176
+ : ctx.taskBackend.writeTask(next));
177
+ }
178
+ catch (err) {
179
+ if (err instanceof CliError && !opts.quiet) {
180
+ for (const warning of new Set(deferredWarnings)) {
181
+ process.stderr.write(`${warnMessage(warning)}\n`);
182
+ }
183
+ }
184
+ throw err;
185
+ }
186
+ if (!opts.quiet) {
187
+ for (const warning of new Set(deferredWarnings)) {
188
+ process.stderr.write(`${warnMessage(warning)}\n`);
189
+ }
190
+ }
148
191
  // tasks.json is export-only; generated via `agentplane task export`.
149
192
  if (opts.commitFromComment) {
150
193
  if (!opts.body) {
@@ -159,9 +202,9 @@ export async function cmdTaskSetStatus(opts) {
159
202
  cwd: opts.cwd,
160
203
  rootOverride: opts.rootOverride,
161
204
  taskId: opts.taskId,
162
- primaryTag: resolvePrimaryTag(toStringArray(task.tags), ctx).primary,
205
+ primaryTag: primaryTagForCommit,
163
206
  author: opts.author,
164
- statusFrom: currentStatus,
207
+ statusFrom: currentStatusForCommit,
165
208
  statusTo: nextStatus,
166
209
  commentBody: opts.body,
167
210
  formattedComment: formatCommentBodyForCommit(opts.body, config),
@@ -10,6 +10,7 @@ export declare function ensureTaskDependsOnGraphIsAcyclic(opts: {
10
10
  dependsOn: string[];
11
11
  }): Promise<void>;
12
12
  export declare function resolveTaskDependencyState(task: TaskData, backend: Pick<TaskBackend, "getTask" | "getTasks">): Promise<DependencyState>;
13
+ export declare function dependencyWarningMessages(dep: DependencyState): string[];
13
14
  export declare function buildDependencyState(tasks: TaskData[]): Map<string, DependencyState>;
14
15
  export declare function formatTaskLine(task: TaskData, depState?: DependencyState): string;
15
16
  //# sourceMappingURL=dependencies.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"dependencies.d.ts","sourceRoot":"","sources":["../../../../src/commands/task/shared/dependencies.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,mCAAmC,CAAC;AAK/E,MAAM,MAAM,eAAe,GAAG;IAC5B,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB,CAAC;AAkCF,wBAAsB,iCAAiC,CAAC,IAAI,EAAE;IAC5D,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB,GAAG,OAAO,CAAC,IAAI,CAAC,CA2BhB;AAED,wBAAsB,0BAA0B,CAC9C,IAAI,EAAE,QAAQ,EACd,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,SAAS,GAAG,UAAU,CAAC,GACjD,OAAO,CAAC,eAAe,CAAC,CAuB1B;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,CAqBpF;AAgBD,wBAAgB,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,eAAe,GAAG,MAAM,CAejF"}
1
+ {"version":3,"file":"dependencies.d.ts","sourceRoot":"","sources":["../../../../src/commands/task/shared/dependencies.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,mCAAmC,CAAC;AAK/E,MAAM,MAAM,eAAe,GAAG;IAC5B,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB,CAAC;AAkCF,wBAAsB,iCAAiC,CAAC,IAAI,EAAE;IAC5D,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB,GAAG,OAAO,CAAC,IAAI,CAAC,CA2BhB;AAED,wBAAsB,0BAA0B,CAC9C,IAAI,EAAE,QAAQ,EACd,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,SAAS,GAAG,UAAU,CAAC,GACjD,OAAO,CAAC,eAAe,CAAC,CAuB1B;AAED,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM,EAAE,CASxE;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,CAqBpF;AAgBD,wBAAgB,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,eAAe,GAAG,MAAM,CAejF"}
@@ -83,6 +83,16 @@ export async function resolveTaskDependencyState(task, backend) {
83
83
  }
84
84
  return { dependsOn, missing, incomplete };
85
85
  }
86
+ export function dependencyWarningMessages(dep) {
87
+ const warnings = [];
88
+ if (dep.missing.length > 0) {
89
+ warnings.push(`missing deps: ${dep.missing.join(", ")}`);
90
+ }
91
+ if (dep.incomplete.length > 0) {
92
+ warnings.push(`incomplete deps: ${dep.incomplete.join(", ")}`);
93
+ }
94
+ return warnings;
95
+ }
86
96
  export function buildDependencyState(tasks) {
87
97
  const byId = new Map(tasks.map((task) => [task.id, task]));
88
98
  const state = new Map();
@@ -40,7 +40,7 @@ export function isVerifyStepsFilled(sectionText) {
40
40
  return false;
41
41
  return true;
42
42
  }
43
- export function normalizeTaskDocVersion(value, fallback = 2) {
43
+ export function normalizeTaskDocVersion(value, fallback = 3) {
44
44
  return value === 3 ? 3 : value === 2 ? 2 : fallback;
45
45
  }
46
46
  export function normalizeVerificationSectionLayout(sectionText, version) {
@@ -18,6 +18,15 @@ export declare function ensureCommentCommitAllowed(opts: {
18
18
  statusFrom: string;
19
19
  statusTo: string;
20
20
  }): void;
21
+ export declare function resolveCommentCommitWarning(opts: {
22
+ enabled: boolean;
23
+ config: AgentplaneConfig;
24
+ action: string;
25
+ confirmed: boolean;
26
+ quiet: boolean;
27
+ statusFrom: string;
28
+ statusTo: string;
29
+ }): string | null;
21
30
  export declare function requireStructuredComment(body: string, prefix: string, minChars: number): void;
22
31
  export declare function readHeadCommit(cwd: string): Promise<{
23
32
  hash: string;
@@ -31,6 +40,14 @@ export declare function enforceStatusCommitPolicy(opts: {
31
40
  statusFrom: string;
32
41
  statusTo: string;
33
42
  }): void;
43
+ export declare function resolveStatusCommitPolicyWarning(opts: {
44
+ policy: AgentplaneConfig["status_commit_policy"];
45
+ action: string;
46
+ confirmed: boolean;
47
+ quiet: boolean;
48
+ statusFrom: string;
49
+ statusTo: string;
50
+ }): string | null;
34
51
  export declare function isMajorStatusCommitTransition(statusFrom: string, statusTo: string): boolean;
35
52
  export declare function readCommitInfo(cwd: string, rev: string): Promise<{
36
53
  hash: string;
@@ -1 +1 @@
1
- {"version":3,"file":"transitions.d.ts","sourceRoot":"","sources":["../../../../src/commands/task/shared/transitions.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAK5D,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,mCAAmC,CAAC;AAK7E,wBAAgB,eAAe,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,GAAG,SAAS,EAAE,CAW7E;AAED,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAc3F;AAED,wBAAgB,qCAAqC,CACnD,IAAI,EAAE,QAAQ,EACd,MAAM,EAAE,gBAAgB,GACvB,IAAI,CAkBN;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAO1E;AAED,wBAAgB,6BAA6B,CAAC,IAAI,EAAE;IAClD,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;CAChB,GAAG,IAAI,CAUP;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE;IAC/C,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,gBAAgB,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,IAAI,CAmBP;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAgB7F;AAED,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAI5F;AAED,wBAAgB,yBAAyB,CAAC,IAAI,EAAE;IAC9C,MAAM,EAAE,gBAAgB,CAAC,sBAAsB,CAAC,CAAC;IACjD,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,IAAI,CA8BP;AAUD,wBAAgB,6BAA6B,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAK3F;AAED,wBAAsB,cAAc,CAClC,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,GACV,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAI5C;AAED,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAMlE"}
1
+ {"version":3,"file":"transitions.d.ts","sourceRoot":"","sources":["../../../../src/commands/task/shared/transitions.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAK5D,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,mCAAmC,CAAC;AAK7E,wBAAgB,eAAe,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,GAAG,SAAS,EAAE,CAW7E;AAED,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAc3F;AAED,wBAAgB,qCAAqC,CACnD,IAAI,EAAE,QAAQ,EACd,MAAM,EAAE,gBAAgB,GACvB,IAAI,CAkBN;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAO1E;AAED,wBAAgB,6BAA6B,CAAC,IAAI,EAAE;IAClD,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;CAChB,GAAG,IAAI,CAUP;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE;IAC/C,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,gBAAgB,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,IAAI,CAKP;AAED,wBAAgB,2BAA2B,CAAC,IAAI,EAAE;IAChD,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,gBAAgB,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,MAAM,GAAG,IAAI,CAmBhB;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAgB7F;AAED,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAI5F;AAED,wBAAgB,yBAAyB,CAAC,IAAI,EAAE;IAC9C,MAAM,EAAE,gBAAgB,CAAC,sBAAsB,CAAC,CAAC;IACjD,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,IAAI,CAKP;AAED,wBAAgB,gCAAgC,CAAC,IAAI,EAAE;IACrD,MAAM,EAAE,gBAAgB,CAAC,sBAAsB,CAAC,CAAC;IACjD,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,MAAM,GAAG,IAAI,CA2BhB;AAUD,wBAAgB,6BAA6B,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAK3F;AAED,wBAAsB,cAAc,CAClC,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,GACV,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAI5C;AAED,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAMlE"}
@@ -71,8 +71,14 @@ export function ensureStatusTransitionAllowed(opts) {
71
71
  });
72
72
  }
73
73
  export function ensureCommentCommitAllowed(opts) {
74
+ const warning = resolveCommentCommitWarning(opts);
75
+ if (warning) {
76
+ process.stderr.write(`${warnMessage(warning)}\n`);
77
+ }
78
+ }
79
+ export function resolveCommentCommitWarning(opts) {
74
80
  if (!opts.enabled)
75
- return;
81
+ return null;
76
82
  if (opts.config.commit_automation === "finish_only") {
77
83
  throw new CliError({
78
84
  exitCode: 2,
@@ -81,7 +87,7 @@ export function ensureCommentCommitAllowed(opts) {
81
87
  "(allowed only in finish).",
82
88
  });
83
89
  }
84
- enforceStatusCommitPolicy({
90
+ return resolveStatusCommitPolicyWarning({
85
91
  policy: opts.config.status_commit_policy,
86
92
  action: opts.action,
87
93
  confirmed: opts.confirmed,
@@ -113,6 +119,12 @@ export async function readHeadCommit(cwd) {
113
119
  return { hash, message: subject };
114
120
  }
115
121
  export function enforceStatusCommitPolicy(opts) {
122
+ const warning = resolveStatusCommitPolicyWarning(opts);
123
+ if (warning) {
124
+ process.stderr.write(`${warnMessage(warning)}\n`);
125
+ }
126
+ }
127
+ export function resolveStatusCommitPolicyWarning(opts) {
116
128
  if (!isMajorStatusCommitTransition(opts.statusFrom, opts.statusTo)) {
117
129
  throw new CliError({
118
130
  exitCode: 2,
@@ -122,12 +134,12 @@ export function enforceStatusCommitPolicy(opts) {
122
134
  });
123
135
  }
124
136
  if (opts.policy === "off")
125
- return;
137
+ return null;
126
138
  if (opts.policy === "warn") {
127
- if (!opts.quiet && !opts.confirmed) {
128
- process.stderr.write(`${warnMessage(`${opts.action}: status/comment-driven commit requested; policy=warn (pass --confirm-status-commit to acknowledge)`)}\n`);
129
- }
130
- return;
139
+ return opts.quiet || opts.confirmed
140
+ ? null
141
+ : `${opts.action}: status/comment-driven commit requested; policy=warn ` +
142
+ "(pass --confirm-status-commit to acknowledge)";
131
143
  }
132
144
  if (opts.policy === "confirm" && !opts.confirmed) {
133
145
  throw new CliError({
@@ -137,6 +149,7 @@ export function enforceStatusCommitPolicy(opts) {
137
149
  "(pass --confirm-status-commit to proceed)",
138
150
  });
139
151
  }
152
+ return null;
140
153
  }
141
154
  const MAJOR_STATUS_COMMIT_TRANSITIONS = new Set([
142
155
  "READY->DOING",
@@ -1,7 +1,7 @@
1
1
  export { dedupeStrings } from "../../shared/strings.js";
2
2
  export { decodeEscapedTaskTextNewlines, nowIso, normalizeTaskDocVersion, taskObservationSectionName, extractTaskObservationSection, VERIFY_STEPS_PLACEHOLDER, VERIFICATION_RESULTS_BEGIN, VERIFICATION_RESULTS_END, extractDocSection, isVerifyStepsFilled, isDocSectionFilled, ensureAgentFilledRequiredDocSections, normalizeVerificationSectionLayout, } from "./shared/docs.js";
3
3
  export { normalizeDependsOnInput, normalizeTaskStatus, toStringArray, requiresVerify, type PrimaryTagResolution, type TaskTagPolicy, readTaskTagPolicy, resolvePrimaryTagFromConfig, requiresVerifyStepsByPrimary, requiresVerificationByPrimary, resolvePrimaryTag, warnIfUnknownOwner, } from "./shared/tags.js";
4
- export { type DependencyState, ensureTaskDependsOnGraphIsAcyclic, resolveTaskDependencyState, buildDependencyState, formatTaskLine, } from "./shared/dependencies.js";
5
- export { appendTaskEvent, ensurePlanApprovedIfRequired, ensureVerificationSatisfiedIfRequired, isTransitionAllowed, ensureStatusTransitionAllowed, ensureCommentCommitAllowed, requireStructuredComment, enforceStatusCommitPolicy, isMajorStatusCommitTransition, readHeadCommit, readCommitInfo, defaultCommitEmojiForStatus, } from "./shared/transitions.js";
4
+ export { type DependencyState, dependencyWarningMessages, ensureTaskDependsOnGraphIsAcyclic, resolveTaskDependencyState, buildDependencyState, formatTaskLine, } from "./shared/dependencies.js";
5
+ export { appendTaskEvent, ensurePlanApprovedIfRequired, ensureVerificationSatisfiedIfRequired, isTransitionAllowed, ensureStatusTransitionAllowed, ensureCommentCommitAllowed, resolveCommentCommitWarning, requireStructuredComment, enforceStatusCommitPolicy, resolveStatusCommitPolicyWarning, isMajorStatusCommitTransition, readHeadCommit, readCommitInfo, defaultCommitEmojiForStatus, } from "./shared/transitions.js";
6
6
  export { type TaskListFilters, parseTaskListFilters, handleTaskListWarnings, taskTextBlob, } from "./shared/listing.js";
7
7
  //# sourceMappingURL=shared.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../src/commands/task/shared.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAExD,OAAO,EACL,6BAA6B,EAC7B,MAAM,EACN,uBAAuB,EACvB,0BAA0B,EAC1B,6BAA6B,EAC7B,wBAAwB,EACxB,0BAA0B,EAC1B,wBAAwB,EACxB,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,oCAAoC,EACpC,kCAAkC,GACnC,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,uBAAuB,EACvB,mBAAmB,EACnB,aAAa,EACb,cAAc,EACd,KAAK,oBAAoB,EACzB,KAAK,aAAa,EAClB,iBAAiB,EACjB,2BAA2B,EAC3B,4BAA4B,EAC5B,6BAA6B,EAC7B,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,KAAK,eAAe,EACpB,iCAAiC,EACjC,0BAA0B,EAC1B,oBAAoB,EACpB,cAAc,GACf,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,eAAe,EACf,4BAA4B,EAC5B,qCAAqC,EACrC,mBAAmB,EACnB,6BAA6B,EAC7B,0BAA0B,EAC1B,wBAAwB,EACxB,yBAAyB,EACzB,6BAA6B,EAC7B,cAAc,EACd,cAAc,EACd,2BAA2B,GAC5B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,KAAK,eAAe,EACpB,oBAAoB,EACpB,sBAAsB,EACtB,YAAY,GACb,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../src/commands/task/shared.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAExD,OAAO,EACL,6BAA6B,EAC7B,MAAM,EACN,uBAAuB,EACvB,0BAA0B,EAC1B,6BAA6B,EAC7B,wBAAwB,EACxB,0BAA0B,EAC1B,wBAAwB,EACxB,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,oCAAoC,EACpC,kCAAkC,GACnC,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,uBAAuB,EACvB,mBAAmB,EACnB,aAAa,EACb,cAAc,EACd,KAAK,oBAAoB,EACzB,KAAK,aAAa,EAClB,iBAAiB,EACjB,2BAA2B,EAC3B,4BAA4B,EAC5B,6BAA6B,EAC7B,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,KAAK,eAAe,EACpB,yBAAyB,EACzB,iCAAiC,EACjC,0BAA0B,EAC1B,oBAAoB,EACpB,cAAc,GACf,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,eAAe,EACf,4BAA4B,EAC5B,qCAAqC,EACrC,mBAAmB,EACnB,6BAA6B,EAC7B,0BAA0B,EAC1B,2BAA2B,EAC3B,wBAAwB,EACxB,yBAAyB,EACzB,gCAAgC,EAChC,6BAA6B,EAC7B,cAAc,EACd,cAAc,EACd,2BAA2B,GAC5B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,KAAK,eAAe,EACpB,oBAAoB,EACpB,sBAAsB,EACtB,YAAY,GACb,MAAM,qBAAqB,CAAC"}
@@ -1,6 +1,6 @@
1
1
  export { dedupeStrings } from "../../shared/strings.js";
2
2
  export { decodeEscapedTaskTextNewlines, nowIso, normalizeTaskDocVersion, taskObservationSectionName, extractTaskObservationSection, VERIFY_STEPS_PLACEHOLDER, VERIFICATION_RESULTS_BEGIN, VERIFICATION_RESULTS_END, extractDocSection, isVerifyStepsFilled, isDocSectionFilled, ensureAgentFilledRequiredDocSections, normalizeVerificationSectionLayout, } from "./shared/docs.js";
3
3
  export { normalizeDependsOnInput, normalizeTaskStatus, toStringArray, requiresVerify, readTaskTagPolicy, resolvePrimaryTagFromConfig, requiresVerifyStepsByPrimary, requiresVerificationByPrimary, resolvePrimaryTag, warnIfUnknownOwner, } from "./shared/tags.js";
4
- export { ensureTaskDependsOnGraphIsAcyclic, resolveTaskDependencyState, buildDependencyState, formatTaskLine, } from "./shared/dependencies.js";
5
- export { appendTaskEvent, ensurePlanApprovedIfRequired, ensureVerificationSatisfiedIfRequired, isTransitionAllowed, ensureStatusTransitionAllowed, ensureCommentCommitAllowed, requireStructuredComment, enforceStatusCommitPolicy, isMajorStatusCommitTransition, readHeadCommit, readCommitInfo, defaultCommitEmojiForStatus, } from "./shared/transitions.js";
4
+ export { dependencyWarningMessages, ensureTaskDependsOnGraphIsAcyclic, resolveTaskDependencyState, buildDependencyState, formatTaskLine, } from "./shared/dependencies.js";
5
+ export { appendTaskEvent, ensurePlanApprovedIfRequired, ensureVerificationSatisfiedIfRequired, isTransitionAllowed, ensureStatusTransitionAllowed, ensureCommentCommitAllowed, resolveCommentCommitWarning, requireStructuredComment, enforceStatusCommitPolicy, resolveStatusCommitPolicyWarning, isMajorStatusCommitTransition, readHeadCommit, readCommitInfo, defaultCommitEmojiForStatus, } from "./shared/transitions.js";
6
6
  export { parseTaskListFilters, handleTaskListWarnings, taskTextBlob, } from "./shared/listing.js";
@@ -1 +1 @@
1
- {"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../../src/commands/task/start.ts"],"names":[],"mappings":"AAQA,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,2BAA2B,CAAC;AAiEnC,wBAAsB,QAAQ,CAAC,IAAI,EAAE;IACnC,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;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,mBAAmB,EAAE,OAAO,CAAC;IAC7B,KAAK,EAAE,OAAO,CAAC;IACf,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;CAChB,GAAG,OAAO,CAAC,MAAM,CAAC,CA6KlB"}
1
+ {"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../../src/commands/task/start.ts"],"names":[],"mappings":"AAQA,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,2BAA2B,CAAC;AAyEnC,wBAAsB,QAAQ,CAAC,IAAI,EAAE;IACnC,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;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,mBAAmB,EAAE,OAAO,CAAC;IAC7B,KAAK,EAAE,OAAO,CAAC;IACf,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;CAChB,GAAG,OAAO,CAAC,MAAM,CAAC,CAkLlB"}
@@ -5,7 +5,7 @@ import { CliError } from "../../shared/errors.js";
5
5
  import { commitFromComment } from "../guard/index.js";
6
6
  import { ensureActionApproved } from "../shared/approval-requirements.js";
7
7
  import { loadCommandContext, loadTaskFromContext, } from "../shared/task-backend.js";
8
- import { backendIsLocalFileBackend, getTaskStore } from "../shared/task-store.js";
8
+ import { appendTaskCommentIntent, appendTaskEventIntent, backendIsLocalFileBackend, getTaskStore, mutateTaskStore, setTaskFieldsIntent, touchTaskDocMetaIntent, } from "../shared/task-store.js";
9
9
  import { readDirectWorkLock } from "../../shared/direct-work-lock.js";
10
10
  import { appendTaskEvent, ensurePlanApprovedIfRequired, ensureCommentCommitAllowed, ensureStatusTransitionAllowed, extractTaskObservationSection, defaultCommitEmojiForStatus, extractDocSection, isVerifyStepsFilled, normalizeTaskDocVersion, nowIso, requiresVerifyStepsByPrimary, requireStructuredComment, resolveTaskDependencyState, resolvePrimaryTag, taskObservationSectionName, toStringArray, } from "./shared.js";
11
11
  function assertStartDocRequirements(task, config) {
@@ -63,14 +63,18 @@ export async function cmdStart(opts) {
63
63
  const task = useStore
64
64
  ? await store.get(opts.taskId)
65
65
  : await loadTaskFromContext({ ctx, taskId: opts.taskId });
66
- assertStartDocRequirements(task, ctx.config);
67
- ensurePlanApprovedIfRequired(task, ctx.config);
66
+ if (!useStore) {
67
+ assertStartDocRequirements(task, ctx.config);
68
+ ensurePlanApprovedIfRequired(task, ctx.config);
69
+ }
68
70
  const currentStatus = String(task.status || "TODO").toUpperCase();
69
- ensureStatusTransitionAllowed({
70
- currentStatus,
71
- nextStatus: "DOING",
72
- force: opts.force,
73
- });
71
+ if (!useStore) {
72
+ ensureStatusTransitionAllowed({
73
+ currentStatus,
74
+ nextStatus: "DOING",
75
+ force: opts.force,
76
+ });
77
+ }
74
78
  ensureCommentCommitAllowed({
75
79
  enabled: opts.commitFromComment,
76
80
  config: ctx.config,
@@ -110,35 +114,36 @@ export async function cmdStart(opts) {
110
114
  { author: opts.author, body: commentBody },
111
115
  ];
112
116
  const at = nowIso();
117
+ let currentStatusForCommit = currentStatus;
118
+ let primaryTagForCommit = resolvePrimaryTag(toStringArray(task.tags), ctx).primary;
113
119
  await (useStore
114
- ? store.patch(opts.taskId, (current) => {
120
+ ? mutateTaskStore(store, opts.taskId, (current) => {
115
121
  assertStartDocRequirements(current, ctx.config);
116
122
  ensurePlanApprovedIfRequired(current, ctx.config);
117
123
  const currentStatus = String(current.status || "TODO").toUpperCase();
124
+ currentStatusForCommit = currentStatus;
125
+ primaryTagForCommit = resolvePrimaryTag(toStringArray(current.tags), ctx).primary;
118
126
  ensureStatusTransitionAllowed({
119
127
  currentStatus,
120
128
  nextStatus: "DOING",
121
129
  force: opts.force,
122
130
  });
123
- return {
124
- task: { status: "DOING" },
125
- appendComments: [{ author: opts.author, body: commentBody }],
126
- appendEvents: [
127
- {
128
- type: "status",
129
- at,
130
- author: opts.author,
131
- from: currentStatus,
132
- to: "DOING",
133
- note: commentBody,
134
- },
135
- ],
136
- docMeta: {
137
- touch: true,
131
+ return [
132
+ setTaskFieldsIntent({ status: "DOING" }),
133
+ appendTaskCommentIntent({ author: opts.author, body: commentBody }),
134
+ appendTaskEventIntent({
135
+ type: "status",
136
+ at,
137
+ author: opts.author,
138
+ from: currentStatus,
139
+ to: "DOING",
140
+ note: commentBody,
141
+ }),
142
+ touchTaskDocMetaIntent({
138
143
  updatedBy: opts.author,
139
144
  version: normalizeTaskDocVersion(current.doc_version),
140
- },
141
- };
145
+ }),
146
+ ];
142
147
  })
143
148
  : ctx.taskBackend.writeTask({
144
149
  ...task,
@@ -174,10 +179,10 @@ export async function cmdStart(opts) {
174
179
  cwd: opts.cwd,
175
180
  rootOverride: opts.rootOverride,
176
181
  taskId: opts.taskId,
177
- primaryTag: resolvePrimaryTag(toStringArray(task.tags), ctx).primary,
182
+ primaryTag: primaryTagForCommit,
178
183
  executorAgent,
179
184
  author: opts.author,
180
- statusFrom: currentStatus,
185
+ statusFrom: currentStatusForCommit,
181
186
  statusTo: "DOING",
182
187
  commentBody: opts.body,
183
188
  formattedComment,
@@ -1 +1 @@
1
- {"version":3,"file":"verify-record.d.ts","sourceRoot":"","sources":["../../../src/commands/task/verify-record.ts"],"names":[],"mappings":"AAUA,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,2BAA2B,CAAC;AAanC,KAAK,WAAW,GAAG,IAAI,GAAG,cAAc,CAAC;AAqRzC,wBAAsB,eAAe,CAAC,IAAI,EAAE;IAC1C,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;CAChB,GAAG,OAAO,CAAC,MAAM,CAAC,CAElB;AAED,wBAAsB,mBAAmB,CAAC,IAAI,EAAE;IAC9C,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;CAChB,GAAG,OAAO,CAAC,MAAM,CAAC,CAMlB;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE;IAC1C,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,WAAW,CAAC;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;CAChB,GAAG,OAAO,CAAC,MAAM,CAAC,CAElB"}
1
+ {"version":3,"file":"verify-record.d.ts","sourceRoot":"","sources":["../../../src/commands/task/verify-record.ts"],"names":[],"mappings":"AAUA,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,2BAA2B,CAAC;AAqBnC,KAAK,WAAW,GAAG,IAAI,GAAG,cAAc,CAAC;AA0RzC,wBAAsB,eAAe,CAAC,IAAI,EAAE;IAC1C,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;CAChB,GAAG,OAAO,CAAC,MAAM,CAAC,CAElB;AAED,wBAAsB,mBAAmB,CAAC,IAAI,EAAE;IAC9C,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;CAChB,GAAG,OAAO,CAAC,MAAM,CAAC,CAMlB;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE;IAC1C,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,WAAW,CAAC;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;CAChB,GAAG,OAAO,CAAC,MAAM,CAAC,CAElB"}