diff --git a/.claude/skills/setup-agent-team/discovery.sh b/.claude/skills/setup-agent-team/discovery.sh index 1e828c45..740f6ab9 100755 --- a/.claude/skills/setup-agent-team/discovery.sh +++ b/.claude/skills/setup-agent-team/discovery.sh @@ -80,9 +80,9 @@ fi export CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1 get_matrix_summary() { - python3 -c " -import json -m = json.load(open('${MANIFEST}')) + python3 - "${MANIFEST}" <<'PYEOF' +import json, sys +m = json.load(open(sys.argv[1])) agents = list(m['agents'].keys()) clouds = list(m['clouds'].keys()) gaps = [k for k, v in m.get('matrix', {}).items() if v == 'missing'] @@ -90,33 +90,28 @@ impl = sum(1 for v in m['matrix'].values() if v == 'implemented') total = len(agents) * len(clouds) print(f'Matrix: {len(agents)} agents x {len(clouds)} clouds = {impl}/{total} implemented') if gaps: - print(f'Gaps ({len(gaps)}): {\", \".join(gaps[:10])}') + print(f'Gaps ({len(gaps)}): {", ".join(gaps[:10])}') else: print('Matrix is full — ready for discovery') -print(f'Agents: {\", \".join(agents)}') -print(f'Clouds: {\", \".join(clouds)}') -" +print(f'Agents: {", ".join(agents)}') +print(f'Clouds: {", ".join(clouds)}') +PYEOF } count_gaps() { - python3 -c " -import json -m = json.load(open('${MANIFEST}')) + python3 - "${MANIFEST}" <<'PYEOF' +import json, sys +m = json.load(open(sys.argv[1])) print(sum(1 for v in m.get('matrix', {}).values() if v == 'missing')) -" +PYEOF } build_team_prompt() { - local summary - summary=$(get_matrix_summary) - cat <<'PROMPT_EOF' You are the lead of the spawn discovery team. Read CLAUDE.md and manifest.json first. Current state: -PROMPT_EOF - echo "${summary}" - cat <<'PROMPT_EOF' +MATRIX_SUMMARY_PLACEHOLDER Your job: coordinate teammates to expand the spawn matrix. Delegate only — do NOT implement anything yourself. @@ -277,24 +272,25 @@ PROMPT_EOF build_single_prompt() { local gap - gap=$(python3 -c " -import json -m = json.load(open('${MANIFEST}')) + gap=$(python3 - "${MANIFEST}" <<'PYEOF' +import json, sys +m = json.load(open(sys.argv[1])) for key, status in m.get('matrix', {}).items(): if status == 'missing': print(key) break -") +PYEOF +) if [[ -n "${gap}" ]]; then local cloud="${gap%%/*}" local agent="${gap##*/}" - cat < "${PROMPT_FILE}" + # Substitute MATRIX_SUMMARY_PLACEHOLDER with actual summary using python3 + # (sed cannot safely handle multi-line replacements; python3 avoids shell expansion) + local summary + summary=$(get_matrix_summary) + python3 - "${PROMPT_FILE}" "${summary}" <<'PYEOF' +import sys +path, replacement = sys.argv[1], sys.argv[2] +content = open(path).read() +open(path, 'w').write(content.replace('MATRIX_SUMMARY_PLACEHOLDER', replacement)) +PYEOF + # Substitute WORKTREE_BASE_PLACEHOLDER with actual worktree path sed -i "s|WORKTREE_BASE_PLACEHOLDER|${WORKTREE_BASE}|g" "${PROMPT_FILE}"