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); }