@rryando/arcs 3.1.2 → 3.2.1

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 (128) hide show
  1. package/README.md +65 -40
  2. package/dist/cli/arcs-orchestrate.d.ts +1 -1
  3. package/dist/cli/arcs-orchestrate.d.ts.map +1 -1
  4. package/dist/cli/arcs-orchestrate.js +8 -4
  5. package/dist/cli/arcs-orchestrate.js.map +1 -1
  6. package/dist/cli/arg-parser.d.ts +3 -3
  7. package/dist/cli/arg-parser.d.ts.map +1 -1
  8. package/dist/cli/arg-parser.js +1 -1
  9. package/dist/cli/arg-parser.js.map +1 -1
  10. package/dist/cli/bundle-installer.d.ts +11 -0
  11. package/dist/cli/bundle-installer.d.ts.map +1 -1
  12. package/dist/cli/bundle-installer.js +14 -4
  13. package/dist/cli/bundle-installer.js.map +1 -1
  14. package/dist/cli/command-registry.d.ts +61 -6
  15. package/dist/cli/command-registry.d.ts.map +1 -1
  16. package/dist/cli/command-registry.js.map +1 -1
  17. package/dist/cli/commands/batch.js +17 -16
  18. package/dist/cli/commands/batch.js.map +1 -1
  19. package/dist/cli/commands/brief.js +71 -74
  20. package/dist/cli/commands/brief.js.map +1 -1
  21. package/dist/cli/commands/bundle.js +79 -31
  22. package/dist/cli/commands/bundle.js.map +1 -1
  23. package/dist/cli/commands/dependency.js +47 -43
  24. package/dist/cli/commands/dependency.js.map +1 -1
  25. package/dist/cli/commands/diagnostics.js +1 -1
  26. package/dist/cli/commands/diagnostics.js.map +1 -1
  27. package/dist/cli/commands/diagram.js +96 -58
  28. package/dist/cli/commands/diagram.js.map +1 -1
  29. package/dist/cli/commands/done.js +19 -18
  30. package/dist/cli/commands/done.js.map +1 -1
  31. package/dist/cli/commands/graph.js +12 -10
  32. package/dist/cli/commands/graph.js.map +1 -1
  33. package/dist/cli/commands/index.d.ts +1 -0
  34. package/dist/cli/commands/index.d.ts.map +1 -1
  35. package/dist/cli/commands/index.js +1 -0
  36. package/dist/cli/commands/index.js.map +1 -1
  37. package/dist/cli/commands/knowledge-search.js +11 -12
  38. package/dist/cli/commands/knowledge-search.js.map +1 -1
  39. package/dist/cli/commands/knowledge.js +63 -56
  40. package/dist/cli/commands/knowledge.js.map +1 -1
  41. package/dist/cli/commands/loop.js +40 -36
  42. package/dist/cli/commands/loop.js.map +1 -1
  43. package/dist/cli/commands/maintenance.js +30 -19
  44. package/dist/cli/commands/maintenance.js.map +1 -1
  45. package/dist/cli/commands/next.js +9 -8
  46. package/dist/cli/commands/next.js.map +1 -1
  47. package/dist/cli/commands/plan.js +61 -55
  48. package/dist/cli/commands/plan.js.map +1 -1
  49. package/dist/cli/commands/project-updates.js +37 -33
  50. package/dist/cli/commands/project-updates.js.map +1 -1
  51. package/dist/cli/commands/project.js +33 -23
  52. package/dist/cli/commands/project.js.map +1 -1
  53. package/dist/cli/commands/proposal.d.ts +2 -0
  54. package/dist/cli/commands/proposal.d.ts.map +1 -0
  55. package/dist/cli/commands/proposal.js +509 -0
  56. package/dist/cli/commands/proposal.js.map +1 -0
  57. package/dist/cli/commands/remember.js +6 -6
  58. package/dist/cli/commands/remember.js.map +1 -1
  59. package/dist/cli/commands/status.js +9 -8
  60. package/dist/cli/commands/status.js.map +1 -1
  61. package/dist/cli/commands/task.d.ts +1 -5
  62. package/dist/cli/commands/task.d.ts.map +1 -1
  63. package/dist/cli/commands/task.js +261 -248
  64. package/dist/cli/commands/task.js.map +1 -1
  65. package/dist/cli/commands/utility.d.ts.map +1 -1
  66. package/dist/cli/commands/utility.js +39 -35
  67. package/dist/cli/commands/utility.js.map +1 -1
  68. package/dist/cli/dag-commands.js.map +1 -1
  69. package/dist/cli/help-generator.d.ts +3 -3
  70. package/dist/cli/help-generator.d.ts.map +1 -1
  71. package/dist/cli/help-generator.js +1 -1
  72. package/dist/cli/help-generator.js.map +1 -1
  73. package/dist/cli/md-renderer.d.ts.map +1 -1
  74. package/dist/cli/md-renderer.js +45 -11
  75. package/dist/cli/md-renderer.js.map +1 -1
  76. package/dist/cli/setup.d.ts.map +1 -1
  77. package/dist/cli/setup.js +235 -113
  78. package/dist/cli/setup.js.map +1 -1
  79. package/dist/utils/diagram-generator.d.ts.map +1 -1
  80. package/dist/utils/diagram-generator.js +8 -1
  81. package/dist/utils/diagram-generator.js.map +1 -1
  82. package/dist/utils/diagram-store.d.ts +45 -0
  83. package/dist/utils/diagram-store.d.ts.map +1 -0
  84. package/dist/utils/diagram-store.js +99 -0
  85. package/dist/utils/diagram-store.js.map +1 -0
  86. package/dist/utils/errors.d.ts.map +1 -1
  87. package/dist/utils/errors.js.map +1 -1
  88. package/dist/utils/graphify-knowledge.d.ts +19 -3
  89. package/dist/utils/graphify-knowledge.d.ts.map +1 -1
  90. package/dist/utils/graphify-knowledge.js +45 -58
  91. package/dist/utils/graphify-knowledge.js.map +1 -1
  92. package/dist/utils/graphify.d.ts +58 -3
  93. package/dist/utils/graphify.d.ts.map +1 -1
  94. package/dist/utils/graphify.js +175 -42
  95. package/dist/utils/graphify.js.map +1 -1
  96. package/dist/utils/json-schemas.d.ts +153 -0
  97. package/dist/utils/json-schemas.d.ts.map +1 -1
  98. package/dist/utils/json-schemas.js +23 -0
  99. package/dist/utils/json-schemas.js.map +1 -1
  100. package/dist/utils/proposal-store.d.ts +64 -0
  101. package/dist/utils/proposal-store.d.ts.map +1 -0
  102. package/dist/utils/proposal-store.js +161 -0
  103. package/dist/utils/proposal-store.js.map +1 -0
  104. package/dist/utils/storage-utils.d.ts +1 -1
  105. package/dist/utils/storage-utils.d.ts.map +1 -1
  106. package/dist/utils/storage-utils.js +1 -1
  107. package/dist/utils/storage-utils.js.map +1 -1
  108. package/dist/utils/task-store.d.ts +20 -0
  109. package/dist/utils/task-store.d.ts.map +1 -1
  110. package/dist/utils/task-store.js +42 -5
  111. package/dist/utils/task-store.js.map +1 -1
  112. package/dist/utils/toposort.d.ts +1 -1
  113. package/dist/utils/toposort.d.ts.map +1 -1
  114. package/dist/utils/toposort.js +5 -4
  115. package/dist/utils/toposort.js.map +1 -1
  116. package/dist/utils/workflow-policy.d.ts +1 -1
  117. package/dist/utils/workflow-policy.d.ts.map +1 -1
  118. package/dist/utils/workflow-policy.js +1 -1
  119. package/dist/utils/workflow-policy.js.map +1 -1
  120. package/opencode/arcs/bundle-runtime.json +3 -0
  121. package/opencode/arcs/manifest.json +47 -66
  122. package/opencode/arcs/prompts/arcs-orchestrate-caveman.txt +8 -4
  123. package/opencode/arcs/prompts/arcs-orchestrate.txt +8 -4
  124. package/opencode/arcs/skills/enriching-graphify-proposals/SKILL.md +170 -0
  125. package/opencode/arcs/skills/init-project/SKILL.md +18 -11
  126. package/opencode/arcs/skills/to-diagram/SKILL.md +1 -1
  127. package/package.json +1 -1
  128. package/scripts/deploy-claudecode-bundle.mjs +414 -0
@@ -3,19 +3,20 @@
3
3
  // ---------------------------------------------------------------------------
4
4
  import { listTasks, readKnowledgeIndex, readPlanIndex } from "../../utils/project-memory.js";
5
5
  import { resolveProject } from "../../utils/project-resolver.js";
6
- import { defineCommand } from "../command-registry.js";
6
+ import { defineCommand, } from "../command-registry.js";
7
7
  import { success } from "../output-envelope.js";
8
8
  // ---------------------------------------------------------------------------
9
+ const statusParams = {
10
+ slug: {
11
+ type: "string",
12
+ positional: 0,
13
+ description: "Project slug or path",
14
+ },
15
+ };
9
16
  defineCommand({
10
17
  path: "status",
11
18
  description: "Quick progress overview for a project",
12
- params: {
13
- slug: {
14
- type: "string",
15
- positional: 0,
16
- description: "Project slug or path",
17
- },
18
- },
19
+ params: statusParams,
19
20
  handler: handleStatus,
20
21
  });
21
22
  // ---------------------------------------------------------------------------
@@ -1 +1 @@
1
- {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,2 @@
1
- import { type TaskStatus } from "../../utils/project-memory.js";
2
- export declare function attemptDiagramUpdate(slug: string, planId: string, nodeId: string, status: TaskStatus): {
3
- diagramUpdated: boolean;
4
- diagramError?: string;
5
- };
1
+ export {};
6
2
  //# sourceMappingURL=task.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"task.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/task.ts"],"names":[],"mappings":"AASA,OAAO,EAML,KAAK,UAAU,EAEhB,MAAM,+BAA+B,CAAC;AAmPvC,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,UAAU,GACjB;IAAE,cAAc,EAAE,OAAO,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,CA4BpD"}
1
+ {"version":3,"file":"task.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/task.ts"],"names":[],"mappings":""}
@@ -1,13 +1,11 @@
1
1
  // ---------------------------------------------------------------------------
2
2
  // Task commands — list, get, create, transition, update (registry-based)
3
3
  // ---------------------------------------------------------------------------
4
- import { execSync } from "node:child_process";
5
4
  import { existsSync } from "node:fs";
6
- import { homedir } from "node:os";
7
- import { resolve } from "node:path";
8
- import { getDataDir, getProjectDir } from "../../utils/paths.js";
5
+ import { attemptDiagramUpdate } from "../../utils/diagram-store.js";
6
+ import { getProjectDir } from "../../utils/paths.js";
9
7
  import { createTask, deleteTask, getTask, listTasks, updateTask, } from "../../utils/project-memory.js";
10
- import { defineCommand, ERROR_CODES, } from "../command-registry.js";
8
+ import { defineCommand, ERROR_CODES } from "../command-registry.js";
11
9
  import { failure, success } from "../output-envelope.js";
12
10
  // ---------------------------------------------------------------------------
13
11
  // task list
@@ -34,41 +32,36 @@ defineCommand({
34
32
  description: "Comma-separated field names to include in output",
35
33
  },
36
34
  },
37
- handler: handleTaskList,
35
+ handler: async (params, _flags) => {
36
+ const { slug, status, priority, planId, fields } = params;
37
+ const projectDir = getProjectDir(slug);
38
+ if (!existsSync(projectDir)) {
39
+ return failure(ERROR_CODES.PROJECT_NOT_FOUND, `Project "${slug}" not found`, {
40
+ hint: "Run 'arcs project list' to see available projects.",
41
+ });
42
+ }
43
+ let tasks = await listTasks(projectDir, { status });
44
+ if (priority) {
45
+ tasks = tasks.filter((t) => t.priority === priority);
46
+ }
47
+ if (planId) {
48
+ tasks = tasks.filter((t) => t.planId === planId);
49
+ }
50
+ if (fields) {
51
+ const keys = fields.split(",").map((k) => k.trim());
52
+ const projected = tasks.map((item) => {
53
+ const out = {};
54
+ for (const key of keys) {
55
+ if (key in item)
56
+ out[key] = item[key];
57
+ }
58
+ return out;
59
+ });
60
+ return success(projected);
61
+ }
62
+ return success(tasks);
63
+ },
38
64
  });
39
- async function handleTaskList(params, _flags) {
40
- const slug = params.slug;
41
- const status = params.status;
42
- const priority = params.priority;
43
- const planId = params.planId;
44
- const fields = params.fields;
45
- const projectDir = getProjectDir(slug);
46
- if (!existsSync(projectDir)) {
47
- return failure(ERROR_CODES.PROJECT_NOT_FOUND, `Project "${slug}" not found`, {
48
- hint: "Run 'arcs project list' to see available projects.",
49
- });
50
- }
51
- let tasks = await listTasks(projectDir, { status });
52
- if (priority) {
53
- tasks = tasks.filter((t) => t.priority === priority);
54
- }
55
- if (planId) {
56
- tasks = tasks.filter((t) => t.planId === planId);
57
- }
58
- if (fields) {
59
- const keys = fields.split(",").map((k) => k.trim());
60
- const projected = tasks.map((item) => {
61
- const out = {};
62
- for (const key of keys) {
63
- if (key in item)
64
- out[key] = item[key];
65
- }
66
- return out;
67
- });
68
- return success(projected);
69
- }
70
- return success(tasks);
71
- }
72
65
  // ---------------------------------------------------------------------------
73
66
  // task get
74
67
  // ---------------------------------------------------------------------------
@@ -79,25 +72,23 @@ defineCommand({
79
72
  slug: { type: "string", required: true, positional: 0, description: "Project slug" },
80
73
  taskId: { type: "string", required: true, positional: 1, description: "Task ID" },
81
74
  },
82
- handler: handleTaskGet,
75
+ handler: async (params, _flags) => {
76
+ const { slug, taskId } = params;
77
+ const projectDir = getProjectDir(slug);
78
+ if (!existsSync(projectDir)) {
79
+ return failure(ERROR_CODES.PROJECT_NOT_FOUND, `Project "${slug}" not found`, {
80
+ hint: "Run 'arcs project list' to see available projects.",
81
+ });
82
+ }
83
+ try {
84
+ const task = await getTask(projectDir, taskId);
85
+ return success(task);
86
+ }
87
+ catch (err) {
88
+ return failure(ERROR_CODES.ENTITY_NOT_FOUND, err instanceof Error ? err.message : String(err));
89
+ }
90
+ },
83
91
  });
84
- async function handleTaskGet(params, _flags) {
85
- const slug = params.slug;
86
- const taskId = params.taskId;
87
- const projectDir = getProjectDir(slug);
88
- if (!existsSync(projectDir)) {
89
- return failure(ERROR_CODES.PROJECT_NOT_FOUND, `Project "${slug}" not found`, {
90
- hint: "Run 'arcs project list' to see available projects.",
91
- });
92
- }
93
- try {
94
- const task = await getTask(projectDir, taskId);
95
- return success(task);
96
- }
97
- catch (err) {
98
- return failure(ERROR_CODES.ENTITY_NOT_FOUND, err instanceof Error ? err.message : String(err));
99
- }
100
- }
101
92
  // ---------------------------------------------------------------------------
102
93
  // task create
103
94
  // ---------------------------------------------------------------------------
@@ -122,42 +113,75 @@ defineCommand({
122
113
  description: "Initial status",
123
114
  enum: ["backlog", "in_progress", "done", "cancelled"],
124
115
  },
116
+ "source-files": {
117
+ type: "string",
118
+ description: "Comma-separated source file refs (path[:anchor])",
119
+ },
120
+ scope: { type: "string", description: "Per-node %% scope: metadata for diagrams" },
121
+ acceptance: { type: "string", description: "Per-node %% acceptance: metadata for diagrams" },
122
+ verify: { type: "string", description: "Per-node %% verify: command for diagrams" },
123
+ skill: { type: "string", description: "Per-node %% skill: name for diagrams" },
124
+ },
125
+ handler: async (params, flags) => {
126
+ const { slug, title, planId, priority, status, scope, acceptance, verify, skill } = params;
127
+ const dependsOnRaw = params.dependsOn;
128
+ const dependsOn = dependsOnRaw
129
+ ? dependsOnRaw
130
+ .split(",")
131
+ .map((s) => s.trim())
132
+ .filter(Boolean)
133
+ : undefined;
134
+ const sourceFilesRaw = params["source-files"];
135
+ const sourceFiles = sourceFilesRaw
136
+ ? sourceFilesRaw.split(",").map((s) => {
137
+ const [path, anchor] = s.trim().split(":");
138
+ return anchor ? { path, anchor } : { path };
139
+ })
140
+ : undefined;
141
+ const projectDir = getProjectDir(slug);
142
+ if (!existsSync(projectDir)) {
143
+ return failure(ERROR_CODES.PROJECT_NOT_FOUND, `Project "${slug}" not found`, {
144
+ hint: "Run 'arcs project list' to see available projects.",
145
+ });
146
+ }
147
+ if (flags.dryRun) {
148
+ return success({
149
+ dryRun: true,
150
+ wouldCreate: {
151
+ title,
152
+ slug,
153
+ planId,
154
+ priority,
155
+ status,
156
+ dependsOn,
157
+ ...(sourceFiles && { sourceFiles }),
158
+ ...(scope && { scope }),
159
+ ...(acceptance && { acceptance }),
160
+ ...(verify && { verify }),
161
+ ...(skill && { skill }),
162
+ },
163
+ });
164
+ }
165
+ try {
166
+ const task = await createTask(projectDir, {
167
+ title,
168
+ ...(planId && { planId }),
169
+ ...(dependsOn && { dependsOn }),
170
+ priority,
171
+ status,
172
+ ...(sourceFiles && { sourceFiles }),
173
+ ...(scope && { scope }),
174
+ ...(acceptance && { acceptance }),
175
+ ...(verify && { verify }),
176
+ ...(skill && { skill }),
177
+ });
178
+ return success(task);
179
+ }
180
+ catch (err) {
181
+ return failure("task_create_error", err instanceof Error ? err.message : String(err));
182
+ }
125
183
  },
126
- handler: handleTaskCreate,
127
184
  });
128
- async function handleTaskCreate(params, flags) {
129
- const slug = params.slug;
130
- const title = params.title;
131
- const planId = params.planId;
132
- const priority = params.priority ?? "medium";
133
- const status = params.status ?? "backlog";
134
- const dependsOnRaw = params.dependsOn;
135
- const dependsOn = dependsOnRaw
136
- ? dependsOnRaw.split(",").map((s) => s.trim()).filter(Boolean)
137
- : undefined;
138
- const projectDir = getProjectDir(slug);
139
- if (!existsSync(projectDir)) {
140
- return failure(ERROR_CODES.PROJECT_NOT_FOUND, `Project "${slug}" not found`, {
141
- hint: "Run 'arcs project list' to see available projects.",
142
- });
143
- }
144
- if (flags.dryRun) {
145
- return success({ dryRun: true, wouldCreate: { title, slug, planId, priority, status, dependsOn } });
146
- }
147
- try {
148
- const task = await createTask(projectDir, {
149
- title,
150
- ...(planId && { planId }),
151
- ...(dependsOn && { dependsOn }),
152
- priority,
153
- status,
154
- });
155
- return success(task);
156
- }
157
- catch (err) {
158
- return failure("task_create_error", err instanceof Error ? err.message : String(err));
159
- }
160
- }
161
185
  // ---------------------------------------------------------------------------
162
186
  // task transition
163
187
  // ---------------------------------------------------------------------------
@@ -178,100 +202,42 @@ defineCommand({
178
202
  planId: { type: "string", description: "Plan ID (enables atomic diagram update)" },
179
203
  diagramNodeId: { type: "string", description: "Diagram node ID to update (e.g. T001)" },
180
204
  },
181
- handler: handleTaskTransition,
182
- });
183
- /**
184
- * Map task status (snake_case in the ARCS task model) to diagram classDef
185
- * status (camelCase in the Mermaid script). The two namespaces are
186
- * intentionally distinct task statuses follow Python/JSON convention,
187
- * diagram statuses match the classDef identifiers.
188
- */
189
- function taskStatusToDiagramStatus(status) {
190
- switch (status) {
191
- case "in_progress":
192
- return "inProgress";
193
- case "done":
194
- return "done";
195
- case "cancelled":
196
- return "blocked";
197
- case "backlog":
198
- return "backlog";
199
- }
200
- }
201
- function findDiagramScript() {
202
- const localPath = resolve(import.meta.dirname, "../../../opencode/arcs/skills/to-diagram/scripts/manage-diagram.mjs");
203
- if (existsSync(localPath))
204
- return localPath;
205
- const configPath = resolve(homedir(), ".config/opencode/skills/arcs/to-diagram/scripts/manage-diagram.mjs");
206
- if (existsSync(configPath))
207
- return configPath;
208
- return undefined;
209
- }
210
- export function attemptDiagramUpdate(slug, planId, nodeId, status) {
211
- const dataDir = getDataDir();
212
- const diagramPath = resolve(dataDir, "projects", slug, "plans", `${planId}.diagram.mmd`);
213
- if (!existsSync(diagramPath)) {
214
- return { diagramUpdated: false, diagramError: "Diagram file not found" };
215
- }
216
- const scriptPath = findDiagramScript();
217
- if (!scriptPath) {
218
- return { diagramUpdated: false, diagramError: "manage-diagram.mjs script not found" };
219
- }
220
- const diagramStatus = taskStatusToDiagramStatus(status);
221
- try {
222
- execSync(`node "${scriptPath}" status "${diagramPath}" "${nodeId}" "${diagramStatus}"`, {
223
- encoding: "utf-8",
224
- timeout: 10000,
225
- // Capture child stderr so script error output never leaks to the parent's
226
- // stderr — keeps --json output clean and parseable for agents.
227
- stdio: ["ignore", "pipe", "pipe"],
228
- });
229
- return { diagramUpdated: true };
230
- }
231
- catch (err) {
232
- const msg = err instanceof Error ? err.stderr || err.message : String(err);
233
- return { diagramUpdated: false, diagramError: msg };
234
- }
235
- }
236
- async function handleTaskTransition(params, flags) {
237
- const slug = params.slug;
238
- const taskId = params.taskId;
239
- const status = params.status;
240
- const planId = params.planId;
241
- const diagramNodeId = params.diagramNodeId;
242
- const projectDir = getProjectDir(slug);
243
- if (!existsSync(projectDir)) {
244
- return failure(ERROR_CODES.PROJECT_NOT_FOUND, `Project "${slug}" not found`, {
245
- hint: "Run 'arcs project list' to see available projects.",
246
- });
247
- }
248
- if (flags.dryRun) {
249
- return success({
250
- dryRun: true,
251
- wouldTransition: { slug, taskId, status, planId, diagramNodeId },
252
- });
253
- }
254
- try {
255
- const currentTask = await getTask(projectDir, taskId);
256
- const previousStatus = currentTask.status;
257
- await updateTask(projectDir, { id: taskId, status });
258
- // Atomic diagram update if both planId and diagramNodeId provided
259
- if (planId && diagramNodeId) {
260
- const diagramResult = attemptDiagramUpdate(slug, planId, diagramNodeId, status);
205
+ handler: async (params, flags) => {
206
+ const { slug, taskId, status, planId, diagramNodeId } = params;
207
+ const projectDir = getProjectDir(slug);
208
+ if (!existsSync(projectDir)) {
209
+ return failure(ERROR_CODES.PROJECT_NOT_FOUND, `Project "${slug}" not found`, {
210
+ hint: "Run 'arcs project list' to see available projects.",
211
+ });
212
+ }
213
+ if (flags.dryRun) {
261
214
  return success({
262
- taskId,
263
- previousStatus,
264
- newStatus: status,
265
- diagramNodeId,
266
- ...diagramResult,
215
+ dryRun: true,
216
+ wouldTransition: { slug, taskId, status, planId, diagramNodeId },
267
217
  });
268
218
  }
269
- return success({ taskId, previousStatus, newStatus: status });
270
- }
271
- catch (err) {
272
- return failure(ERROR_CODES.ENTITY_NOT_FOUND, err instanceof Error ? err.message : String(err));
273
- }
274
- }
219
+ try {
220
+ const currentTask = await getTask(projectDir, taskId);
221
+ const previousStatus = currentTask.status;
222
+ await updateTask(projectDir, { id: taskId, status });
223
+ // Atomic diagram update if both planId and diagramNodeId provided
224
+ if (planId && diagramNodeId) {
225
+ const diagramResult = attemptDiagramUpdate(slug, planId, diagramNodeId, status);
226
+ return success({
227
+ taskId,
228
+ previousStatus,
229
+ newStatus: status,
230
+ diagramNodeId,
231
+ ...diagramResult,
232
+ });
233
+ }
234
+ return success({ taskId, previousStatus, newStatus: status });
235
+ }
236
+ catch (err) {
237
+ return failure(ERROR_CODES.ENTITY_NOT_FOUND, err instanceof Error ? err.message : String(err));
238
+ }
239
+ },
240
+ });
275
241
  // ---------------------------------------------------------------------------
276
242
  // task update
277
243
  // ---------------------------------------------------------------------------
@@ -290,45 +256,94 @@ defineCommand({
290
256
  },
291
257
  planId: { type: "string", description: "Associated plan ID" },
292
258
  dependsOn: { type: "string", description: "Comma-separated task IDs (empty string to clear)" },
259
+ "source-files": {
260
+ type: "string",
261
+ description: "Comma-separated source file refs (path[:anchor]); empty string clears",
262
+ },
263
+ scope: { type: "string", description: "Per-node %% scope: metadata (empty string clears)" },
264
+ acceptance: {
265
+ type: "string",
266
+ description: "Per-node %% acceptance: metadata (empty string clears)",
267
+ },
268
+ verify: {
269
+ type: "string",
270
+ description: "Per-node %% verify: command (empty string clears)",
271
+ },
272
+ skill: { type: "string", description: "Per-node %% skill: name (empty string clears)" },
273
+ },
274
+ handler: async (params, flags) => {
275
+ const { slug, taskId, title, priority, planId } = params;
276
+ const dependsOnRaw = params.dependsOn;
277
+ const dependsOn = dependsOnRaw !== undefined
278
+ ? dependsOnRaw === ""
279
+ ? []
280
+ : dependsOnRaw
281
+ .split(",")
282
+ .map((s) => s.trim())
283
+ .filter(Boolean)
284
+ : undefined;
285
+ const sourceFilesRaw = params["source-files"];
286
+ const sourceFiles = sourceFilesRaw !== undefined
287
+ ? sourceFilesRaw === ""
288
+ ? []
289
+ : sourceFilesRaw.split(",").map((s) => {
290
+ const [path, anchor] = s.trim().split(":");
291
+ return anchor ? { path, anchor } : { path };
292
+ })
293
+ : undefined;
294
+ // Empty string clears the field; non-empty sets; undefined leaves untouched.
295
+ const scopeUpdate = params.scope !== undefined ? (params.scope === "" ? null : params.scope) : undefined;
296
+ const acceptanceUpdate = params.acceptance !== undefined
297
+ ? params.acceptance === ""
298
+ ? null
299
+ : params.acceptance
300
+ : undefined;
301
+ const verifyUpdate = params.verify !== undefined ? (params.verify === "" ? null : params.verify) : undefined;
302
+ const skillUpdate = params.skill !== undefined ? (params.skill === "" ? null : params.skill) : undefined;
303
+ const projectDir = getProjectDir(slug);
304
+ if (!existsSync(projectDir)) {
305
+ return failure(ERROR_CODES.PROJECT_NOT_FOUND, `Project "${slug}" not found`, {
306
+ hint: "Run 'arcs project list' to see available projects.",
307
+ });
308
+ }
309
+ if (flags.dryRun) {
310
+ return success({
311
+ dryRun: true,
312
+ wouldUpdate: {
313
+ slug,
314
+ taskId,
315
+ title,
316
+ priority,
317
+ planId,
318
+ dependsOn,
319
+ ...(sourceFiles !== undefined && { sourceFiles }),
320
+ ...(scopeUpdate !== undefined && { scope: scopeUpdate }),
321
+ ...(acceptanceUpdate !== undefined && { acceptance: acceptanceUpdate }),
322
+ ...(verifyUpdate !== undefined && { verify: verifyUpdate }),
323
+ ...(skillUpdate !== undefined && { skill: skillUpdate }),
324
+ },
325
+ });
326
+ }
327
+ try {
328
+ const task = await updateTask(projectDir, {
329
+ id: taskId,
330
+ ...(title && { title }),
331
+ ...(priority && { priority }),
332
+ ...(planId && { planId }),
333
+ ...(dependsOn !== undefined && { dependsOn }),
334
+ ...(sourceFiles !== undefined && { sourceFiles }),
335
+ ...(scopeUpdate !== undefined && { scope: scopeUpdate }),
336
+ ...(acceptanceUpdate !== undefined && { acceptance: acceptanceUpdate }),
337
+ ...(verifyUpdate !== undefined && { verify: verifyUpdate }),
338
+ ...(skillUpdate !== undefined && { skill: skillUpdate }),
339
+ });
340
+ return success(task);
341
+ }
342
+ catch (err) {
343
+ return failure(ERROR_CODES.ENTITY_NOT_FOUND, err instanceof Error ? err.message : String(err));
344
+ }
293
345
  },
294
- handler: handleTaskUpdate,
295
346
  });
296
- async function handleTaskUpdate(params, flags) {
297
- const slug = params.slug;
298
- const taskId = params.taskId;
299
- const title = params.title;
300
- const priority = params.priority;
301
- const planId = params.planId;
302
- const dependsOnRaw = params.dependsOn;
303
- const dependsOn = dependsOnRaw !== undefined
304
- ? (dependsOnRaw === "" ? [] : dependsOnRaw.split(",").map((s) => s.trim()).filter(Boolean))
305
- : undefined;
306
- const projectDir = getProjectDir(slug);
307
- if (!existsSync(projectDir)) {
308
- return failure(ERROR_CODES.PROJECT_NOT_FOUND, `Project "${slug}" not found`, {
309
- hint: "Run 'arcs project list' to see available projects.",
310
- });
311
- }
312
- if (flags.dryRun) {
313
- return success({
314
- dryRun: true,
315
- wouldUpdate: { slug, taskId, title, priority, planId, dependsOn },
316
- });
317
- }
318
- try {
319
- const task = await updateTask(projectDir, {
320
- id: taskId,
321
- ...(title && { title }),
322
- ...(priority && { priority }),
323
- ...(planId && { planId }),
324
- ...(dependsOn !== undefined && { dependsOn }),
325
- });
326
- return success(task);
327
- }
328
- catch (err) {
329
- return failure(ERROR_CODES.ENTITY_NOT_FOUND, err instanceof Error ? err.message : String(err));
330
- }
331
- }
332
347
  // ---------------------------------------------------------------------------
333
348
  // task delete
334
349
  // ---------------------------------------------------------------------------
@@ -340,34 +355,32 @@ defineCommand({
340
355
  slug: { type: "string", required: true, positional: 0, description: "Project slug" },
341
356
  taskId: { type: "string", required: true, positional: 1, description: "Task ID" },
342
357
  },
343
- handler: handleTaskDelete,
358
+ handler: async (params, flags) => {
359
+ const { slug, taskId } = params;
360
+ const projectDir = getProjectDir(slug);
361
+ if (!existsSync(projectDir)) {
362
+ return failure(ERROR_CODES.PROJECT_NOT_FOUND, `Project "${slug}" not found`, {
363
+ hint: "Run 'arcs project list' to see available projects.",
364
+ });
365
+ }
366
+ if (flags.dryRun) {
367
+ return success({ dryRun: true, wouldDelete: { slug, taskId } });
368
+ }
369
+ try {
370
+ await getTask(projectDir, taskId);
371
+ }
372
+ catch {
373
+ return failure(ERROR_CODES.ENTITY_NOT_FOUND, `Task "${taskId}" not found`, {
374
+ hint: `Run 'arcs task list ${slug}' to see available tasks.`,
375
+ });
376
+ }
377
+ try {
378
+ await deleteTask(projectDir, taskId);
379
+ return success({ deleted: taskId });
380
+ }
381
+ catch (err) {
382
+ return failure("task_delete_error", err instanceof Error ? err.message : String(err));
383
+ }
384
+ },
344
385
  });
345
- async function handleTaskDelete(params, flags) {
346
- const slug = params.slug;
347
- const taskId = params.taskId;
348
- const projectDir = getProjectDir(slug);
349
- if (!existsSync(projectDir)) {
350
- return failure(ERROR_CODES.PROJECT_NOT_FOUND, `Project "${slug}" not found`, {
351
- hint: "Run 'arcs project list' to see available projects.",
352
- });
353
- }
354
- if (flags.dryRun) {
355
- return success({ dryRun: true, wouldDelete: { slug, taskId } });
356
- }
357
- try {
358
- await getTask(projectDir, taskId);
359
- }
360
- catch {
361
- return failure(ERROR_CODES.ENTITY_NOT_FOUND, `Task "${taskId}" not found`, {
362
- hint: `Run 'arcs task list ${slug}' to see available tasks.`,
363
- });
364
- }
365
- try {
366
- await deleteTask(projectDir, taskId);
367
- return success({ deleted: taskId });
368
- }
369
- catch (err) {
370
- return failure("task_delete_error", err instanceof Error ? err.message : String(err));
371
- }
372
- }
373
386
  //# sourceMappingURL=task.js.map