Sketch of a Claude Code port of openai/symphony — a daemon-style orchestrator that polls an issue tracker, dispatches isolated worker agents per issue, and reconciles state across ticks. Tracker-agnostic by design: the project's CLAUDE.md documents how to talk to whatever tracker is in use (GitHub Issues, Gitea, tracker CLI, Linear, etc.); the plugin reads those instructions rather than shipping per-tracker adapters. Includes: - /symphony-init for first-time setup (detects gh/gitea/tracker, writes the tracker section into project CLAUDE.md, drops WORKFLOW.md, offers to schedule the tick) - /symphony-tick fired by /schedule cron entries (idempotent, silent, never prompts) - per-issue worker agent in isolated worktrees - on-disk state in .symphony/state.json (survives cron cold starts) Known divergences from the spec are documented in the plugin CLAUDE.md (no streaming agent telemetry; no codex.* knobs; hooks run inside the worker rather than the orchestrator). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
45 lines
1.4 KiB
JSON
45 lines
1.4 KiB
JSON
{
|
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
"title": "Symphony orchestrator state",
|
|
"type": "object",
|
|
"required": ["running", "retry_attempts", "claimed", "completed"],
|
|
"properties": {
|
|
"running": {
|
|
"type": "object",
|
|
"additionalProperties": {
|
|
"type": "object",
|
|
"required": ["task_id", "worktree", "started_at"],
|
|
"properties": {
|
|
"task_id": { "type": "string" },
|
|
"worktree": { "type": "string" },
|
|
"started_at": { "type": "string", "format": "date-time" },
|
|
"issue_identifier": { "type": "string" }
|
|
}
|
|
}
|
|
},
|
|
"retry_attempts": {
|
|
"type": "object",
|
|
"additionalProperties": {
|
|
"type": "object",
|
|
"required": ["attempt", "due_at_ms"],
|
|
"properties": {
|
|
"attempt": { "type": "integer", "minimum": 1 },
|
|
"due_at_ms": { "type": "integer" },
|
|
"last_error": { "type": ["string", "null"] }
|
|
}
|
|
}
|
|
},
|
|
"claimed": { "type": "array", "items": { "type": "string" } },
|
|
"completed": { "type": "array", "items": { "type": "string" } },
|
|
"totals": {
|
|
"type": "object",
|
|
"properties": {
|
|
"ticks": { "type": "integer" },
|
|
"dispatched": { "type": "integer" },
|
|
"completed": { "type": "integer" },
|
|
"failed": { "type": "integer" }
|
|
}
|
|
}
|
|
}
|
|
}
|