diff --git a/codex-wrapper/main.go b/codex-wrapper/main.go index 9f3ee7e..9ce2e93 100644 --- a/codex-wrapper/main.go +++ b/codex-wrapper/main.go @@ -26,7 +26,6 @@ const ( stdinSpecialChars = "\n\\\"'`$" ) - // Test hooks for dependency injection var ( stdinReader io.Reader = os.Stdin @@ -58,8 +57,8 @@ type TaskSpec struct { Task string `json:"task"` WorkDir string `json:"workdir,omitempty"` Dependencies []string `json:"dependencies,omitempty"` + SessionID string `json:"session_id,omitempty"` Mode string `json:"-"` - SessionID string `json:"-"` UseStdin bool `json:"-"` } @@ -72,7 +71,6 @@ type TaskResult struct { Error string `json:"error"` } - func parseParallelConfig(data []byte) (*ParallelConfig, error) { trimmed := bytes.TrimSpace(data) if len(trimmed) == 0 { @@ -115,6 +113,9 @@ func parseParallelConfig(data []byte) (*ParallelConfig, error) { task.ID = value case "workdir": task.WorkDir = value + case "session_id": + task.SessionID = value + task.Mode = "resume" case "dependencies": for _, dep := range strings.Split(value, ",") { dep = strings.TrimSpace(dep) @@ -396,7 +397,6 @@ func run() int { } } - logInfo("Script started") cfg, err := parseArgs() @@ -856,8 +856,16 @@ func min(a, b int) int { return b } -func test() string { - return "hello $world" +func hello() string { + return "hello world" +} + +func greet(name string) string { + return "hello " + name +} + +func farewell(name string) string { + return "goodbye " + name } func logInfo(msg string) { diff --git a/codex-wrapper/main_test.go b/codex-wrapper/main_test.go index d55b9ef..6b31546 100644 --- a/codex-wrapper/main_test.go +++ b/codex-wrapper/main_test.go @@ -624,6 +624,34 @@ func TestMin(t *testing.T) { } } +func TestHello(t *testing.T) { + got := hello() + if got != "hello world" { + t.Fatalf("hello() = %q, want %q", got, "hello world") + } +} + +func TestGreet(t *testing.T) { + got := greet("Linus") + if got != "hello Linus" { + t.Fatalf("greet() = %q, want %q", got, "hello Linus") + } +} + +func TestFarewell(t *testing.T) { + got := farewell("Linus") + if got != "goodbye Linus" { + t.Fatalf("farewell() = %q, want %q", got, "goodbye Linus") + } +} + +func TestFarewellEmpty(t *testing.T) { + got := farewell("") + if got != "goodbye " { + t.Fatalf("farewell(\"\") = %q, want %q", got, "goodbye ") + } +} + func TestLogFunctions(t *testing.T) { // Capture stderr oldStderr := os.Stderr diff --git a/skills/codex/SKILL.md b/skills/codex/SKILL.md index 09bb113..010aa48 100644 --- a/skills/codex/SKILL.md +++ b/skills/codex/SKILL.md @@ -206,17 +206,36 @@ EOF - `id: `: Required, unique task identifier - `workdir: `: Optional, working directory (default: `.`) - `dependencies: , `: Optional, comma-separated task IDs +- `session_id: `: Optional, resume a previous session - `---CONTENT---`: Separates metadata from task content - Task content: Any text, code, special characters (no escaping needed) -**Output**: JSON with results and summary -```json -{ - "results": [ - {"task_id": "T1", "exit_code": 0, "message": "...", "session_id": "...", "error": ""} - ], - "summary": {"total": 3, "success": 3, "failed": 0} -} +**Resume Failed Tasks**: +```bash +# Use session_id from previous output to resume +codex-wrapper --parallel - <<'EOF' +---TASK--- +id: T2 +session_id: 019xxx-previous-session-id +---CONTENT--- +fix the previous error and retry +EOF +``` + +**Output**: Human-readable text format +``` +=== Parallel Execution Summary === +Total: 3 | Success: 2 | Failed: 1 + +--- Task: T1 --- +Status: SUCCESS +Session: 019xxx + +Task output message... + +--- Task: T2 --- +Status: FAILED (exit code 1) +Error: some error message ``` **Features**: