Initial implementation of Domna's agentic toolkit per PRD #1: - Runner CLI (src/cli.ts) wrapping sandcastle.run() with Docker provider - Pure modules: PhaseScheduler, PromptBuilder, FailureHandler with tests - Project Status v2 GraphQL client + parsers with tests - BranchManager (git/gh wrapper) and LoopOrchestrator (per-tick algorithm) - Variant-aware: per-ticket (one PR per issue, phase-gated, exit between phases) vs single-pr (one PR for the whole DAG, halt on failure) - /to-project skill that creates a repo-level project, configures the Status schema the runner expects, and sets initial issue statuses - setup.sh that installs Matt Pocock skills + Domna skills via npx skills Out of scope at v1: remote runners, Slack notifications, stacked PRs, cross-repo projects, SHA-pinning of upstream skills (tracks HEAD until the skills CLI supports repo#sha). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
3.3 KiB
| name | description |
|---|---|
| to-project | Create a GitHub Project (v2) for the issues just produced by /to-issues, configure the Status field schema the agentic-toolkit runner expects, and set initial statuses (AFK no-blockers → Ready, AFK with blockers → Backlog, HITL → Needs human). Use after /to-issues to make a project the runner can execute against. |
To Project
Create a repo-level GitHub Project (v2) from the issues /to-issues just produced, and prepare it so the Domna agentic-toolkit runner can execute against it without further configuration.
The issue tracker and issue numbers should already be known from the conversation context (the most recent /to-issues run). If they aren't, ask the user for the issue numbers explicitly.
Process
1. Gather context
Confirm with the user:
- Project name — defaults to the PRD title if a PRD is in context.
- Project description — defaults to a one-line summary of the PRD.
- Repo — the repo that owns the project. Defaults to the current
ghrepo. - Issue set — the issue numbers to add. Defaults to issues created in the most recent
/to-issuesrun.
2. Create the project
Use gh project create (or the GraphQL createProjectV2 mutation) at the repo level. Project visibility defaults to whatever the repo's default is. Capture the project number and node id from the response.
3. Configure the Status field
The runner requires a single-select field named Status with these options, in this order:
BacklogReadyIn progressIn reviewNeeds humanDone
If the project came with a default Status field, replace its options to match exactly — extra options are fine; missing ones must be added. If no Status field exists, create one.
4. Add issues to the project
For each issue in the issue set, add it to the project as an item.
5. Set initial statuses
For each issue, decide the starting status based on its labels and Blocked by references:
| Issue properties | Starting status |
|---|---|
Has hitl or ready-for-human label |
Needs human |
Has Blocked by references to issues in this set |
Backlog |
| Otherwise (AFK, no remaining blockers) | Ready |
Apply the status via the updateProjectV2ItemFieldValue mutation.
6. Comment on each issue
For each issue in the project, post a comment linking back to the project URL so the issue page shows the project context. One sentence is enough; example:
Tracked in project:
7. Confirm to the user
Print:
- Project URL
- Number of issues added, broken down by initial status (e.g. "3 Ready, 2 Backlog, 1 Needs human")
- Suggested next command, e.g.:
cd path/to/agentic-toolkit GITHUB_TOKEN=... npx . run --project <N> --mode per-ticket --owner <OWNER> --repo <REPO> --target-repo <TARGET>
Notes
- The project is repo-level, not org-level, by design (smaller blast radius, simpler permissions). If you need a cross-repo project, do it manually for now.
- Projects created by this skill are intended to be short-lived: scoped to one PRD's worth of work, archived or deleted on completion.
- The runner's
setStatuscalls assume the option names listed above. Don't rename or translate them.