DevOps generoi Dockerfilen + Tarkkailija kirjoittaa README.md-raportin

Uudet pipeline-vaiheet:

DevOps — Dockerfile:
- python:3.12-slim + uv (astral-sh)
- Oikea COPY-järjestys (pyproject.toml → sync → source)
- Expose 8000, CMD uvicorn

Tarkkailija — README.md:
- Markdown-raportti joka sisältää:
  - Tiedostolista ja kuvaukset
  - Käyttöohjeet (uv + Docker)
  - API Endpoints -taulukko
  - Arkkitehtuurihuomiot
  - Riskiarviointi
- README.md lisätään projektikorttin tiedostoihin
  → avattavissa editorissa

Pipeline nyt: Data → Koodari → DevOps review → korjaukset →
QA testit → DevOps Dockerfile → Tarkkailija README → Valmis

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Jaakko Vanhala
2026-04-10 07:29:45 +03:00
parent 5498eb6cbb
commit c731c18360

View File

@@ -812,15 +812,43 @@ OUTPUT FORMAT:
stepN++; stepN++;
} }
// Tarkkailija: riskianalyysi // DevOps: Dockerfile
termLog(`\n<span style="color:var(--accent);font-weight:bold">[${stepN}] ${esc(tst.name)}</span> — 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]; const obs = agents.observer || Object.values(agents)[5];
if (obs) { if (obs) {
termLog(`\n<span style="color:#8b949e;font-weight:bold">[${stepN}] ${esc(obs.name)}</span> — riskianalyysi`); termLog(`\n<span style="color:#8b949e;font-weight:bold">[${stepN}] ${esc(obs.name)}</span> — projektin yhteenveto`);
highlightAgent('observer'); 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 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}`; const obsPrompt = (obs.prompt ? obs.prompt+'\n\n' : '') +
await kpnRun(obs.model, obsPrompt); `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++; stepN++;
} }
@@ -828,7 +856,7 @@ OUTPUT FORMAT:
highlightAgent(null); highlightAgent(null);
termLog(`\n<span style="color:var(--purple);font-weight:bold">━━━ Valmis (${Object.keys(files).length} tiedostoa) ━━━</span>`); termLog(`\n<span style="color:var(--purple);font-weight:bold">━━━ Valmis (${Object.keys(files).length} tiedostoa) ━━━</span>`);
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); renderProjectCard(files, task);
} }