Skip to content
Development
Skill

/repo-harness-orchestrator

Start the orchestrator seat of the current repository in a new Herdr tab of the project space, from rh seats argv. Refuses when the repository already has a live orchestrator seat.

From plugin
repo-harness
43614 skills8 agents

Claude Code

$ npx -y skills add aimpact-inc/repo-harness --skill repo-harness-orchestrator --agent claude-code

SKILL.md

repo-harness-orchestrator.SKILL.md
name: repo-harness-orchestrator
description: Start the orchestrator seat of the current repository in a new Herdr tab of the project space, from rh seats argv. Refuses when the repository already has a live orchestrator seat.
when_to_use: "repo-harness-orchestrator"
disable-model-invocation: true

repo-harness-orchestrator

Bot entrypoint. Explicit invoke only. It starts one process. `rh seats argv` holds the model, the effort, the tool limits, the env, the labels and the brief; this skill copies none of them. The role rules stay in `repo-harness-issue-flow`.

A running session cannot get tool limits or env after its start, so this skill never turns the current session into the seat. It always starts a new terminal.

Run

Run the script below as one Bash command from the project checkout. Set `SPACE` to the space id when the user named one (`--space <id>`); otherwise leave it empty. Every probe is its own checked step: a failed or unparsable probe stops the script, and is never read as "no seat" or "no space". A non-zero exit starts nothing; report its stderr. A missing `hc` or `herdr-app` stops the script; there is no tmux fallback.

SPACE=''
stop() { printf 'repo-harness-orchestrator: %s\n' "$1" >&2; exit 1; }
for tool in gh git jq hc herdr-app repo-harness; do command -v "$tool" >/dev/null || stop "$tool is not available"; done

# 1. Repository: gh reads the git remote of the cwd, so each project has its own seats.
repo=$(gh api 'repos/{owner}/{repo}') || stop 'gh cannot read the repository of the cwd git remote'
id=$(printf '%s' "$repo" | jq -er '.id | numbers') || stop 'the repository has no numeric id'
name=$(printf '%s' "$repo" | jq -er '.name | strings') || stop 'the repository has no name'
common=$(git rev-parse --path-format=absolute --git-common-dir) || stop 'the cwd is not in a git checkout'
folder=$(dirname "$common")

# 2. Space: the named id, else the one local space named after the repository. Never the selected space.
layout=$(herdr-app ls) || stop 'herdr-app ls failed'
spaces=$(printf '%s' "$layout" | jq -ec --arg n "$name" --arg s "$SPACE" '.spaces | arrays
  | [.[] | select((.id | contains("/") | not) and (if $s == "" then .name == $n else .id == $s end)) | .id]') || stop 'herdr-app ls has no space list'
[ "$(printf '%s' "$spaces" | jq length)" = 1 ] || stop "space does not resolve for $name: $spaces; invoke again with --space <id>"
space=$(printf '%s' "$spaces" | jq -r '.[0]')

# 3. Duplicate check, local terminals only.
# Seats are per host: the board reads local terminals only (src/effects/terminal/herdr-core.ts#isRemoteTerminal), and another machine may run the same seat.
seats=$(hc ls --json --label repo-harness.seat=orchestrator --label "repo-harness.repository=$id") || stop 'hc ls failed'
live=$(printf '%s' "$seats" | jq -ec '.terminals | arrays | [.[] | .address | select(contains("/") | not)]') || stop 'hc ls has no terminal list'
[ "$live" = '[]' ] || stop "refused: repository $id already has a live orchestrator seat at $(printf '%s' "$live" | jq -r 'join(", ")')"

# 4. Launch: seats argv first, checked, then Herdr with the checked values.
launch=$(rh seats argv orchestrator --repository-id "$id" --json) || stop 'rh seats argv orchestrator failed'
argv=$(printf '%s' "$launch" | jq -ec '.argv | select(type == "array" and length > 0 and all(.[]; type == "string"))') || stop 'seats argv gave no argv'
tab=$(printf '%s' "$launch" | jq -er '.tab | strings | select(. != "")') || stop 'seats argv gave no tab name'
herdr-app do tab.new --space "$space" --name "$tab" --folder "$folder" --argv "$argv" || stop 'herdr-app tab.new failed'

Then report the new terminal address from the `tab.new` output. When the output names none, run the step 3 probe again: the argv labels its own terminal before the agent starts. Report the `limits` of the `seats argv` JSON.

The advisor starts next with `repo-harness-advisor`.

Read more
@ancienttwo
Ships withrepo-harness

File-backed workflow harness for reliable Claude Code and Codex sessions.

43614 skills8 agents
Get the whole plugin

Stars on GitHub

Momentum

stars in total
436
Star history of Ancienttwo/repo-harness on GitHub, a chart by star-history.com

Other skills on repo-harness.

obsidian-memory

obsidian-memory

Recall project memory or save reusable lessons to Obsidian only when explicitly requested. Exclude automatic task closeout, raw…

More skills from other plugins.

brainstorming
Auto-invoked

brainstorming

You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…

@obra@obraInstall Skill
ask-matt

ask-matt

Ask which skill or flow fits your situation. A router over the skills in this repo.

skills2w309k
@mattpocock@mattpocockInstall Skill
accessibility
Auto-invoked

accessibility

Design, implement, and audit accessible UI to WCAG 2.2 Level AA across Web, iOS, and Android — semantic ARIA roles and labels,…

ecc2w293k
@affaan-m@affaan-mInstall Skill
compiler-commit

compiler-commit

Use when you want to verify compiler changes and commit with the correct convention. Runs tests, lint, and format, then commits…

react5d252k
@facebook@facebookInstall Skill

Questions about repo-harness-orchestrator.

Which coding agents can use repo-harness-orchestrator?
repo-harness-orchestrator installs in Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode and Windsurf with the skills CLI, using each agent's flag shown on this page. Flowy's auto-invocation, which fires a skill when your prompt matches, runs in Claude Code only.