CDK scaffold bin/cdk.ts async entry point breaks cdk ls/synth/deploy
Los mantenedores suelen responder en 1 día
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 2/5
- Tiempo estimado
- 1-3 horas
- Aptitud para principiantes
- 78/100
- Tipo de issue
- Error
- Claridad
- Bien especificado
- Estado de actividad
- Tranquilo
- Stack tecnológico
- aws, node.js, typescript
- Área
- cli, infrastructure
Línea de trabajo
Comienza con la plantilla de scaffold en src/assets/cdk/bin/cdk.ts y revisa cómo sus llamadas asíncronas a ConfigIO registran stacks antes del synth automático de CDK. Ejecuta la reproducción con agentcore create, npx tsc y npx cdk ls. Se considera terminado cuando el proyecto generado muestra AgentCore-myagent-main y synth produce su template en lugar de un assembly vacío.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Bug Description
The generated bin/cdk.ts from agentcore create uses an async main() function with await configIO.readProjectSpec() and await configIO.readAWSDeploymentTargets(). This causes cdk ls, cdk synth, and cdk deploy to silently produce zero stacks with exit code 0.
Root Cause
The CDK App class has an autoSynth property that defaults to true when CDK_OUTDIR is set (i.e., when run by the CDK CLI). autoSynth uses Node.js process.on('beforeExit') to call app.synth() automatically. However, beforeExit fires when the synchronous event loop drains — before async main() completes.
Timeline when CDK CLI runs the app:
- CDK CLI spawns
node dist/bin/cdk.jswithCDK_OUTDIRset to a temp dir main().catch(...)starts the async function but returns immediately (it's a promise)- Synchronous event loop drains →
beforeExitfires →autoSynthcallsapp.synth()on an empty App (stacks are inside the unresolvedmain()) - CDK CLI reads the empty cloud assembly → zero stacks
The explicit app.synth() at the end of main() eventually runs, but by then the CDK CLI has already read the output.
Reference: CDK AppProps.autoSynth docs — "Automatically call synth() before the program exits. Default: true if running via CDK CLI (CDK_OUTDIR is set)"
Reproduction
# 1. Create a fresh project
agentcore create --name myagent --defaults
# 2. Add a deployment target
cat > myagent/agentcore/aws-targets.json << 'EOF'
[{"name": "main", "account": "123456789012", "region": "us-east-1"}]
EOF
# 3. Install and compile
cd myagent/agentcore/cdk
npm install
npx tsc
# 4. List stacks — expect "AgentCore-myagent-main", get nothing
npx cdk ls
# Output: (empty, exit code 0)
# 5. Verify the app DOES create stacks when run directly
node -e "
const { AgentCoreStack } = require('./dist/lib/cdk-stack');
const cdk = require('aws-cdk-lib');
const app = new cdk.App();
console.log('Stacks:', app.node.children.length);
"
# This also shows 0 because stacks are inside async main()
Expected Behavior
npx cdk ls should output:
AgentCore-myagent-main
Actual Behavior
npx cdk ls outputs nothing (empty stdout, exit code 0). cdk synth also exits 0 but produces no template. cdk deploy would silently deploy nothing.
Proposed Fix
Replace async ConfigIO calls with synchronous fs.readFileSync in the scaffold template (src/assets/cdk/bin/cdk.ts):
#!/usr/bin/env node
import { AgentCoreStack } from '../lib/cdk-stack';
import type { AgentCoreProjectSpec, AwsDeploymentTarget } from '@aws/agentcore-cdk';
import { App, type Environment } from 'aws-cdk-lib';
import * as path from 'path';
import * as fs from 'fs';
// Synchronous reads — CDK CLI requires stacks registered before process exits.
// Async ConfigIO calls race with the CDK CLI's autoSynth (beforeExit hook).
const configRoot = path.resolve(__dirname, '..', '..', '..');
const spec: AgentCoreProjectSpec = JSON.parse(
fs.readFileSync(path.join(configRoot, 'agentcore.json'), 'utf8'),
);
const targets: AwsDeploymentTarget[] = JSON.parse(
fs.readFileSync(path.join(configRoot, 'aws-targets.json'), 'utf8'),
);
if (targets.length === 0) {
throw new Error('No deployment targets configured.');
}
const app = new App();
for (const target of targets) {
new AgentCoreStack(app, `AgentCore-${spec.name}-${target.name}`, {
spec,
env: { account: target.account, region: target.region },
});
}
app.synth();
The agentcore.json and aws-targets.json files are small local JSON — there's no benefit to reading them asynchronously, and doing so breaks CDK CLI compatibility.
Environment
@aws/agentcoreCLI: 0.8.0@aws/agentcore-cdk: 0.1.0-alpha.17aws-cdk-lib: 2.189.1- CDK CLI: 2.1100.1
- Node.js: v22.x
- OS: macOS (Darwin 25.3.0)
- Lenguaje dominante
- TypeScript
- Estrellas
- 291
- Forks
- 96
- Merge medio
- 20 h 50 min
- PR fusionados (30 d)
- 214
Preparar el entorno
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de aws/agentcore-cli
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 70/100
aws/agentcore-cli#2395 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
aws/agentcore-cli#2392 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
aws/agentcore-cli#2267 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
aws/agentcore-cli#2258 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
aws/agentcore-cli#2176 ·
Los mantenedores suelen responder en 1 día
Todos los issues de aws/agentcore-cli
Issues similares
-
module-request
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
Los mantenedores suelen responder en 1 día
-
ports get and web print 'Port N already in use, trying next...' for every busy port they skipAbierto
Dificultad 1/5 Menos de una hora Aptitud para principiantes 90/100
appandflow/stim#1604 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
community first-timers-only good first issue hacktoberfest help wanted low hanging fruit up-for-grabs
Dificultad 1/5 Menos de una hora Aptitud para principiantes 92/100
lingdojo/kana-dojo#31060 · 1 comentario · 5 reacciones ·
Los mantenedores suelen responder en 1 día
-
SSH workspace restore rewrites relative symlinks into the deleted sync-back staging directoryAbierto
Dificultad 1/5 Menos de una hora Aptitud para principiantes 90/100
paperclipai/paperclip#14173 ·
Los mantenedores suelen responder en 1 día
-
needs-triage
Dificultad 2/5 1-3 horas Aptitud para principiantes 85/100
Los mantenedores suelen responder en 1 día