Skip to main content

skill-orchestrate

Autonomous state machine that drives a task through its full lifecycle (research -> plan -> implement -> complete) without user confirmation between phases. Invoke for /orchestrate command.

설치로 이동

소스 정보

저장소
benbrastmckie/nvim
최근 소스 활동
2026년 6월 8일 03:07
감지된 SKILL.md 언어
영어
스타
443
포크
459

설치 방법

기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.

소스 파일 검토

설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.

SKILL.md 표시 중

SKILL.md
소스 지침 · 읽기 전용 미리보기
name
skill-orchestrate
description
Autonomous state machine that drives a task through its full lifecycle (research -> plan -> implement -> complete) without user confirmation between phases. Invoke for /orchestrate command.
allowed-tools
Task, Bash, Read, Edit
# Orchestrate Skill Fire-and-forget autonomous loop implementing the 10-state task lifecycle state machine. Drives research, planning, implementation, and blocker escalation without user interaction. ## Context References Architecture documentation (load as needed): - `.opencode/docs/architecture/orchestrate-state-machine.md` - Complete state table and transition diagram - `.opencode/docs/architecture/handoff-schema.md` - Orchestrator handoff JSON schema - `.opencode/docs/architecture/dispatch-agent-spec.md` - Fork vs. named subagent dispatch spec Infrastructure (source as needed): - `.opencode/scripts/skill-base.sh` - Shared skill lifecycle functions - `.opencode/scripts/dispatch-agent.sh` - Fork vs. named subagent dispatch functions --- ## Execution Flow ### Stage 0: Multi-Task Mode Detection Parse `multi_task_mode` from the delegation context. If true, branch to multi-task stages (MT-1 through MT-5) in the **Multi-Task Mode** section below. If false or absent, fall through to existing Stage 1 (single-task mode unchanged). ```bash source .opencode/scripts/skill-base.sh multi_task_mode=$(echo "$delegation_context" | jq -r '.multi_task_mode // false') session_id=$(echo "$delegation_context" | jq -r '.session_id') focus_prompt=$(echo "$delegation_context" | jq -r '.focus_prompt // ""') if [ "$multi_task_mode" = "true" ]; then echo "[orchestrate] Multi-task mode detected — branching to MT-1" # Continue to Stage MT-1 (see Multi-Task Mode section) # All single-task stages (1-8) are SKIPPED in multi-task mode goto_multi_task=true else goto_multi_task=false fi # If goto_multi_task=true, skip Stages 1-8 and proceed to Stage MT-1 ``` --- ### Stage 1: Input Validation ```bash source .opencode/scripts/skill-base.sh task_number=$(echo "$delegation_context" | jq -r '.task_context.task_number') session_id=$(echo "$delegation_context" | jq -r '.session_id') focus_prompt=$(echo "$delegation_context" | jq -r '.focus_prompt // ""') # Read task state without blocking on terminal states (orchestrate handles them gracefully) PADDED_NUM=$(printf "%03d" "$task_number") TASK_DATA=$(jq -r --argjson num "$task_number" \ '.active_projects[] | select(.project_number == $num)' \ specs/state.json) if [ -z "$TASK_DATA" ]; then echo "ERROR: Task $task_number not found in state.json" >&2 exit 1 fi PROJECT_NAME=$(echo "$TASK_DATA" | jq -r '.project_name') TASK_TYPE=$(echo "$TASK_DATA" | jq -r '.task_type // "general"') DESCRIPTION=$(echo "$TASK_DATA" | jq -r '.description // ""') TASK_DIR="specs/${PADDED_NUM}_${PROJECT_NAME}" ``` ### Stage 1b: Resolve Task-Type Routing Map task_type to the correct research and implementation agents using extension manifests. ```bash # Resolve agents by task_type — consult extension manifests for non-core types case "$TASK_TYPE" in lean4|lean) RESEARCH_AGENT="lean-research-agent" IMPLEMENT_AGENT="lean-implementation-agent" ;; neovim) RESEARCH_AGENT="neovim-research-agent" IMPLEMENT_AGENT="neovim-implementation-agent" ;; nix) RESEARCH_AGENT="nix-research-agent" IMPLEMENT_AGENT="nix-implementation-agent" ;; *) RESEARCH_AGENT="general-research-agent" IMPLEMENT_AGENT="general-implementation-agent" ;; esac echo "[orchestrate] Task type: $TASK_TYPE → research=$RESEARCH_AGENT, implement=$IMPLEMENT_AGENT" ``` **Extension resolution**: If a task_type is not in the case table above, check for an extension manifest: ```bash manifest=".opencode/extensions/${TASK_TYPE}/manifest.json" if [ -f "$manifest" ]; then ext_research=$(jq -r ".routing.research[\"$TASK_TYPE\"] // empty" "$manifest") ext_implement=$(jq -r ".routing.implement[\"$TASK_TYPE\"] // empty" "$manifest") # Map skill names to agent names (skill-X-Y -> X-Y-agent) if [ -n "$ext_research" ]; then RESEARCH_AGENT=$(echo "$ext_research" | sed 's/^skill-//' | sed 's/$/-agent/') fi if [ -n "$ext_implement" ]; then IMPLEMENT_AGENT=$(echo "$ext_implement" | sed 's/^skill-//' | sed 's/$/-agent/') fi fi ``` ### Stage 2: Preflight — Loop Guard Create or read the loop guard file. This tracks cycle count across conversational turns. ```bash MAX_CYCLES=5 loop_guard_file="${TASK_DIR}/.orchestrator-loop-guard" handoff_file="${TASK_DIR}/.orchestrator-handoff.json" mkdir -p "$TASK_DIR" if [ -f "$loop_guard_file" ] && jq empty "$loop_guard_file" 2>/dev/null; then # Resume: read existing guard cycle_count=$(jq -r '.cycle_count // 0' "$loop_guard_file") echo "[orchestrate] Resuming — cycle $cycle_count of $MAX_CYCLES" else # Fresh start: create guard cycle_count=0 jq -n \ --arg session_id "$session_id" \ --argjson max_cycles "$MAX_CYCLES" \ --arg started "$(date -u +%Y-%m-%dT%H:%M:%SZ)" \ '{ "session_id": $session_id, "cycle_count": 0, "max_cycles": $max_cycles, "current_state": "reading", "started": $started, "last_updated": $started }' > "$loop_guard_file" echo "[orchestrate] Starting fresh — MAX_CYCLES=$MAX_CYCLES" fi # Blocker escalation counter (reset each /orchestrate invocation) blocker_escalation_count=0 MAX_BLOCKER_ESCALATIONS=2 # Drift detection constants (reset each /orchestrate invocation) drift_inspection_count=0 MAX_DRIFT_INSPECTIONS=1 DRIFT_COMPLETION_THRESHOLD=0.70 DRIFT_REVISION_THRESHOLD=0.30 ``` ### Stage 3: State Machine Loop The loop runs until a terminal condition is reached or MAX_CYCLES is hit. ``` while [ "$cycle_count" -lt "$MAX_CYCLES" ]; do ``` At the top of each iteration: **3a. Read current task status** ```bash current_status=$(jq -r --argjson num "$task_number" \ '.active_projects[] | select(.project_number == $num) | .status' \ specs/state.json) echo "[orchestrate] Cycle $((cycle_count + 1))/$MAX_CYCLES — status: $current_status" ``` **3b. Update loop guard with current state** ```bash jq --arg state "$current_status" \ --arg updated "$(date -u +%Y-%m-%dT%H:%M:%SZ)" \ --argjson count "$cycle_count" \ '.current_state = $state | .last_updated = $updated | .cycle_count = $count' \ "$loop_guard_file" > "${loop_guard_file}.tmp" && mv "${loop_guard_file}.tmp" "$loop_guard_file" ``` **3c. Dispatch by state** (see State Handlers in Stage 4) --- ### Stage 4: State Handlers #### State: `not_started` or `not started` Dispatch research via named subagent (resolved by task type in Stage 1b). ```bash # Preflight: mark task as RESEARCHING before dispatch skill_preflight_update "$task_number" "research" "$session_id" ``` ``` dispatch_instructions = dispatch_agent "$RESEARCH_AGENT" \ "Research task $task_number: $DESCRIPTION${focus_prompt:+. User focus: $focus_prompt}" \ '{"task_number": N, "task_type": "T", "session_id": "S", "orchestrator_mode": false}' \ "false" ``` Invoke the Task tool per dispatch_instructions (subagent_type: $RESEARCH_AGENT). After Task tool returns: read handoff (Stage 5). Increment cycle_count. #### State: `researching` In-flight state (another session is actively researching). Exit with warning. ``` echo "[orchestrate] WARNING: Task $task_number is currently being researched in another session." echo "Wait for the research to complete, then run /orchestrate $task_number again." EXIT (partial) ``` #### State: `researched` Dispatch planning via named subagent. ```bash # Preflight: mark task as PLANNING before dispatch skill_preflight_update "$task_number" "plan" "$session_id" ``` ``` research_artifacts=$(jq -c '[.active_projects[] | select(.project_number == N) | .artifacts // [] | .[] | select(.type == "report")] | .[0].path // ""' specs/state.json) dispatch_instructions = dispatch_agent "planner-agent" \ "Create implementation plan for task $task_number${focus_prompt:+. User focus: $focus_prompt}" \ '{"task_number": N, "task_type": "T", "session_id": "S", "research_artifacts": [...], "orchestrator_mode": false}' \ "false" ``` Invoke the Task tool per dispatch_instructions (subagent_type: planner-agent). After Task tool returns: read handoff. Increment cycle_count. #### State: `planning` In-flight state. Exit with warning (same pattern as `researching`). #### State: `planned` or `implementing` Dispatch implement via named subagent with `orchestrator_mode: true` (resolved by task type in Stage 1b). ```bash plan_path=$(ls -1 "${TASK_DIR}/plans/"*.md 2>/dev/null | sort -V | tail -1) ``` ```bash # Preflight: mark task as IMPLEMENTING before dispatch skill_preflight_update "$task_number" "implement" "$session_id" ``` ``` dispatch_instructions = dispatch_agent "$IMPLEMENT_AGENT" \ "Implement task $task_number following the plan${focus_prompt:+. User focus: $focus_prompt}" \ '{"task_number": N, "task_type": "T", "session_id": "S", "orchestrator_mode": true, "plan_path": "$plan_path"}' \ "false" ``` Invoke the Task tool per dispatch_instructions (subagent_type: $IMPLEMENT_AGENT). After Task tool returns: read handoff. Increment cycle_count. #### State: `partial` Read `.orchestrator-handoff.json` to determine sub-state: ```bash handoff=$(cat "$handoff_file" 2>/dev/null || echo '{}') blockers=$(echo "$handoff" | jq -c '.blockers // []') continuation=$(echo "$handoff" | jq -c '.continuation_context // null') blocker_count=$(echo "$blockers" | jq 'length') ``` **Sub-state: continuation available** (continuation != null AND has handoff_path): Dispatch implement with continuation context (resolved by task type in Stage 1b). ```bash # Preflight: mark task as IMPLEMENTING before resume dispatch skill_preflight_update "$task_number" "implement" "$session_id" ``` ``` dispatch_instructions = dispatch_agent "$IMPLEMENT_AGENT" \ "Resume implementation for task $task_number from continuation handoff${focus_prompt:+. User focus: $focus_prompt}" \ '{"task_number": N, ..., "orchestrator_mode": true, "plan_path": "$plan_path", "continuation_context": {continuation_context_object}}' \ "false" ```
GitHub에서 보기
이 SKILL.md는 매우 커서 SkillsMP가 여기에는 첫 섹션만 미리 보여줍니다. GitHub에서 보기