loadCliConfig: --dry-run still resolves systemPrompt {{include:...}} macros even though the agent is replaced
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 3/5
- Tempo stimato
- 1-2 giorni
- Idoneità per principianti
- 68/100
- Tipo di issue
- Bug
- Chiarezza
- Specificata chiaramente
- Stato di attività
- Tranquilla
- Stack tecnologico
- typescript
- Ambito
- cli
Direzione di ricerca
Start at loadCliConfig and trace its calls to normalizeCliConfig, normalizeAgentSpec, and expandIncludes. Verify the dry-run path replaces the configured agent before unnecessary systemPrompt includes are resolved. Done means the provided missing-include reproduction runs successfully with --dry-run while normal agent normalization still works outside dry-run.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Observed behavior
loadCliConfig always runs normalizeCliConfig (and through it normalizeAgentSpec) before applying the --dry-run override that replaces the configured agent with DRY_RUN_AGENT_SPEC. normalizeAgentSpec awaits expandIncludes for any systemPrompt on a claude-sdk or openai-sdk agent spec. If the referenced include file does not exist, --dry-run fails with a low-level ENOENT even though the agent spec is about to be thrown away.
Reproduction with a missing include and --dry-run:
FAILED: ENOENT: no such file or directory, open '/tmp/dryrun-test-XXXXXX/does-not-exist.md'
The failing config:
{
"name": "test",
"agent": ["claude-sdk", { "systemPrompt": "{{include:./does-not-exist.md}}" }],
"promptGenerator": ["test", { "prompts": ["hi"] }]
}
The order in loadCliConfig is:
return {
...(await normalizeCliConfig(config, resolvedPath)), // expands systemPrompt includes here
...(maxPrompts !== undefined ? { maxPrompts } : {}),
...(verbose === true || dryRun === true ? { logger: 'verbose' as const } : {}),
...(dryRun === true ? { agent: DRY_RUN_AGENT_SPEC } : {}), // agent thrown away here
};
Expected behavior
When --dry-run is set the agent is replaced with DRY_RUN_AGENT_SPEC, so the configured agent's systemPrompt is never sent to a backend. A user iterating on a config (where the include file may not yet exist, or the path is being edited) should be able to use --dry-run to validate the prompt generator without also having to make the agent's systemPrompt includes resolve.
Today --dry-run does noticeably more work than necessary (reads include files from disk) and, more importantly, spuriously fails when a path that will never be used is broken.
Minimal reproduction
mkdir /tmp/loop-dry && cd /tmp/loop-dry
cat > config.json <<'JSON'
{
"name": "test",
"agent": ["claude-sdk", { "systemPrompt": "{{include:./missing.md}}" }],
"promptGenerator": ["test", { "prompts": ["hi"] }]
}
JSON
loop-the-loop --dry-run config.json
Result: fails with ENOENT: no such file or directory, open '/tmp/loop-dry/missing.md' instead of running a dry run.
Suggested fix
Short-circuit the agent normalization when dryRun is true. The simplest approach is to skip normalizeAgentSpec (or pass through config.agent unchanged) when parsedArgs.dryRun === true, since the agent will be replaced by DRY_RUN_AGENT_SPEC immediately afterwards. For example, inline the dry-run branch in loadCliConfig before calling normalizeCliConfig, or have normalizeCliConfig accept an optional flag that skips the agent step.
- Lingua principale
- TypeScript
- Stelle
- 2
- Fork
- 1
- Metriche di merge delle PR
- Nessuna PR unita negli ultimi 30g
Preparare l'ambiente
Questo progetto non fornisce container di sviluppo, Dockerfile né guida per i contributori, quindi l'ambiente è a tuo carico: parti dal suo README e consulta la nostra guida al primo contributo per i passaggi generali.
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di joewalker/loop-the-loop
-
bug S4
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100
joewalker/loop-the-loop#88 ·
-
Git exec(): child killed by a signal rejects with new Error('') and loses the signal informationApertabug S3
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
joewalker/loop-the-loop#84 ·
-
bug S3
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
joewalker/loop-the-loop#83 ·
-
bug S3
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
joewalker/loop-the-loop#82 ·
-
bug S4
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 90/100
joewalker/loop-the-loop#79 ·
Tutte le issue di joewalker/loop-the-loop
Issue simili
-
category::task code priority::normal
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
e0ipso/strikethroo#145 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 1/5 1-3 ore Idoneità per principianti 85/100
cocos/cocos-docs#3333 ·
-
bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100
RevenueCat/react-native-purchases#2079 ·
I maintainer di solito rispondono entro 1 giorno
-
bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
RevenueCat/purchases-hybrid-common#2039 ·
I maintainer di solito rispondono entro 1 giorno
-
agent-reported area/react bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
I maintainer di solito rispondono entro 1 giorno