@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.
- package/README.md +65 -40
- package/dist/cli/arcs-orchestrate.d.ts +1 -1
- package/dist/cli/arcs-orchestrate.d.ts.map +1 -1
- package/dist/cli/arcs-orchestrate.js +8 -4
- package/dist/cli/arcs-orchestrate.js.map +1 -1
- package/dist/cli/arg-parser.d.ts +3 -3
- package/dist/cli/arg-parser.d.ts.map +1 -1
- package/dist/cli/arg-parser.js +1 -1
- package/dist/cli/arg-parser.js.map +1 -1
- package/dist/cli/bundle-installer.d.ts +11 -0
- package/dist/cli/bundle-installer.d.ts.map +1 -1
- package/dist/cli/bundle-installer.js +14 -4
- package/dist/cli/bundle-installer.js.map +1 -1
- package/dist/cli/command-registry.d.ts +61 -6
- package/dist/cli/command-registry.d.ts.map +1 -1
- package/dist/cli/command-registry.js.map +1 -1
- package/dist/cli/commands/batch.js +17 -16
- package/dist/cli/commands/batch.js.map +1 -1
- package/dist/cli/commands/brief.js +71 -74
- package/dist/cli/commands/brief.js.map +1 -1
- package/dist/cli/commands/bundle.js +79 -31
- package/dist/cli/commands/bundle.js.map +1 -1
- package/dist/cli/commands/dependency.js +47 -43
- package/dist/cli/commands/dependency.js.map +1 -1
- package/dist/cli/commands/diagnostics.js +1 -1
- package/dist/cli/commands/diagnostics.js.map +1 -1
- package/dist/cli/commands/diagram.js +96 -58
- package/dist/cli/commands/diagram.js.map +1 -1
- package/dist/cli/commands/done.js +19 -18
- package/dist/cli/commands/done.js.map +1 -1
- package/dist/cli/commands/graph.js +12 -10
- package/dist/cli/commands/graph.js.map +1 -1
- package/dist/cli/commands/index.d.ts +1 -0
- package/dist/cli/commands/index.d.ts.map +1 -1
- package/dist/cli/commands/index.js +1 -0
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/knowledge-search.js +11 -12
- package/dist/cli/commands/knowledge-search.js.map +1 -1
- package/dist/cli/commands/knowledge.js +63 -56
- package/dist/cli/commands/knowledge.js.map +1 -1
- package/dist/cli/commands/loop.js +40 -36
- package/dist/cli/commands/loop.js.map +1 -1
- package/dist/cli/commands/maintenance.js +30 -19
- package/dist/cli/commands/maintenance.js.map +1 -1
- package/dist/cli/commands/next.js +9 -8
- package/dist/cli/commands/next.js.map +1 -1
- package/dist/cli/commands/plan.js +61 -55
- package/dist/cli/commands/plan.js.map +1 -1
- package/dist/cli/commands/project-updates.js +37 -33
- package/dist/cli/commands/project-updates.js.map +1 -1
- package/dist/cli/commands/project.js +33 -23
- package/dist/cli/commands/project.js.map +1 -1
- package/dist/cli/commands/proposal.d.ts +2 -0
- package/dist/cli/commands/proposal.d.ts.map +1 -0
- package/dist/cli/commands/proposal.js +509 -0
- package/dist/cli/commands/proposal.js.map +1 -0
- package/dist/cli/commands/remember.js +6 -6
- package/dist/cli/commands/remember.js.map +1 -1
- package/dist/cli/commands/status.js +9 -8
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/task.d.ts +1 -5
- package/dist/cli/commands/task.d.ts.map +1 -1
- package/dist/cli/commands/task.js +261 -248
- package/dist/cli/commands/task.js.map +1 -1
- package/dist/cli/commands/utility.d.ts.map +1 -1
- package/dist/cli/commands/utility.js +39 -35
- package/dist/cli/commands/utility.js.map +1 -1
- package/dist/cli/dag-commands.js.map +1 -1
- package/dist/cli/help-generator.d.ts +3 -3
- package/dist/cli/help-generator.d.ts.map +1 -1
- package/dist/cli/help-generator.js +1 -1
- package/dist/cli/help-generator.js.map +1 -1
- package/dist/cli/md-renderer.d.ts.map +1 -1
- package/dist/cli/md-renderer.js +45 -11
- package/dist/cli/md-renderer.js.map +1 -1
- package/dist/cli/setup.d.ts.map +1 -1
- package/dist/cli/setup.js +235 -113
- package/dist/cli/setup.js.map +1 -1
- package/dist/utils/diagram-generator.d.ts.map +1 -1
- package/dist/utils/diagram-generator.js +8 -1
- package/dist/utils/diagram-generator.js.map +1 -1
- package/dist/utils/diagram-store.d.ts +45 -0
- package/dist/utils/diagram-store.d.ts.map +1 -0
- package/dist/utils/diagram-store.js +99 -0
- package/dist/utils/diagram-store.js.map +1 -0
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/graphify-knowledge.d.ts +19 -3
- package/dist/utils/graphify-knowledge.d.ts.map +1 -1
- package/dist/utils/graphify-knowledge.js +45 -58
- package/dist/utils/graphify-knowledge.js.map +1 -1
- package/dist/utils/graphify.d.ts +58 -3
- package/dist/utils/graphify.d.ts.map +1 -1
- package/dist/utils/graphify.js +175 -42
- package/dist/utils/graphify.js.map +1 -1
- package/dist/utils/json-schemas.d.ts +153 -0
- package/dist/utils/json-schemas.d.ts.map +1 -1
- package/dist/utils/json-schemas.js +23 -0
- package/dist/utils/json-schemas.js.map +1 -1
- package/dist/utils/proposal-store.d.ts +64 -0
- package/dist/utils/proposal-store.d.ts.map +1 -0
- package/dist/utils/proposal-store.js +161 -0
- package/dist/utils/proposal-store.js.map +1 -0
- package/dist/utils/storage-utils.d.ts +1 -1
- package/dist/utils/storage-utils.d.ts.map +1 -1
- package/dist/utils/storage-utils.js +1 -1
- package/dist/utils/storage-utils.js.map +1 -1
- package/dist/utils/task-store.d.ts +20 -0
- package/dist/utils/task-store.d.ts.map +1 -1
- package/dist/utils/task-store.js +42 -5
- package/dist/utils/task-store.js.map +1 -1
- package/dist/utils/toposort.d.ts +1 -1
- package/dist/utils/toposort.d.ts.map +1 -1
- package/dist/utils/toposort.js +5 -4
- package/dist/utils/toposort.js.map +1 -1
- package/dist/utils/workflow-policy.d.ts +1 -1
- package/dist/utils/workflow-policy.d.ts.map +1 -1
- package/dist/utils/workflow-policy.js +1 -1
- package/dist/utils/workflow-policy.js.map +1 -1
- package/opencode/arcs/bundle-runtime.json +3 -0
- package/opencode/arcs/manifest.json +47 -66
- package/opencode/arcs/prompts/arcs-orchestrate-caveman.txt +8 -4
- package/opencode/arcs/prompts/arcs-orchestrate.txt +8 -4
- package/opencode/arcs/skills/enriching-graphify-proposals/SKILL.md +170 -0
- package/opencode/arcs/skills/init-project/SKILL.md +18 -11
- package/opencode/arcs/skills/to-diagram/SKILL.md +1 -1
- package/package.json +1 -1
- 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":"AAAA,8EAA8E;AAC9E,iDAAiD;AACjD,8EAA8E;AAE9E,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC7F,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,2 @@
|
|
|
1
|
-
|
|
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":"
|
|
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 {
|
|
7
|
-
import {
|
|
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
|
|
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:
|
|
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:
|
|
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:
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
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
|
-
|
|
263
|
-
|
|
264
|
-
newStatus: status,
|
|
265
|
-
diagramNodeId,
|
|
266
|
-
...diagramResult,
|
|
215
|
+
dryRun: true,
|
|
216
|
+
wouldTransition: { slug, taskId, status, planId, diagramNodeId },
|
|
267
217
|
});
|
|
268
218
|
}
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
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:
|
|
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
|