agentplane 0.1.7 → 0.1.8

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 (54) hide show
  1. package/dist/backends/task-backend.d.ts +16 -0
  2. package/dist/backends/task-backend.d.ts.map +1 -1
  3. package/dist/backends/task-backend.js +44 -0
  4. package/dist/backends/task-index.d.ts.map +1 -1
  5. package/dist/backends/task-index.js +3 -6
  6. package/dist/cli/command-guide.d.ts.map +1 -1
  7. package/dist/cli/command-guide.js +4 -4
  8. package/dist/cli/help.d.ts.map +1 -1
  9. package/dist/cli/help.js +7 -5
  10. package/dist/cli/run-cli.d.ts.map +1 -1
  11. package/dist/cli/run-cli.js +18 -72
  12. package/dist/commands/backend.d.ts.map +1 -1
  13. package/dist/commands/backend.js +17 -2
  14. package/dist/commands/branch/index.d.ts.map +1 -1
  15. package/dist/commands/branch/index.js +3 -1
  16. package/dist/commands/pr/index.d.ts.map +1 -1
  17. package/dist/commands/pr/index.js +15 -12
  18. package/dist/commands/recipes.d.ts.map +1 -1
  19. package/dist/commands/recipes.js +67 -23
  20. package/dist/commands/shared/network-approval.d.ts +8 -0
  21. package/dist/commands/shared/network-approval.d.ts.map +1 -0
  22. package/dist/commands/shared/network-approval.js +25 -0
  23. package/dist/commands/shared/task-backend.d.ts.map +1 -1
  24. package/dist/commands/shared/task-backend.js +6 -0
  25. package/dist/commands/task/finish.d.ts.map +1 -1
  26. package/dist/commands/task/finish.js +2 -1
  27. package/dist/commands/task/index.d.ts +3 -0
  28. package/dist/commands/task/index.d.ts.map +1 -1
  29. package/dist/commands/task/index.js +3 -0
  30. package/dist/commands/task/migrate-doc.d.ts +8 -0
  31. package/dist/commands/task/migrate-doc.d.ts.map +1 -0
  32. package/dist/commands/task/migrate-doc.js +147 -0
  33. package/dist/commands/task/plan.d.ts +14 -0
  34. package/dist/commands/task/plan.d.ts.map +1 -0
  35. package/dist/commands/task/plan.js +217 -0
  36. package/dist/commands/task/scaffold.d.ts.map +1 -1
  37. package/dist/commands/task/scaffold.js +15 -4
  38. package/dist/commands/task/shared.d.ts +2 -0
  39. package/dist/commands/task/shared.d.ts.map +1 -1
  40. package/dist/commands/task/shared.js +29 -0
  41. package/dist/commands/task/start.d.ts.map +1 -1
  42. package/dist/commands/task/start.js +2 -1
  43. package/dist/commands/task/verify-record.d.ts +16 -0
  44. package/dist/commands/task/verify-record.d.ts.map +1 -0
  45. package/dist/commands/task/verify-record.js +277 -0
  46. package/dist/commands/task/verify.d.ts +1 -13
  47. package/dist/commands/task/verify.d.ts.map +1 -1
  48. package/dist/commands/task/verify.js +1 -362
  49. package/dist/commands/upgrade.d.ts.map +1 -1
  50. package/dist/commands/upgrade.js +17 -2
  51. package/dist/commands/workflow.d.ts +1 -1
  52. package/dist/commands/workflow.d.ts.map +1 -1
  53. package/dist/commands/workflow.js +1 -1
  54. package/package.json +2 -2
@@ -1,4 +1,18 @@
1
1
  import { type AgentplaneConfig, type ResolvedProject, type TaskRecord } from "@agentplaneorg/core";
2
+ export type PlanApprovalState = "pending" | "approved" | "rejected";
3
+ export type PlanApproval = {
4
+ state: PlanApprovalState;
5
+ updated_at: string | null;
6
+ updated_by: string | null;
7
+ note: string | null;
8
+ };
9
+ export type VerificationState = "pending" | "ok" | "needs_rework";
10
+ export type VerificationResult = {
11
+ state: VerificationState;
12
+ updated_at: string | null;
13
+ updated_by: string | null;
14
+ note: string | null;
15
+ };
2
16
  type ExtractTaskDoc = (body: string) => string;
3
17
  type MergeTaskDoc = (body: string, doc: string) => string;
4
18
  declare const extractTaskDoc: ExtractTaskDoc;
@@ -14,6 +28,8 @@ export type TaskData = {
14
28
  depends_on: string[];
15
29
  tags: string[];
16
30
  verify: string[];
31
+ plan_approval?: PlanApproval;
32
+ verification?: VerificationResult;
17
33
  commit?: {
18
34
  hash: string;
19
35
  message: string;
@@ -1 +1 @@
1
- {"version":3,"file":"task-backend.d.ts","sourceRoot":"","sources":["../../src/backends/task-backend.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"task-backend.d.ts","sourceRoot":"","sources":["../../src/backends/task-backend.ts"],"names":[],"mappings":"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"}
@@ -167,6 +167,34 @@ function normalizePriority(value) {
167
167
  return "high";
168
168
  return "med";
169
169
  }
170
+ function defaultPlanApproval() {
171
+ return { state: "pending", updated_at: null, updated_by: null, note: null };
172
+ }
173
+ function normalizePlanApproval(value) {
174
+ if (!isRecord(value))
175
+ return null;
176
+ const state = typeof value.state === "string" ? value.state : "";
177
+ if (state !== "pending" && state !== "approved" && state !== "rejected")
178
+ return null;
179
+ const updatedAt = value.updated_at === null || typeof value.updated_at === "string" ? value.updated_at : null;
180
+ const updatedBy = value.updated_by === null || typeof value.updated_by === "string" ? value.updated_by : null;
181
+ const note = value.note === null || typeof value.note === "string" ? value.note : null;
182
+ return { state, updated_at: updatedAt, updated_by: updatedBy, note };
183
+ }
184
+ function defaultVerificationResult() {
185
+ return { state: "pending", updated_at: null, updated_by: null, note: null };
186
+ }
187
+ function normalizeVerificationResult(value) {
188
+ if (!isRecord(value))
189
+ return null;
190
+ const state = typeof value.state === "string" ? value.state : "";
191
+ if (state !== "pending" && state !== "ok" && state !== "needs_rework")
192
+ return null;
193
+ const updatedAt = value.updated_at === null || typeof value.updated_at === "string" ? value.updated_at : null;
194
+ const updatedBy = value.updated_by === null || typeof value.updated_by === "string" ? value.updated_by : null;
195
+ const note = value.note === null || typeof value.note === "string" ? value.note : null;
196
+ return { state, updated_at: updatedAt, updated_by: updatedBy, note };
197
+ }
170
198
  export function taskRecordToData(record) {
171
199
  const fm = record.frontmatter;
172
200
  const comments = Array.isArray(fm.comments)
@@ -180,6 +208,8 @@ export function taskRecordToData(record) {
180
208
  typeof fm.commit.message === "string"
181
209
  ? { hash: fm.commit.hash, message: fm.commit.message }
182
210
  : null;
211
+ const planApproval = normalizePlanApproval(fm.plan_approval);
212
+ const verification = normalizeVerificationResult(fm.verification);
183
213
  const baseId = typeof fm.id === "string" ? fm.id : typeof record.id === "string" ? record.id : "";
184
214
  const task = {
185
215
  id: baseId.trim(),
@@ -191,6 +221,8 @@ export function taskRecordToData(record) {
191
221
  depends_on: normalizeDependsOn(fm.depends_on),
192
222
  tags: toStringArray(fm.tags),
193
223
  verify: toStringArray(fm.verify),
224
+ plan_approval: planApproval ?? undefined,
225
+ verification: verification ?? undefined,
194
226
  commit,
195
227
  comments,
196
228
  doc_version: typeof fm.doc_version === "number" ? fm.doc_version : undefined,
@@ -419,6 +451,18 @@ export class LocalBackend {
419
451
  payload[key] = existingFrontmatter[key];
420
452
  }
421
453
  }
454
+ if (payload.plan_approval === undefined && existingFrontmatter.plan_approval !== undefined) {
455
+ payload.plan_approval = existingFrontmatter.plan_approval;
456
+ }
457
+ if (payload.plan_approval === undefined) {
458
+ payload.plan_approval = defaultPlanApproval();
459
+ }
460
+ if (payload.verification === undefined && existingFrontmatter.verification !== undefined) {
461
+ payload.verification = existingFrontmatter.verification;
462
+ }
463
+ if (payload.verification === undefined) {
464
+ payload.verification = defaultVerificationResult();
465
+ }
422
466
  if (task.doc !== undefined) {
423
467
  const docText = String(task.doc ?? "");
424
468
  body = mergeTaskDoc(body, docText);
@@ -1 +1 @@
1
- {"version":3,"file":"task-index.d.ts","sourceRoot":"","sources":["../../src/backends/task-index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAElD,eAAO,MAAM,yBAAyB,IAAI,CAAC;AAG3C,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,QAAQ,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,cAAc,EAAE,CAAC,CAAC;IAClB,KAAK,EAAE,cAAc,EAAE,CAAC;CACzB,CAAC;AAEF,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAU7D;AAuBD,wBAAsB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAkBpF;AAED,wBAAsB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAM1F;AAED,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,QAAQ,EACd,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,GACd,cAAc,CAMhB"}
1
+ {"version":3,"file":"task-index.d.ts","sourceRoot":"","sources":["../../src/backends/task-index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAElD,eAAO,MAAM,yBAAyB,IAAI,CAAC;AAG3C,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,QAAQ,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,cAAc,EAAE,CAAC,CAAC;IAClB,KAAK,EAAE,cAAc,EAAE,CAAC;CACzB,CAAC;AAEF,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAU7D;AAuBD,wBAAsB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAkBpF;AAED,wBAAsB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAE1F;AAED,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,QAAQ,EACd,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,GACd,cAAc,CAMhB"}
@@ -1,5 +1,6 @@
1
- import { mkdir, readFile, rename, writeFile } from "node:fs/promises";
1
+ import { readFile } from "node:fs/promises";
2
2
  import path from "node:path";
3
+ import { atomicWriteFile } from "@agentplaneorg/core";
3
4
  export const TASK_INDEX_SCHEMA_VERSION = 1;
4
5
  const TASK_INDEX_FILENAME = "tasks-index.v1.json";
5
6
  export function resolveTaskIndexPath(tasksDir) {
@@ -69,11 +70,7 @@ export async function loadTaskIndex(indexPath) {
69
70
  return { schema_version: TASK_INDEX_SCHEMA_VERSION, tasks };
70
71
  }
71
72
  export async function saveTaskIndex(indexPath, index) {
72
- const dir = path.dirname(indexPath);
73
- await mkdir(dir, { recursive: true });
74
- const tmpPath = `${indexPath}.tmp-${process.pid}`;
75
- await writeFile(tmpPath, `${JSON.stringify(index, null, 2)}\n`, "utf8");
76
- await rename(tmpPath, indexPath);
73
+ await atomicWriteFile(indexPath, `${JSON.stringify(index, null, 2)}\n`, "utf8");
77
74
  }
78
75
  export function buildTaskIndexEntry(task, readmePath, mtimeMs) {
79
76
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"command-guide.d.ts","sourceRoot":"","sources":["../../src/cli/command-guide.ts"],"names":[],"mappings":"AA4KA,wBAAgB,SAAS,IAAI,MAAM,EAAE,CAEpC;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAOzD;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CA4EzC"}
1
+ {"version":3,"file":"command-guide.d.ts","sourceRoot":"","sources":["../../src/cli/command-guide.ts"],"names":[],"mappings":"AA6KA,wBAAgB,SAAS,IAAI,MAAM,EAAE,CAEpC;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAOzD;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CA4EzC"}
@@ -33,7 +33,7 @@ const CHEAT_SHEET_ROWS = [
33
33
  },
34
34
  {
35
35
  operation: "CODER/TESTER: verify task",
36
- command: "`agentplane verify <task-id>`",
36
+ command: '`agentplane verify <task-id> --ok|--rework --by <id> --note "..."` (record-only; appends to README)',
37
37
  },
38
38
  {
39
39
  operation: "REVIEWER: check PR artifacts",
@@ -77,7 +77,7 @@ const ROLE_GUIDES = [
77
77
  "- direct mode: work in the current checkout; optional `agentplane work start <task-id> --agent <ROLE> --slug <slug>` only scaffolds docs",
78
78
  "- branch_pr: `agentplane work start <task-id> --agent <ROLE> --slug <slug> --worktree`",
79
79
  '- Status updates: `agentplane start <task-id> --author <ROLE> --body "Start: ..."` / `agentplane block <task-id> --author <ROLE> --body "Blocked: ..."`',
80
- "- Verify: `agentplane verify <task-id>`",
80
+ '- Verify: `agentplane verify <task-id> --ok|--rework --by <ROLE> --note "..."`',
81
81
  '- PR artifacts (branch_pr): `agentplane pr open <task-id> --branch task/<task-id>/<slug> --author <ROLE>` / `agentplane pr update <task-id>` / `agentplane pr note <task-id> --author <ROLE> --body "..."`',
82
82
  '- Commit: `agentplane guard commit <task-id> -m "<emoji> <suffix> ..."` / `agentplane commit <task-id> -m "<emoji> <suffix> ..." --allow <path-prefix>`',
83
83
  ],
@@ -88,7 +88,7 @@ const ROLE_GUIDES = [
88
88
  "- direct mode: work in the current checkout; optional `agentplane work start <task-id> --agent <ROLE> --slug <slug>` only scaffolds docs",
89
89
  "- branch_pr: `agentplane work start <task-id> --agent <ROLE> --slug <slug> --worktree`",
90
90
  '- Status updates: `agentplane start <task-id> --author <ROLE> --body "Start: ..."` / `agentplane block <task-id> --author <ROLE> --body "Blocked: ..."`',
91
- "- Verify: `agentplane verify <task-id>`",
91
+ '- Verify: `agentplane verify <task-id> --ok|--rework --by <ROLE> --note "..."`',
92
92
  '- PR artifacts (branch_pr): `agentplane pr open <task-id> --branch task/<task-id>/<slug> --author <ROLE>` / `agentplane pr update <task-id>` / `agentplane pr note <task-id> --author <ROLE> --body "..."`',
93
93
  '- Commit: `agentplane guard commit <task-id> -m "<emoji> <suffix> ..."` / `agentplane commit <task-id> -m "<emoji> <suffix> ..." --allow <path-prefix>`',
94
94
  ],
@@ -185,7 +185,7 @@ export function renderQuickstart() {
185
185
  "- `agentplane task list` / `agentplane task show <task-id>`",
186
186
  '- `agentplane task new --title "..." --description "..." --priority med --owner CODER --tag <tag>`',
187
187
  '- `agentplane start <task-id> --author <ROLE> --body "Start: ..."`',
188
- "- `agentplane verify <task-id>`",
188
+ '- `agentplane verify <task-id> --ok|--rework --by <ROLE> --note "..."`',
189
189
  '- `agentplane finish <task-id> --author <ROLE> --body "Verified: ..."`',
190
190
  "",
191
191
  "## Branch workflow (branch_pr)",
@@ -1 +1 @@
1
- {"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../../src/cli/help.ts"],"names":[],"mappings":"AAAA,wBAAgB,UAAU,IAAI,MAAM,CA4HnC"}
1
+ {"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../../src/cli/help.ts"],"names":[],"mappings":"AAAA,wBAAgB,UAAU,IAAI,MAAM,CA8HnC"}
package/dist/cli/help.js CHANGED
@@ -21,7 +21,7 @@ export function renderHelp() {
21
21
  " agentplane init [--ide <codex|cursor|windsurf>] [--workflow <direct|branch_pr>] [--hooks <yes|no>] [--require-plan-approval <yes|no>] [--require-network-approval <yes|no>] [--require-verify-approval <yes|no>] [--recipes <list>] [--yes] [--force|--backup]",
22
22
  "",
23
23
  "Upgrade commands:",
24
- " agentplane upgrade [--tag <tag>] [--dry-run] [--no-backup] [--source <repo-url>] [--bundle <path|url>] [--checksum <path|url>]",
24
+ " agentplane upgrade [--tag <tag>] [--dry-run] [--no-backup] [--source <repo-url>] [--bundle <path|url>] [--checksum <path|url>] [--yes]",
25
25
  "",
26
26
  "Config commands:",
27
27
  " agentplane config show",
@@ -36,11 +36,11 @@ export function renderHelp() {
36
36
  "",
37
37
  "Recipe commands:",
38
38
  " agentplane recipes list [--full] [--tag <tag>]",
39
- " agentplane recipes list-remote [--refresh] [--index <path|url>]",
39
+ " agentplane recipes list-remote [--refresh] [--index <path|url>] [--yes]",
40
40
  " agentplane recipes info <id>",
41
41
  " agentplane recipes explain <id>",
42
- " agentplane recipes install --name <id> [--index <path|url>] [--refresh]",
43
- " agentplane recipes install --path <path> | --url <url>",
42
+ " agentplane recipes install --name <id> [--index <path|url>] [--refresh] [--yes]",
43
+ " agentplane recipes install --path <path> | --url <url> [--yes]",
44
44
  " agentplane recipes remove <id>",
45
45
  " agentplane recipes cache prune [--dry-run] [--all]",
46
46
  " agentplane scenario list",
@@ -108,6 +108,7 @@ export function renderHelp() {
108
108
  " agentplane task lint",
109
109
  " agentplane task normalize",
110
110
  " agentplane task migrate [--source <path>]",
111
+ " agentplane task migrate-doc [<task-id> ...] [--all] [--quiet]",
111
112
  "",
112
113
  "Start commands:",
113
114
  " agentplane start <task-id> --author <id> --body <text> [--commit-from-comment] [--force]",
@@ -116,7 +117,8 @@ export function renderHelp() {
116
117
  " agentplane block <task-id> --author <id> --body <text> [--commit-from-comment] [--force]",
117
118
  "",
118
119
  "Verify commands:",
119
- " agentplane verify <task-id> [--skip-if-unchanged] [--cwd <path>] [--log <path>] [--require]",
120
+ " agentplane verify <task-id> (--ok | --rework) --by <id> --note <text> [--details <text> | --file <path>] [--quiet]",
121
+ " agentplane task verify <ok|rework> <task-id> --by <id> --note <text> [--details <text> | --file <path>]",
120
122
  "",
121
123
  "Finish commands:",
122
124
  " agentplane finish <task-id> [<task-id>...] --author <id> --body <text> [--commit-from-comment] [--status-commit]",
@@ -1 +1 @@
1
- {"version":3,"file":"run-cli.d.ts","sourceRoot":"","sources":["../../src/cli/run-cli.ts"],"names":[],"mappings":"AA2iCA,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA63D5D"}
1
+ {"version":3,"file":"run-cli.d.ts","sourceRoot":"","sources":["../../src/cli/run-cli.ts"],"names":[],"mappings":"AAmjCA,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAw0D5D"}
@@ -1,7 +1,7 @@
1
- import { mkdir, readdir, readFile, rm, writeFile } from "node:fs/promises";
1
+ import { mkdir, readdir, readFile, rm } from "node:fs/promises";
2
2
  import os from "node:os";
3
3
  import path from "node:path";
4
- import { defaultConfig, findGitRoot, getStagedFiles, loadConfig, resolveProject, saveConfig, setByDottedKey, } from "@agentplaneorg/core";
4
+ import { atomicWriteFile, defaultConfig, findGitRoot, getStagedFiles, loadConfig, resolveProject, saveConfig, setByDottedKey, } from "@agentplaneorg/core";
5
5
  import { renderHelp } from "./help.js";
6
6
  import { listRoles, renderQuickstart, renderRole } from "./command-guide.js";
7
7
  import { filterAgentsByWorkflow, loadAgentTemplates, loadAgentsTemplate, } from "../agents/agents-template.js";
@@ -17,7 +17,7 @@ import { getVersion } from "../meta/version.js";
17
17
  import { cmdUpgrade } from "../commands/upgrade.js";
18
18
  import { BACKEND_SYNC_USAGE, BACKEND_SYNC_USAGE_EXAMPLE, cmdBackendSync, cmdSync, } from "../commands/backend.js";
19
19
  import { cmdRecipes, cmdScenario } from "../commands/recipes.js";
20
- import { BLOCK_USAGE, BLOCK_USAGE_EXAMPLE, BRANCH_BASE_USAGE, BRANCH_BASE_USAGE_EXAMPLE, BRANCH_REMOVE_USAGE, BRANCH_REMOVE_USAGE_EXAMPLE, BRANCH_STATUS_USAGE, BRANCH_STATUS_USAGE_EXAMPLE, CLEANUP_MERGED_USAGE, CLEANUP_MERGED_USAGE_EXAMPLE, COMMIT_USAGE, COMMIT_USAGE_EXAMPLE, FINISH_USAGE, FINISH_USAGE_EXAMPLE, GUARD_COMMIT_USAGE, GUARD_COMMIT_USAGE_EXAMPLE, HOOK_NAMES, INTEGRATE_USAGE, INTEGRATE_USAGE_EXAMPLE, PR_CHECK_USAGE, PR_CHECK_USAGE_EXAMPLE, PR_NOTE_USAGE, PR_NOTE_USAGE_EXAMPLE, PR_OPEN_USAGE, PR_OPEN_USAGE_EXAMPLE, PR_UPDATE_USAGE, PR_UPDATE_USAGE_EXAMPLE, START_USAGE, START_USAGE_EXAMPLE, TASK_DOC_SET_USAGE, TASK_DOC_SET_USAGE_EXAMPLE, TASK_DOC_SHOW_USAGE, TASK_DOC_SHOW_USAGE_EXAMPLE, VERIFY_USAGE, VERIFY_USAGE_EXAMPLE, WORK_START_USAGE, WORK_START_USAGE_EXAMPLE, cmdBlock, cmdBranchBaseGet, cmdBranchBaseClear, cmdBranchBaseExplain, cmdBranchBaseSet, cmdBranchRemove, cmdBranchStatus, cmdCleanupMerged, cmdCommit, cmdFinish, cmdGuardClean, cmdGuardCommit, cmdGuardSuggestAllow, cmdHooksInstall, cmdHooksRun, cmdHooksUninstall, cmdIntegrate, cmdPrCheck, cmdPrNote, cmdPrOpen, cmdPrUpdate, cmdReady, cmdStart, cmdTaskAdd, cmdTaskComment, cmdTaskDocSet, cmdTaskDocShow, cmdTaskExport, cmdTaskLint, cmdTaskMigrate, cmdTaskNew, cmdTaskNext, cmdTaskNormalize, cmdTaskScaffold, cmdTaskScrub, cmdTaskSearch, cmdTaskSetStatus, cmdTaskShow, cmdTaskUpdate, cmdTaskList, cmdVerify, cmdWorkStart, dedupeStrings, ensureInitCommit, gitInitRepo, promptInitBaseBranch, resolveInitBaseBranch, suggestAllowPrefixes, } from "../commands/workflow.js";
20
+ import { BLOCK_USAGE, BLOCK_USAGE_EXAMPLE, BRANCH_BASE_USAGE, BRANCH_BASE_USAGE_EXAMPLE, BRANCH_REMOVE_USAGE, BRANCH_REMOVE_USAGE_EXAMPLE, BRANCH_STATUS_USAGE, BRANCH_STATUS_USAGE_EXAMPLE, CLEANUP_MERGED_USAGE, CLEANUP_MERGED_USAGE_EXAMPLE, COMMIT_USAGE, COMMIT_USAGE_EXAMPLE, FINISH_USAGE, FINISH_USAGE_EXAMPLE, GUARD_COMMIT_USAGE, GUARD_COMMIT_USAGE_EXAMPLE, HOOK_NAMES, INTEGRATE_USAGE, INTEGRATE_USAGE_EXAMPLE, PR_CHECK_USAGE, PR_CHECK_USAGE_EXAMPLE, PR_NOTE_USAGE, PR_NOTE_USAGE_EXAMPLE, PR_OPEN_USAGE, PR_OPEN_USAGE_EXAMPLE, PR_UPDATE_USAGE, PR_UPDATE_USAGE_EXAMPLE, START_USAGE, START_USAGE_EXAMPLE, TASK_DOC_SET_USAGE, TASK_DOC_SET_USAGE_EXAMPLE, TASK_DOC_SHOW_USAGE, TASK_DOC_SHOW_USAGE_EXAMPLE, VERIFY_USAGE, VERIFY_USAGE_EXAMPLE, WORK_START_USAGE, WORK_START_USAGE_EXAMPLE, cmdBlock, cmdBranchBaseGet, cmdBranchBaseClear, cmdBranchBaseExplain, cmdBranchBaseSet, cmdBranchRemove, cmdBranchStatus, cmdCleanupMerged, cmdCommit, cmdFinish, cmdGuardClean, cmdGuardCommit, cmdGuardSuggestAllow, cmdHooksInstall, cmdHooksRun, cmdHooksUninstall, cmdIntegrate, cmdPrCheck, cmdPrNote, cmdPrOpen, cmdPrUpdate, cmdReady, cmdStart, cmdTaskAdd, cmdTaskComment, cmdTaskDocSet, cmdTaskDocShow, cmdTaskExport, cmdTaskLint, cmdTaskMigrate, cmdTaskMigrateDoc, cmdTaskNew, cmdTaskNext, cmdTaskNormalize, cmdTaskPlan, cmdTaskScaffold, cmdTaskScrub, cmdTaskSearch, cmdTaskSetStatus, cmdTaskShow, cmdTaskUpdate, cmdTaskList, cmdVerify, cmdTaskVerify, cmdWorkStart, dedupeStrings, ensureInitCommit, gitInitRepo, promptInitBaseBranch, resolveInitBaseBranch, suggestAllowPrefixes, } from "../commands/workflow.js";
21
21
  function parseGlobalArgs(argv) {
22
22
  let help = false;
23
23
  let version = false;
@@ -232,7 +232,7 @@ async function writeFileIfChanged(filePath, content) {
232
232
  if (code !== "ENOENT")
233
233
  throw err;
234
234
  }
235
- await writeFile(filePath, content, "utf8");
235
+ await atomicWriteFile(filePath, content, "utf8");
236
236
  return true;
237
237
  }
238
238
  async function cmdConfigShow(opts) {
@@ -631,8 +631,8 @@ async function cmdInit(opts) {
631
631
  custom_fields: { task_id: 1 },
632
632
  },
633
633
  };
634
- await writeFile(localBackendPath, `${JSON.stringify(localBackendPayload, null, 2)}\n`, "utf8");
635
- await writeFile(redmineBackendPath, `${JSON.stringify(redmineBackendPayload, null, 2)}\n`, "utf8");
634
+ await atomicWriteFile(localBackendPath, `${JSON.stringify(localBackendPayload, null, 2)}\n`, "utf8");
635
+ await atomicWriteFile(redmineBackendPath, `${JSON.stringify(redmineBackendPayload, null, 2)}\n`, "utf8");
636
636
  const agentsPath = path.join(resolved.gitRoot, "AGENTS.md");
637
637
  const installPaths = [
638
638
  path.relative(resolved.gitRoot, configPath),
@@ -642,7 +642,7 @@ async function cmdInit(opts) {
642
642
  if (!(await fileExists(agentsPath))) {
643
643
  const template = await loadAgentsTemplate();
644
644
  const filtered = filterAgentsByWorkflow(template, workflow);
645
- await writeFile(agentsPath, filtered, "utf8");
645
+ await atomicWriteFile(agentsPath, filtered, "utf8");
646
646
  wroteAgents = true;
647
647
  }
648
648
  if (wroteAgents) {
@@ -653,7 +653,7 @@ async function cmdInit(opts) {
653
653
  const targetPath = path.join(resolved.agentplaneDir, "agents", agent.fileName);
654
654
  if (await fileExists(targetPath))
655
655
  continue;
656
- await writeFile(targetPath, agent.contents, "utf8");
656
+ await atomicWriteFile(targetPath, agent.contents, "utf8");
657
657
  installPaths.push(path.relative(resolved.gitRoot, targetPath));
658
658
  }
659
659
  if (hooks) {
@@ -1010,6 +1010,9 @@ export async function runCli(argv) {
1010
1010
  if (namespace === "task" && command === "migrate") {
1011
1011
  return await cmdTaskMigrate({ cwd: process.cwd(), rootOverride: globals.root, args });
1012
1012
  }
1013
+ if (namespace === "task" && command === "migrate-doc") {
1014
+ return await cmdTaskMigrateDoc({ cwd: process.cwd(), rootOverride: globals.root, args });
1015
+ }
1013
1016
  if (namespace === "task" && command === "export") {
1014
1017
  return await cmdTaskExport({ cwd: process.cwd(), rootOverride: globals.root });
1015
1018
  }
@@ -1054,6 +1057,12 @@ export async function runCli(argv) {
1054
1057
  message: usageMessage(TASK_DOC_SET_USAGE, TASK_DOC_SET_USAGE_EXAMPLE),
1055
1058
  });
1056
1059
  }
1060
+ if (namespace === "task" && command === "plan") {
1061
+ return await cmdTaskPlan({ cwd: process.cwd(), rootOverride: globals.root, args });
1062
+ }
1063
+ if (namespace === "task" && command === "verify") {
1064
+ return await cmdTaskVerify({ cwd: process.cwd(), rootOverride: globals.root, args });
1065
+ }
1057
1066
  if (namespace === "task" && command === "comment") {
1058
1067
  const [taskId, ...restArgs] = args;
1059
1068
  if (!taskId) {
@@ -2375,74 +2384,11 @@ export async function runCli(argv) {
2375
2384
  message: usageMessage(VERIFY_USAGE, VERIFY_USAGE_EXAMPLE),
2376
2385
  });
2377
2386
  }
2378
- let cwdOverride;
2379
- let logPath;
2380
- let skipIfUnchanged = false;
2381
- let quiet = false;
2382
- let require = false;
2383
- let yes = false;
2384
- for (let i = 0; i < verifyArgs.length; i++) {
2385
- const arg = verifyArgs[i];
2386
- if (!arg)
2387
- continue;
2388
- if (arg === "--cwd") {
2389
- const next = verifyArgs[i + 1];
2390
- if (!next)
2391
- throw new CliError({
2392
- exitCode: 2,
2393
- code: "E_USAGE",
2394
- message: usageMessage(VERIFY_USAGE, VERIFY_USAGE_EXAMPLE),
2395
- });
2396
- cwdOverride = next;
2397
- i++;
2398
- continue;
2399
- }
2400
- if (arg === "--log") {
2401
- const next = verifyArgs[i + 1];
2402
- if (!next)
2403
- throw new CliError({
2404
- exitCode: 2,
2405
- code: "E_USAGE",
2406
- message: usageMessage(VERIFY_USAGE, VERIFY_USAGE_EXAMPLE),
2407
- });
2408
- logPath = next;
2409
- i++;
2410
- continue;
2411
- }
2412
- if (arg === "--skip-if-unchanged") {
2413
- skipIfUnchanged = true;
2414
- continue;
2415
- }
2416
- if (arg === "--quiet") {
2417
- quiet = true;
2418
- continue;
2419
- }
2420
- if (arg === "--require") {
2421
- require = true;
2422
- continue;
2423
- }
2424
- if (arg === "--yes") {
2425
- yes = true;
2426
- continue;
2427
- }
2428
- if (arg.startsWith("--")) {
2429
- throw new CliError({
2430
- exitCode: 2,
2431
- code: "E_USAGE",
2432
- message: usageMessage(VERIFY_USAGE, VERIFY_USAGE_EXAMPLE),
2433
- });
2434
- }
2435
- }
2436
2387
  return await cmdVerify({
2437
2388
  cwd: process.cwd(),
2438
2389
  rootOverride: globals.root,
2439
2390
  taskId,
2440
- execCwd: cwdOverride,
2441
- logPath,
2442
- skipIfUnchanged,
2443
- quiet,
2444
- require,
2445
- yes,
2391
+ args: verifyArgs,
2446
2392
  });
2447
2393
  }
2448
2394
  if (namespace === "integrate") {
@@ -1 +1 @@
1
- {"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../../src/commands/backend.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,kBAAkB,sIACsG,CAAC;AACtI,eAAO,MAAM,0BAA0B,mDAAmD,CAAC;AAC3F,eAAO,MAAM,UAAU,kIAC0G,CAAC;AAClI,eAAO,MAAM,kBAAkB,2CAA2C,CAAC;AA8J3E,wBAAsB,cAAc,CAAC,IAAI,EAAE;IACzC,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB,GAAG,OAAO,CAAC,MAAM,CAAC,CAgClB;AAED,wBAAsB,OAAO,CAAC,IAAI,EAAE;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB,GAAG,OAAO,CAAC,MAAM,CAAC,CAgClB"}
1
+ {"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../../src/commands/backend.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,kBAAkB,sIACsG,CAAC;AACtI,eAAO,MAAM,0BAA0B,mDAAmD,CAAC;AAC3F,eAAO,MAAM,UAAU,kIAC0G,CAAC;AAClI,eAAO,MAAM,kBAAkB,2CAA2C,CAAC;AA8J3E,wBAAsB,cAAc,CAAC,IAAI,EAAE;IACzC,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB,GAAG,OAAO,CAAC,MAAM,CAAC,CAuClB;AAED,wBAAsB,OAAO,CAAC,IAAI,EAAE;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB,GAAG,OAAO,CAAC,MAAM,CAAC,CAuClB"}
@@ -2,6 +2,7 @@ import { backendNotSupportedMessage, usageMessage } from "../cli/output.js";
2
2
  import { mapBackendError } from "../cli/error-map.js";
3
3
  import { CliError } from "../shared/errors.js";
4
4
  import { loadTaskBackend } from "../backends/task-backend.js";
5
+ import { ensureNetworkApproved } from "./shared/network-approval.js";
5
6
  export const BACKEND_SYNC_USAGE = "Usage: agentplane backend sync <id> --direction <push|pull> [--conflict <diff|prefer-local|prefer-remote|fail>] [--yes] [--quiet]";
6
7
  export const BACKEND_SYNC_USAGE_EXAMPLE = "agentplane backend sync local --direction pull";
7
8
  export const SYNC_USAGE = "Usage: agentplane sync [<id>] [--direction <push|pull>] [--conflict <diff|prefer-local|prefer-remote|fail>] [--yes] [--quiet]";
@@ -142,7 +143,7 @@ function parseSyncArgs(args) {
142
143
  export async function cmdBackendSync(opts) {
143
144
  const flags = parseBackendSyncArgs(opts.args);
144
145
  try {
145
- const { backend, backendId } = await loadTaskBackend({
146
+ const { backend, backendId, config } = await loadTaskBackend({
146
147
  cwd: opts.cwd,
147
148
  rootOverride: opts.rootOverride ?? null,
148
149
  });
@@ -160,6 +161,13 @@ export async function cmdBackendSync(opts) {
160
161
  message: backendNotSupportedMessage("sync()"),
161
162
  });
162
163
  }
164
+ if (backendId !== "local") {
165
+ await ensureNetworkApproved({
166
+ config,
167
+ yes: flags.confirm,
168
+ reason: `backend sync may access the network (backend: ${backendId})`,
169
+ });
170
+ }
163
171
  await backend.sync({
164
172
  direction: flags.direction,
165
173
  conflict: flags.conflict,
@@ -177,7 +185,7 @@ export async function cmdBackendSync(opts) {
177
185
  export async function cmdSync(opts) {
178
186
  const flags = parseSyncArgs(opts.args);
179
187
  try {
180
- const { backend, backendId } = await loadTaskBackend({
188
+ const { backend, backendId, config } = await loadTaskBackend({
181
189
  cwd: opts.cwd,
182
190
  rootOverride: opts.rootOverride ?? null,
183
191
  });
@@ -195,6 +203,13 @@ export async function cmdSync(opts) {
195
203
  message: backendNotSupportedMessage("sync()"),
196
204
  });
197
205
  }
206
+ if (backendId !== "local") {
207
+ await ensureNetworkApproved({
208
+ config,
209
+ yes: flags.confirm,
210
+ reason: `sync may access the network (backend: ${backendId})`,
211
+ });
212
+ }
198
213
  await backend.sync({
199
214
  direction: flags.direction,
200
215
  conflict: flags.conflict,
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/branch/index.ts"],"names":[],"mappings":"AAmCA,OAAO,EACL,WAAW,EACX,qBAAqB,EACrB,oBAAoB,EACpB,gBAAgB,GACjB,MAAM,sBAAsB,CAAC;AAE9B,eAAO,MAAM,iBAAiB,2EAC4C,CAAC;AAC3E,eAAO,MAAM,yBAAyB,yCAAyC,CAAC;AAChF,eAAO,MAAM,mBAAmB,sEACqC,CAAC;AACtE,eAAO,MAAM,2BAA2B,yCAAyC,CAAC;AAClF,eAAO,MAAM,mBAAmB,8FAC6D,CAAC;AAC9F,eAAO,MAAM,2BAA2B,iGACwD,CAAC;AACjG,eAAO,MAAM,gBAAgB,mFACqD,CAAC;AACnF,eAAO,MAAM,wBAAwB,kFAC4C,CAAC;AAClF,eAAO,MAAM,oBAAoB,mFACiD,CAAC;AACnF,eAAO,MAAM,4BAA4B,oCAAoC,CAAC;AAoD9E,wBAAsB,YAAY,CAAC,IAAI,EAAE;IACvC,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;CACnB,GAAG,OAAO,CAAC,MAAM,CAAC,CA2GlB;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE;IAC3C,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,OAAO,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;CAChB,GAAG,OAAO,CAAC,MAAM,CAAC,CA8IlB;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE;IAC3C,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,GAAG,OAAO,CAAC,MAAM,CAAC,CAQlB;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE;IAC3C,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,GAAG,OAAO,CAAC,MAAM,CAAC,CA4BlB;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE;IAC7C,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,GAAG,OAAO,CAAC,MAAM,CAAC,CAWlB;AAED,wBAAsB,oBAAoB,CAAC,IAAI,EAAE;IAC/C,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,GAAG,OAAO,CAAC,MAAM,CAAC,CA6ClB;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE;IAC1C,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,GAAG,OAAO,CAAC,MAAM,CAAC,CAmDlB;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE;IAC1C,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;CAChB,GAAG,OAAO,CAAC,MAAM,CAAC,CA4DlB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/branch/index.ts"],"names":[],"mappings":"AAoCA,OAAO,EACL,WAAW,EACX,qBAAqB,EACrB,oBAAoB,EACpB,gBAAgB,GACjB,MAAM,sBAAsB,CAAC;AAE9B,eAAO,MAAM,iBAAiB,2EAC4C,CAAC;AAC3E,eAAO,MAAM,yBAAyB,yCAAyC,CAAC;AAChF,eAAO,MAAM,mBAAmB,sEACqC,CAAC;AACtE,eAAO,MAAM,2BAA2B,yCAAyC,CAAC;AAClF,eAAO,MAAM,mBAAmB,8FAC6D,CAAC;AAC9F,eAAO,MAAM,2BAA2B,iGACwD,CAAC;AACjG,eAAO,MAAM,gBAAgB,mFACqD,CAAC;AACnF,eAAO,MAAM,wBAAwB,kFAC4C,CAAC;AAClF,eAAO,MAAM,oBAAoB,mFACiD,CAAC;AACnF,eAAO,MAAM,4BAA4B,oCAAoC,CAAC;AAoD9E,wBAAsB,YAAY,CAAC,IAAI,EAAE;IACvC,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;CACnB,GAAG,OAAO,CAAC,MAAM,CAAC,CA4GlB;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE;IAC3C,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,OAAO,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;CAChB,GAAG,OAAO,CAAC,MAAM,CAAC,CA8IlB;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE;IAC3C,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,GAAG,OAAO,CAAC,MAAM,CAAC,CAQlB;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE;IAC3C,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,GAAG,OAAO,CAAC,MAAM,CAAC,CA4BlB;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE;IAC7C,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,GAAG,OAAO,CAAC,MAAM,CAAC,CAWlB;AAED,wBAAsB,oBAAoB,CAAC,IAAI,EAAE;IAC/C,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,GAAG,OAAO,CAAC,MAAM,CAAC,CA6ClB;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE;IAC1C,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,GAAG,OAAO,CAAC,MAAM,CAAC,CAmDlB;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE;IAC1C,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;CAChB,GAAG,OAAO,CAAC,MAAM,CAAC,CA4DlB"}
@@ -13,6 +13,7 @@ import { gitBranchExists, gitCurrentBranch } from "../shared/git-ops.js";
13
13
  import { findWorktreeForBranch, gitListTaskBranches, parseTaskIdFromBranch, } from "../shared/git-worktree.js";
14
14
  import { isPathWithin, resolvePathFallback } from "../shared/path.js";
15
15
  import { loadBackendTask } from "../shared/task-backend.js";
16
+ import { ensurePlanApprovedIfRequired } from "../task/shared.js";
16
17
  export { gitInitRepo, resolveInitBaseBranch, promptInitBaseBranch, ensureInitCommit, } from "../shared/git-ops.js";
17
18
  export const BRANCH_BASE_USAGE = "Usage: agentplane branch base get|set|clear|explain [<name>|--current]";
18
19
  export const BRANCH_BASE_USAGE_EXAMPLE = "agentplane branch base set --current";
@@ -89,11 +90,12 @@ export async function cmdWorkStart(opts) {
89
90
  message: usageMessage(WORK_START_USAGE, WORK_START_USAGE_EXAMPLE),
90
91
  });
91
92
  }
92
- await loadBackendTask({
93
+ const { task } = await loadBackendTask({
93
94
  cwd: opts.cwd,
94
95
  rootOverride: opts.rootOverride,
95
96
  taskId: opts.taskId,
96
97
  });
98
+ ensurePlanApprovedIfRequired(task, loaded.config);
97
99
  const currentBranch = await gitCurrentBranch(resolved.gitRoot);
98
100
  let baseRef = currentBranch;
99
101
  if (mode === "branch_pr") {
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/pr/index.ts"],"names":[],"mappings":"AAmCA,eAAO,MAAM,aAAa,wEAAwE,CAAC;AACnG,eAAO,MAAM,qBAAqB,0DAA0D,CAAC;AAC7F,eAAO,MAAM,eAAe,0CAA0C,CAAC;AACvE,eAAO,MAAM,uBAAuB,6CAA6C,CAAC;AAClF,eAAO,MAAM,cAAc,yCAAyC,CAAC;AACrE,eAAO,MAAM,sBAAsB,4CAA4C,CAAC;AAChF,eAAO,MAAM,aAAa,oEAAoE,CAAC;AAC/F,eAAO,MAAM,qBAAqB,4EACuC,CAAC;AAC1E,eAAO,MAAM,eAAe,wJAC2H,CAAC;AACxJ,eAAO,MAAM,uBAAuB,0DAA0D,CAAC;AA2H/F,wBAAsB,SAAS,CAAC,IAAI,EAAE;IACpC,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;CACjB,GAAG,OAAO,CAAC,MAAM,CAAC,CAoElB;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE;IACtC,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,MAAM,CAAC,CAyFlB;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE;IACrC,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,MAAM,CAAC,CAgElB;AAED,wBAAsB,SAAS,CAAC,IAAI,EAAE;IACpC,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,CAwClB;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE;IACvC,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;IAC7C,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;CAChB,GAAG,OAAO,CAAC,MAAM,CAAC,CAigBlB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/pr/index.ts"],"names":[],"mappings":"AAwCA,eAAO,MAAM,aAAa,wEAAwE,CAAC;AACnG,eAAO,MAAM,qBAAqB,0DAA0D,CAAC;AAC7F,eAAO,MAAM,eAAe,0CAA0C,CAAC;AACvE,eAAO,MAAM,uBAAuB,6CAA6C,CAAC;AAClF,eAAO,MAAM,cAAc,yCAAyC,CAAC;AACrE,eAAO,MAAM,sBAAsB,4CAA4C,CAAC;AAChF,eAAO,MAAM,aAAa,oEAAoE,CAAC;AAC/F,eAAO,MAAM,qBAAqB,4EACuC,CAAC;AAC1E,eAAO,MAAM,eAAe,wJAC2H,CAAC;AACxJ,eAAO,MAAM,uBAAuB,0DAA0D,CAAC;AA2H/F,wBAAsB,SAAS,CAAC,IAAI,EAAE;IACpC,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;CACjB,GAAG,OAAO,CAAC,MAAM,CAAC,CAoElB;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE;IACtC,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,MAAM,CAAC,CAyFlB;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE;IACrC,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,MAAM,CAAC,CAgElB;AAED,wBAAsB,SAAS,CAAC,IAAI,EAAE;IACpC,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,CAwClB;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE;IACvC,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;IAC7C,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;CAChB,GAAG,OAAO,CAAC,MAAM,CAAC,CAogBlB"}
@@ -1,6 +1,6 @@
1
- import { mkdir, readFile, writeFile } from "node:fs/promises";
1
+ import { mkdir, readFile } from "node:fs/promises";
2
2
  import path from "node:path";
3
- import { loadConfig, resolveBaseBranch, resolveProject, } from "@agentplaneorg/core";
3
+ import { atomicWriteFile, loadConfig, resolveBaseBranch, resolveProject, } from "@agentplaneorg/core";
4
4
  import { mapBackendError, mapCoreError } from "../../cli/error-map.js";
5
5
  import { fileExists } from "../../cli/fs-utils.js";
6
6
  import { successMessage, unknownEntityMessage, usageMessage, workflowModeMessage, } from "../../cli/output.js";
@@ -14,6 +14,7 @@ import { appendVerifyLog, extractLastVerifiedSha, parsePrMeta, runShellCommand,
14
14
  import { isPathWithin } from "../shared/path.js";
15
15
  import { loadBackendTask } from "../shared/task-backend.js";
16
16
  import { cmdFinish } from "../task/index.js";
17
+ import { ensurePlanApprovedIfRequired, ensureVerificationSatisfiedIfRequired, } from "../task/shared.js";
17
18
  export const PR_OPEN_USAGE = "Usage: agentplane pr open <task-id> --author <id> [--branch <name>]";
18
19
  export const PR_OPEN_USAGE_EXAMPLE = "agentplane pr open 202602030608-F1Q8AB --author CODER";
19
20
  export const PR_UPDATE_USAGE = "Usage: agentplane pr update <task-id>";
@@ -167,14 +168,14 @@ export async function cmdPrOpen(opts) {
167
168
  last_verified_at: meta?.last_verified_at ?? null,
168
169
  verify: meta?.verify ?? { status: "skipped" },
169
170
  };
170
- await writeFile(metaPath, `${JSON.stringify(nextMeta, null, 2)}\n`, "utf8");
171
+ await atomicWriteFile(metaPath, `${JSON.stringify(nextMeta, null, 2)}\n`, "utf8");
171
172
  if (!(await fileExists(diffstatPath)))
172
- await writeFile(diffstatPath, "", "utf8");
173
+ await atomicWriteFile(diffstatPath, "", "utf8");
173
174
  if (!(await fileExists(verifyLogPath)))
174
- await writeFile(verifyLogPath, "", "utf8");
175
+ await atomicWriteFile(verifyLogPath, "", "utf8");
175
176
  if (!(await fileExists(reviewPath))) {
176
177
  const review = renderPrReviewTemplate({ author, createdAt, branch });
177
- await writeFile(reviewPath, review, "utf8");
178
+ await atomicWriteFile(reviewPath, review, "utf8");
178
179
  }
179
180
  process.stdout.write(`${successMessage("pr open", path.relative(resolved.gitRoot, prDir))}\n`);
180
181
  return 0;
@@ -228,7 +229,7 @@ export async function cmdPrUpdate(opts) {
228
229
  const branch = await gitCurrentBranch(resolved.gitRoot);
229
230
  const { stdout: diffStatOut } = await execFileAsync("git", ["diff", "--stat", `${baseBranch}...HEAD`], { cwd: resolved.gitRoot, env: gitEnv() });
230
231
  const diffstat = diffStatOut.trimEnd();
231
- await writeFile(diffstatPath, diffstat ? `${diffstat}\n` : "", "utf8");
232
+ await atomicWriteFile(diffstatPath, diffstat ? `${diffstat}\n` : "", "utf8");
232
233
  const { stdout: headOut } = await execFileAsync("git", ["rev-parse", "HEAD"], {
233
234
  cwd: resolved.gitRoot,
234
235
  env: gitEnv(),
@@ -245,7 +246,7 @@ export async function cmdPrUpdate(opts) {
245
246
  ];
246
247
  const reviewText = await readFile(reviewPath, "utf8");
247
248
  const nextReview = updateAutoSummaryBlock(reviewText, summaryLines.join("\n"));
248
- await writeFile(reviewPath, nextReview, "utf8");
249
+ await atomicWriteFile(reviewPath, nextReview, "utf8");
249
250
  const rawMeta = await readFile(metaPath, "utf8");
250
251
  const meta = parsePrMeta(rawMeta, opts.taskId);
251
252
  const nextMeta = {
@@ -255,7 +256,7 @@ export async function cmdPrUpdate(opts) {
255
256
  last_verified_sha: meta.last_verified_sha ?? null,
256
257
  last_verified_at: meta.last_verified_at ?? null,
257
258
  };
258
- await writeFile(metaPath, `${JSON.stringify(nextMeta, null, 2)}\n`, "utf8");
259
+ await atomicWriteFile(metaPath, `${JSON.stringify(nextMeta, null, 2)}\n`, "utf8");
259
260
  process.stdout.write(`${successMessage("pr update", path.relative(resolved.gitRoot, prDir))}\n`);
260
261
  return 0;
261
262
  }
@@ -359,7 +360,7 @@ export async function cmdPrNote(opts) {
359
360
  }
360
361
  const review = await readFile(reviewPath, "utf8");
361
362
  const updated = appendHandoffNote(review, `${author}: ${body}`);
362
- await writeFile(reviewPath, updated, "utf8");
363
+ await atomicWriteFile(reviewPath, updated, "utf8");
363
364
  process.stdout.write(`${successMessage("pr note", opts.taskId)}\n`);
364
365
  return 0;
365
366
  }
@@ -390,6 +391,8 @@ export async function cmdIntegrate(opts) {
390
391
  message: workflowModeMessage(loaded.config.workflow_mode, "branch_pr"),
391
392
  });
392
393
  }
394
+ ensurePlanApprovedIfRequired(task, loaded.config);
395
+ ensureVerificationSatisfiedIfRequired(task, loaded.config);
393
396
  await ensureGitClean({ cwd: opts.cwd, rootOverride: opts.rootOverride });
394
397
  if (opts.base?.trim().length === 0) {
395
398
  throw new CliError({
@@ -793,9 +796,9 @@ export async function cmdIntegrate(opts) {
793
796
  ? { ...mergedMeta.verify, status: "pass" }
794
797
  : { status: "pass", command: verifyCommands.join(" && ") };
795
798
  }
796
- await writeFile(metaPath, `${JSON.stringify(nextMeta, null, 2)}\n`, "utf8");
799
+ await atomicWriteFile(metaPath, `${JSON.stringify(nextMeta, null, 2)}\n`, "utf8");
797
800
  const diffstat = await gitDiffStat(resolved.gitRoot, baseShaBeforeMerge, branch);
798
- await writeFile(diffstatPath, diffstat ? `${diffstat}\n` : "", "utf8");
801
+ await atomicWriteFile(diffstatPath, diffstat ? `${diffstat}\n` : "", "utf8");
799
802
  const verifyDesc = verifyCommands.length === 0
800
803
  ? "skipped(no commands)"
801
804
  : shouldRunVerify
@@ -1 +1 @@
1
- {"version":3,"file":"recipes.d.ts","sourceRoot":"","sources":["../../src/commands/recipes.ts"],"names":[],"mappings":"AA2kEA,wBAAsB,UAAU,CAAC,IAAI,EAAE;IACrC,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB,GAAG,OAAO,CAAC,MAAM,CAAC,CAwGlB;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE;IACtC,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB,GAAG,OAAO,CAAC,MAAM,CAAC,CAoDlB"}
1
+ {"version":3,"file":"recipes.d.ts","sourceRoot":"","sources":["../../src/commands/recipes.ts"],"names":[],"mappings":"AAinEA,wBAAsB,UAAU,CAAC,IAAI,EAAE;IACrC,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB,GAAG,OAAO,CAAC,MAAM,CAAC,CAyGlB;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE;IACtC,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB,GAAG,OAAO,CAAC,MAAM,CAAC,CAoDlB"}