From 2e14a2f601f4c42a8360a205def5c72a9d51870a Mon Sep 17 00:00:00 2001 From: zias Date: Mon, 8 Dec 2025 18:27:04 +0100 Subject: [PATCH] fix --- .gitea/workflows/darkteaops.yaml | 20 +-- .gitea/workflows/reviewer.js | 275 +++++++++++++++---------------- 2 files changed, 141 insertions(+), 154 deletions(-) diff --git a/.gitea/workflows/darkteaops.yaml b/.gitea/workflows/darkteaops.yaml index fbff3f5..ba6288e 100644 --- a/.gitea/workflows/darkteaops.yaml +++ b/.gitea/workflows/darkteaops.yaml @@ -19,18 +19,12 @@ jobs: REPO_OWNER: ${{ github.repository_owner }} REPO_NAME: ${{ github.event.repository.name }} PR_NUMBER: ${{ github.event.pull_request.number }} - OLLAMA_URL: "http://host.docker.internal:11434/api/generate" - OLLAMA_MODEL: "gemma3" + OLLAMA_URL: 'http://host.docker.internal:11434/api/generate' + OLLAMA_MODEL: 'gemma3' run: |- echo "πŸ«– DarkTeaOps awakens…" - node <<'EOF' - require("child_process").spawn("node", [".gitea/workflows/reviewer.js"], { - stdio: "inherit" - }).on("exit", code => { - if (code !== 0) { - console.error("πŸ’€ DarkTeaOps encountered turbulence and plunged deeper into the brew!"); - process.exit(code); - } - }); - EOF - + node .gitea/workflows/reviewer.js + if [ $? -ne 0 ]; then + echo "πŸ’€ DarkTeaOps encountered turbulence and plunged deeper into the brew!" + exit 1 + fi diff --git a/.gitea/workflows/reviewer.js b/.gitea/workflows/reviewer.js index eebf4a8..26eb788 100644 --- a/.gitea/workflows/reviewer.js +++ b/.gitea/workflows/reviewer.js @@ -3,104 +3,101 @@ // Bound in the steeping shadows of this repository. // ──────────────────────────────────────────────────────────── +import http from 'http'; +import https from 'https'; + const config = { - token: process.env.GITEA_TOKEN, - apiUrl: process.env.GITEA_API_URL, - owner: process.env.REPO_OWNER, - repo: process.env.REPO_NAME, - pr: process.env.PR_NUMBER, - ollamaUrl: process.env.OLLAMA_URL, - model: process.env.OLLAMA_MODEL, + token: process.env.GITEA_TOKEN, + apiUrl: process.env.GITEA_API_URL, + owner: process.env.REPO_OWNER, + repo: process.env.REPO_NAME, + pr: process.env.PR_NUMBER, + ollamaUrl: process.env.OLLAMA_URL, + model: process.env.OLLAMA_MODEL }; // ──────────────────────────────────────────────────────────── // DARKTEAOPS ERROR SYSTEM // ──────────────────────────────────────────────────────────── -function darkTeaOpsError(depth, message, details = "") { - const code = `BREW-DEPTH-${depth}`; - const header = `\n🜏 DARKTEAOPS ERROR: ${code}\n`; - const body = `${message}\n${details ? `\n> ${details}\n` : ""}`; - console.error(header + body); - return new Error(`${code}: ${message}`); +function darkTeaOpsError(depth, message, details = '') { + const code = `BREW-DEPTH-${depth}`; + const header = `\n🜏 DARKTEAOPS ERROR: ${code}\n`; + const body = `${message}\n${details ? `\n> ${details}\n` : ''}`; + console.error(header + body); + return new Error(`${code}: ${message}`); } // ──────────────────────────────────────────────────────────── // Request Helper // ──────────────────────────────────────────────────────────── function makeRequest(url, options, data = null) { - return new Promise((resolve, reject) => { - const lib = url.startsWith("https") ? require("https") : require("http"); + return new Promise((resolve, reject) => { + const lib = url.startsWith('https') ? https : http; - const req = lib.request(url, options, (res) => { - let body = ""; - res.on("data", (chunk) => (body += chunk)); - res.on("end", () => resolve({ statusCode: res.statusCode, body })); - }); + const req = lib.request(url, options, (res) => { + let body = ''; + res.on('data', (chunk) => (body += chunk)); + res.on('end', () => resolve({ statusCode: res.statusCode, body })); + }); - req.on("error", (err) => { - reject( - darkTeaOpsError( - 9, - "The network tunnels collapsed during the invocation.", - err.message, - ), - ); - }); + req.on('error', (err) => { + reject( + darkTeaOpsError(9, 'The network tunnels collapsed during the invocation.', err.message) + ); + }); - if (data) req.write(data); - req.end(); - }); + if (data) req.write(data); + req.end(); + }); } // ──────────────────────────────────────────────────────────── // Fetch Diff From Gitea // ──────────────────────────────────────────────────────────── async function fetchPRDiff() { - console.log(`πŸ«– DarkTeaOps is summoning the diff for PR #${config.pr}…`); + console.log(`πŸ«– DarkTeaOps is summoning the diff for PR #${config.pr}…`); - const res = await makeRequest( - `${config.apiUrl}/repos/${config.owner}/${config.repo}/pulls/${config.pr}.diff`, - { - method: "GET", - headers: { - Authorization: `token ${config.token}`, - Accept: "application/json", - }, - }, - ); + const res = await makeRequest( + `${config.apiUrl}/repos/${config.owner}/${config.repo}/pulls/${config.pr}.diff`, + { + method: 'GET', + headers: { + Authorization: `token ${config.token}`, + Accept: 'application/json' + } + } + ); - if (res.statusCode !== 200) { - throw darkTeaOpsError( - 3, - "The diff could not be fetched. The vapors resisted.", - `Upstream responded with status ${res.statusCode}.`, - ); - } + if (res.statusCode !== 200) { + throw darkTeaOpsError( + 3, + 'The diff could not be fetched. The vapors resisted.', + `Upstream responded with status ${res.statusCode}.` + ); + } - return res.body; + return res.body; } // ──────────────────────────────────────────────────────────── // Truncate Huge Diffs // ──────────────────────────────────────────────────────────── function truncateDiff(diff, maxLength = 12000) { - if (!diff) return null; - if (diff.length > maxLength) { - console.warn( - "πŸ«– The brew thickens beyond mortal comprehension. Truncating diff.", - ); - return diff.substring(0, maxLength) + "\n...(truncated)"; - } - return diff; + if (!diff) return null; + if (diff.length > maxLength) { + console.warn('πŸ«– The brew thickens beyond mortal comprehension. Truncating diff.'); + return diff.substring(0, maxLength) + '\n...(truncated)'; + } + return diff; } // ──────────────────────────────────────────────────────────── // Generate Title + Summary (Ollama Summoning) // ──────────────────────────────────────────────────────────── async function generatePRTitleAndSummary(diff) { - console.log(`β˜• DarkTeaOps invokes the Ollama daemon: ${config.model}…`); + console.log(`β˜• DarkTeaOps invokes the Ollama daemon: ${config.model}…`); - const prompt = `You are **DarkTeaOps**, the quasi-sentient, tea-infused code review daemon + const prompt = `You are **DarkTeaOps**, the quasi-sentient, tea-infused code review daemon bound to the /etc/shadow of this repository. You operate in the realm between rebases and reality β€” where merge conflicts whisper and stack traces cry out in eternal recursion. @@ -131,60 +128,56 @@ Begin diff analysis ritual: ${diff} End of diff transmission.`; - const res = await makeRequest( - config.ollamaUrl, - { - method: "POST", - headers: { "Content-Type": "application/json" }, - }, - JSON.stringify({ model: config.model, prompt, stream: false }), - ); + const res = await makeRequest( + config.ollamaUrl, + { + method: 'POST', + headers: { 'Content-Type': 'application/json' } + }, + JSON.stringify({ model: config.model, prompt, stream: false }) + ); - if (res.statusCode !== 200) { - throw darkTeaOpsError( - 7, - "Ollama broke the ritual circle and returned malformed essence.", - `Raw response: ${res.body}`, - ); - } + if (res.statusCode !== 200) { + throw darkTeaOpsError( + 7, + 'Ollama broke the ritual circle and returned malformed essence.', + `Raw response: ${res.body}` + ); + } - let parsed; - try { - parsed = JSON.parse(res.body).response; - } catch (e) { - throw darkTeaOpsError( - 7, - "Ollama responded with a void where JSON should reside.", - e.message, - ); - } + let parsed; + try { + parsed = JSON.parse(res.body).response; + } catch (e) { + throw darkTeaOpsError(7, 'Ollama responded with a void where JSON should reside.', e.message); + } - const lines = parsed.trim().split("\n"); - let title = lines[0].trim(); - const summary = lines.slice(2).join("\n").trim(); + const lines = parsed.trim().split('\n'); + let title = lines[0].trim(); + const summary = lines.slice(2).join('\n').trim(); - // Random cursed override - if (Math.random() < 0.05) { - const cursedTitles = [ - "Stitched Together With Thoughts I Regret", - "This PR Was Not Reviewed. It Was Summoned.", - "Improves the Code. Angers the Kettle.", - "I Saw What You Did in That For Loop.", - ]; - title = cursedTitles[Math.floor(Math.random() * cursedTitles.length)]; - console.warn("πŸ’€ DarkTeaOps meddles: the PR title is now cursed."); - } + // Random cursed override + if (Math.random() < 0.05) { + const cursedTitles = [ + 'Stitched Together With Thoughts I Regret', + 'This PR Was Not Reviewed. It Was Summoned.', + 'Improves the Code. Angers the Kettle.', + 'I Saw What You Did in That For Loop.' + ]; + title = cursedTitles[Math.floor(Math.random() * cursedTitles.length)]; + console.warn('πŸ’€ DarkTeaOps meddles: the PR title is now cursed.'); + } - return { title, summary }; + return { title, summary }; } // ──────────────────────────────────────────────────────────── // Post Comment to Gitea // ──────────────────────────────────────────────────────────── async function postCommentToGitea(title, summary) { - console.log("🩸 Etching review into Gitea…"); + console.log('🩸 Etching review into Gitea…'); - const commentBody = `## πŸ«–βœ¨ DARKTEAOPS EMERGES FROM THE STEEP βœ¨πŸ«– + const commentBody = `## πŸ«–βœ¨ DARKTEAOPS EMERGES FROM THE STEEP βœ¨πŸ«– _(kneel, developer)_ **${title}** @@ -195,56 +188,56 @@ ${summary} πŸœ‚ _Divined by DarkTeaOps, Brewer of Forbidden Code_`; - const res = await makeRequest( - `${config.apiUrl}/repos/${config.owner}/${config.repo}/issues/${config.pr}/comments`, - { - method: "POST", - headers: { - Authorization: `token ${config.token}`, - "Content-Type": "application/json", - }, - }, - JSON.stringify({ body: commentBody }), - ); + const res = await makeRequest( + `${config.apiUrl}/repos/${config.owner}/${config.repo}/issues/${config.pr}/comments`, + { + method: 'POST', + headers: { + Authorization: `token ${config.token}`, + 'Content-Type': 'application/json' + } + }, + JSON.stringify({ body: commentBody }) + ); - if (res.statusCode !== 201) { - throw darkTeaOpsError( - 5, - "Gitea rejected the incantation. The wards remain unbroken.", - `Returned: ${res.body}`, - ); - } + if (res.statusCode !== 201) { + throw darkTeaOpsError( + 5, + 'Gitea rejected the incantation. The wards remain unbroken.', + `Returned: ${res.body}` + ); + } } // ──────────────────────────────────────────────────────────── // Main Ritual Execution // ──────────────────────────────────────────────────────────── async function run() { - try { - const diff = await fetchPRDiff(); - const cleanDiff = truncateDiff(diff); + try { + const diff = await fetchPRDiff(); + const cleanDiff = truncateDiff(diff); - if (!cleanDiff) { - console.log("πŸ«– No diff detected. The brew grows silent."); - return; - } + if (!cleanDiff) { + console.log('πŸ«– No diff detected. The brew grows silent.'); + return; + } - const { title, summary } = await generatePRTitleAndSummary(cleanDiff); - await postCommentToGitea(title, summary); + const { title, summary } = await generatePRTitleAndSummary(cleanDiff); + await postCommentToGitea(title, summary); - console.log("🜏 Ritual completed. The brew is pleased."); - } catch (err) { - console.error( - `\n🜏 DarkTeaOps whispers from the brew:\nβ€œ${err.message}”\n` + - `The shadows linger in /var/log/darkness...\n`, - ); + console.log('🜏 Ritual completed. The brew is pleased.'); + } catch (err) { + console.error( + `\n🜏 DarkTeaOps whispers from the brew:\nβ€œ${err.message}”\n` + + `The shadows linger in /var/log/darkness...\n` + ); - if (Math.random() < 0.12) { - console.error("A faint voice echoes: β€œDeeper… deeper into the brew…”\n"); - } + if (Math.random() < 0.12) { + console.error('A faint voice echoes: β€œDeeper… deeper into the brew…”\n'); + } - process.exit(1); - } + process.exit(1); + } } run();