원클릭으로
doey-add-window
Add a new team window (Subtaskmaster + Workers), optionally as a reserved freelancer pool.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
Add a new team window (Subtaskmaster + Workers), optionally as a reserved freelancer pool.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
| name | doey-add-window |
| description | Add a new team window (Subtaskmaster + Workers), optionally as a reserved freelancer pool. |
cat $(tmux show-environment DOEY_RUNTIME 2>/dev/null | cut -d= -f2-)/session.env 2>/dev/null || truetmux list-windows -t "$(grep SESSION_NAME $(tmux show-environment DOEY_RUNTIME 2>/dev/null | cut -d= -f2-)/session.env 2>/dev/null | cut -d= -f2)" -F '#{window_index} #{window_name}' 2>/dev/null|| true/doey-add-window [grid] [--freelancer] [--workers N] [--name NAME] [--task-id ID] [--reserved] (default 4x2). No confirmation. Stays on the session's branch (usually main); use /doey-worktree separately to isolate a window after the fact.
bash: if command -v doey >/dev/null 2>&1; then doey add-window "$@" 2>&1 && echo "Team spawned via CLI" && exit 0; echo "CLI failed, falling back to inline steps"; fi
bash: RD=$(tmux show-environment DOEY_RUNTIME 2>/dev/null | cut -d= -f2-) && _sv() { grep "^$1=" "${RD}/session.env" 2>/dev/null | head -1 | cut -d= -f2- | tr -d '"'; } && SESSION_NAME=$(_sv SESSION_NAME) && PROJECT_DIR=$(_sv PROJECT_DIR) && PROJECT_NAME=$(_sv PROJECT_NAME) && GRID="${USER_GRID:-4x2}" && COLS=$(echo "$GRID" | cut -dx -f1) && ROWS=$(echo "$GRID" | cut -dx -f2) && TOTAL=$((COLS * ROWS)) && FREELANCER_MODE="false" && for _a in "$@"; do [ "$_a" = "--freelancer" ] && FREELANCER_MODE="true"; done && if [ "$FREELANCER_MODE" = "true" ]; then WORKER_COUNT=$TOTAL; else [ "$TOTAL" -lt 2 ] && { echo "ERROR: Need ≥2 panes"; exit 1; } || true; WORKER_COUNT=$((TOTAL - 1)); fi
bash: tmux new-window -t "$SESSION_NAME" -c "$PROJECT_DIR" && sleep 0.5 && NEW_WIN=$(tmux display-message -t "$SESSION_NAME" -p '#{window_index}') && for _s in $(seq 1 $((TOTAL - 1))); do tmux split-window -t "${SESSION_NAME}:${NEW_WIN}" -c "$PROJECT_DIR"; done && tmux select-layout -t "${SESSION_NAME}:${NEW_WIN}" tiled && sleep 0.5 && WORKER_PANES_LIST="" && if [ "$FREELANCER_MODE" = "true" ]; then for i in $(seq 0 $((WORKER_COUNT - 1))); do tmux select-pane -t "${SESSION_NAME}:${NEW_WIN}.${i}" -T "T${NEW_WIN} F${i}"; [ -n "$WORKER_PANES_LIST" ] && WORKER_PANES_LIST="${WORKER_PANES_LIST},${i}" || WORKER_PANES_LIST="${i}"; done; else tmux select-pane -t "${SESSION_NAME}:${NEW_WIN}.0" -T "T${NEW_WIN} Subtaskmaster"; for i in $(seq 1 $WORKER_COUNT); do tmux select-pane -t "${SESSION_NAME}:${NEW_WIN}.${i}" -T "T${NEW_WIN} W${i}"; [ -n "$WORKER_PANES_LIST" ] && WORKER_PANES_LIST="${WORKER_PANES_LIST},${i}" || WORKER_PANES_LIST="${i}"; done; fi
"create pane failed" = terminal too small.
bash: MGR_PANE="0" && TT="" && [ "$FREELANCER_MODE" = "true" ] && { MGR_PANE=""; TT="freelancer"; } && cat > "${RD}/team_${NEW_WIN}.env.tmp" << TEAM_EOF SESSION_NAME=${SESSION_NAME} PROJECT_DIR=${PROJECT_DIR} PROJECT_NAME=${PROJECT_NAME} WINDOW_INDEX=${NEW_WIN} GRID=${GRID} TOTAL_PANES=${TOTAL} MANAGER_PANE=${MGR_PANE} WORKER_PANES=${WORKER_PANES_LIST} WORKER_COUNT=${WORKER_COUNT} TEAM_TYPE=${TT} TEAM_NAME=${FREELANCER_MODE:+Freelancers} RESERVED= TASK_ID= TEAM_EOF mv "${RD}/team_${NEW_WIN}.env.tmp" "${RD}/team_${NEW_WIN}.env" && CUR=$(grep '^TEAM_WINDOWS=' "${RD}/session.env" 2>/dev/null | cut -d= -f2 | tr -d '"') && { [ -n "$CUR" ] && NW="${CUR},${NEW_WIN}" || NW="${NEW_WIN}"; } && TMPENV=$(mktemp "${RD}/session.env.tmp_XXXXXX") && if grep -q '^TEAM_WINDOWS=' "${RD}/session.env"; then sed "s/^TEAM_WINDOWS=.*/TEAM_WINDOWS=${NW}/" "${RD}/session.env" > "$TMPENV"; else cat "${RD}/session.env" > "$TMPENV"; echo "TEAM_WINDOWS=${NW}" >> "$TMPENV"; fi && mv "$TMPENV" "${RD}/session.env"
bash: source "$HOME/.local/bin/doey-send.sh" 2>/dev/null || true; if [ "$FREELANCER_MODE" = "true" ]; then for i in $(echo "$WORKER_PANES_LIST" | tr ',' ' '); do WP=$(grep -rl "pane ${NEW_WIN}.${i} " "${RD}"/worker-system-prompt-.md 2>/dev/null | head -1); CMD="claude --dangerously-skip-permissions --model opus --name "T${NEW_WIN} F${i}""; [ -n "$WP" ] && CMD="${CMD} --append-system-prompt-file "${WP}""; doey_send_launch "${SESSION_NAME}:${NEW_WIN}.${i}" "$CMD"; sleep 0.5; done; else doey_send_launch "${SESSION_NAME}:${NEW_WIN}.0" "claude --dangerously-skip-permissions --name "T${NEW_WIN} Subtaskmaster" --agent "t${NEW_WIN}-manager"" && sleep 1; for i in $(echo "$WORKER_PANES_LIST" | tr ',' ' '); do WP=$(grep -rl "pane ${NEW_WIN}.${i} " "${RD}"/worker-system-prompt-.md 2>/dev/null | head -1); CMD="claude --dangerously-skip-permissions --model opus --name "T${NEW_WIN} W${i}""; [ -n "$WP" ] && CMD="${CMD} --append-system-prompt-file "${WP}""; doey_send_launch "${SESSION_NAME}:${NEW_WIN}.${i}" "$CMD"; sleep 0.5; done; fi
bash: bash -c "eval "$(sed -n '/^_env_val()/,/^}/p' '${PROJECT_DIR}/shell/doey.sh')" && eval "$(sed -n '/^_layout_checksum()/,/^}/p' '${PROJECT_DIR}/shell/doey.sh')" && eval "$(sed -n '/^rebalance_grid_layout()/,/^}/p' '${PROJECT_DIR}/shell/doey.sh')" && rebalance_grid_layout '${SESSION_NAME}' '${NEW_WIN}' '${RD}'"
bash: sleep 8 && NOT_READY=0 && DOWN="" && for i in 0 $(echo "$WORKER_PANES_LIST" | tr ',' ' '); do CHILD=$(pgrep -P "$(tmux display-message -t "${SESSION_NAME}:${NEW_WIN}.${i}" -p '#{pane_pid}')" 2>/dev/null); OUTPUT=$(tmux capture-pane -t "${SESSION_NAME}:${NEW_WIN}.${i}" -p 2>/dev/null); if [ -z "$CHILD" ] || ! echo "$OUTPUT" | grep -q "bypass permissions"; then NOT_READY=$((NOT_READY + 1)); DOWN="$DOWN ${NEW_WIN}.$i"; fi; done; [ "$NOT_READY" -eq 0 ] && echo "All booted" || echo "WARNING: ${NOT_READY} not ready:${DOWN}"
Pane 0 = Subtaskmaster (freelancer: all workers). Write team env before launch. Default flow stays on the session's branch (usually main); use /doey-worktree after the fact for explicit isolation.
Plan-first task creation — research, breakdown, risk analysis, then create tasks from approved plan. Usage: /doey-planned-task <goal>
Request a respawn of the current worker pane. Use when you need to "respawn me", "restart myself", "fresh context", or "reset my pane". Writes an atomic respawn request that kills the current Claude process and relaunches with a fresh context.
Discover scaffolding patterns in this project — structural fingerprints, accretion files, and refactoring patterns from git history. Returns candidates worth turning into templates.
Spawn the doey-scaffy MCP server so workers can drive the Scaffy template engine via tool calls. Loaded automatically when a task needs scaffy_run / scaffy_validate / scaffy_list / scaffy_audit / scaffy_discover / scaffy_new / scaffy_fmt or any scaffy:// resource.
Create a new scaffy template from existing files (--from-files) or interactively. Outputs to .doey/scaffy/templates/<name>.scaffy.
Manage persistent project tasks — list, add, transition, show, subtasks, decisions, notes. Tasks stored in .doey/tasks/ (survives reboot). Use when you need to "show tasks", "add a task", "mark a task done", "what are we working on", or "create a task".