forked from bkinnightskytw/code_work_spawner
119 lines
2.9 KiB
Markdown
119 lines
2.9 KiB
Markdown
# code_work_spawner
|
|
|
|
GitHub issue thread assistant with Agent Orchestrator style config.
|
|
|
|
The app polls configured GitHub repositories with `gh`, reads issue threads and
|
|
issue comments, and uses configured CLI responders such as `codex`,
|
|
`opencode`, or `copilot-cli` to reply when:
|
|
|
|
- a user explicitly mentions the assistant
|
|
- a new comment changes the thread enough that the responder decides a reply is
|
|
useful
|
|
|
|
It supports multi-repo configuration, responder fallback chains.
|
|
|
|
## Features
|
|
|
|
- Agent Orchestrator style YAML config with `defaults` and `projects`
|
|
- Multiple repositories in one process
|
|
- Comment-triggered issue assistance
|
|
- Planning / architecture guidance in issue threads
|
|
- Bug verification flows in isolated temporary git worktrees
|
|
- CLI-based responder fallback chain
|
|
- Durable state with `drift` + SQLite
|
|
- BDD-style tests using `package:test` with Given / When / Then wording
|
|
|
|
## Requirements
|
|
|
|
- Dart SDK 3.11+
|
|
- `gh` CLI authenticated for the target repositories
|
|
- Local checkouts for configured repositories
|
|
- Optional local responder CLIs such as `codex`, `opencode`, or `copilot-cli`
|
|
|
|
## Config
|
|
|
|
Create a local `agent-orchestrator.yaml`:
|
|
|
|
```yaml
|
|
defaults:
|
|
issueAssistant:
|
|
enabled: true
|
|
pollInterval: 5m
|
|
mentionTriggers: ["@helper", "@codex"]
|
|
commentTag: code-work-spawner
|
|
prompt: |
|
|
You are helping on {{repo}}.
|
|
Trigger: {{trigger}}
|
|
Thread:
|
|
{{thread_json}}
|
|
responders:
|
|
- id: codex
|
|
command: codex
|
|
args: ["exec", "--json"]
|
|
timeout: 10m
|
|
- id: opencode
|
|
command: opencode
|
|
timeout: 10m
|
|
|
|
projects:
|
|
my-app:
|
|
repo: owner/my-app
|
|
path: ~/code/my-app
|
|
defaultBranch: main
|
|
sessionPrefix: app
|
|
```
|
|
|
|
Project entries can override `issueAssistant` fields when a repo needs a
|
|
different prompt, mention triggers, or responder chain.
|
|
|
|
For a more minimal Agent Orchestrator compatible subset, start from
|
|
[`examples/simple-github.yaml`](examples/simple-github.yaml). This repo accepts
|
|
AO-style `dataDir`, `worktreeDir`, and core `projects` fields, and uses
|
|
`worktreeDir` for bug-verification worktrees.
|
|
|
|
## Run
|
|
|
|
```bash
|
|
dart run build_runner build
|
|
```
|
|
|
|
Single poll cycle:
|
|
|
|
```bash
|
|
dart run bin/code_work_spawner.dart --once
|
|
```
|
|
|
|
Long-running poller:
|
|
|
|
```bash
|
|
dart run bin/code_work_spawner.dart
|
|
```
|
|
|
|
Override paths when needed:
|
|
|
|
```bash
|
|
dart run bin/code_work_spawner.dart \
|
|
--config /path/to/agent-orchestrator.yaml \
|
|
--db /path/to/state.sqlite3 \
|
|
--gh-command /usr/bin/gh
|
|
```
|
|
|
|
## Testing
|
|
|
|
```bash
|
|
dart run tool/validate_gherkin_test_format.dart
|
|
dart analyze
|
|
dart test
|
|
```
|
|
|
|
All Dart tests under `test/` must follow the repo's Gherkin doc-comment format:
|
|
|
|
- `group(...)` has a `Feature` doc block above it
|
|
- `test(...)` has a `Scenario` doc block above it
|
|
- runtime names stay plain, without `Feature:` or `Scenario:` prefixes
|
|
- test bodies include `Given` / `When` / `Then` inline comments
|
|
|
|
## ref
|
|
|
|
[agent-orchestrator](https://github.com/ComposioHQ/agent-orchestrator)
|