#!/bin/bash # Lancia (o riprende) una sessione Claude Code "slave" headless con un compito. # Uso: scripts/avvia_slave.sh [--with-memory] "" # scripts/avvia_slave.sh --resume "" # # Incapsula tutto il meccanismo (lettura token da file, unset variabile # ereditata, invocazione claude -p) in un solo comando, cosi' nessuna sessione # deve ricostruire la procedura a mano. Vedi # archivio/Adrian/riferimento/claude-cli-headless.md per il perche' di ogni # passaggio (NON serve rileggerlo per usare questo script - solo per capirlo). # # "Scaffale" (04/09/2026): una slave -p persiste il transcript su disco di # default (claude -p salva la sessione a meno di --no-session-persistence) - # --resume la riprende esattamente dal punto in cui era arrivata, stessa # conoscenza pregressa, zero processo vivo nel frattempo. Lo script stampa # sempre il session_id in coda (via --output-format json) cosi' chi lancia # puo' annotarlo su `archivio/Adrian/riferimento/slave-shelf.md` se vuole # tenere la slave "sullo scaffale" invece di considerarla chiusa. # # --with-memory (05/09/2026, capovolto il default introdotto lo stesso giorno): # di default una slave NON legge piu' memory/MEMORY.md - verificato su tutti i # casi reali (i tre esperti, la sentinella Gmail, i tre servizio-*-watch) che # quel contenuto (stato/progetti di Adrian, non del compito della slave) non # viene mai usato: un compito da slave ha quasi sempre una propria fonte di # verita' (un file di ruolo/protocollo dedicato passato nel prompt). Usare # --with-memory solo per una slave che deve davvero orientarsi nel contesto # operativo generale (es. una slave lanciata a mano su un compito ampio senza # un protocollo proprio) - l'eccezione, non il default. # # MARKER: prefisso fisso indipendente da --with-memory, sempre presente - # serve solo a scripts/monitor-consumo-istanze/report.py per riconoscere nel # transcript una slave one-shot (bucket "slave one-shot") separandola dalle # sessioni interattive Adrian sulla stessa cwd di radice. Non cambiarlo senza # aggiornare anche SLAVE_PREFIX in quel report. set -euo pipefail cd /mnt/ssd/data/Dropbox/adrian MARKER="Sei una slave Adrian one-shot lanciata da avvia_slave.sh." RESUME_ID="" WITH_MEMORY="" while [ $# -gt 0 ]; do case "$1" in --resume) RESUME_ID="${2:?uso: scripts/avvia_slave.sh --resume \"\"}" shift 2 ;; --with-memory) WITH_MEMORY=1 shift ;; *) break ;; esac done TASK="${1:?uso: scripts/avvia_slave.sh [--with-memory] \"\" [oppure --resume \"\"]}" export CLAUDE_CODE_OAUTH_TOKEN="$(grep '^CLAUDE_CODE_OAUTH_TOKEN=' archivio/_secrets/credentials.md | cut -d= -f2-)" unset VSCODE_IPC_HOOK_CLI || true if [ -n "$RESUME_ID" ]; then # Ripresa: la slave ha gia' il contesto del turno precedente, nessun prefisso MEMORY.md. RESULT_JSON="$(claude -p --resume "$RESUME_ID" --output-format json "$TASK")" elif [ -n "$WITH_MEMORY" ]; then PROMPT="$MARKER Prima di tutto leggi memory/MEMORY.md per il contesto operativo corrente (thread aperti, stato dei progetti) - non agire alla cieca. Poi esegui questo compito: $TASK" RESULT_JSON="$(claude -p --output-format json "$PROMPT")" else PROMPT="$MARKER Esegui questo compito: $TASK" RESULT_JSON="$(claude -p --output-format json "$PROMPT")" fi python3 -c " import json, sys d = json.loads(sys.argv[1]) print(d.get('result', '')) print(f\"--- session_id: {d.get('session_id', '?')} ---\", file=sys.stderr) " "$RESULT_JSON"