~ / rigs / thientranhung / astragentic

thientranhung/astragentic

Orchestration framework for running several AI coding agents on one real codebase — isolation, dispatch, review, provenance.

↗ GitHub ★ 3 Apache-2.0 updated today project Claude CodeCodex Claude plugin
share on X
ARCHETYPE
Orchestrator
A bench of specialised subagents. The main agent mostly delegates.
CONTEXT TAX · EVERY TURN
~2.0k tokens
Moderate · median rig: 2.3k · breakdown
GUARDRAILS
3/5
Blocks destructive commands · Pre-tool screening hook · No YOLO mode · details

Copy this rig

# review before running: this installs third-party code
$ npx degit thientranhung/astragentic/harness/.claude ./rig-astragentic  # inspect, then merge into .claude/

MCP servers are added to Claude Code at local scope; env vars are shown as YOUR_… placeholders — we never store values. Files are fetched with degit into a separate folder so you can review before merging.

$ npx degit thientranhung/astragentic/harness/.agents/skills/batch-triage .claude/skills/batch-triage
$ npx degit thientranhung/astragentic/harness/.agents/skills/bmad-party .claude/skills/bmad-party
$ npx degit thientranhung/astragentic/harness/.agents/skills/bmad-ux .claude/skills/bmad-ux
$ npx degit thientranhung/astragentic/harness/.agents/skills/bootstrap-glossary .claude/skills/bootstrap-glossary
$ npx degit thientranhung/astragentic/harness/.agents/skills/codex-arm .claude/skills/codex-arm
$ npx degit thientranhung/astragentic/harness/.agents/skills/codex-claude-arm .claude/skills/codex-claude-arm
$ npx degit thientranhung/astragentic/harness/.agents/skills/dispatch-qa-walk .claude/skills/dispatch-qa-walk
$ npx degit thientranhung/astragentic/harness/.agents/skills/dispatch-ticket-claude .claude/skills/dispatch-ticket-claude
$ npx degit thientranhung/astragentic/harness/.agents/skills/dispatch-ticket-codex .claude/skills/dispatch-ticket-codex
$ npx degit thientranhung/astragentic/harness/.agents/skills/dispatch-ticket-opencode .claude/skills/dispatch-ticket-opencode
$ npx degit thientranhung/astragentic/harness/.agents/skills/dispatch-ticket .claude/skills/dispatch-ticket
$ npx degit thientranhung/astragentic/harness/.agents/skills/github-issue-tracker .claude/skills/github-issue-tracker
$ npx degit thientranhung/astragentic/harness/.agents/skills/jira-issue-tracker .claude/skills/jira-issue-tracker
$ npx degit thientranhung/astragentic/harness/.agents/skills/legacy-testing .claude/skills/legacy-testing
$ npx degit thientranhung/astragentic/harness/.agents/skills/linear-issue-tracker .claude/skills/linear-issue-tracker
$ npx degit thientranhung/astragentic/harness/.agents/skills/reconcile-tracker .claude/skills/reconcile-tracker
$ npx degit thientranhung/astragentic/harness/.agents/skills/review-with-rin .claude/skills/review-with-rin
$ npx degit thientranhung/astragentic/harness/.agents/skills/untangle .claude/skills/untangle
$ curl -fsSL --create-dirs -o .claude/agents/builder.md https://raw.githubusercontent.com/thientranhung/astragentic/main/harness/.claude/agents/builder.md
$ curl -fsSL --create-dirs -o .claude/agents/qa.md https://raw.githubusercontent.com/thientranhung/astragentic/main/harness/.claude/agents/qa.md
$ curl -fsSL --create-dirs -o .claude/agents/rin.md https://raw.githubusercontent.com/thientranhung/astragentic/main/harness/.claude/agents/rin.md
$ curl -fsSL --create-dirs -o .claude/agents/shaper.md https://raw.githubusercontent.com/thientranhung/astragentic/main/harness/.claude/agents/shaper.md
$ curl -fsSL --create-dirs -o .claude/agents/thomas.md https://raw.githubusercontent.com/thientranhung/astragentic/main/harness/.claude/agents/thomas.md

Merge into .claude/settings.json (project) or ~/.claude/settings.json (user). Hook commands reference scripts in the source repo — copy those too.

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "command",
            "command": "d=\"${CLAUDE_PROJECT_DIR:-$PWD}\"; s=\"$d/scripts/hook-git-guard.py\"; [ -f \"$s\" ] || s=\"$d/harness/scripts/hook-git-guard.py\"; if [ -f \"$s\" ]; then exec python3 \"$s\"; else cat >/dev/null; echo \"hook-git-guard: NOT FOUND under $d — the git guar"
          }
        ]
      }
    ]
  }
}

Skills (18)

Subagents (5)

builderBuilds one ticket in its own worktree as the sole writer there. Drives implement, then code-review's two axes over the increment, then the simplify pass.
qaProduct-quality walker. Exercises the RUNNING product as a user — interface, journeys, API contracts and data as experienced — instead of reading the diff. Read-only by default; mutations require expl
rinMilestone reviewer. Runs as a gate pane in a detached worktree at the reviewed SHA, writes one report file, and returns a second opinion plus verification that the process left its traces.
shaperShaping session. Drives grill-with-docs to to-spec to to-tickets in one unbroken context, deciding seams while the whole picture is in view.
thomasRouter. Resident session: owns the tracker, the frontier query, the claim protocol, dispatch and merge. Drives triage, wayfinder, to-questionnaire, ask-matt, and the three brownfield bootstrap phases.

Hooks (5)

eventmatcherruns
PreToolUseBashd="${CLAUDE_PROJECT_DIR:-$PWD}"; s="$d/scripts/hook-git-guard.py"; [ -f "$s" ] || s="$d/harness/scripts/hook-git-guard.py"; if [ -f "$s" ]; then exec python3 "$s"; else cat >/dev/null; echo "hook-git-guard: NOT FOUND under $d — the git guar
WorktreeRemove*d="${CLAUDE_PROJECT_DIR:-$PWD}"; s="$d/scripts/release-worktree-resources.sh"; [ -f "$s" ] || s="$d/harness/scripts/release-worktree-resources.sh"; echo "HOOK: WorktreeRemove — path=${WORKTREE_PATH:-unset} at $(date -u +%FT%TZ)" >> /tmp/har
SessionStartcompactd="${CLAUDE_PROJECT_DIR:-$PWD}"; s="$d/scripts/hook-contract-reload.py"; [ -f "$s" ] || s="$d/harness/scripts/hook-contract-reload.py"; if [ -f "$s" ]; then exec python3 "$s"; else cat >/dev/null; echo "hook-contract-reload: NOT FOUND under
SessionStart*d="${CLAUDE_PROJECT_DIR:-$PWD}"; s="$d/scripts/hook-tracker-status.py"; [ -f "$s" ] || s="$d/harness/scripts/hook-tracker-status.py"; if [ -f "$s" ]; then exec python3 "$s"; else cat >/dev/null; echo "hook-tracker-status: NOT FOUND under $d
SubagentStop*payload=$(cat); agent_type=$(echo "$payload" | grep -o '"agent_type":"[^"]*"' | head -1 | cut -d'"' -f4); agent_id=$(echo "$payload" | grep -o '"agent_id":"[^"]*"' | head -1 | cut -d'"' -f4); session_id=$(echo "$payload" | grep -o '"session

Similar rigs

copied ✓