feat: add session resume support and improve output format

- Support session_id in parallel task config for resuming failed tasks
- Change output format from JSON to human-readable text
- Add helper functions (hello, greet, farewell) with tests
- Clean up code formatting

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
cexll
2025-11-29 23:14:43 +08:00
parent 23c212f8be
commit f95f5f5e88
3 changed files with 69 additions and 14 deletions

View File

@@ -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) {

View File

@@ -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

View File

@@ -206,17 +206,36 @@ EOF
- `id: <task-id>`: Required, unique task identifier
- `workdir: <path>`: Optional, working directory (default: `.`)
- `dependencies: <id1>, <id2>`: Optional, comma-separated task IDs
- `session_id: <uuid>`: 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**: