pi-loop 0.1.0
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/agents/code-reviewer.md +82 -0
- package/agents/coder.md +82 -0
- package/agents/decomposer.md +55 -0
- package/agents/judge.md +90 -0
- package/agents/review-optimizer.md +44 -0
- package/dist/agents/adapter.d.ts +9 -0
- package/dist/agents/adapter.d.ts.map +1 -0
- package/dist/agents/adapter.js +41 -0
- package/dist/agents/adapter.js.map +1 -0
- package/dist/agents/factory.d.ts +7 -0
- package/dist/agents/factory.d.ts.map +1 -0
- package/dist/agents/factory.js +49 -0
- package/dist/agents/factory.js.map +1 -0
- package/dist/agents/registry.d.ts +4 -0
- package/dist/agents/registry.d.ts.map +1 -0
- package/dist/agents/registry.js +98 -0
- package/dist/agents/registry.js.map +1 -0
- package/dist/agents/types.d.ts +21 -0
- package/dist/agents/types.d.ts.map +1 -0
- package/dist/agents/types.js +39 -0
- package/dist/agents/types.js.map +1 -0
- package/dist/cli/args.d.ts +38 -0
- package/dist/cli/args.d.ts.map +1 -0
- package/dist/cli/args.js +160 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/commands.d.ts +29 -0
- package/dist/cli/commands.d.ts.map +1 -0
- package/dist/cli/commands.js +362 -0
- package/dist/cli/commands.js.map +1 -0
- package/dist/cli/output.d.ts +33 -0
- package/dist/cli/output.d.ts.map +1 -0
- package/dist/cli/output.js +99 -0
- package/dist/cli/output.js.map +1 -0
- package/dist/config/defaults.d.ts +3 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +31 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/loader.d.ts +11 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +70 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/types.d.ts +41 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +5 -0
- package/dist/config/types.js.map +1 -0
- package/dist/core/checkpoint.d.ts +18 -0
- package/dist/core/checkpoint.d.ts.map +1 -0
- package/dist/core/checkpoint.js +32 -0
- package/dist/core/checkpoint.js.map +1 -0
- package/dist/core/judge.d.ts +11 -0
- package/dist/core/judge.d.ts.map +1 -0
- package/dist/core/judge.js +91 -0
- package/dist/core/judge.js.map +1 -0
- package/dist/core/learnings.d.ts +4 -0
- package/dist/core/learnings.d.ts.map +1 -0
- package/dist/core/learnings.js +33 -0
- package/dist/core/learnings.js.map +1 -0
- package/dist/core/orchestrator.d.ts +64 -0
- package/dist/core/orchestrator.d.ts.map +1 -0
- package/dist/core/orchestrator.js +499 -0
- package/dist/core/orchestrator.js.map +1 -0
- package/dist/core/plan.d.ts +7 -0
- package/dist/core/plan.d.ts.map +1 -0
- package/dist/core/plan.js +15 -0
- package/dist/core/plan.js.map +1 -0
- package/dist/core/readiness-policy.d.ts +11 -0
- package/dist/core/readiness-policy.d.ts.map +1 -0
- package/dist/core/readiness-policy.js +24 -0
- package/dist/core/readiness-policy.js.map +1 -0
- package/dist/core/scheduling-policy.d.ts +9 -0
- package/dist/core/scheduling-policy.d.ts.map +1 -0
- package/dist/core/scheduling-policy.js +56 -0
- package/dist/core/scheduling-policy.js.map +1 -0
- package/dist/core/task-backend.d.ts +55 -0
- package/dist/core/task-backend.d.ts.map +1 -0
- package/dist/core/task-backend.js +76 -0
- package/dist/core/task-backend.js.map +1 -0
- package/dist/core/task-state.d.ts +26 -0
- package/dist/core/task-state.d.ts.map +1 -0
- package/dist/core/task-state.js +182 -0
- package/dist/core/task-state.js.map +1 -0
- package/dist/core/wiring.d.ts +12 -0
- package/dist/core/wiring.d.ts.map +1 -0
- package/dist/core/wiring.js +131 -0
- package/dist/core/wiring.js.map +1 -0
- package/dist/git/conflict.d.ts +6 -0
- package/dist/git/conflict.d.ts.map +1 -0
- package/dist/git/conflict.js +25 -0
- package/dist/git/conflict.js.map +1 -0
- package/dist/git/repo.d.ts +13 -0
- package/dist/git/repo.d.ts.map +1 -0
- package/dist/git/repo.js +74 -0
- package/dist/git/repo.js.map +1 -0
- package/dist/git/same-branch.d.ts +9 -0
- package/dist/git/same-branch.d.ts.map +1 -0
- package/dist/git/same-branch.js +55 -0
- package/dist/git/same-branch.js.map +1 -0
- package/dist/git/worktree.d.ts +14 -0
- package/dist/git/worktree.d.ts.map +1 -0
- package/dist/git/worktree.js +78 -0
- package/dist/git/worktree.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +47 -0
- package/dist/index.js.map +1 -0
- package/dist/integrations/linear/backend.d.ts +38 -0
- package/dist/integrations/linear/backend.d.ts.map +1 -0
- package/dist/integrations/linear/backend.js +374 -0
- package/dist/integrations/linear/backend.js.map +1 -0
- package/dist/integrations/linear/client.d.ts +19 -0
- package/dist/integrations/linear/client.d.ts.map +1 -0
- package/dist/integrations/linear/client.js +86 -0
- package/dist/integrations/linear/client.js.map +1 -0
- package/dist/integrations/linear/comment-templates.d.ts +14 -0
- package/dist/integrations/linear/comment-templates.d.ts.map +1 -0
- package/dist/integrations/linear/comment-templates.js +50 -0
- package/dist/integrations/linear/comment-templates.js.map +1 -0
- package/dist/integrations/linear/contract.d.ts +15 -0
- package/dist/integrations/linear/contract.d.ts.map +1 -0
- package/dist/integrations/linear/contract.js +86 -0
- package/dist/integrations/linear/contract.js.map +1 -0
- package/dist/integrations/linear/types.d.ts +39 -0
- package/dist/integrations/linear/types.d.ts.map +1 -0
- package/dist/integrations/linear/types.js +2 -0
- package/dist/integrations/linear/types.js.map +1 -0
- package/dist/swarm/pool.d.ts +33 -0
- package/dist/swarm/pool.d.ts.map +1 -0
- package/dist/swarm/pool.js +182 -0
- package/dist/swarm/pool.js.map +1 -0
- package/dist/swarm/scheduler.d.ts +38 -0
- package/dist/swarm/scheduler.d.ts.map +1 -0
- package/dist/swarm/scheduler.js +191 -0
- package/dist/swarm/scheduler.js.map +1 -0
- package/dist/swarm/worker.d.ts +49 -0
- package/dist/swarm/worker.d.ts.map +1 -0
- package/dist/swarm/worker.js +180 -0
- package/dist/swarm/worker.js.map +1 -0
- package/dist/tools/bash-tool.d.ts +24 -0
- package/dist/tools/bash-tool.d.ts.map +1 -0
- package/dist/tools/bash-tool.js +177 -0
- package/dist/tools/bash-tool.js.map +1 -0
- package/dist/tools/file-tools.d.ts +3 -0
- package/dist/tools/file-tools.d.ts.map +1 -0
- package/dist/tools/file-tools.js +68 -0
- package/dist/tools/file-tools.js.map +1 -0
- package/dist/tools/git-tools.d.ts +3 -0
- package/dist/tools/git-tools.d.ts.map +1 -0
- package/dist/tools/git-tools.js +44 -0
- package/dist/tools/git-tools.js.map +1 -0
- package/dist/tools/learnings-tool.d.ts +3 -0
- package/dist/tools/learnings-tool.d.ts.map +1 -0
- package/dist/tools/learnings-tool.js +48 -0
- package/dist/tools/learnings-tool.js.map +1 -0
- package/dist/tools/plan-tool.d.ts +3 -0
- package/dist/tools/plan-tool.d.ts.map +1 -0
- package/dist/tools/plan-tool.js +24 -0
- package/dist/tools/plan-tool.js.map +1 -0
- package/dist/tools/task-tools.d.ts +3 -0
- package/dist/tools/task-tools.d.ts.map +1 -0
- package/dist/tools/task-tools.js +108 -0
- package/dist/tools/task-tools.js.map +1 -0
- package/dist/tools/test-tool.d.ts +3 -0
- package/dist/tools/test-tool.d.ts.map +1 -0
- package/dist/tools/test-tool.js +43 -0
- package/dist/tools/test-tool.js.map +1 -0
- package/package.json +47 -0
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/** Mapping of tool names each agent role is allowed to use */
|
|
2
|
+
export const AGENT_TOOL_PERMISSIONS = {
|
|
3
|
+
decomposer: ["read_plan", "read_tasks", "update_task", "create_subtasks", "read_learnings"],
|
|
4
|
+
"review-optimizer": ["read_plan", "read_tasks", "update_task", "read_learnings"],
|
|
5
|
+
coder: [
|
|
6
|
+
"read_file",
|
|
7
|
+
"write_file",
|
|
8
|
+
"edit_file",
|
|
9
|
+
"bash",
|
|
10
|
+
"read_plan",
|
|
11
|
+
"read_tasks",
|
|
12
|
+
"update_task",
|
|
13
|
+
"read_learnings",
|
|
14
|
+
"append_learnings",
|
|
15
|
+
"run_tests",
|
|
16
|
+
"git_commit",
|
|
17
|
+
],
|
|
18
|
+
"code-reviewer": [
|
|
19
|
+
"read_file",
|
|
20
|
+
"bash",
|
|
21
|
+
"read_plan",
|
|
22
|
+
"read_tasks",
|
|
23
|
+
"update_task",
|
|
24
|
+
"read_learnings",
|
|
25
|
+
"append_learnings",
|
|
26
|
+
"run_tests",
|
|
27
|
+
"git_diff",
|
|
28
|
+
],
|
|
29
|
+
judge: [
|
|
30
|
+
"read_file",
|
|
31
|
+
"bash",
|
|
32
|
+
"read_plan",
|
|
33
|
+
"read_tasks",
|
|
34
|
+
"read_learnings",
|
|
35
|
+
"append_learnings",
|
|
36
|
+
"run_tests",
|
|
37
|
+
],
|
|
38
|
+
};
|
|
39
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/agents/types.ts"],"names":[],"mappings":"AAsBA,8DAA8D;AAC9D,MAAM,CAAC,MAAM,sBAAsB,GAAyC;IAC3E,UAAU,EAAE,CAAC,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,iBAAiB,EAAE,gBAAgB,CAAC;IAC3F,kBAAkB,EAAE,CAAC,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,gBAAgB,CAAC;IAChF,KAAK,EAAE;QACN,WAAW;QACX,YAAY;QACZ,WAAW;QACX,MAAM;QACN,WAAW;QACX,YAAY;QACZ,aAAa;QACb,gBAAgB;QAChB,kBAAkB;QAClB,WAAW;QACX,YAAY;KACZ;IACD,eAAe,EAAE;QAChB,WAAW;QACX,MAAM;QACN,WAAW;QACX,YAAY;QACZ,aAAa;QACb,gBAAgB;QAChB,kBAAkB;QAClB,WAAW;QACX,UAAU;KACV;IACD,KAAK,EAAE;QACN,WAAW;QACX,MAAM;QACN,WAAW;QACX,YAAY;QACZ,gBAAgB;QAChB,kBAAkB;QAClB,WAAW;KACX;CACQ,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI argument parsing from process.argv.
|
|
3
|
+
*/
|
|
4
|
+
export interface ParsedArgs {
|
|
5
|
+
command: "run" | "resume" | "status" | "validate" | "clean" | "help";
|
|
6
|
+
planPath?: string;
|
|
7
|
+
options: {
|
|
8
|
+
model?: string;
|
|
9
|
+
concurrency?: number;
|
|
10
|
+
thinking?: string;
|
|
11
|
+
config?: string;
|
|
12
|
+
taskBackend?: string;
|
|
13
|
+
linearCycle?: string;
|
|
14
|
+
linearTeam?: string;
|
|
15
|
+
verbose?: boolean;
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Parses argv (skipping first 2 entries for node and script).
|
|
20
|
+
*
|
|
21
|
+
* Supports:
|
|
22
|
+
* - pi-loop run <plan.md>
|
|
23
|
+
* - pi-loop resume
|
|
24
|
+
* - pi-loop status
|
|
25
|
+
* - pi-loop validate <plan.md>
|
|
26
|
+
* - pi-loop clean
|
|
27
|
+
* - --model provider:modelId
|
|
28
|
+
* - --concurrency N
|
|
29
|
+
* - --thinking level
|
|
30
|
+
* - --config path
|
|
31
|
+
* - --task-backend markdown|linear
|
|
32
|
+
* - --linear-cycle "Cycle Name"
|
|
33
|
+
* - --linear-team "TEAM"
|
|
34
|
+
* - --verbose
|
|
35
|
+
* - --help or no args → help command
|
|
36
|
+
*/
|
|
37
|
+
export declare function parseArgs(argv: string[]): ParsedArgs;
|
|
38
|
+
//# sourceMappingURL=args.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../../src/cli/args.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,UAAU;IAC1B,OAAO,EAAE,KAAK,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,OAAO,GAAG,MAAM,CAAC;IACrE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE;QACR,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,OAAO,CAAC,EAAE,OAAO,CAAC;KAClB,CAAC;CACF;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAwFpD"}
|
package/dist/cli/args.js
ADDED
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI argument parsing from process.argv.
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Parses argv (skipping first 2 entries for node and script).
|
|
6
|
+
*
|
|
7
|
+
* Supports:
|
|
8
|
+
* - pi-loop run <plan.md>
|
|
9
|
+
* - pi-loop resume
|
|
10
|
+
* - pi-loop status
|
|
11
|
+
* - pi-loop validate <plan.md>
|
|
12
|
+
* - pi-loop clean
|
|
13
|
+
* - --model provider:modelId
|
|
14
|
+
* - --concurrency N
|
|
15
|
+
* - --thinking level
|
|
16
|
+
* - --config path
|
|
17
|
+
* - --task-backend markdown|linear
|
|
18
|
+
* - --linear-cycle "Cycle Name"
|
|
19
|
+
* - --linear-team "TEAM"
|
|
20
|
+
* - --verbose
|
|
21
|
+
* - --help or no args → help command
|
|
22
|
+
*/
|
|
23
|
+
export function parseArgs(argv) {
|
|
24
|
+
const args = argv.slice(2);
|
|
25
|
+
const result = {
|
|
26
|
+
command: "help",
|
|
27
|
+
options: {},
|
|
28
|
+
};
|
|
29
|
+
if (args.length === 0) {
|
|
30
|
+
return result;
|
|
31
|
+
}
|
|
32
|
+
let i = 0;
|
|
33
|
+
// Check for --help anywhere in args
|
|
34
|
+
if (args.includes("--help")) {
|
|
35
|
+
result.command = "help";
|
|
36
|
+
return result;
|
|
37
|
+
}
|
|
38
|
+
// First non-flag argument is the command
|
|
39
|
+
while (i < args.length && args[i].startsWith("--")) {
|
|
40
|
+
i = parseFlag(args, i, result);
|
|
41
|
+
}
|
|
42
|
+
if (i >= args.length) {
|
|
43
|
+
return result;
|
|
44
|
+
}
|
|
45
|
+
const command = args[i];
|
|
46
|
+
i++;
|
|
47
|
+
switch (command) {
|
|
48
|
+
case "run": {
|
|
49
|
+
result.command = "run";
|
|
50
|
+
// Next non-flag arg is planPath
|
|
51
|
+
while (i < args.length) {
|
|
52
|
+
if (args[i].startsWith("--")) {
|
|
53
|
+
i = parseFlag(args, i, result);
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
result.planPath = args[i];
|
|
57
|
+
i++;
|
|
58
|
+
break;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
break;
|
|
62
|
+
}
|
|
63
|
+
case "resume":
|
|
64
|
+
result.command = "resume";
|
|
65
|
+
break;
|
|
66
|
+
case "status":
|
|
67
|
+
result.command = "status";
|
|
68
|
+
break;
|
|
69
|
+
case "validate": {
|
|
70
|
+
result.command = "validate";
|
|
71
|
+
// Next non-flag arg is planPath
|
|
72
|
+
while (i < args.length) {
|
|
73
|
+
if (args[i].startsWith("--")) {
|
|
74
|
+
i = parseFlag(args, i, result);
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
result.planPath = args[i];
|
|
78
|
+
i++;
|
|
79
|
+
break;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
break;
|
|
83
|
+
}
|
|
84
|
+
case "clean":
|
|
85
|
+
result.command = "clean";
|
|
86
|
+
break;
|
|
87
|
+
case "help":
|
|
88
|
+
result.command = "help";
|
|
89
|
+
break;
|
|
90
|
+
default:
|
|
91
|
+
result.command = "help";
|
|
92
|
+
break;
|
|
93
|
+
}
|
|
94
|
+
// Parse remaining flags
|
|
95
|
+
while (i < args.length) {
|
|
96
|
+
if (args[i].startsWith("--")) {
|
|
97
|
+
i = parseFlag(args, i, result);
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
i++;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return result;
|
|
104
|
+
}
|
|
105
|
+
function parseFlag(args, index, result) {
|
|
106
|
+
const flag = args[index];
|
|
107
|
+
switch (flag) {
|
|
108
|
+
case "--model":
|
|
109
|
+
if (index + 1 < args.length) {
|
|
110
|
+
result.options.model = args[index + 1];
|
|
111
|
+
return index + 2;
|
|
112
|
+
}
|
|
113
|
+
return index + 1;
|
|
114
|
+
case "--concurrency":
|
|
115
|
+
if (index + 1 < args.length) {
|
|
116
|
+
const parsed = Number.parseInt(args[index + 1], 10);
|
|
117
|
+
if (!Number.isNaN(parsed) && parsed > 0) {
|
|
118
|
+
result.options.concurrency = parsed;
|
|
119
|
+
}
|
|
120
|
+
return index + 2;
|
|
121
|
+
}
|
|
122
|
+
return index + 1;
|
|
123
|
+
case "--thinking":
|
|
124
|
+
if (index + 1 < args.length) {
|
|
125
|
+
result.options.thinking = args[index + 1];
|
|
126
|
+
return index + 2;
|
|
127
|
+
}
|
|
128
|
+
return index + 1;
|
|
129
|
+
case "--config":
|
|
130
|
+
if (index + 1 < args.length) {
|
|
131
|
+
result.options.config = args[index + 1];
|
|
132
|
+
return index + 2;
|
|
133
|
+
}
|
|
134
|
+
return index + 1;
|
|
135
|
+
case "--verbose":
|
|
136
|
+
result.options.verbose = true;
|
|
137
|
+
return index + 1;
|
|
138
|
+
case "--task-backend":
|
|
139
|
+
if (index + 1 < args.length) {
|
|
140
|
+
result.options.taskBackend = args[index + 1];
|
|
141
|
+
return index + 2;
|
|
142
|
+
}
|
|
143
|
+
return index + 1;
|
|
144
|
+
case "--linear-cycle":
|
|
145
|
+
if (index + 1 < args.length) {
|
|
146
|
+
result.options.linearCycle = args[index + 1];
|
|
147
|
+
return index + 2;
|
|
148
|
+
}
|
|
149
|
+
return index + 1;
|
|
150
|
+
case "--linear-team":
|
|
151
|
+
if (index + 1 < args.length) {
|
|
152
|
+
result.options.linearTeam = args[index + 1];
|
|
153
|
+
return index + 2;
|
|
154
|
+
}
|
|
155
|
+
return index + 1;
|
|
156
|
+
default:
|
|
157
|
+
return index + 1;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=args.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"args.js","sourceRoot":"","sources":["../../src/cli/args.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Command handlers — wired to the orchestrator.
|
|
3
|
+
*/
|
|
4
|
+
import type { ParsedArgs } from "./args.js";
|
|
5
|
+
/**
|
|
6
|
+
* Main execution: load config, create orchestrator, run.
|
|
7
|
+
*/
|
|
8
|
+
export declare function runCommand(planPath: string, options: ParsedArgs["options"]): Promise<void>;
|
|
9
|
+
/**
|
|
10
|
+
* Load checkpoint, resume from where we left off.
|
|
11
|
+
*/
|
|
12
|
+
export declare function resumeCommand(options: ParsedArgs["options"]): Promise<void>;
|
|
13
|
+
/**
|
|
14
|
+
* Read Tasks.md and display formatted task list.
|
|
15
|
+
*/
|
|
16
|
+
export declare function statusCommand(): Promise<void>;
|
|
17
|
+
/**
|
|
18
|
+
* Dry run: load config, run decomposer + reviewer only, display results.
|
|
19
|
+
*/
|
|
20
|
+
export declare function validateCommand(planPath: string, options: ParsedArgs["options"]): Promise<void>;
|
|
21
|
+
/**
|
|
22
|
+
* Remove .pi-loop/ directory and any .pi-loop-worktrees/ directories.
|
|
23
|
+
*/
|
|
24
|
+
export declare function cleanCommand(): Promise<void>;
|
|
25
|
+
/**
|
|
26
|
+
* Print usage text.
|
|
27
|
+
*/
|
|
28
|
+
export declare function helpCommand(): void;
|
|
29
|
+
//# sourceMappingURL=commands.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../src/cli/commands.ts"],"names":[],"mappings":"AAAA;;GAEG;AAgBH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AA4D5C;;GAEG;AACH,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CA6DhG;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,UAAU,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAmDjF;AAED;;GAEG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CA8EnD;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAwFrG;AAED;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAiBlD;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAuBlC"}
|
|
@@ -0,0 +1,362 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Command handlers — wired to the orchestrator.
|
|
3
|
+
*/
|
|
4
|
+
import { existsSync } from "node:fs";
|
|
5
|
+
import { readFile } from "node:fs/promises";
|
|
6
|
+
import { rm } from "node:fs/promises";
|
|
7
|
+
import { resolve } from "node:path";
|
|
8
|
+
import { loadConfig } from "../config/loader.js";
|
|
9
|
+
import { loadCheckpoint } from "../core/checkpoint.js";
|
|
10
|
+
import { Orchestrator } from "../core/orchestrator.js";
|
|
11
|
+
import { evaluateTaskReadiness } from "../core/readiness-policy.js";
|
|
12
|
+
import { selectExecutionOrder } from "../core/scheduling-policy.js";
|
|
13
|
+
import { parseTasks } from "../core/task-state.js";
|
|
14
|
+
import { buildOrchestratorDeps } from "../core/wiring.js";
|
|
15
|
+
import { ensureRepo } from "../git/repo.js";
|
|
16
|
+
import { createLinearTaskBackend } from "../integrations/linear/backend.js";
|
|
17
|
+
import { logError, logPhase, logSuccess, logSummary, logTask, logVerbose } from "./output.js";
|
|
18
|
+
/**
|
|
19
|
+
* Builds CLI overrides into a partial PiLoopConfig.
|
|
20
|
+
*/
|
|
21
|
+
function buildOverrides(options) {
|
|
22
|
+
const overrides = {};
|
|
23
|
+
if (options.model) {
|
|
24
|
+
const [provider, ...rest] = options.model.split(":");
|
|
25
|
+
const modelId = rest.join(":");
|
|
26
|
+
if (provider && modelId) {
|
|
27
|
+
overrides.defaultModel = { provider, modelId };
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
if (options.concurrency !== undefined) {
|
|
31
|
+
overrides.maxConcurrency = options.concurrency;
|
|
32
|
+
}
|
|
33
|
+
if (options.thinking) {
|
|
34
|
+
overrides.thinkingLevel = options.thinking;
|
|
35
|
+
}
|
|
36
|
+
if (options.taskBackend === "markdown" || options.taskBackend === "linear") {
|
|
37
|
+
overrides.taskBackend = options.taskBackend;
|
|
38
|
+
}
|
|
39
|
+
return overrides;
|
|
40
|
+
}
|
|
41
|
+
function applyLinearCliOverrides(config, options) {
|
|
42
|
+
if (options.linearCycle) {
|
|
43
|
+
config.linear.cycleName = options.linearCycle;
|
|
44
|
+
}
|
|
45
|
+
if (options.linearTeam) {
|
|
46
|
+
config.linear.teamId = options.linearTeam;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
function validateLinearConfiguration(config) {
|
|
50
|
+
if (config.taskBackend !== "linear")
|
|
51
|
+
return [];
|
|
52
|
+
const errors = [];
|
|
53
|
+
if (!config.linear.enabled) {
|
|
54
|
+
errors.push("Linear backend selected but config.linear.enabled is false");
|
|
55
|
+
}
|
|
56
|
+
if (!config.linear.apiUrl.trim()) {
|
|
57
|
+
errors.push("Linear backend selected but config.linear.apiUrl is empty");
|
|
58
|
+
}
|
|
59
|
+
if (!config.linear.tokenEnvVar.trim()) {
|
|
60
|
+
errors.push("Linear backend selected but config.linear.tokenEnvVar is empty");
|
|
61
|
+
}
|
|
62
|
+
else if (!process.env[config.linear.tokenEnvVar]) {
|
|
63
|
+
errors.push(`Missing Linear token environment variable: ${config.linear.tokenEnvVar}`);
|
|
64
|
+
}
|
|
65
|
+
return errors;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Main execution: load config, create orchestrator, run.
|
|
69
|
+
*/
|
|
70
|
+
export async function runCommand(planPath, options) {
|
|
71
|
+
logPhase("initializing");
|
|
72
|
+
const overrides = buildOverrides(options);
|
|
73
|
+
const config = await loadConfig(options.config, overrides);
|
|
74
|
+
applyLinearCliOverrides(config, options);
|
|
75
|
+
const linearErrors = validateLinearConfiguration(config);
|
|
76
|
+
if (linearErrors.length > 0) {
|
|
77
|
+
for (const err of linearErrors) {
|
|
78
|
+
logError(err);
|
|
79
|
+
}
|
|
80
|
+
process.exitCode = 1;
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
logVerbose(`Model: ${config.defaultModel.provider}:${config.defaultModel.modelId}`, options.verbose ?? false);
|
|
84
|
+
logVerbose(`Concurrency: ${config.maxConcurrency}`, options.verbose ?? false);
|
|
85
|
+
logVerbose(`Thinking: ${config.thinkingLevel}`, options.verbose ?? false);
|
|
86
|
+
const resolvedPlan = resolve(planPath);
|
|
87
|
+
if (!existsSync(resolvedPlan)) {
|
|
88
|
+
logError(`Plan file not found: ${resolvedPlan}`);
|
|
89
|
+
process.exitCode = 1;
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
logPhase("running");
|
|
93
|
+
logVerbose(`Plan: ${resolvedPlan}`, options.verbose ?? false);
|
|
94
|
+
const workDir = process.cwd();
|
|
95
|
+
await ensureRepo(workDir, config.git.autoInit);
|
|
96
|
+
const piLoopDir = resolve(workDir, ".pi-loop");
|
|
97
|
+
const tasksPath = resolve(piLoopDir, "Tasks.md");
|
|
98
|
+
const learningsPath = resolve(piLoopDir, "Learnings.md");
|
|
99
|
+
const deps = await buildOrchestratorDeps(config, resolvedPlan, tasksPath, learningsPath, workDir);
|
|
100
|
+
const orchestrator = new Orchestrator({
|
|
101
|
+
planPath: resolvedPlan,
|
|
102
|
+
tasksPath,
|
|
103
|
+
learningsPath,
|
|
104
|
+
config,
|
|
105
|
+
deps,
|
|
106
|
+
workDir,
|
|
107
|
+
});
|
|
108
|
+
const verdict = await orchestrator.run();
|
|
109
|
+
logPhase(verdict.status === "done" ? "completed" : "incomplete");
|
|
110
|
+
logSuccess(`Verdict: ${verdict.status}`);
|
|
111
|
+
if (verdict.feedback) {
|
|
112
|
+
logVerbose(`Feedback: ${verdict.feedback}`, true);
|
|
113
|
+
}
|
|
114
|
+
const completed = verdict.completedGoals.length;
|
|
115
|
+
const total = completed + verdict.remainingGoals.length;
|
|
116
|
+
logSummary(completed, total, 0);
|
|
117
|
+
if (verdict.status !== "done") {
|
|
118
|
+
process.exitCode = 1;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Load checkpoint, resume from where we left off.
|
|
123
|
+
*/
|
|
124
|
+
export async function resumeCommand(options) {
|
|
125
|
+
logPhase("resuming");
|
|
126
|
+
const checkpoint = await loadCheckpoint();
|
|
127
|
+
if (!checkpoint) {
|
|
128
|
+
logError("No checkpoint found. Nothing to resume.");
|
|
129
|
+
process.exitCode = 1;
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
const overrides = buildOverrides(options);
|
|
133
|
+
const config = await loadConfig(options.config, overrides);
|
|
134
|
+
applyLinearCliOverrides(config, options);
|
|
135
|
+
const linearErrors = validateLinearConfiguration(config);
|
|
136
|
+
if (linearErrors.length > 0) {
|
|
137
|
+
for (const err of linearErrors) {
|
|
138
|
+
logError(err);
|
|
139
|
+
}
|
|
140
|
+
process.exitCode = 1;
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
logVerbose(`Resuming from phase: ${checkpoint.phase}, cycle: ${checkpoint.cycle}`, options.verbose ?? false);
|
|
144
|
+
logVerbose(`Config loaded: concurrency=${config.maxConcurrency}`, options.verbose ?? false);
|
|
145
|
+
const workDir = process.cwd();
|
|
146
|
+
const piLoopDir = resolve(workDir, ".pi-loop");
|
|
147
|
+
const tasksPath = resolve(piLoopDir, "Tasks.md");
|
|
148
|
+
const learningsPath = resolve(piLoopDir, "Learnings.md");
|
|
149
|
+
const deps = await buildOrchestratorDeps(config, checkpoint.planPath, tasksPath, learningsPath, workDir);
|
|
150
|
+
const orchestrator = new Orchestrator({
|
|
151
|
+
planPath: checkpoint.planPath,
|
|
152
|
+
tasksPath,
|
|
153
|
+
learningsPath,
|
|
154
|
+
config,
|
|
155
|
+
deps,
|
|
156
|
+
workDir,
|
|
157
|
+
});
|
|
158
|
+
const verdict = await orchestrator.resume(checkpoint);
|
|
159
|
+
logPhase(verdict.status === "done" ? "completed" : "incomplete");
|
|
160
|
+
logSuccess(`Verdict: ${verdict.status}`);
|
|
161
|
+
if (verdict.feedback) {
|
|
162
|
+
logVerbose(`Feedback: ${verdict.feedback}`, true);
|
|
163
|
+
}
|
|
164
|
+
if (verdict.status !== "done") {
|
|
165
|
+
process.exitCode = 1;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Read Tasks.md and display formatted task list.
|
|
170
|
+
*/
|
|
171
|
+
export async function statusCommand() {
|
|
172
|
+
logPhase("status");
|
|
173
|
+
const config = await loadConfig();
|
|
174
|
+
logSuccess(`Task backend: ${config.taskBackend}`);
|
|
175
|
+
if (config.taskBackend === "linear") {
|
|
176
|
+
const linearErrors = validateLinearConfiguration(config);
|
|
177
|
+
if (linearErrors.length > 0) {
|
|
178
|
+
for (const err of linearErrors) {
|
|
179
|
+
logError(err);
|
|
180
|
+
}
|
|
181
|
+
process.exitCode = 1;
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
const backend = createLinearTaskBackend(config.linear);
|
|
185
|
+
await backend.initializeCycle(0);
|
|
186
|
+
const ready = await backend.getReadyTasks("coder");
|
|
187
|
+
const scheduled = selectExecutionOrder(ready, {
|
|
188
|
+
role: "coder",
|
|
189
|
+
roleLabelPrefix: config.linear.roleLabelPrefix,
|
|
190
|
+
});
|
|
191
|
+
const skippedReasons = {};
|
|
192
|
+
const eligible = [];
|
|
193
|
+
for (const task of scheduled) {
|
|
194
|
+
const backendReadiness = await backend.validateDefinitionOfReady(task);
|
|
195
|
+
const readiness = evaluateTaskReadiness(task, backendReadiness, {
|
|
196
|
+
requireDescription: true,
|
|
197
|
+
disallowAmbiguousPlaceholders: true,
|
|
198
|
+
});
|
|
199
|
+
if (!readiness.ok) {
|
|
200
|
+
for (const reason of readiness.reasons) {
|
|
201
|
+
skippedReasons[reason] = (skippedReasons[reason] ?? 0) + 1;
|
|
202
|
+
}
|
|
203
|
+
continue;
|
|
204
|
+
}
|
|
205
|
+
eligible.push(task);
|
|
206
|
+
}
|
|
207
|
+
const snapshot = await backend.snapshotForJudge();
|
|
208
|
+
const doc = parseTasks(snapshot);
|
|
209
|
+
const blockedCount = doc.tasks.filter((task) => task.status === "rejected").length;
|
|
210
|
+
logSuccess(`Ready issues: ${ready.length}`);
|
|
211
|
+
logSuccess(`Eligible issues: ${eligible.length}`);
|
|
212
|
+
logSuccess(`Blocked issues: ${blockedCount}`);
|
|
213
|
+
if (eligible.length > 0) {
|
|
214
|
+
const next = eligible[0];
|
|
215
|
+
logVerbose(`Next candidate: ${next.id} ${next.title}`, true);
|
|
216
|
+
}
|
|
217
|
+
const skipEntries = Object.entries(skippedReasons).sort((a, b) => b[1] - a[1]);
|
|
218
|
+
if (skipEntries.length > 0) {
|
|
219
|
+
logVerbose("Skip reasons:", true);
|
|
220
|
+
for (const [reason, count] of skipEntries.slice(0, 5)) {
|
|
221
|
+
logVerbose(`- ${reason}: ${count}`, true);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
226
|
+
const locations = [resolve(".pi-loop", "Tasks.md"), resolve("Tasks.md")];
|
|
227
|
+
for (const loc of locations) {
|
|
228
|
+
if (existsSync(loc)) {
|
|
229
|
+
const content = await readFile(loc, "utf8");
|
|
230
|
+
const doc = parseTasks(content);
|
|
231
|
+
const completed = doc.tasks.filter((t) => t.status === "done").length;
|
|
232
|
+
for (const task of doc.tasks) {
|
|
233
|
+
logTask(task.id, task.title, task.status);
|
|
234
|
+
}
|
|
235
|
+
logSummary(completed, doc.tasks.length, doc.cycle);
|
|
236
|
+
return;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
logError("No Tasks.md found in .pi-loop/ or current directory.");
|
|
240
|
+
process.exitCode = 1;
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Dry run: load config, run decomposer + reviewer only, display results.
|
|
244
|
+
*/
|
|
245
|
+
export async function validateCommand(planPath, options) {
|
|
246
|
+
logPhase("validating");
|
|
247
|
+
const overrides = buildOverrides(options);
|
|
248
|
+
const config = await loadConfig(options.config, overrides);
|
|
249
|
+
applyLinearCliOverrides(config, options);
|
|
250
|
+
const linearErrors = validateLinearConfiguration(config);
|
|
251
|
+
if (linearErrors.length > 0) {
|
|
252
|
+
for (const err of linearErrors) {
|
|
253
|
+
logError(err);
|
|
254
|
+
}
|
|
255
|
+
process.exitCode = 1;
|
|
256
|
+
return;
|
|
257
|
+
}
|
|
258
|
+
const resolvedPlan = resolve(planPath);
|
|
259
|
+
if (!existsSync(resolvedPlan)) {
|
|
260
|
+
logError(`Plan file not found: ${resolvedPlan}`);
|
|
261
|
+
process.exitCode = 1;
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
logVerbose(`Validating plan: ${resolvedPlan}`, options.verbose ?? false);
|
|
265
|
+
logVerbose(`Model: ${config.defaultModel.provider}:${config.defaultModel.modelId}`, options.verbose ?? false);
|
|
266
|
+
logVerbose(`Concurrency: ${config.maxConcurrency}`, options.verbose ?? false);
|
|
267
|
+
logVerbose(`Thinking: ${config.thinkingLevel}`, options.verbose ?? false);
|
|
268
|
+
const workDir = process.cwd();
|
|
269
|
+
const piLoopDir = resolve(workDir, ".pi-loop");
|
|
270
|
+
const tasksPath = resolve(piLoopDir, "Tasks.md");
|
|
271
|
+
const learningsPath = resolve(piLoopDir, "Learnings.md");
|
|
272
|
+
const deps = await buildOrchestratorDeps(config, resolvedPlan, tasksPath, learningsPath, workDir);
|
|
273
|
+
if (config.taskBackend === "linear") {
|
|
274
|
+
logPhase("linear readiness dry run");
|
|
275
|
+
await deps.taskBackend.initializeCycle(0);
|
|
276
|
+
const ready = await deps.taskBackend.getReadyTasks("coder");
|
|
277
|
+
const scheduled = selectExecutionOrder(ready, {
|
|
278
|
+
role: "coder",
|
|
279
|
+
roleLabelPrefix: config.linear.roleLabelPrefix,
|
|
280
|
+
});
|
|
281
|
+
let eligible = 0;
|
|
282
|
+
let ineligible = 0;
|
|
283
|
+
for (const task of scheduled) {
|
|
284
|
+
const backendReadiness = await deps.taskBackend.validateDefinitionOfReady(task);
|
|
285
|
+
const readiness = evaluateTaskReadiness(task, backendReadiness, {
|
|
286
|
+
requireDescription: true,
|
|
287
|
+
disallowAmbiguousPlaceholders: true,
|
|
288
|
+
});
|
|
289
|
+
if (readiness.ok) {
|
|
290
|
+
eligible += 1;
|
|
291
|
+
logTask(task.id, task.title, "pending");
|
|
292
|
+
}
|
|
293
|
+
else {
|
|
294
|
+
ineligible += 1;
|
|
295
|
+
logTask(task.id, `${task.title} — ${readiness.reasons.join("; ")}`, "rejected");
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
logSuccess(`Linear validate complete: ${ready.length} ready, ${eligible} eligible, ${ineligible} ineligible`);
|
|
299
|
+
return;
|
|
300
|
+
}
|
|
301
|
+
// Dry run: decompose the plan and review, but don't execute
|
|
302
|
+
const plan = await readFile(resolvedPlan, "utf8");
|
|
303
|
+
const learnings = "";
|
|
304
|
+
logPhase("decomposing (dry run)");
|
|
305
|
+
const decomposer = await deps.createAgentFn("decomposer", learnings);
|
|
306
|
+
const tasksMarkdown = await decomposer.run(`Decompose the following plan into tasks in the Tasks.md format.\n\nPlan:\n${plan}`);
|
|
307
|
+
logPhase("reviewing (dry run)");
|
|
308
|
+
const reviewer = await deps.createAgentFn("review-optimizer", learnings);
|
|
309
|
+
const reviewedTasks = await reviewer.run(`Review and optimize the following task decomposition against the plan.\n\nPlan:\n${plan}\n\nTasks:\n${tasksMarkdown}`);
|
|
310
|
+
// Display reviewed tasks
|
|
311
|
+
const doc = parseTasks(reviewedTasks);
|
|
312
|
+
for (const task of doc.tasks) {
|
|
313
|
+
logTask(task.id, task.title, task.status);
|
|
314
|
+
}
|
|
315
|
+
logSuccess(`Validation complete: ${doc.tasks.length} tasks decomposed`);
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* Remove .pi-loop/ directory and any .pi-loop-worktrees/ directories.
|
|
319
|
+
*/
|
|
320
|
+
export async function cleanCommand() {
|
|
321
|
+
logPhase("cleaning");
|
|
322
|
+
const targets = [resolve(".pi-loop"), resolve(".pi-loop-worktrees")];
|
|
323
|
+
let cleaned = false;
|
|
324
|
+
for (const target of targets) {
|
|
325
|
+
if (existsSync(target)) {
|
|
326
|
+
await rm(target, { recursive: true, force: true });
|
|
327
|
+
logSuccess(`Removed ${target}`);
|
|
328
|
+
cleaned = true;
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
if (!cleaned) {
|
|
332
|
+
logSuccess("Nothing to clean.");
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
/**
|
|
336
|
+
* Print usage text.
|
|
337
|
+
*/
|
|
338
|
+
export function helpCommand() {
|
|
339
|
+
const text = `
|
|
340
|
+
pi-loop -- Autonomous coding loop CLI
|
|
341
|
+
|
|
342
|
+
Usage:
|
|
343
|
+
pi-loop run <plan.md> Execute a plan
|
|
344
|
+
pi-loop resume Resume from checkpoint
|
|
345
|
+
pi-loop status Show current task status
|
|
346
|
+
pi-loop validate <plan.md> Dry run -- decompose and review only
|
|
347
|
+
pi-loop clean Remove .pi-loop/ and worktree directories
|
|
348
|
+
|
|
349
|
+
Options:
|
|
350
|
+
--model <provider:modelId> Override default model
|
|
351
|
+
--concurrency <N> Max parallel workers
|
|
352
|
+
--thinking <level> Thinking level (off|minimal|low|medium|high|xhigh)
|
|
353
|
+
--task-backend <mode> Task backend (markdown|linear)
|
|
354
|
+
--linear-cycle <name> Override Linear cycle name
|
|
355
|
+
--linear-team <id> Override Linear team id
|
|
356
|
+
--config <path> Path to config file
|
|
357
|
+
--verbose Enable verbose output
|
|
358
|
+
--help Show this help
|
|
359
|
+
`;
|
|
360
|
+
process.stderr.write(text.trimStart());
|
|
361
|
+
}
|
|
362
|
+
//# sourceMappingURL=commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/cli/commands.ts"],"names":[],"mappings":"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"}
|