acpus 0.5.2 → 0.6.0-alpha.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 (140) hide show
  1. package/README.md +19 -5
  2. package/dist/.tsbuildinfo +1 -0
  3. package/dist/agent-progress-format.d.ts +7 -0
  4. package/dist/agent-progress-format.d.ts.map +1 -0
  5. package/dist/agent-progress-format.js +102 -0
  6. package/dist/agent-progress-format.js.map +1 -0
  7. package/dist/authoring/core.d.ts +2 -0
  8. package/dist/authoring/core.d.ts.map +1 -0
  9. package/dist/authoring/core.js +2 -0
  10. package/dist/authoring/core.js.map +1 -0
  11. package/dist/authoring/expression.d.ts +2 -0
  12. package/dist/authoring/expression.d.ts.map +1 -0
  13. package/dist/authoring/expression.js +2 -0
  14. package/dist/authoring/expression.js.map +1 -0
  15. package/dist/authoring/tasks/git.d.ts +2 -0
  16. package/dist/authoring/tasks/git.d.ts.map +1 -0
  17. package/dist/authoring/tasks/git.js +2 -0
  18. package/dist/authoring/tasks/git.js.map +1 -0
  19. package/dist/catalog.d.ts +18 -24
  20. package/dist/catalog.d.ts.map +1 -1
  21. package/dist/catalog.js +164 -174
  22. package/dist/catalog.js.map +1 -1
  23. package/dist/cli.d.ts +3 -0
  24. package/dist/cli.d.ts.map +1 -0
  25. package/dist/cli.js +14 -0
  26. package/dist/cli.js.map +1 -0
  27. package/dist/commands/daemon.d.ts +14 -0
  28. package/dist/commands/daemon.d.ts.map +1 -0
  29. package/dist/commands/daemon.js +89 -0
  30. package/dist/commands/daemon.js.map +1 -0
  31. package/dist/commands/doctor.d.ts +11 -0
  32. package/dist/commands/doctor.d.ts.map +1 -0
  33. package/dist/commands/doctor.js +26 -0
  34. package/dist/commands/doctor.js.map +1 -0
  35. package/dist/commands/hooks.d.ts +11 -0
  36. package/dist/commands/hooks.d.ts.map +1 -0
  37. package/dist/commands/hooks.js +64 -0
  38. package/dist/commands/hooks.js.map +1 -0
  39. package/dist/commands/json.d.ts +7 -0
  40. package/dist/commands/json.d.ts.map +1 -0
  41. package/dist/commands/json.js +43 -0
  42. package/dist/commands/json.js.map +1 -0
  43. package/dist/commands/runs-picker.d.ts +21 -0
  44. package/dist/commands/runs-picker.d.ts.map +1 -0
  45. package/dist/commands/runs-picker.js +76 -0
  46. package/dist/commands/runs-picker.js.map +1 -0
  47. package/dist/commands/runs.d.ts +12 -0
  48. package/dist/commands/runs.d.ts.map +1 -0
  49. package/dist/commands/runs.js +285 -0
  50. package/dist/commands/runs.js.map +1 -0
  51. package/dist/commands/skill.d.ts +11 -0
  52. package/dist/commands/skill.d.ts.map +1 -0
  53. package/dist/commands/skill.js +221 -0
  54. package/dist/commands/skill.js.map +1 -0
  55. package/dist/commands/web.d.ts +24 -0
  56. package/dist/commands/web.d.ts.map +1 -0
  57. package/dist/commands/web.js +57 -0
  58. package/dist/commands/web.js.map +1 -0
  59. package/dist/commands/workflow.d.ts +11 -0
  60. package/dist/commands/workflow.d.ts.map +1 -0
  61. package/dist/commands/workflow.js +324 -0
  62. package/dist/commands/workflow.js.map +1 -0
  63. package/dist/daemon-entry.d.ts +3 -0
  64. package/dist/daemon-entry.d.ts.map +1 -0
  65. package/dist/daemon-entry.js +26 -0
  66. package/dist/daemon-entry.js.map +1 -0
  67. package/dist/errors.d.ts +19 -0
  68. package/dist/errors.d.ts.map +1 -0
  69. package/dist/errors.js +28 -0
  70. package/dist/errors.js.map +1 -0
  71. package/dist/output.d.ts +91 -11
  72. package/dist/output.d.ts.map +1 -1
  73. package/dist/output.js +203 -44
  74. package/dist/output.js.map +1 -1
  75. package/dist/program.d.ts +9 -0
  76. package/dist/program.d.ts.map +1 -0
  77. package/dist/program.js +85 -0
  78. package/dist/program.js.map +1 -0
  79. package/dist/run-status-surface.d.ts +12 -0
  80. package/dist/run-status-surface.d.ts.map +1 -0
  81. package/dist/run-status-surface.js +324 -0
  82. package/dist/run-status-surface.js.map +1 -0
  83. package/dist/workflow-preparation.d.ts +3 -0
  84. package/dist/workflow-preparation.d.ts.map +1 -0
  85. package/dist/workflow-preparation.js +34 -0
  86. package/dist/workflow-preparation.js.map +1 -0
  87. package/package.json +35 -35
  88. package/skills/acpus/SKILL.md +120 -0
  89. package/skills/acpus/eval/evaluations.md +47 -0
  90. package/skills/acpus/examples/hooks.example.json +17 -0
  91. package/skills/acpus/examples/workflows/adversarial-review/workflow.ts +248 -0
  92. package/skills/acpus/examples/workflows/change-approval/workflow.ts +121 -0
  93. package/skills/acpus/examples/workflows/issue-triage/tasks.ts +14 -0
  94. package/skills/acpus/examples/workflows/issue-triage/workflow.ts +146 -0
  95. package/skills/acpus/examples/workflows/multi-aspect-brainstorm/workflow.ts +304 -0
  96. package/skills/acpus/examples/workflows/worktree-tournament/workflow.ts +194 -0
  97. package/skills/acpus/references/authoring.md +205 -0
  98. package/skills/acpus/references/cli-operations.md +94 -0
  99. package/skills/acpus/references/hooks-json.md +81 -0
  100. package/skills/acpus/references/runtime-recovery.md +97 -0
  101. package/dist/agent-activity.d.ts +0 -3
  102. package/dist/agent-activity.d.ts.map +0 -1
  103. package/dist/agent-activity.js +0 -50
  104. package/dist/agent-activity.js.map +0 -1
  105. package/dist/agent-overrides.d.ts +0 -3
  106. package/dist/agent-overrides.d.ts.map +0 -1
  107. package/dist/agent-overrides.js +0 -39
  108. package/dist/agent-overrides.js.map +0 -1
  109. package/dist/follow.d.ts +0 -23
  110. package/dist/follow.d.ts.map +0 -1
  111. package/dist/follow.js +0 -164
  112. package/dist/follow.js.map +0 -1
  113. package/dist/hooks.d.ts +0 -4
  114. package/dist/hooks.d.ts.map +0 -1
  115. package/dist/hooks.js +0 -159
  116. package/dist/hooks.js.map +0 -1
  117. package/dist/index.d.ts +0 -3
  118. package/dist/index.d.ts.map +0 -1
  119. package/dist/index.js +0 -592
  120. package/dist/index.js.map +0 -1
  121. package/dist/io.d.ts +0 -3
  122. package/dist/io.d.ts.map +0 -1
  123. package/dist/io.js +0 -27
  124. package/dist/io.js.map +0 -1
  125. package/dist/observations.d.ts +0 -39
  126. package/dist/observations.d.ts.map +0 -1
  127. package/dist/observations.js +0 -83
  128. package/dist/observations.js.map +0 -1
  129. package/dist/runs-show.d.ts +0 -40
  130. package/dist/runs-show.d.ts.map +0 -1
  131. package/dist/runs-show.js +0 -296
  132. package/dist/runs-show.js.map +0 -1
  133. package/dist/supervisor-client.d.ts +0 -9
  134. package/dist/supervisor-client.d.ts.map +0 -1
  135. package/dist/supervisor-client.js +0 -8
  136. package/dist/supervisor-client.js.map +0 -1
  137. package/dist/supervisor.d.ts +0 -18
  138. package/dist/supervisor.d.ts.map +0 -1
  139. package/dist/supervisor.js +0 -24
  140. package/dist/supervisor.js.map +0 -1
@@ -0,0 +1,324 @@
1
+ import { formatAgentProgressDetailLines } from "./agent-progress-format.js";
2
+ export function staticNodesForWorkflow(ir) {
3
+ const nodes = [];
4
+ visitScope(ir.root, nodes);
5
+ return nodes;
6
+ }
7
+ export function formatRunStatusSurface(run, staticNodes = [], nowMs = Date.now()) {
8
+ const index = staticIndex(staticNodes);
9
+ const lines = [`Run ${run.id} ${run.name} ${displayRunExecutionStatus(run)} ${formatRunDuration(run, nowMs)}`];
10
+ const rows = statusRows(run, staticNodes, index);
11
+ const agentProgress = agentProgressByNodeKey(run);
12
+ for (const row of rows) {
13
+ lines.push(...formatRow(row, run.id, nowMs, index));
14
+ const progress = row.kind === "agent" ? agentProgress.get(row.key) : undefined;
15
+ if (progress)
16
+ lines.push(...formatAgentProgressDetailLines(progress, { includeMessage: true, nowMs }).map(line => ` ${line}`));
17
+ }
18
+ const output = formatOutput(run);
19
+ if (output) {
20
+ lines.push("");
21
+ lines.push(...output);
22
+ }
23
+ const hooks = formatHooks(run);
24
+ if (hooks) {
25
+ lines.push("");
26
+ lines.push(...hooks);
27
+ }
28
+ return `${lines.join("\n")}\n`;
29
+ }
30
+ function displayRunExecutionStatus(run) {
31
+ if (run.execution?.state !== "stale")
32
+ return run.status;
33
+ if (run.execution.reason === "daemon_pid_dead")
34
+ return `stale (daemon pid dead, last status: ${run.status})`;
35
+ if (run.execution.reason === "run_lease_expired")
36
+ return `stale (run lease expired, last status: ${run.status})`;
37
+ return `stale (daemon heartbeat expired, last status: ${run.status})`;
38
+ }
39
+ export function formatRunObservationRow(run, nodeKey, nowMs = Date.now(), staticNodes = []) {
40
+ const index = staticIndex(staticNodes);
41
+ const row = statusRows(run, staticNodes, index).find(candidate => candidate.key === nodeKey);
42
+ if (row)
43
+ return formatRow(row, run.id, nowMs, index).join("\n");
44
+ const frame = run.dynamic?.frames.find(candidate => candidate.frameKey === nodeKey);
45
+ if (frame?.nodeId) {
46
+ return formatRow({
47
+ key: frame.frameKey,
48
+ nodeId: frame.nodeId,
49
+ kind: nodeKind(index, frame.nodeId) ?? "assert",
50
+ status: frame.status,
51
+ start: frame.createdAt,
52
+ ...endField(terminalStatus(frame.status) ? frame.updatedAt : undefined),
53
+ ...errorField(frame.error),
54
+ }, run.id, nowMs, index).join("\n");
55
+ }
56
+ const instance = run.dynamic?.nodeInstances.find(candidate => candidate.nodeKey === nodeKey);
57
+ if (!instance)
58
+ return undefined;
59
+ const attempt = currentAttempt(run.dynamic?.attempts ?? [], instance);
60
+ return formatRow({
61
+ key: instance.nodeKey,
62
+ nodeId: instance.nodeId,
63
+ kind: nodeKind(index, instance.nodeId) ?? "task",
64
+ status: instance.status,
65
+ start: attempt?.startedAt ?? instance.createdAt,
66
+ ...endField(attempt?.finishedAt ?? (terminalStatus(instance.status) ? instance.updatedAt : undefined)),
67
+ ...(attempt?.attemptNo === undefined ? {} : { attemptNo: attempt.attemptNo }),
68
+ ...errorField(instance.error ?? attempt?.error),
69
+ }, run.id, nowMs, index).join("\n");
70
+ }
71
+ function statusRows(run, staticNodes, index) {
72
+ const rows = [];
73
+ const materializedNodeIds = new Set([
74
+ ...(run.dynamic?.frames.flatMap(frame => frame.nodeId ? [frame.nodeId] : []) ?? []),
75
+ ...(run.dynamic?.nodeInstances.map(instance => instance.nodeId) ?? []),
76
+ ]);
77
+ for (const frame of run.dynamic?.frames ?? []) {
78
+ if (!frame.nodeId || (frame.frameKind !== "node" && frame.frameKind !== "loop"))
79
+ continue;
80
+ const kind = nodeKind(index, frame.nodeId) ?? "assert";
81
+ if (frame.status === "completed" && kind !== "assert")
82
+ continue;
83
+ rows.push({
84
+ key: frame.frameKey,
85
+ nodeId: frame.nodeId,
86
+ kind,
87
+ status: frame.status,
88
+ start: frame.createdAt,
89
+ ...(terminalStatus(frame.status) ? { end: frame.updatedAt } : {}),
90
+ ...(frame.error === undefined ? {} : { error: frame.error }),
91
+ });
92
+ }
93
+ for (const instance of run.dynamic?.nodeInstances ?? []) {
94
+ const attempt = currentAttempt(run.dynamic?.attempts ?? [], instance);
95
+ const signalWait = run.dynamic?.signalWaits.find(wait => wait.nodeKey === instance.nodeKey && wait.status === "awaiting");
96
+ rows.push({
97
+ key: instance.nodeKey,
98
+ nodeId: instance.nodeId,
99
+ kind: nodeKind(index, instance.nodeId) ?? "task",
100
+ status: signalWait?.status ?? instance.status,
101
+ start: attempt?.startedAt ?? signalWait?.createdAt ?? instance.createdAt,
102
+ ...endField(attempt?.finishedAt ?? (terminalStatus(instance.status) ? instance.updatedAt : undefined)),
103
+ ...(attempt?.attemptNo === undefined ? {} : { attemptNo: attempt.attemptNo }),
104
+ ...errorField(instance.error ?? attempt?.error),
105
+ ...(signalWait === undefined ? {} : { signalWait }),
106
+ });
107
+ }
108
+ if (!terminalRunStatus(run.status)) {
109
+ for (const item of staticNodes) {
110
+ if (materializedNodeIds.has(item.nodeId))
111
+ continue;
112
+ rows.push({
113
+ key: item.nodeId,
114
+ nodeId: item.nodeId,
115
+ kind: item.kind,
116
+ status: "pending",
117
+ });
118
+ }
119
+ }
120
+ return rows.sort((left, right) => {
121
+ const order = (index.orderByNodeId.get(left.nodeId) ?? Number.MAX_SAFE_INTEGER) - (index.orderByNodeId.get(right.nodeId) ?? Number.MAX_SAFE_INTEGER);
122
+ return order || left.key.localeCompare(right.key);
123
+ });
124
+ }
125
+ function formatRow(row, runId, nowMs, index) {
126
+ const parts = [row.key, `[${row.kind}]`];
127
+ if (row.status !== "completed")
128
+ parts.push(displayStatus(row.status));
129
+ const duration = formatDuration(row.start, row.end, row.status, nowMs);
130
+ if (duration)
131
+ parts.push(duration);
132
+ if ((row.attemptNo ?? 1) > 1)
133
+ parts.push(`attempt=${row.attemptNo}`);
134
+ const lines = [` ${statusGlyph(row.status)} ${parts.join(" ")}`];
135
+ const error = errorMessage(row.error);
136
+ if (error)
137
+ lines.push(` Error: ${error}`);
138
+ if (row.signalWait?.status === "awaiting") {
139
+ lines.push(...formatSignalWait(runId, row.signalWait, index.nodeById.get(row.nodeId)?.outputSchema));
140
+ }
141
+ return lines;
142
+ }
143
+ function formatSignalWait(runId, wait, outputSchema) {
144
+ const lines = [];
145
+ if (wait.renderedPrompt) {
146
+ lines.push(" Prompt:");
147
+ for (const line of wait.renderedPrompt.replace(/\s+$/, "").split("\n"))
148
+ lines.push(` ${line}`);
149
+ }
150
+ lines.push(...payloadGuidance(outputSchema).map(line => ` ${line}`));
151
+ lines.push(` Signal: acpus runs signal ${runId} --target ${wait.nodeKey} --payload '<json>'`);
152
+ return lines;
153
+ }
154
+ function payloadGuidance(schema) {
155
+ if (!schema)
156
+ return ["Expected payload: string"];
157
+ if (schema.kind !== "object")
158
+ return [`Expected payload: ${schemaKind(schema)}`];
159
+ const fields = Object.entries(schema.fields);
160
+ if (fields.length === 0)
161
+ return ["Expected payload: {}"];
162
+ const required = new Set(schema.required);
163
+ return [
164
+ "Expected payload:",
165
+ ...fields.map(([name, field]) => ` ${name}: ${schemaKind(field)}${required.has(name) ? " (required)" : " (optional)"}`),
166
+ ];
167
+ }
168
+ function schemaKind(schema) {
169
+ if (schema.kind === "array")
170
+ return `${schemaKind(schema.item)}[]`;
171
+ if (schema.kind === "union")
172
+ return schema.variants.map(schemaKind).join(" | ");
173
+ if (schema.kind === "literal")
174
+ return JSON.stringify(schema.value);
175
+ if (schema.kind === "enum")
176
+ return schema.values.map(value => JSON.stringify(value)).join(" | ");
177
+ if (schema.kind === "record")
178
+ return `record<${schemaKind(schema.value)}>`;
179
+ return schema.kind;
180
+ }
181
+ function formatOutput(run) {
182
+ if (run.status !== "completed" || run.output === undefined || emptyObject(run.output))
183
+ return undefined;
184
+ return ["Output:", ...JSON.stringify(run.output, null, 2).split("\n").map(line => ` ${line}`)];
185
+ }
186
+ function agentProgressByNodeKey(run) {
187
+ const progressByNodeKey = new Map();
188
+ for (const progress of run.dynamic?.progress ?? []) {
189
+ if (progress.kind === "agent")
190
+ progressByNodeKey.set(progress.nodeKey, progress);
191
+ }
192
+ return progressByNodeKey;
193
+ }
194
+ function formatHooks(run) {
195
+ if (!terminalRunStatus(run.status) || run.hooks.length === 0)
196
+ return undefined;
197
+ return [
198
+ "Hooks:",
199
+ ...run.hooks.map(entry => {
200
+ const duration = entry.durationMs === undefined ? "" : ` ${formatMs(entry.durationMs)}`;
201
+ const exit = entry.exitCode === undefined ? "" : ` exit=${entry.exitCode}`;
202
+ return ` ${entry.status} ${entry.handlerId} ${entry.event} #${entry.eventSequence}${duration}${exit}`;
203
+ }),
204
+ ];
205
+ }
206
+ function formatMs(ms) {
207
+ return ms < 1_000 ? `${ms}ms` : `${(ms / 1_000).toFixed(1)}s`;
208
+ }
209
+ function formatRunDuration(run, nowMs) {
210
+ return formatDuration(run.createdAt, terminalRunStatus(run.status) ? run.updatedAt : undefined, run.status, nowMs) ?? "<1s";
211
+ }
212
+ function formatDuration(start, end, status, nowMs) {
213
+ if (!start)
214
+ return undefined;
215
+ const startMs = Date.parse(start);
216
+ if (!Number.isFinite(startMs))
217
+ return undefined;
218
+ const endMs = end ? Date.parse(end) : activeStatus(status) ? nowMs : undefined;
219
+ if (endMs === undefined || !Number.isFinite(endMs))
220
+ return undefined;
221
+ const seconds = Math.floor(Math.max(0, endMs - startMs) / 1000);
222
+ if (seconds < 60)
223
+ return seconds === 0 ? "<1s" : `${seconds}s`;
224
+ const minutes = Math.floor(seconds / 60);
225
+ const remainSec = seconds % 60;
226
+ if (minutes < 60)
227
+ return remainSec > 0 ? `${minutes}m${remainSec}s` : `${minutes}m`;
228
+ const hours = Math.floor(minutes / 60);
229
+ if (hours < 48)
230
+ return `${hours}h`;
231
+ return `${Math.floor(hours / 24)}d`;
232
+ }
233
+ function latestAttempt(attempts, nodeKey) {
234
+ return attempts.filter(attempt => attempt.nodeKey === nodeKey).sort((left, right) => right.attemptNo - left.attemptNo)[0];
235
+ }
236
+ function currentAttempt(attempts, instance) {
237
+ if (instance.acceptedAttemptId)
238
+ return attempts.find(attempt => attempt.attemptId === instance.acceptedAttemptId);
239
+ if (instance.status === "ready" || instance.status === "awaiting")
240
+ return undefined;
241
+ return latestAttempt(attempts, instance.nodeKey);
242
+ }
243
+ function endField(end) {
244
+ return end === undefined ? {} : { end };
245
+ }
246
+ function errorField(error) {
247
+ return error === undefined ? {} : { error };
248
+ }
249
+ function statusGlyph(status) {
250
+ if (status === "pending" || status === "ready")
251
+ return "○";
252
+ if (status === "running" || status === "started")
253
+ return "⠋";
254
+ if (status === "awaiting")
255
+ return "◌";
256
+ if (status === "completed")
257
+ return "✓";
258
+ if (status === "failed" || status === "timed_out")
259
+ return "✗";
260
+ if (status === "paused")
261
+ return "Ⅱ";
262
+ if (status === "canceled" || status === "cancelled")
263
+ return "·";
264
+ return "?";
265
+ }
266
+ function displayStatus(status) {
267
+ return status === "cancelled" ? "canceled" : status;
268
+ }
269
+ function terminalRunStatus(status) {
270
+ return status === "completed" || status === "failed" || status === "canceled";
271
+ }
272
+ function terminalStatus(status) {
273
+ return status === "completed" || status === "failed" || status === "canceled" || status === "cancelled" || status === "timed_out";
274
+ }
275
+ function activeStatus(status) {
276
+ return status === "running" || status === "started" || status === "awaiting" || status === "pending" || status === "ready" || status === "paused";
277
+ }
278
+ function errorMessage(error) {
279
+ if (!error)
280
+ return undefined;
281
+ if (typeof error === "string")
282
+ return error;
283
+ if (typeof error === "object" && "message" in error && typeof error.message === "string")
284
+ return error.message;
285
+ if (typeof error === "object" && "reason" in error && typeof error.reason === "string")
286
+ return error.reason;
287
+ return JSON.stringify(error);
288
+ }
289
+ function emptyObject(value) {
290
+ return Boolean(value && typeof value === "object" && !Array.isArray(value) && Object.keys(value).length === 0);
291
+ }
292
+ function staticIndex(staticNodes) {
293
+ return {
294
+ orderByNodeId: new Map(staticNodes.map(item => [item.nodeId, item.order])),
295
+ nodeById: new Map(staticNodes.map(item => [item.nodeId, item])),
296
+ };
297
+ }
298
+ function nodeKind(index, nodeId) {
299
+ return index.nodeById.get(nodeId)?.kind;
300
+ }
301
+ function visitScope(scope, nodes) {
302
+ for (const node of scope.nodes) {
303
+ nodes.push({
304
+ nodeId: node.id,
305
+ kind: node.kind,
306
+ order: nodes.length,
307
+ ...(node.kind === "signal" ? { outputSchema: node.outputSchema } : {}),
308
+ });
309
+ for (const child of childScopes(node))
310
+ visitScope(child, nodes);
311
+ }
312
+ }
313
+ function childScopes(node) {
314
+ if (node.kind === "if")
315
+ return [node.then, node.else];
316
+ if (node.kind === "switch")
317
+ return [...node.cases.map(item => item.then), node.default];
318
+ if (node.kind === "parallel")
319
+ return Object.values(node.branches).map(branch => branch.scope);
320
+ if (node.kind === "fanout" || node.kind === "loop")
321
+ return [node.do];
322
+ return [];
323
+ }
324
+ //# sourceMappingURL=run-status-surface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-status-surface.js","sourceRoot":"","sources":["../src/run-status-surface.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { type PreparedWorkflow } from "@acpus/workflow-compiler";
2
+ export declare function prepareWorkflowForCli(workflow: string, cwd: string): Promise<PreparedWorkflow>;
3
+ //# sourceMappingURL=workflow-preparation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-preparation.d.ts","sourceRoot":"","sources":["../src/workflow-preparation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,gBAAgB,EAAmC,MAAM,0BAA0B,CAAC;AAItH,wBAAsB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAQpG"}
@@ -0,0 +1,34 @@
1
+ import { tryPrepareWorkflow } from "@acpus/workflow-compiler";
2
+ import { CliError } from "./errors.js";
3
+ import { summarizeWorkflow } from "./output.js";
4
+ export async function prepareWorkflowForCli(workflow, cwd) {
5
+ const result = await tryPrepareWorkflow({ workflow, cwd });
6
+ return result.match(prepared => prepared, failure => {
7
+ throw workflowPreparationCliError(failure);
8
+ });
9
+ }
10
+ function workflowPreparationCliError(failure) {
11
+ if (failure.type === "check-failed") {
12
+ return new CliError(1, {
13
+ ok: false,
14
+ phase: "check",
15
+ message: failure.message,
16
+ diagnostics: failure.diagnostics,
17
+ });
18
+ }
19
+ if (failure.type === "compile-failed") {
20
+ return new CliError(1, {
21
+ ok: false,
22
+ phase: "compile",
23
+ message: failure.message,
24
+ });
25
+ }
26
+ return new CliError(1, {
27
+ ok: false,
28
+ phase: "validate",
29
+ message: failure.message,
30
+ workflow: summarizeWorkflow(failure.ir),
31
+ diagnostics: failure.diagnostics,
32
+ });
33
+ }
34
+ //# sourceMappingURL=workflow-preparation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-preparation.js","sourceRoot":"","sources":["../src/workflow-preparation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAA0D,MAAM,0BAA0B,CAAC;AACtH,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,QAAgB,EAAE,GAAW;IACvE,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;IAC3D,OAAO,MAAM,CAAC,KAAK,CACjB,QAAQ,CAAC,EAAE,CAAC,QAAQ,EACpB,OAAO,CAAC,EAAE;QACR,MAAM,2BAA2B,CAAC,OAAO,CAAC,CAAC;IAC7C,CAAC,CACF,CAAC;AACJ,CAAC;AAED,SAAS,2BAA2B,CAAC,OAAmC;IACtE,IAAI,OAAO,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;QACpC,OAAO,IAAI,QAAQ,CAAC,CAAC,EAAE;YACrB,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,OAAO;YACd,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,WAAW,EAAE,OAAO,CAAC,WAAW;SACjC,CAAC,CAAC;IACL,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;QACtC,OAAO,IAAI,QAAQ,CAAC,CAAC,EAAE;YACrB,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,SAAS;YAChB,OAAO,EAAE,OAAO,CAAC,OAAO;SACzB,CAAC,CAAC;IACL,CAAC;IACD,OAAO,IAAI,QAAQ,CAAC,CAAC,EAAE;QACrB,EAAE,EAAE,KAAK;QACT,KAAK,EAAE,UAAU;QACjB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,QAAQ,EAAE,iBAAiB,CAAC,OAAO,CAAC,EAAE,CAAC;QACvC,WAAW,EAAE,OAAO,CAAC,WAAW;KACjC,CAAC,CAAC;AACL,CAAC"}
package/package.json CHANGED
@@ -1,43 +1,35 @@
1
1
  {
2
2
  "name": "acpus",
3
- "version": "0.5.2",
4
- "description": "Local durable workflow runner for ACP agents",
5
- "keywords": [
6
- "acp",
7
- "acpx",
8
- "agent",
9
- "workflow",
10
- "orchestrator",
11
- "cli"
12
- ],
13
- "license": "MIT",
14
- "author": "kkkyran",
15
- "homepage": "https://github.com/kelvinschen/acpus#readme",
16
- "repository": {
17
- "type": "git",
18
- "url": "git+https://github.com/kelvinschen/acpus.git",
19
- "directory": "packages/cli"
20
- },
21
- "bugs": {
22
- "url": "https://github.com/kelvinschen/acpus/issues"
23
- },
3
+ "version": "0.6.0-alpha.1",
24
4
  "type": "module",
5
+ "description": "Acpus CLI for TypeScript workflow validation and durable run admission.",
6
+ "license": "MIT",
25
7
  "engines": {
26
- "node": ">=22"
8
+ "node": ">=22.12"
27
9
  },
28
10
  "bin": {
29
- "acpus": "./dist/index.js"
11
+ "acpus": "./dist/cli.js"
30
12
  },
31
13
  "exports": {
32
- ".": {
33
- "types": "./dist/index.d.ts",
34
- "default": "./dist/index.js"
14
+ "./core": {
15
+ "development": "./src/authoring/core.ts",
16
+ "types": "./dist/authoring/core.d.ts",
17
+ "default": "./dist/authoring/core.js"
18
+ },
19
+ "./expression": {
20
+ "development": "./src/authoring/expression.ts",
21
+ "types": "./dist/authoring/expression.d.ts",
22
+ "default": "./dist/authoring/expression.js"
23
+ },
24
+ "./tasks/git": {
25
+ "development": "./src/authoring/tasks/git.ts",
26
+ "types": "./dist/authoring/tasks/git.d.ts",
27
+ "default": "./dist/authoring/tasks/git.js"
35
28
  }
36
29
  },
37
- "main": "./dist/index.js",
38
- "types": "./dist/index.d.ts",
39
30
  "files": [
40
31
  "dist",
32
+ "skills",
41
33
  "README.md",
42
34
  "LICENSE"
43
35
  ],
@@ -45,18 +37,26 @@
45
37
  "access": "public"
46
38
  },
47
39
  "dependencies": {
40
+ "@clack/prompts": "^1.6.0",
48
41
  "commander": "^15.0.0",
49
- "yaml": "^2.9.0",
50
- "@acpus/core": "0.6.0",
51
- "@acpus/runtime": "0.8.0",
52
- "@acpus/tui": "0.6.2"
42
+ "@acpus/core": "0.7.0-alpha.1",
43
+ "@acpus/expression": "0.1.0-alpha.1",
44
+ "@acpus/runtime": "0.9.0-alpha.1",
45
+ "@acpus/tasks": "0.1.0-alpha.1",
46
+ "@acpus/web": "0.1.0-alpha.1",
47
+ "@acpus/workflow-compiler": "0.1.0-alpha.1"
53
48
  },
54
49
  "devDependencies": {
55
- "@types/node": "^22.15.30"
50
+ "@types/node": "^22.15.30",
51
+ "tsx": "^4.22.4"
52
+ },
53
+ "repository": {
54
+ "type": "git",
55
+ "url": "https://github.com/kelvinschen/acpus"
56
56
  },
57
57
  "scripts": {
58
- "build": "tsgo -p tsconfig.json && node -e \"require('node:fs').chmodSync('dist/index.js', 0o755)\"",
59
- "typecheck": "tsgo -p tsconfig.json --noEmit",
58
+ "build": "tsc -p tsconfig.json",
59
+ "typecheck": "tsc -p tsconfig.json --noEmit && tsc -p tsconfig.fixtures.json --noEmit",
60
60
  "clean": "rm -rf dist"
61
61
  }
62
62
  }
@@ -0,0 +1,120 @@
1
+ ---
2
+ name: acpus
3
+ description: Helps author, check, run, inspect, recover, and explain Acpus TypeScript workflows, durable runs, agent/task/signal nodes, runtime controls, catalog entries, hooks.json. Use when the user mentions Acpus, acpus workflow/runs/hooks, TypeScript workflow modules, WorkflowIR, task.define, acpus/core, acpus/expression, acpus/tasks/git, or retry/fork/signal/pause/resume/cancel operations.
4
+ ---
5
+
6
+ # Acpus
7
+
8
+ Use this Skill for the TypeScript implementation of Acpus.
9
+
10
+ Acpus is a local durable harness for AI-first workflows. Authors write typed TypeScript workflow modules, Acpus compiles them to frozen `WorkflowIR`, and the durable runtime admits and advances runs from that frozen state.
11
+
12
+ Assume the user can run the CLI as `acpus`. If the CLI is unavailable, ask whether they want to install it with `npm install -g acpus` before giving installation steps.
13
+
14
+ ## First classify the request
15
+
16
+ | Path | Use when the user asks to... | Start here |
17
+ | --- | --- | --- |
18
+ | Explain | understand Acpus concepts, node types, WorkflowIR, expressions, or durable runs | Answer conceptually; use the focused reference for the topic. |
19
+ | Author / adapt | create or edit a TypeScript workflow module, task, agent, signal, composite, schema, or prompt | Read `references/authoring.md`, then examples under `examples/workflows/`. |
20
+ | Check | validate a workflow before running it | Use `acpus workflow check <workflow.ts>`; read `references/cli-operations.md`. |
21
+ | Run | start an existing workflow or catalog entry | Use `acpus workflow run <workflow-or-catalog>`; read `references/cli-operations.md`. |
22
+ | Inspect / monitor | inspect a run, pick a run interactively, observe status, diagnose awaiting signal or stale execution | Use `acpus runs inspect [run-id]`; read `references/runtime-recovery.md`. |
23
+ | Recover / control | pause, resume, retry, cancel, fork, or signal a run | Inspect first; then choose the smallest safe control in `references/runtime-recovery.md`. |
24
+ | Configure hooks | validate or explain runtime hook config | Read `references/hooks-json.md`. |
25
+
26
+ A single conversation may move through several paths. Re-classify before each material action.
27
+
28
+ ## Operating defaults
29
+
30
+ 1. Use `acpus <cmd> --help` for exact command syntax.
31
+ 2. Check workflows before running; inspect runs before retry, fork, signal, cancel, pause, resume, or delete.
32
+ 3. Ask before destructive actions such as canceling, deleting `.acpus`, unsafe fork reuse, publishing, pushing, or deleting files.
33
+ 4. For exact authoring API signatures, inspect the installed package declarations.
34
+
35
+ ## Authoring quick sheet
36
+
37
+ ```ts
38
+ import { defineWorkflow, z } from "acpus/core";
39
+ import { template, and, lte } from "acpus/expression";
40
+
41
+ export default defineWorkflow({
42
+ name: "diff-review",
43
+ description: "Review a repository diff for readiness.",
44
+ inputSchema: z.object({ repoPath: z.path(), headRef: z.string().default("HEAD") }),
45
+ agents: {
46
+ reviewer: { use: "codex" },
47
+ },
48
+ }).build(({ input, agents, step, meta }) => {
49
+ const diff = step("collect_diff").task({
50
+ run: {
51
+ input: { repoPath: input.repoPath, headRef: input.headRef },
52
+ cwd: input.repoPath,
53
+ exec: async ({ input, $, artifact }) => {
54
+ const result = await $`git diff ${input.headRef}`;
55
+ return {
56
+ patch: await artifact.writeText("diff.patch", result.stdout, {
57
+ mediaType: "text/x-patch",
58
+ }),
59
+ };
60
+ },
61
+ },
62
+ timeout: "5m",
63
+ });
64
+
65
+ const review = step("review").agent({
66
+ outputSchema: z.object({
67
+ ready: z.boolean(),
68
+ riskCount: z.number(),
69
+ summary: z.string(),
70
+ }),
71
+ run: {
72
+ agent: agents.reviewer,
73
+ prompt: template`Review this patch and return JSON: ${diff.output.patch}`,
74
+ },
75
+ retry: { max: 2 },
76
+ timeout: "30m",
77
+ });
78
+
79
+ return { runId: meta.runId, ready: review.output.ready, summary: review.output.summary };
80
+ });
81
+ ```
82
+
83
+ ## Run quick sheet
84
+
85
+ Check before admitting a durable run:
86
+
87
+ ```sh
88
+ acpus workflow check <workflow.ts-or-catalog>
89
+ ```
90
+
91
+ Run workflow with input, `--background` for background run:
92
+
93
+ ```sh
94
+ acpus workflow run <workflow.ts-or-catalog> --input '<json>' [--background]
95
+ ```
96
+
97
+ Inspect run
98
+
99
+ ```sh
100
+ acpus runs inspect <run-id>
101
+ ```
102
+
103
+ ## Reference map
104
+
105
+ Read only the file needed for the current task:
106
+
107
+ | Need | Read |
108
+ | --- | --- |
109
+ | TypeScript workflow DSL, nodes, expressions, schemas, tasks, agents, artifacts | `references/authoring.md` |
110
+ | Exact public API signatures | Use the declaration lookup protocol in `references/authoring.md` |
111
+ | CLI operation defaults and help discovery | `references/cli-operations.md` |
112
+ | Inspecting, monitoring, retry/fork/signal/cancel/pause/resume decisions | `references/runtime-recovery.md` |
113
+ | hooks.json format and hook validation/listing | `references/hooks-json.md` |
114
+ | Adversarial review with dynamic lenses, fanout, cross-critique, and structured synthesis | `examples/workflows/adversarial-review/workflow.ts` |
115
+ | Issue triage with fanout, parallel, switch, companion reusable task module, and agent review | `examples/workflows/issue-triage/workflow.ts` |
116
+ | Issue triage companion task module | `examples/workflows/issue-triage/tasks.ts` |
117
+ | Change approval with agent plan refinement, loop, optional signal, if, and assert | `examples/workflows/change-approval/workflow.ts` |
118
+ | Worktree tournament with `createWorktree`, three implementation agents, and a judge | `examples/workflows/worktree-tournament/workflow.ts` |
119
+ | Multi-aspect brainstorm workflow | `examples/workflows/multi-aspect-brainstorm/workflow.ts` |
120
+ | Copyable hook config | `examples/hooks.example.json` |