diff --git a/network-poc/frontend/src/pages/index.astro b/network-poc/frontend/src/pages/index.astro
index c5f1ace..13e9d57 100644
--- a/network-poc/frontend/src/pages/index.astro
+++ b/network-poc/frontend/src/pages/index.astro
@@ -812,15 +812,43 @@ OUTPUT FORMAT:
stepN++;
}
- // Tarkkailija: riskianalyysi
+ // DevOps: Dockerfile
+ termLog(`\n[${stepN}] ${esc(tst.name)} — Dockerfile`);
+ highlightAgent('tester');
+ explainStep('Dockerfile', `${tst.name} generoi Docker-kontin joka pakkaa projektin ajettavaksi.`);
+ const dockerPrompt = (tst.prompt ? tst.prompt+'\n\n' : '') +
+ `Write a Dockerfile for this Python FastAPI project.\n\n` +
+ `Project files: ${Object.keys(files).join(', ')}\n\n` +
+ `Requirements:\n` +
+ `- Use python:3.12-slim as base\n` +
+ `- Install uv: COPY --from=ghcr.io/astral-sh/uv:latest /uv /bin/uv\n` +
+ `- Copy pyproject.toml first, then uv sync, then copy source\n` +
+ `- Expose port 8000\n` +
+ `- CMD: uv run uvicorn main:app --host 0.0.0.0 --port 8000\n` +
+ `\nWrite ONLY the Dockerfile, no explanations.`;
+ const dockerfile = await kpnRun(tst.model, dockerPrompt);
+ if (dockerfile) files['Dockerfile'] = dockerfile;
+ stepN++;
+
+ // Tarkkailija: yhteenveto + raportti
const obs = agents.observer || Object.values(agents)[5];
if (obs) {
- termLog(`\n[${stepN}] ${esc(obs.name)} — riskianalyysi`);
+ termLog(`\n[${stepN}] ${esc(obs.name)} — projektin yhteenveto`);
highlightAgent('observer');
- explainStep('Riskianalyysi', `${obs.name} arvioi arkkitehtuurin, tietoturvan ja ylläpidettävyyden.`);
+ explainStep('Raportti', `${obs.name} kokoaa yhteenvedon projektin rakenteesta, riskeistä ja käyttöönotosta.`);
const finalCode = Object.entries(files).map(([n,c]) => `--- ${n} ---\n${c}`).join('\n\n');
- const obsPrompt = (obs.prompt ? obs.prompt+'\n\n' : '') + `Evaluate this project:\n\n${finalCode}`;
- await kpnRun(obs.model, obsPrompt);
+ const obsPrompt = (obs.prompt ? obs.prompt+'\n\n' : '') +
+ `Write a project README.md report in markdown for this project: ${task}\n\n` +
+ `Include these sections:\n` +
+ `# Project: ${task}\n` +
+ `## Files (list each file and its purpose)\n` +
+ `## How to run (uv + Docker commands)\n` +
+ `## API Endpoints (table: method, path, description)\n` +
+ `## Architecture notes\n` +
+ `## Risk assessment (security, reliability)\n\n` +
+ `Project code:\n${finalCode}`;
+ const readme = await kpnRun(obs.model, obsPrompt);
+ if (readme) files['README.md'] = readme;
stepN++;
}
@@ -828,7 +856,7 @@ OUTPUT FORMAT:
highlightAgent(null);
termLog(`\n━━━ Valmis (${Object.keys(files).length} tiedostoa) ━━━`);
- explainStep('Tulos', `Projekti "${task}" generoitu ${Object.keys(files).length} tiedostoon. Klikkaa "Avaa editorissa" tutkiaksesi koodia. Aja: uv run uvicorn main:app --reload`);
+ explainStep('Tulos', `Projekti "${task}" generoitu ${Object.keys(files).length} tiedostoon. Klikkaa "Avaa editorissa" tutkiaksesi koodia ja README:tä.`);
renderProjectCard(files, task);
}