Tofuist-agentti: OpenTofu/IaC-asiantuntija gecko-avatarilla
- Uusi agentti: Tofuist (gecko-avatar, oranssinkulta #e3a336) - System prompt: HCL-koodi, moduulit, lifecycle, state encryption - docs-kenttä: lataa automaattisesti /docs/tofu-cheatsheet.md referenssiksi - kpnRun: tukee nyt agentin docs-kenttää (haetaan kerran, cachetetaan) - OpenTofu-dokumentaatio haettu GitHubista + tiivistetty cheatsheet - Avatar, gallery-head, värimapit ja pipeline-tuet lisätty Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1057,6 +1057,10 @@
|
||||
<img src="/avatars/laiskiainen_notext.png" alt="DevOps">
|
||||
<div class="avatar-name">DevOps</div>
|
||||
</div>
|
||||
<div class="avatar-card" id="avatar-tofuist" data-agent="tofuist" onclick="selectAgent('tofuist', event)">
|
||||
<img src="/avatars/gecko_notext.png" alt="Tofuist">
|
||||
<div class="avatar-name">Tofuist</div>
|
||||
</div>
|
||||
<div class="avatar-card" id="avatar-observer" data-agent="observer" onclick="selectAgent('observer', event)">
|
||||
<img src="/avatars/aikuinen_susi.png" alt="Tarkkailija">
|
||||
<div class="avatar-name">Tarkkailija</div>
|
||||
@@ -1091,6 +1095,7 @@
|
||||
<div class="gallery-head-wrap" id="wrap-data"><img src="/avatars/pesukarhu_notext.png" id="gallery-data" class="gallery-head" alt="Data"></div>
|
||||
<div class="gallery-head-wrap" id="wrap-qa"><img src="/avatars/susi_notext.png" id="gallery-qa" class="gallery-head" alt="QA"></div>
|
||||
<div class="gallery-head-wrap" id="wrap-tester"><img src="/avatars/laiskiainen_notext.png" id="gallery-tester" class="gallery-head" alt="DevOps"></div>
|
||||
<div class="gallery-head-wrap" id="wrap-tofuist"><img src="/avatars/gecko_notext.png" id="gallery-tofuist" class="gallery-head" alt="Tofuist"></div>
|
||||
</div>
|
||||
<div style="text-align: center; margin-top: 16px;">
|
||||
<button class="btn" id="simu-btn" onclick="toggleSimulation()" style="font-size: 11px; padding: 4px 10px; background: #0d1a2d; border-color: #58a6ff;">Käynnistä simulaatio</button>
|
||||
@@ -1159,6 +1164,7 @@
|
||||
data: { name: 'Data-Agentti — System Prompt', model: 'qwen-coder', default: 'Olet tietokanta-asiantuntija. Vastaat skeemojen suunnittelusta, SQL-kyselyiden optimoinnista ja datamalleista.' },
|
||||
qa: { name: 'QA — System Prompt', model: 'qwen-coder', default: 'Olet laadunvarmistaja (QA). Kirjoitat testejä, etsit virheitä ja varmistat, että kaikki reunatapaukset on huomioitu.' },
|
||||
tester: { name: 'DevOps — System Prompt', model: 'qwen-coder', default: 'Olet DevOps-insinööri. Kirjoitat Dockerfile- ja docker-compose.yml-tiedostot, README:t ja käynnistysohjeet. Käytä aina multi-stage Docker buildia ja docker compose -orkestrointia.' },
|
||||
tofuist: { name: 'Tofuist — System Prompt', model: 'qwen-coder', docs: '/docs/tofu-cheatsheet.md', default: 'You are an OpenTofu/Terraform IaC specialist. You write HCL infrastructure code: providers, resources, modules, variables, outputs, state management, and encryption. You follow OpenTofu best practices: use planning behaviors before apply, handle resource lifecycle (create_before_destroy, prevent_destroy), configure state encryption for sensitive data, and structure code with clear module boundaries. Always output valid HCL code. Use provider references correctly (required_providers block). Prefer data sources over hardcoded values.' },
|
||||
};
|
||||
const selectedAgents = new Set();
|
||||
let sharedPrompt = localStorage.getItem('kpn-shared-prompt') || '';
|
||||
@@ -1386,7 +1392,7 @@
|
||||
const title = document.getElementById('prompt-modal-title');
|
||||
const fields = document.getElementById('prompt-modal-fields');
|
||||
|
||||
const agentNames = { manager: 'Manageri', coder: 'Koodari', tester: 'DevOps', qa: 'QA', data: 'Data' };
|
||||
const agentNames = { manager: 'Manageri', coder: 'Koodari', tester: 'DevOps', qa: 'QA', data: 'Data', tofuist: 'Tofuist' };
|
||||
title.textContent = `${agentNames[agent] || agent} — ${label}`;
|
||||
|
||||
fields.innerHTML = modalPromptParts.map((f, i) => `
|
||||
@@ -2054,6 +2060,14 @@ IMPORTANT: Include get_db() dependency for FastAPI` },
|
||||
const parts = [];
|
||||
if (sharedPrompt) parts.push(sharedPrompt);
|
||||
if (agent && agent.prompt) parts.push(agent.prompt);
|
||||
// Ladataan agentin docs-referenssi (esim. OpenTofu cheatsheet)
|
||||
if (agent && agent.docs && !agent._docsCache) {
|
||||
try {
|
||||
const r = await fetch(agent.docs);
|
||||
if (r.ok) agent._docsCache = await r.text();
|
||||
} catch(e) { /* docs ei saatavilla */ }
|
||||
}
|
||||
if (agent && agent._docsCache) parts.push('Reference:\n' + agent._docsCache);
|
||||
parts.push(prompt);
|
||||
const fullPrompt = parts.join('\n\n');
|
||||
|
||||
@@ -2140,7 +2154,7 @@ IMPORTANT: Include get_db() dependency for FastAPI` },
|
||||
}
|
||||
renderPipelineSteps();
|
||||
// Päivitetään agentin avatar tooltip + vilahdus
|
||||
const avatarMap = { manager: 'avatar-kpn', coder: 'avatar-coder', tester: 'avatar-tester', qa: 'avatar-qa', data: 'avatar-data' };
|
||||
const avatarMap = { manager: 'avatar-kpn', coder: 'avatar-coder', tester: 'avatar-tester', qa: 'avatar-qa', data: 'avatar-data', tofuist: 'avatar-tofuist' };
|
||||
const avatarId = avatarMap[agent];
|
||||
if (avatarId) {
|
||||
const el = document.getElementById(avatarId);
|
||||
@@ -2170,7 +2184,7 @@ IMPORTANT: Include get_db() dependency for FastAPI` },
|
||||
if (pipelineSteps.length === 0) { container.style.display = 'none'; return; }
|
||||
container.style.display = 'flex';
|
||||
container.innerHTML = pipelineSteps.map((s, i) => {
|
||||
const colors = { manager: '#d29922', coder: '#3fb950', tester: '#58a6ff', qa: '#a371f7', data: '#d2a8ff' };
|
||||
const colors = { manager: '#d29922', coder: '#3fb950', tester: '#58a6ff', qa: '#a371f7', data: '#d2a8ff', tofuist: '#e3a336' };
|
||||
const color = colors[s.agent] || '#8b949e';
|
||||
const icon = s.status === 'done' ? '✓' : s.status === 'active' ? '◷' : '◯';
|
||||
const iconColor = s.status === 'done' ? '#3fb950' : s.status === 'active' ? '#d29922' : '#8b949e';
|
||||
@@ -2837,8 +2851,8 @@ ${fixableFiles}`;
|
||||
|
||||
function generateProjectReport(task, files, steps, staticIssues) {
|
||||
const fileEntries = Object.entries(files);
|
||||
const agentNames = { manager: 'Manageri', coder: 'Koodari', tester: 'DevOps', qa: 'QA', data: 'Data' };
|
||||
const agentColors = { manager: '#d29922', coder: '#3fb950', tester: '#58a6ff', qa: '#a371f7', data: '#d2a8ff' };
|
||||
const agentNames = { manager: 'Manageri', coder: 'Koodari', tester: 'DevOps', qa: 'QA', data: 'Data', tofuist: 'Tofuist' };
|
||||
const agentColors = { manager: '#d29922', coder: '#3fb950', tester: '#58a6ff', qa: '#a371f7', data: '#d2a8ff', tofuist: '#e3a336' };
|
||||
|
||||
// Syntaksikorostus: kevyt regex-pohjainen highlighter
|
||||
function highlightCode(code, filename) {
|
||||
@@ -2948,9 +2962,9 @@ ${filesHtml}
|
||||
}
|
||||
|
||||
function generateWorkflowSwimlane(steps) {
|
||||
const agentLabels = { manager: 'Manageri', coder: 'Koodari', tester: 'DevOps', qa: 'QA', data: 'Data' };
|
||||
const agentColors = { manager: '#d29922', coder: '#3fb950', tester: '#58a6ff', qa: '#a371f7', data: '#d2a8ff' };
|
||||
const agentBgs = { manager: '#1c1206', coder: '#0d1a0d', tester: '#0d1520', qa: '#170d22', data: '#1a0d22' };
|
||||
const agentLabels = { manager: 'Manageri', coder: 'Koodari', tester: 'DevOps', qa: 'QA', data: 'Data', tofuist: 'Tofuist' };
|
||||
const agentColors = { manager: '#d29922', coder: '#3fb950', tester: '#58a6ff', qa: '#a371f7', data: '#d2a8ff', tofuist: '#e3a336' };
|
||||
const agentBgs = { manager: '#1c1206', coder: '#0d1a0d', tester: '#0d1520', qa: '#170d22', data: '#1a0d22', tofuist: '#1a1506' };
|
||||
const stepDescs = { 'Suunnittelu': 'Jakaa projektin tiedostoiksi', 'Review': 'Tarkistaa koodin laadun', 'Testit': 'Kirjoittaa pytest-testit', 'Dockerfile': 'Generoi Docker-imagen', 'Compose': 'Palvelumääritys', 'README': 'Käyttöohjeet', 'Validointi': 'Tarkistaa yhteensopivuuden', 'Korjaukset': 'Korjaa löydetyt ongelmat' };
|
||||
|
||||
var agents = [];
|
||||
|
||||
Reference in New Issue
Block a user