Skip to content

Commit d1be795

Browse files
王超claude
authored andcommitted
feat(spawn): active-config model matching, tiered boot fallback, PR#128 guard layers; release 1.6.348
Model-entry injection criterion: new server/lib/spawn-model-resolver.js resolves the spawn-time model from the ACTIVE configuration (workspace active proxy profile mapping > env CLAUDE_MODEL/ANTHROPIC_MODEL > settings.json env.ANTHROPIC_MODEL > top-level model; alias "default" is no signal; no signal -> no injection), replacing the stale lastModelUsage statistic that force-injected third-party override prompts into unconfigured sessions. readClaudeProjectModel stays for context-bar calibration. All 18 README locales updated (Arabic priority chain spelled in words to avoid RTL bidi mirroring of ">"). Tiered boot fallback for injected system prompts: tier 1 retries once WITHOUT injection on non-signal exit!=0 within a 5s boot window via a one-shot skip token consumed at the top of the next spawn (permanent rejected set reserved for the deterministic "unknown option" signal, which still self-heals IM workers); !signal and !insideLogDir gates keep user kills and IM personas out. Tier 2 prints a diagnostic notice on quick exit-0 without auto-restart or auto-disable. PR #128 integration (supersedes its branch): findcc resolveNpmClaudePath falls back to the package bin/claude(.exe) for the Claude Code 2.x layout that ships no cli.js (extracted findNpmBinFallback; claude.exe is the real bin filename on every platform in 2.1.x); pty-manager wraps the whole system-prompt pipeline in try-catch and registers PTY handlers immediately after spawn; create_system_prompt runs git via spawnSync with a 15s timeout; server.js's listen callback wraps its async setup in a caught IIFE so post-bind rejections can't kill the process. Two review rounds (six roles each) applied: exactly-once token consumption, weakened causality wording in retry notices, corrected SIGKILL claim in findcc comments (verified same-inode hard link), 2.x-fallback and null-guard test coverage, history.md dedup. Tests: npm run test 7883 pass, npm run test:cli 8242 pass, 0 fail. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
1 parent 26d2e72 commit d1be795

32 files changed

Lines changed: 651 additions & 86 deletions

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ The **Edit System Prompt** modal (hamburger menu → Edit System Prompt) is tabb
149149

150150
* The **Default** tab keeps the classic behavior: it writes `CC_SYSTEM.md` (override) or `CC_APPEND_SYSTEM.md` (append) into the current workspace, injected as `--system-prompt-file` / `--append-system-prompt-file` on the next ccv launch.
151151
* **Model tabs**: click **+ Add model**, type a name such as `opus` or `Gemini3`, and pick a scope — **Global** (`~/.claude/cc-viewer/system_prompt/`, applies to every workspace) or **Workspace** (`<project>/system_prompt/`). Each tab has its own Append/Override switch and Markdown preview.
152-
* Entries are stored as uppercase files: `OPUS_SYSTEM.md` (override) or `OPUS_APPEND_SYSTEM.md` (append). Matching is fuzzy — a case-insensitive substring of the model ID used at the last launch, so `opus` matches `claude-opus-4-8[1m]` regardless of version. A workspace match beats a global one; within a scope the longest name wins; a matched entry fully replaces the Default files for that launch.
152+
* Entries are stored as uppercase files: `OPUS_SYSTEM.md` (override) or `OPUS_APPEND_SYSTEM.md` (append). Matching is fuzzy — a case-insensitive substring of the model ID resolved from the ACTIVE configuration (an active third-party proxy profile's model mapping > the launch environment's `ANTHROPIC_MODEL`/`CLAUDE_MODEL` > the `model` configured in `settings.json`; with no configuration signal, no entry is injected), so `opus` matches `claude-opus-4-8[1m]` regardless of version. Switching the proxy profile mid-session re-matches only after the claude session is restarted, and a `--model` flag passed through extra args is not consulted (known limitations). A workspace match beats a global one; within a scope the longest name wins; a matched entry fully replaces the Default files for that launch.
153153
* Saving a tab empty deletes the entry. Model switches made mid-session apply at the next relaunch. Set `CCV_DISABLE_AUTO_SYSTEM_PROMPT=1` to disable all automatic injection. You may commit `<project>/system_prompt/` to share prompts with your team, or add it to `.gitignore` to keep them private.
154154

155155
### Logger mode (view the complete Claude Code session)

docs/README.ar.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ ccv -h
140140

141141
* تبويب **افتراضي** يحافظ على السلوك التقليدي: يكتب `CC_SYSTEM.md` (استبدال) أو `CC_APPEND_SYSTEM.md` (إلحاق) في مساحة العمل الحالية، ويُحقن كـ `--system-prompt-file` / `--append-system-prompt-file` عند التشغيل التالي لـ ccv.
142142
* **تبويبات النماذج**: انقر **+ إضافة نموذج**، واكتب اسمًا مثل `opus` أو `Gemini3`، واختر النطاق — **عام** (`~/.claude/cc-viewer/system_prompt/`، يُطبَّق على كل مساحات العمل) أو **مساحة العمل** (`<project>/system_prompt/`). لكل تبويب مفتاح إلحاق/استبدال خاص به ومعاينة Markdown خاصة به.
143-
* تُخزَّن الإدخالات كملفات بأحرف كبيرة: `OPUS_SYSTEM.md` (استبدال) أو `OPUS_APPEND_SYSTEM.md` (إلحاق). المطابقة تقريبية — سلسلة فرعية غير حساسة لحالة الأحرف من معرّف النموذج المستخدم في آخر تشغيل، لذا فإن `opus` يطابق `claude-opus-4-8[1m]` بغض النظر عن الإصدار. مطابقة مساحة العمل تتقدم على المطابقة العامة؛ وداخل النطاق الواحد يفوز الاسم الأطول؛ والإدخال المطابق يحل تمامًا محل ملفات التبويب الافتراضي لذلك التشغيل.
143+
* تُخزَّن الإدخالات كملفات بأحرف كبيرة: `OPUS_SYSTEM.md` (استبدال) أو `OPUS_APPEND_SYSTEM.md` (إلحاق). المطابقة تقريبية — سلسلة فرعية غير حساسة لحالة الأحرف من معرّف النموذج المستنتَج من الإعدادات الفعّالة حاليًا، وفق الأولوية التالية: تعيين النموذج في proxy profile الخارجي النشط، ثم متغيّرا البيئة `ANTHROPIC_MODEL`/`CLAUDE_MODEL` عند التشغيل، ثم `model` في `settings.json`؛ وبدون إشارة إعداد لا يُحقن أي إدخال، لذا فإن `opus` يطابق `claude-opus-4-8[1m]` بغض النظر عن الإصدار. مطابقة مساحة العمل تتقدم على المطابقة العامة؛ وداخل النطاق الواحد يفوز الاسم الأطول؛ والإدخال المطابق يحل تمامًا محل ملفات التبويب الافتراضي لذلك التشغيل. قيود معروفة: تبديل proxy profile أثناء الجلسة لا يُعاد تقييمه إلا بعد إعادة تشغيل جلسة claude؛ ولا يُؤخذ خيار `--model` المُمرَّر عبر وسائط إضافية في الاعتبار.
144144
* حفظ تبويب فارغ يحذف الإدخال. تغييرات النموذج التي تُجرى في منتصف الجلسة تسري عند إعادة التشغيل التالية. عيّن `CCV_DISABLE_AUTO_SYSTEM_PROMPT=1` لتعطيل كل الحقن التلقائي. يمكنك إيداع `<project>/system_prompt/` عبر commit لمشاركة الموجهات مع فريقك، أو إضافته إلى `.gitignore` لإبقائها خاصة.
145145

146146
### وضع التسجيل (عرض الجلسة الكاملة لـ claude code)

docs/README.da.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ Modalen **Rediger systemprompt** (hamburgermenu → Rediger systemprompt) er opd
140140

141141
* Fanen **Standard** bevarer den klassiske adfærd: den skriver `CC_SYSTEM.md` (overskriv) eller `CC_APPEND_SYSTEM.md` (tilføj) i det aktuelle arbejdsområde, injiceret som `--system-prompt-file` / `--append-system-prompt-file` ved næste ccv-start.
142142
* **Modelfaner**: klik på **+ Tilføj model**, indtast et navn som `opus` eller `Gemini3`, og vælg et omfang — **Global** (`~/.claude/cc-viewer/system_prompt/`, gælder for alle arbejdsområder) eller **Arbejdsområde** (`<project>/system_prompt/`). Hver fane har sin egen Tilføj/Overskriv-kontakt og Markdown-forhåndsvisning.
143-
* Posterne gemmes som filer med store bogstaver: `OPUS_SYSTEM.md` (overskriv) eller `OPUS_APPEND_SYSTEM.md` (tilføj). Matchningen er fuzzy — en delstreng, uden forskel på store og små bogstaver, af det model-ID der blev brugt ved seneste start, så `opus` matcher `claude-opus-4-8[1m]` uanset version. Et match i arbejdsområdet slår et globalt; inden for et omfang vinder det længste navn; en matchet post erstatter fuldstændigt Standard-filerne for den pågældende start.
143+
* Posterne gemmes som filer med store bogstaver: `OPUS_SYSTEM.md` (overskriv) eller `OPUS_APPEND_SYSTEM.md` (tilføj). Matchningen er fuzzy — en delstreng, uden forskel på store og små bogstaver, af det model-ID der udledes af den AKTIVE konfiguration (den aktive tredjeparts proxy-profils modeltilknytning > miljøvariablerne `ANTHROPIC_MODEL`/`CLAUDE_MODEL` ved start > `model` i `settings.json`; uden konfigurationssignal injiceres ingen post), så `opus` matcher `claude-opus-4-8[1m]` uanset version. Et match i arbejdsområdet slår et globalt; inden for et omfang vinder det længste navn; en matchet post erstatter fuldstændigt Standard-filerne for den pågældende start. Kendte begrænsninger: skift af proxy-profil midt i en session matches først igen efter genstart af claude-sessionen; et `--model`-flag sendt via ekstra argumenter tages ikke i betragtning.
144144
* Gemmes en fane tom, slettes posten. Modelskift foretaget midt i en session træder i kraft ved næste genstart. Sæt `CCV_DISABLE_AUTO_SYSTEM_PROMPT=1` for at deaktivere al automatisk injektion. Du kan committe `<project>/system_prompt/` for at dele prompter med dit team, eller tilføje den til `.gitignore` for at holde dem private.
145145

146146
### Logger-tilstand (Se komplette Claude Code-sessioner)

docs/README.de.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ Das Modal **System-Prompt bearbeiten** (Hamburger-Menü → System-Prompt bearbe
140140

141141
* Der Tab **Standard** behält das klassische Verhalten bei: Er schreibt `CC_SYSTEM.md` (Überschreiben) oder `CC_APPEND_SYSTEM.md` (Anhängen) in den aktuellen Arbeitsbereich, injiziert als `--system-prompt-file` / `--append-system-prompt-file` beim nächsten ccv-Start.
142142
* **Modell-Tabs**: Klicken Sie auf **+ Modell hinzufügen**, geben Sie einen Namen wie `opus` oder `Gemini3` ein und wählen Sie einen Geltungsbereich — **Global** (`~/.claude/cc-viewer/system_prompt/`, gilt für jeden Arbeitsbereich) oder **Arbeitsbereich** (`<project>/system_prompt/`). Jeder Tab hat einen eigenen Anhängen/Überschreiben-Schalter und eine Markdown-Vorschau.
143-
* Einträge werden als großgeschriebene Dateien gespeichert: `OPUS_SYSTEM.md` (Überschreiben) oder `OPUS_APPEND_SYSTEM.md` (Anhängen). Der Abgleich ist unscharf — ein Teilstring der beim letzten Start verwendeten Modell-ID ohne Beachtung der Groß-/Kleinschreibung, sodass `opus` unabhängig von der Version auf `claude-opus-4-8[1m]` passt. Ein Arbeitsbereich-Treffer schlägt einen globalen; innerhalb eines Geltungsbereichs gewinnt der längste Name; ein passender Eintrag ersetzt für diesen Start die Standard-Dateien vollständig.
143+
* Einträge werden als großgeschriebene Dateien gespeichert: `OPUS_SYSTEM.md` (Überschreiben) oder `OPUS_APPEND_SYSTEM.md` (Anhängen). Der Abgleich ist unscharf — ein Teilstring der aus der AKTIVEN Konfiguration aufgelösten Modell-ID (Modell-Zuordnung des aktiven Drittanbieter-Proxy-Profils > Umgebungsvariablen `ANTHROPIC_MODEL`/`CLAUDE_MODEL` beim Start > `model` in `settings.json`; ohne Konfigurationssignal wird kein Eintrag injiziert) ohne Beachtung der Groß-/Kleinschreibung, sodass `opus` unabhängig von der Version auf `claude-opus-4-8[1m]` passt. Ein Arbeitsbereich-Treffer schlägt einen globalen; innerhalb eines Geltungsbereichs gewinnt der längste Name; ein passender Eintrag ersetzt für diesen Start die Standard-Dateien vollständig. Bekannte Einschränkungen: Ein Profilwechsel während der Sitzung wird erst nach Neustart der claude-Sitzung neu abgeglichen; ein per Zusatzargument übergebenes `--model` wird nicht ausgewertet.
144144
* Wird ein Tab leer gespeichert, wird der Eintrag gelöscht. Modellwechsel während einer Sitzung greifen beim nächsten Neustart. Setzen Sie `CCV_DISABLE_AUTO_SYSTEM_PROMPT=1`, um jede automatische Injektion zu deaktivieren. Sie können `<project>/system_prompt/` committen, um Prompts mit Ihrem Team zu teilen, oder es zu `.gitignore` hinzufügen, um sie privat zu halten.
145145

146146
### Logger-Modus (Vollständige Claude Code-Sitzungen anzeigen)

docs/README.es.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ El modal **Editar prompt del sistema** (menú de hamburguesa → Editar prompt d
140140

141141
* La pestaña **Predeterminado** conserva el comportamiento clásico: escribe `CC_SYSTEM.md` (sustituir) o `CC_APPEND_SYSTEM.md` (añadir) en el espacio de trabajo actual, inyectado como `--system-prompt-file` / `--append-system-prompt-file` en el siguiente arranque de ccv.
142142
* **Pestañas de modelo**: haga clic en **+ Añadir modelo**, escriba un nombre como `opus` o `Gemini3` y elija un ámbito — **Global** (`~/.claude/cc-viewer/system_prompt/`, se aplica a todos los espacios de trabajo) o **Espacio de trabajo** (`<project>/system_prompt/`). Cada pestaña tiene su propio interruptor Añadir/Sustituir y su vista previa de Markdown.
143-
* Las entradas se almacenan como archivos en mayúsculas: `OPUS_SYSTEM.md` (sustituir) u `OPUS_APPEND_SYSTEM.md` (añadir). La coincidencia es difusa — una subcadena, sin distinción de mayúsculas y minúsculas, del ID de modelo usado en el último arranque, de modo que `opus` coincide con `claude-opus-4-8[1m]` sin importar la versión. Una coincidencia de espacio de trabajo prevalece sobre una global; dentro de un ámbito gana el nombre más largo; una entrada coincidente reemplaza por completo los archivos de Predeterminado para ese arranque.
143+
* Las entradas se almacenan como archivos en mayúsculas: `OPUS_SYSTEM.md` (sustituir) u `OPUS_APPEND_SYSTEM.md` (añadir). La coincidencia es difusa — una subcadena, sin distinción de mayúsculas y minúsculas, del ID de modelo resuelto a partir de la configuración ACTIVA (mapeo de modelo del proxy profile de terceros activo > variables de entorno `ANTHROPIC_MODEL`/`CLAUDE_MODEL` al arrancar > `model` de `settings.json`; sin señal de configuración no se inyecta ninguna entrada), de modo que `opus` coincide con `claude-opus-4-8[1m]` sin importar la versión. Una coincidencia de espacio de trabajo prevalece sobre una global; dentro de un ámbito gana el nombre más largo; una entrada coincidente reemplaza por completo los archivos de Predeterminado para ese arranque. Limitaciones conocidas: cambiar de proxy profile a mitad de sesión solo se vuelve a evaluar tras reiniciar la sesión de claude; un `--model` pasado por argumentos adicionales no se consulta.
144144
* Guardar una pestaña vacía elimina la entrada. Los cambios de modelo realizados a mitad de sesión se aplican en el siguiente relanzamiento. Establezca `CCV_DISABLE_AUTO_SYSTEM_PROMPT=1` para desactivar toda inyección automática. Puede hacer commit de `<project>/system_prompt/` para compartir prompts con su equipo, o añadirlo a `.gitignore` para mantenerlos privados.
145145

146146
### Modo Logger (Ver sesiones completas de Claude Code)

docs/README.fr.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ La fenêtre modale **Modifier le prompt système** (menu hamburger → Modifier
140140

141141
* L'onglet **Défaut** conserve le comportement classique : il écrit `CC_SYSTEM.md` (remplacer) ou `CC_APPEND_SYSTEM.md` (ajouter) dans l'espace de travail courant, injecté via `--system-prompt-file` / `--append-system-prompt-file` au prochain lancement de ccv.
142142
* **Onglets de modèle** : cliquez sur **+ Ajouter un modèle**, saisissez un nom comme `opus` ou `Gemini3`, puis choisissez une portée — **Global** (`~/.claude/cc-viewer/system_prompt/`, s'applique à tous les espaces de travail) ou **Espace de travail** (`<project>/system_prompt/`). Chaque onglet possède son propre commutateur Ajouter/Remplacer et son aperçu Markdown.
143-
* Les entrées sont stockées sous forme de fichiers en majuscules : `OPUS_SYSTEM.md` (remplacer) ou `OPUS_APPEND_SYSTEM.md` (ajouter). La correspondance est approximative — une sous-chaîne insensible à la casse de l'ID de modèle utilisé au dernier lancement, de sorte que `opus` correspond à `claude-opus-4-8[1m]` quelle que soit la version. Une correspondance au niveau de l'espace de travail l'emporte sur une correspondance globale ; au sein d'une même portée, le nom le plus long gagne ; une entrée correspondante remplace entièrement les fichiers de l'onglet Défaut pour ce lancement.
143+
* Les entrées sont stockées sous forme de fichiers en majuscules : `OPUS_SYSTEM.md` (remplacer) ou `OPUS_APPEND_SYSTEM.md` (ajouter). La correspondance est approximative — une sous-chaîne insensible à la casse de l'ID de modèle résolu à partir de la configuration ACTIVE (mappage de modèle du proxy profile tiers actif > variables d'environnement `ANTHROPIC_MODEL`/`CLAUDE_MODEL` au lancement > `model` de `settings.json` ; sans signal de configuration, aucune entrée n'est injectée), de sorte que `opus` correspond à `claude-opus-4-8[1m]` quelle que soit la version. Une correspondance au niveau de l'espace de travail l'emporte sur une correspondance globale ; au sein d'une même portée, le nom le plus long gagne ; une entrée correspondante remplace entièrement les fichiers de l'onglet Défaut pour ce lancement. Limitations connues : un changement de proxy profile en cours de session n'est re-mis en correspondance qu'après redémarrage de la session claude ; un indicateur `--model` transmis via des arguments supplémentaires n'est pas pris en compte.
144144
* Enregistrer un onglet vide supprime l'entrée. Les changements de modèle effectués en cours de session s'appliquent au prochain relancement. Définissez `CCV_DISABLE_AUTO_SYSTEM_PROMPT=1` pour désactiver toute injection automatique. Vous pouvez committer `<project>/system_prompt/` pour partager les prompts avec votre équipe, ou l'ajouter à `.gitignore` pour les garder privés.
145145

146146
### Mode Logger (Visualiser les sessions complètes de Claude Code)

docs/README.it.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ La finestra modale **Modifica prompt di sistema** (menu hamburger → Modifica p
140140

141141
* La scheda **Predefinito** mantiene il comportamento classico: scrive `CC_SYSTEM.md` (sovrascrivi) o `CC_APPEND_SYSTEM.md` (aggiungi) nell'area di lavoro corrente, iniettato come `--system-prompt-file` / `--append-system-prompt-file` al successivo avvio di ccv.
142142
* **Schede modello**: fai clic su **+ Aggiungi modello**, digita un nome come `opus` o `Gemini3` e scegli un ambito — **Globale** (`~/.claude/cc-viewer/system_prompt/`, si applica a ogni area di lavoro) o **Area di lavoro** (`<project>/system_prompt/`). Ogni scheda ha il proprio interruttore Aggiungi/Sovrascrivi e la propria anteprima Markdown.
143-
* Le voci sono memorizzate come file in maiuscolo: `OPUS_SYSTEM.md` (sovrascrivi) o `OPUS_APPEND_SYSTEM.md` (aggiungi). La corrispondenza è fuzzy — una sottostringa, senza distinzione tra maiuscole e minuscole, dell'ID del modello usato all'ultimo avvio, quindi `opus` corrisponde a `claude-opus-4-8[1m]` indipendentemente dalla versione. Una corrispondenza dell'area di lavoro prevale su una globale; all'interno di un ambito vince il nome più lungo; una voce corrispondente sostituisce completamente i file di Predefinito per quell'avvio.
143+
* Le voci sono memorizzate come file in maiuscolo: `OPUS_SYSTEM.md` (sovrascrivi) o `OPUS_APPEND_SYSTEM.md` (aggiungi). La corrispondenza è fuzzy — una sottostringa, senza distinzione tra maiuscole e minuscole, dell'ID del modello risolto dalla configurazione ATTIVA (mappatura modello del proxy profile di terze parti attivo > variabili d'ambiente `ANTHROPIC_MODEL`/`CLAUDE_MODEL` all'avvio > `model` di `settings.json`; senza segnale di configurazione nessuna voce viene iniettata), quindi `opus` corrisponde a `claude-opus-4-8[1m]` indipendentemente dalla versione. Una corrispondenza dell'area di lavoro prevale su una globale; all'interno di un ambito vince il nome più lungo; una voce corrispondente sostituisce completamente i file di Predefinito per quell'avvio. Limitazioni note: il cambio di proxy profile a metà sessione viene rivalutato solo dopo il riavvio della sessione claude; un flag `--model` passato tramite argomenti extra non viene considerato.
144144
* Salvare una scheda vuota elimina la voce. I cambi di modello effettuati a metà sessione si applicano al successivo riavvio. Imposta `CCV_DISABLE_AUTO_SYSTEM_PROMPT=1` per disabilitare ogni iniezione automatica. Puoi fare il commit di `<project>/system_prompt/` per condividere i prompt con il tuo team, oppure aggiungerlo a `.gitignore` per mantenerli privati.
145145

146146
### Modalità Logger (Visualizzare sessioni complete di Claude Code)

0 commit comments

Comments
 (0)