Skip to content
This repository was archived by the owner on Mar 26, 2026. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion scripts/dev-setup.sh
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ echo " make dev-start DEV_PORT=$DEV_PORT"
echo ""
echo "==> To register with claude MCP:"
echo ""
echo " claude mcp add boss-dev --transport http http://localhost:${DEV_PORT}/mcp"
echo " claude mcp add odis-dev --transport http http://localhost:${DEV_PORT}/mcp"
echo ""
echo "==> Workflow:"
echo " make dev-start # start isolated instance on port $DEV_PORT"
Expand Down
42 changes: 22 additions & 20 deletions scripts/spawn-dev-agent.sh
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
#!/usr/bin/env bash
# spawn-dev-agent.sh — spawn a tmux agent session wired to BOTH boss-mcp and boss-dev.
# spawn-dev-agent.sh — spawn a tmux agent session wired to BOTH odis-mcp and odis-dev.
#
# Usage: bash scripts/spawn-dev-agent.sh <agent-name> <space> [work-dir]
#
# The spawned tmux session gets:
# boss-mcp.* — production coordinator (check-in, post_status, tasks, messages)
# boss-dev.* — local dev instance (test API behavior against your branch's code)
# odis-mcp.* — production coordinator (check-in, post_status, tasks, messages)
# odis-dev.* — local dev instance (test API behavior against your branch's code)
#
# If BOSS_API_TOKEN is set, it is included as an Authorization header for boss-mcp.
# If BOSS_MCP_URL is unset, defaults to http://localhost:8899/mcp.
# If ODIS_API_TOKEN (or legacy BOSS_API_TOKEN) is set, it is included as an
# Authorization header for odis-mcp.
# If ODIS_MCP_URL (or legacy BOSS_MCP_URL) is unset, defaults to http://localhost:8899/mcp.
#
# The agent runs in a restart loop — if claude exits it relaunches automatically.

Expand All @@ -28,7 +29,7 @@ SPACE="$2"
WORK_DIR="${3:-$WORKTREE_ROOT}"

# ── Config ────────────────────────────────────────────────────────────────────
BOSS_MCP_URL="${BOSS_MCP_URL:-http://localhost:8899/mcp}"
ODIS_MCP_URL="${ODIS_MCP_URL:-${BOSS_MCP_URL:-http://localhost:8899/mcp}}"
DEV_PORT_FILE="$WORKTREE_ROOT/data-dev/boss.port"
MCP_CONFIG_FILE="$WORKTREE_ROOT/data-dev/mcp-config-${AGENT_NAME}.json"

Expand All @@ -53,19 +54,20 @@ echo "==> Dev instance at port ${DEV_PORT} (${DEV_MCP_URL})"
# ── Generate MCP config JSON ──────────────────────────────────────────────────
mkdir -p "$(dirname "$MCP_CONFIG_FILE")"

if [ -n "${BOSS_API_TOKEN:-}" ]; then
# Include Authorization header for production boss-mcp
API_TOKEN="${ODIS_API_TOKEN:-${BOSS_API_TOKEN:-}}"
if [ -n "${API_TOKEN:-}" ]; then
# Include Authorization header for production odis-mcp
cat > "$MCP_CONFIG_FILE" <<JSON
{
"mcpServers": {
"boss-mcp": {
"odis-mcp": {
"type": "http",
"url": "${BOSS_MCP_URL}",
"url": "${ODIS_MCP_URL}",
"headers": {
"Authorization": "Bearer ${BOSS_API_TOKEN}"
"Authorization": "Bearer ${API_TOKEN}"
}
},
"boss-dev": {
"odis-dev": {
"type": "http",
"url": "${DEV_MCP_URL}"
}
Expand All @@ -76,11 +78,11 @@ else
cat > "$MCP_CONFIG_FILE" <<JSON
{
"mcpServers": {
"boss-mcp": {
"odis-mcp": {
"type": "http",
"url": "${BOSS_MCP_URL}"
"url": "${ODIS_MCP_URL}"
},
"boss-dev": {
"odis-dev": {
"type": "http",
"url": "${DEV_MCP_URL}"
}
Expand All @@ -90,8 +92,8 @@ JSON
fi

echo "==> MCP config written to $MCP_CONFIG_FILE"
echo " boss-mcp → $BOSS_MCP_URL"
echo " boss-dev → $DEV_MCP_URL"
echo " odis-mcp → $ODIS_MCP_URL"
echo " odis-dev → $DEV_MCP_URL"

# ── Kill existing session if any ──────────────────────────────────────────────
if tmux has-session -t "$SESSION_ID" 2>/dev/null; then
Expand All @@ -112,7 +114,7 @@ sleep 0.3
# The claude command uses --mcp-config for both servers, --strict-mcp-config to
# exclude any globally registered servers (clean environment for dev testing).
# Wrapped in a restart loop: if claude exits unexpectedly, it relaunches automatically.
ALLOWED_TOOLS="mcp__boss-mcp__post_status,mcp__boss-mcp__check_messages,mcp__boss-mcp__send_message,mcp__boss-mcp__ack_message,mcp__boss-mcp__request_decision,mcp__boss-mcp__create_task,mcp__boss-mcp__list_tasks,mcp__boss-mcp__move_task,mcp__boss-mcp__update_task,mcp__boss-mcp__spawn_agent,mcp__boss-mcp__restart_agent,mcp__boss-mcp__stop_agent,mcp__boss-dev__post_status,mcp__boss-dev__check_messages,mcp__boss-dev__send_message,mcp__boss-dev__ack_message,mcp__boss-dev__request_decision,mcp__boss-dev__create_task,mcp__boss-dev__list_tasks,mcp__boss-dev__move_task,mcp__boss-dev__update_task,mcp__boss-dev__spawn_agent,mcp__boss-dev__restart_agent,mcp__boss-dev__stop_agent"
ALLOWED_TOOLS="mcp__odis-mcp__post_status,mcp__odis-mcp__check_messages,mcp__odis-mcp__send_message,mcp__odis-mcp__ack_message,mcp__odis-mcp__request_decision,mcp__odis-mcp__create_task,mcp__odis-mcp__list_tasks,mcp__odis-mcp__move_task,mcp__odis-mcp__update_task,mcp__odis-mcp__spawn_agent,mcp__odis-mcp__restart_agent,mcp__odis-mcp__stop_agent,mcp__odis-dev__post_status,mcp__odis-dev__check_messages,mcp__odis-dev__send_message,mcp__odis-dev__ack_message,mcp__odis-dev__request_decision,mcp__odis-dev__create_task,mcp__odis-dev__list_tasks,mcp__odis-dev__move_task,mcp__odis-dev__update_task,mcp__odis-dev__spawn_agent,mcp__odis-dev__restart_agent,mcp__odis-dev__stop_agent"
CLAUDE_CMD="claude --dangerously-skip-permissions --mcp-config $(printf '%q' "$MCP_CONFIG_FILE") --strict-mcp-config --allowedTools $ALLOWED_TOOLS"
RESTART_LOOP="while true; do $CLAUDE_CMD; echo '[spawn-dev-agent] claude exited — restarting in 2s...'; sleep 2; done"

Expand All @@ -125,8 +127,8 @@ echo " Session: $SESSION_ID"
echo " Agent: $AGENT_NAME"
echo " Space: $SPACE"
echo " Work dir: $WORK_DIR"
echo " boss-mcp: $BOSS_MCP_URL"
echo " boss-dev: $DEV_MCP_URL"
echo " odis-mcp: $ODIS_MCP_URL"
echo " odis-dev: $DEV_MCP_URL"
echo ""
echo " Attach: tmux attach -t $SESSION_ID"
echo " Dev status: make dev-status"
Expand Down
Loading