@scanton/phase2s 0.24.0 → 0.26.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/.phase2s/skills/deep-specify/SKILL.md +45 -27
- package/README.md +177 -95
- package/dist/src/cli/goal.d.ts +32 -0
- package/dist/src/cli/goal.d.ts.map +1 -0
- package/dist/src/cli/goal.js +262 -0
- package/dist/src/cli/goal.js.map +1 -0
- package/dist/src/cli/index.d.ts.map +1 -1
- package/dist/src/cli/index.js +10 -0
- package/dist/src/cli/index.js.map +1 -1
- package/dist/src/core/spec-parser.d.ts +41 -0
- package/dist/src/core/spec-parser.d.ts.map +1 -0
- package/dist/src/core/spec-parser.js +188 -0
- package/dist/src/core/spec-parser.js.map +1 -0
- package/dist/src/providers/codex.d.ts +8 -11
- package/dist/src/providers/codex.d.ts.map +1 -1
- package/dist/src/providers/codex.js +115 -118
- package/dist/src/providers/codex.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec-parser.js","sourceRoot":"","sources":["../../../src/core/spec-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,24 +5,21 @@ import type { OpenAIFunctionDef } from "../tools/types.js";
|
|
|
5
5
|
* Codex CLI provider.
|
|
6
6
|
*
|
|
7
7
|
* Uses `codex exec` in fully non-interactive scripting mode:
|
|
8
|
-
* --json
|
|
9
|
-
* --output-last-message writes the final response to a temp file
|
|
8
|
+
* --json suppresses the terminal UI, outputs JSONL events on stdout
|
|
10
9
|
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
10
|
+
* Each `item.completed` event with `type: "agent_message"` is yielded immediately
|
|
11
|
+
* as a `{ type: "text" }` ProviderEvent. Multi-step tasks (with tool calls) produce
|
|
12
|
+
* multiple agent_message items, so callers see real-time step-by-step progress rather
|
|
13
|
+
* than waiting for the entire run to finish.
|
|
13
14
|
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
* (same batch UX as before, but through the Provider streaming interface).
|
|
17
|
-
* Tool calling is not supported via the --output-last-message mechanism;
|
|
18
|
-
* toolCalls is always [].
|
|
15
|
+
* Malformed JSONL lines are silently skipped.
|
|
16
|
+
* Tool calling is not surfaced via this mechanism; toolCalls is always [].
|
|
19
17
|
*/
|
|
20
18
|
export declare class CodexProvider implements Provider {
|
|
21
19
|
name: string;
|
|
22
20
|
private codexPath;
|
|
23
21
|
private model;
|
|
24
22
|
constructor(config: Config);
|
|
25
|
-
chatStream(messages: Message[],
|
|
26
|
-
private _chat;
|
|
23
|
+
chatStream(messages: Message[], _tools: OpenAIFunctionDef[], options?: import("./types.js").ChatStreamOptions): AsyncIterable<ProviderEvent>;
|
|
27
24
|
}
|
|
28
25
|
//# sourceMappingURL=codex.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../../src/providers/codex.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../../src/providers/codex.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACnE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAkD3D;;;;;;;;;;;;;GAaG;AACH,qBAAa,aAAc,YAAW,QAAQ;IAC5C,IAAI,SAAe;IACnB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,KAAK,CAAS;gBAEV,MAAM,EAAE,MAAM;IAKnB,UAAU,CACf,QAAQ,EAAE,OAAO,EAAE,EACnB,MAAM,EAAE,iBAAiB,EAAE,EAC3B,OAAO,CAAC,EAAE,OAAO,YAAY,EAAE,iBAAiB,GAC/C,aAAa,CAAC,aAAa,CAAC;CAuIhC"}
|
|
@@ -1,56 +1,20 @@
|
|
|
1
1
|
import { spawn } from "node:child_process";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
import { join } from "node:path";
|
|
5
|
-
import { tmpdir } from "node:os";
|
|
6
|
-
/** Track all temp dirs created this process so we can clean up on crash/exit. */
|
|
7
|
-
const activeTempDirs = new Set();
|
|
8
|
-
function cleanupTempDirs() {
|
|
9
|
-
// Synchronous cleanup — rmSync is available here (unlike the async rm).
|
|
10
|
-
for (const dir of activeTempDirs) {
|
|
11
|
-
try {
|
|
12
|
-
rmSync(dir, { recursive: true, force: true });
|
|
13
|
-
}
|
|
14
|
-
catch {
|
|
15
|
-
// Best-effort — ignore errors (e.g. already deleted by normal path)
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* Guard against double-registration if the module is evaluated multiple times.
|
|
21
|
-
* In vitest environments, modules may be re-evaluated between test files, which
|
|
22
|
-
* would register duplicate handlers and trigger MaxListenersExceededWarning.
|
|
23
|
-
*/
|
|
24
|
-
let _signalHandlersRegistered = false;
|
|
25
|
-
if (!_signalHandlersRegistered) {
|
|
26
|
-
_signalHandlersRegistered = true;
|
|
27
|
-
process.on("exit", cleanupTempDirs);
|
|
28
|
-
// SIGTERM and SIGINT don't trigger "exit" automatically — register them explicitly
|
|
29
|
-
// so that temp dirs (which may contain prompt text) are cleaned up on Ctrl+C and kill.
|
|
30
|
-
process.on("SIGTERM", () => {
|
|
31
|
-
cleanupTempDirs();
|
|
32
|
-
process.exit(0);
|
|
33
|
-
});
|
|
34
|
-
process.on("SIGINT", () => {
|
|
35
|
-
cleanupTempDirs();
|
|
36
|
-
process.exit(0);
|
|
37
|
-
});
|
|
2
|
+
function isAgentMessage(item) {
|
|
3
|
+
return item.type === "agent_message" && "text" in item;
|
|
38
4
|
}
|
|
39
5
|
/**
|
|
40
6
|
* Codex CLI provider.
|
|
41
7
|
*
|
|
42
8
|
* Uses `codex exec` in fully non-interactive scripting mode:
|
|
43
|
-
* --json
|
|
44
|
-
* --output-last-message writes the final response to a temp file
|
|
9
|
+
* --json suppresses the terminal UI, outputs JSONL events on stdout
|
|
45
10
|
*
|
|
46
|
-
*
|
|
47
|
-
*
|
|
11
|
+
* Each `item.completed` event with `type: "agent_message"` is yielded immediately
|
|
12
|
+
* as a `{ type: "text" }` ProviderEvent. Multi-step tasks (with tool calls) produce
|
|
13
|
+
* multiple agent_message items, so callers see real-time step-by-step progress rather
|
|
14
|
+
* than waiting for the entire run to finish.
|
|
48
15
|
*
|
|
49
|
-
*
|
|
50
|
-
*
|
|
51
|
-
* (same batch UX as before, but through the Provider streaming interface).
|
|
52
|
-
* Tool calling is not supported via the --output-last-message mechanism;
|
|
53
|
-
* toolCalls is always [].
|
|
16
|
+
* Malformed JSONL lines are silently skipped.
|
|
17
|
+
* Tool calling is not surfaced via this mechanism; toolCalls is always [].
|
|
54
18
|
*/
|
|
55
19
|
export class CodexProvider {
|
|
56
20
|
name = "codex-cli";
|
|
@@ -60,22 +24,8 @@ export class CodexProvider {
|
|
|
60
24
|
this.codexPath = config.codexPath;
|
|
61
25
|
this.model = config.model;
|
|
62
26
|
}
|
|
63
|
-
async *chatStream(messages,
|
|
64
|
-
const
|
|
65
|
-
if (result.text) {
|
|
66
|
-
yield { type: "text", content: result.text };
|
|
67
|
-
}
|
|
68
|
-
// Codex provider currently always returns toolCalls: [] — tool calling
|
|
69
|
-
// is not supported via the --output-last-message mechanism.
|
|
70
|
-
if (result.toolCalls.length > 0) {
|
|
71
|
-
yield { type: "tool_calls", calls: result.toolCalls };
|
|
72
|
-
yield { type: "done", stopReason: "tool_calls" };
|
|
73
|
-
}
|
|
74
|
-
else {
|
|
75
|
-
yield { type: "done", stopReason: "stop" };
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
async _chat(messages, _tools, modelOverride) {
|
|
27
|
+
async *chatStream(messages, _tools, options) {
|
|
28
|
+
const model = options?.model ?? this.model;
|
|
79
29
|
// Build the full prompt: system context + conversation history
|
|
80
30
|
const parts = [];
|
|
81
31
|
const systemMessages = messages.filter((m) => m.role === "system");
|
|
@@ -83,8 +33,7 @@ export class CodexProvider {
|
|
|
83
33
|
parts.push(systemMessages.map((m) => m.content).join("\n"));
|
|
84
34
|
parts.push("---");
|
|
85
35
|
}
|
|
86
|
-
const
|
|
87
|
-
for (const msg of nonSystem) {
|
|
36
|
+
for (const msg of messages.filter((m) => m.role !== "system")) {
|
|
88
37
|
if (msg.role === "user") {
|
|
89
38
|
parts.push(`User: ${msg.content}`);
|
|
90
39
|
}
|
|
@@ -93,70 +42,118 @@ export class CodexProvider {
|
|
|
93
42
|
}
|
|
94
43
|
}
|
|
95
44
|
const prompt = parts.join("\n\n");
|
|
96
|
-
//
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
const outputFile = join(tmpDir, "last-message.txt");
|
|
100
|
-
// codex exec --json suppresses the interactive UI (no /dev/tty access)
|
|
101
|
-
// --output-last-message writes the final response to a file we control
|
|
102
|
-
//
|
|
103
|
-
// The "--" separator signals end-of-flags to codex's own arg parser.
|
|
104
|
-
// Without it, a prompt beginning with "--" (e.g. "--help" or "--flags")
|
|
105
|
-
// would be misinterpreted as a codex CLI flag rather than as the prompt.
|
|
106
|
-
// spawn() with an array is NOT shell-injected, so this is the only risk.
|
|
45
|
+
// codex exec --json suppresses the interactive UI and outputs JSONL on stdout.
|
|
46
|
+
// The "--" separator signals end-of-flags so prompts beginning with "--" are safe.
|
|
47
|
+
// spawn() with an array is NOT shell-injected, so this is the only prompt-injection risk.
|
|
107
48
|
const args = [
|
|
108
49
|
"exec",
|
|
109
|
-
"-m",
|
|
50
|
+
"-m", model,
|
|
110
51
|
"--full-auto",
|
|
111
52
|
"-C", process.cwd(),
|
|
112
53
|
"--json",
|
|
113
|
-
"--output-last-message", outputFile,
|
|
114
54
|
"--",
|
|
115
55
|
prompt,
|
|
116
56
|
];
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
env
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
},
|
|
125
|
-
});
|
|
126
|
-
let stderr = "";
|
|
127
|
-
// Consume stdout (JSONL events) so the pipe buffer never fills and
|
|
128
|
-
// blocks codex. We don't parse it — we use --output-last-message instead.
|
|
129
|
-
proc.stdout.resume();
|
|
130
|
-
proc.stderr.on("data", (data) => {
|
|
131
|
-
stderr += data.toString();
|
|
132
|
-
});
|
|
133
|
-
proc.on("close", async (code) => {
|
|
134
|
-
// Try reading the output file first (most reliable)
|
|
135
|
-
try {
|
|
136
|
-
const text = await readFile(outputFile, "utf-8");
|
|
137
|
-
await rm(tmpDir, { recursive: true }).catch(() => { });
|
|
138
|
-
activeTempDirs.delete(tmpDir);
|
|
139
|
-
resolve({ text: text.trim(), toolCalls: [] });
|
|
140
|
-
return;
|
|
141
|
-
}
|
|
142
|
-
catch {
|
|
143
|
-
// Output file missing — fall through to error handling
|
|
144
|
-
}
|
|
145
|
-
await rm(tmpDir, { recursive: true }).catch(() => { });
|
|
146
|
-
activeTempDirs.delete(tmpDir);
|
|
147
|
-
if (code !== 0) {
|
|
148
|
-
reject(new Error(`Codex exited with code ${code}: ${stderr.trim()}`));
|
|
149
|
-
return;
|
|
150
|
-
}
|
|
151
|
-
// Unexpected: exited 0 but no output file
|
|
152
|
-
reject(new Error("Codex produced no output"));
|
|
153
|
-
});
|
|
154
|
-
proc.on("error", async (err) => {
|
|
155
|
-
await rm(tmpDir, { recursive: true }).catch(() => { });
|
|
156
|
-
activeTempDirs.delete(tmpDir);
|
|
157
|
-
reject(new Error(`Failed to spawn codex: ${err.message}`));
|
|
158
|
-
});
|
|
57
|
+
const proc = spawn(this.codexPath, args, {
|
|
58
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
59
|
+
env: {
|
|
60
|
+
...process.env,
|
|
61
|
+
NO_COLOR: "1",
|
|
62
|
+
FORCE_COLOR: "0",
|
|
63
|
+
},
|
|
159
64
|
});
|
|
65
|
+
// -------------------------------------------------------------------------
|
|
66
|
+
// Async queue: bridges the event-emitter world → async generator.
|
|
67
|
+
//
|
|
68
|
+
// We can't `yield` from inside event handlers, so we push events into a
|
|
69
|
+
// queue and use a one-shot resolve callback to wake the generator loop.
|
|
70
|
+
// -------------------------------------------------------------------------
|
|
71
|
+
const pendingEvents = [];
|
|
72
|
+
let finished = false;
|
|
73
|
+
let finishError = null;
|
|
74
|
+
let wakeUp = null;
|
|
75
|
+
let hasProducedText = false;
|
|
76
|
+
const push = (event) => {
|
|
77
|
+
pendingEvents.push(event);
|
|
78
|
+
wakeUp?.();
|
|
79
|
+
wakeUp = null;
|
|
80
|
+
};
|
|
81
|
+
const finish = (err) => {
|
|
82
|
+
if (finished)
|
|
83
|
+
return; // Guard: called at most once
|
|
84
|
+
finished = true;
|
|
85
|
+
finishError = err ?? null;
|
|
86
|
+
wakeUp?.();
|
|
87
|
+
wakeUp = null;
|
|
88
|
+
};
|
|
89
|
+
// JSONL line parser — called for each complete line from stdout
|
|
90
|
+
const processLine = (line) => {
|
|
91
|
+
if (!line)
|
|
92
|
+
return;
|
|
93
|
+
let evt;
|
|
94
|
+
try {
|
|
95
|
+
evt = JSON.parse(line);
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
// Silent fallback: malformed JSONL line, skip it
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
if (evt.type === "item.completed" && isAgentMessage(evt.item)) {
|
|
102
|
+
hasProducedText = true;
|
|
103
|
+
push({ type: "text", content: evt.item.text });
|
|
104
|
+
}
|
|
105
|
+
else if (evt.type === "error") {
|
|
106
|
+
finish(new Error(`Codex error: ${evt.message}`));
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
// Stream stdout, splitting on newlines as chunks arrive
|
|
110
|
+
let lineBuffer = "";
|
|
111
|
+
proc.stdout.on("data", (chunk) => {
|
|
112
|
+
lineBuffer += chunk.toString();
|
|
113
|
+
let newlineIdx;
|
|
114
|
+
while ((newlineIdx = lineBuffer.indexOf("\n")) !== -1) {
|
|
115
|
+
processLine(lineBuffer.slice(0, newlineIdx).trim());
|
|
116
|
+
lineBuffer = lineBuffer.slice(newlineIdx + 1);
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
// Consume stderr so the pipe buffer never fills and blocks codex.
|
|
120
|
+
proc.stderr.resume();
|
|
121
|
+
proc.on("close", (code) => {
|
|
122
|
+
if (finished)
|
|
123
|
+
return;
|
|
124
|
+
// Flush any remaining content without a trailing newline
|
|
125
|
+
const remaining = lineBuffer.trim();
|
|
126
|
+
if (remaining)
|
|
127
|
+
processLine(remaining);
|
|
128
|
+
if (!hasProducedText && code !== 0) {
|
|
129
|
+
finish(new Error(`Codex exited with code ${code ?? "null"}`));
|
|
130
|
+
}
|
|
131
|
+
else if (!hasProducedText) {
|
|
132
|
+
finish(new Error("Codex produced no output"));
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
finish();
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
proc.on("error", (err) => {
|
|
139
|
+
finish(new Error(`Failed to spawn codex: ${err.message}`));
|
|
140
|
+
});
|
|
141
|
+
// Generator loop: drain the queue, wait for more, repeat until done
|
|
142
|
+
while (true) {
|
|
143
|
+
while (pendingEvents.length > 0) {
|
|
144
|
+
yield pendingEvents.shift();
|
|
145
|
+
}
|
|
146
|
+
if (finished) {
|
|
147
|
+
if (finishError)
|
|
148
|
+
throw finishError;
|
|
149
|
+
yield { type: "done", stopReason: "stop" };
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
// Wait for the next push() or finish() call
|
|
153
|
+
await new Promise((resolve) => {
|
|
154
|
+
wakeUp = resolve;
|
|
155
|
+
});
|
|
156
|
+
}
|
|
160
157
|
}
|
|
161
158
|
}
|
|
162
159
|
//# sourceMappingURL=codex.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codex.js","sourceRoot":"","sources":["../../../src/providers/codex.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"codex.js","sourceRoot":"","sources":["../../../src/providers/codex.ts"],"names":[],"mappings":"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"}
|