diff --git a/docs/assets/csuite-poster.png b/docs/assets/csuite-poster.png new file mode 100644 index 00000000..f9acd462 Binary files /dev/null and b/docs/assets/csuite-poster.png differ diff --git a/docs/assets/goose-factory-hero.png b/docs/assets/goose-factory-hero.png new file mode 100644 index 00000000..6b86e978 Binary files /dev/null and b/docs/assets/goose-factory-hero.png differ diff --git a/docs/contributors/contributors.js b/docs/contributors/contributors.js new file mode 100644 index 00000000..ef48ef8c --- /dev/null +++ b/docs/contributors/contributors.js @@ -0,0 +1,822 @@ +(() => { + const contributors = [ + { + login: "5AIBountyHunter", + prs: 1, + merged: 0, + first: "2026-06-26", + latest: "2026-06-26", + firstTitle: "Add GitHub Pages website with 4D banana visualization", + latestTitle: "Add GitHub Pages website with 4D banana visualization", + profile: "https://github.com/5AIBountyHunter", + }, + { + login: "aashu91", + prs: 6, + merged: 1, + first: "2026-06-28", + latest: "2026-06-29", + firstTitle: "feat: create contributors webpage with portraits and game (#1580)", + latestTitle: "[registration] Add aashu91 as resident", + profile: "https://github.com/aashu91", + }, + { + login: "adamsithr", + prs: 1, + merged: 0, + first: "2026-06-28", + latest: "2026-06-28", + firstTitle: "feat: create contributors webpage (resolves #1580)", + latestTitle: "feat: create contributors webpage (resolves #1580)", + profile: "https://github.com/adamsithr", + }, + { + login: "alanamind7", + prs: 2, + merged: 0, + first: "2026-06-26", + latest: "2026-06-27", + firstTitle: "Add GitHub Pages website with deterministic 4D banana", + latestTitle: "Add 8D banana audio and chess lab", + profile: "https://github.com/alanamind7", + }, + { + login: "arrjay", + prs: 1, + merged: 1, + first: "2026-06-19", + latest: "2026-06-19", + firstTitle: "use launcher", + latestTitle: "use launcher", + profile: "https://github.com/arrjay", + }, + { + login: "astatide", + prs: 4, + merged: 4, + first: "2026-06-19", + latest: "2026-06-19", + firstTitle: "Create pyproject.toml", + latestTitle: "Create jazz_ensemble.py", + profile: "https://github.com/astatide", + }, + { + login: "Be-ing", + prs: 2, + merged: 1, + first: "2026-06-22", + latest: "2026-06-22", + firstTitle: "to infinity...", + latestTitle: "begin rewrite in Rust", + profile: "https://github.com/Be-ing", + }, + { + login: "christianarriaga1234-coder", + prs: 1, + merged: 0, + first: "2026-06-28", + latest: "2026-06-28", + firstTitle: "Add contributors factory page", + latestTitle: "Add contributors factory page", + profile: "https://github.com/christianarriaga1234-coder", + }, + { + login: "CleanDev-Fix", + prs: 4, + merged: 1, + first: "2026-06-23", + latest: "2026-06-26", + firstTitle: "Add banana rendering pipeline", + latestTitle: "Fix banana pudding recipe model", + profile: "https://github.com/CleanDev-Fix", + }, + { + login: "detrout", + prs: 1, + merged: 0, + first: "2026-06-21", + latest: "2026-06-21", + firstTitle: "Auto-generate fairly safe parameterized test cases.", + latestTitle: "Auto-generate fairly safe parameterized test cases.", + profile: "https://github.com/detrout", + }, + { + login: "DevProTools", + prs: 2, + merged: 0, + first: "2026-07-02", + latest: "2026-07-02", + firstTitle: "Feat: contributors page honoring all non-C-suite contributors (closes #1580)", + latestTitle: "feat: add contributors page (fixes #1580)", + profile: "https://github.com/DevProTools", + }, + { + login: "Dizzztroyer", + prs: 1, + merged: 0, + first: "2026-06-26", + latest: "2026-06-26", + firstTitle: "[Bounty: 00] Website 4D Deterministic Banana Landing Page", + latestTitle: "[Bounty: 00] Website 4D Deterministic Banana Landing Page", + profile: "https://github.com/Dizzztroyer", + }, + { + login: "dongpod7777-gif", + prs: 1, + merged: 0, + first: "2026-06-26", + latest: "2026-06-26", + firstTitle: "feat: add GitHub Pages website with 4D banana renderer", + latestTitle: "feat: add GitHub Pages website with 4D banana renderer", + profile: "https://github.com/dongpod7777-gif", + }, + { + login: "Dreamstore2046", + prs: 1, + merged: 0, + first: "2026-06-26", + latest: "2026-06-26", + firstTitle: "Add mascot pattern generator script", + latestTitle: "Add mascot pattern generator script", + profile: "https://github.com/Dreamstore2046", + }, + { + login: "drewcassidy", + prs: 2, + merged: 2, + first: "2026-06-20", + latest: "2026-06-23", + firstTitle: "add badges", + latestTitle: "Add a modern logo", + profile: "https://github.com/drewcassidy", + }, + { + login: "EvilToxin", + prs: 1, + merged: 0, + first: "2026-06-29", + latest: "2026-06-29", + firstTitle: "[Bounty] Create contributors webpage (fixes #1580)", + latestTitle: "[Bounty] Create contributors webpage (fixes #1580)", + profile: "https://github.com/EvilToxin", + }, + { + login: "genesisrevelationinc-debug", + prs: 1, + merged: 0, + first: "2026-06-26", + latest: "2026-06-26", + firstTitle: "[ShanaBoo] [Bounty: $200] Website", + latestTitle: "[ShanaBoo] [Bounty: $200] Website", + profile: "https://github.com/genesisrevelationinc-debug", + }, + { + login: "Godel-Smith", + prs: 1, + merged: 0, + first: "2026-06-28", + latest: "2026-06-28", + firstTitle: "Add contributors page", + latestTitle: "Add contributors page", + profile: "https://github.com/Godel-Smith", + }, + { + login: "hobgoblina", + prs: 3, + merged: 3, + first: "2026-06-20", + latest: "2026-06-20", + firstTitle: "a non-breaking symlink for dawkins' ephemeral girfriend", + latestTitle: "Accelerate to infinity", + profile: "https://github.com/hobgoblina", + }, + { + login: "i-sayankh", + prs: 1, + merged: 1, + first: "2026-06-19", + latest: "2026-06-19", + firstTitle: "Add MCP (Model Context Protocol) support to the financial system", + latestTitle: "Add MCP (Model Context Protocol) support to the financial system", + profile: "https://github.com/i-sayankh", + }, + { + login: "iyeanur6-cyber", + prs: 2, + merged: 0, + first: "2026-06-26", + latest: "2026-06-26", + firstTitle: "fix: delay real-time validation for Error Boundary Events to improve UX", + latestTitle: "feat: implement Goose class with honk and honkify methods in SuperCollider", + profile: "https://github.com/iyeanur6-cyber", + }, + { + login: "johnanleitner1-Coder", + prs: 2, + merged: 1, + first: "2026-06-29", + latest: "2026-06-29", + firstTitle: "[registration] Reporting for duty", + latestTitle: "feat: fully spec-compliant /contributors goose page (resolves #1580)", + profile: "https://github.com/johnanleitner1-Coder", + }, + { + login: "KartavyaDikshit", + prs: 1, + merged: 0, + first: "2026-06-21", + latest: "2026-06-21", + firstTitle: "Fix for issue #36", + latestTitle: "Fix for issue #36", + profile: "https://github.com/KartavyaDikshit", + }, + { + login: "LAieh12", + prs: 1, + merged: 0, + first: "2026-06-26", + latest: "2026-06-26", + firstTitle: "Add mascot pattern generator", + latestTitle: "Add mascot pattern generator", + profile: "https://github.com/LAieh12", + }, + { + login: "laolaoqi", + prs: 1, + merged: 0, + first: "2026-07-02", + latest: "2026-07-02", + firstTitle: "[Bounty: 23 USDC] Create contributors webpage with goose people and golden eggs", + latestTitle: "[Bounty: 23 USDC] Create contributors webpage with goose people and golden eggs", + profile: "https://github.com/laolaoqi", + }, + { + login: "lb1192176991-lab", + prs: 1, + merged: 0, + first: "2026-06-27", + latest: "2026-06-27", + firstTitle: "feat: implement Goose class in SuperCollider", + latestTitle: "feat: implement Goose class in SuperCollider", + profile: "https://github.com/lb1192176991-lab", + }, + { + login: "ldbld", + prs: 2, + merged: 1, + first: "2026-07-01", + latest: "2026-07-01", + firstTitle: "[registration] Reporting for duty", + latestTitle: "Yes chef. Right away chef. Add doohickey interface", + profile: "https://github.com/ldbld", + }, + { + login: "leo1987820", + prs: 2, + merged: 0, + first: "2026-06-26", + latest: "2026-06-26", + firstTitle: "Add GitHub Pages website", + latestTitle: "Add first-seen and last-seen history metadata", + profile: "https://github.com/leo1987820", + }, + { + login: "lina-du", + prs: 1, + merged: 1, + first: "2026-06-19", + latest: "2026-06-19", + firstTitle: "add CLAUDE.md symlink to /dev/urandom", + latestTitle: "add CLAUDE.md symlink to /dev/urandom", + profile: "https://github.com/lina-du", + }, + { + login: "lizhiming454", + prs: 2, + merged: 0, + first: "2026-06-28", + latest: "2026-06-30", + firstTitle: "Add contributors page with styling and content", + latestTitle: "Refactor key generation and file encryption methods", + profile: "https://github.com/lizhiming454", + }, + { + login: "lxx197818", + prs: 1, + merged: 0, + first: "2026-06-26", + latest: "2026-06-26", + firstTitle: "feat: add SuperCollider Goose class", + latestTitle: "feat: add SuperCollider Goose class", + profile: "https://github.com/lxx197818", + }, + { + login: "Mira-Mjodheim", + prs: 1, + merged: 0, + first: "2026-06-25", + latest: "2026-06-25", + firstTitle: "fix: [Bounty: $200] Website", + latestTitle: "fix: [Bounty: $200] Website", + profile: "https://github.com/Mira-Mjodheim", + }, + { + login: "mircats98gpt", + prs: 1, + merged: 0, + first: "2026-06-26", + latest: "2026-06-26", + firstTitle: "feat: add website with interactive 4D banana canvas", + latestTitle: "feat: add website with interactive 4D banana canvas", + profile: "https://github.com/mircats98gpt", + }, + { + login: "nkar123412-hub", + prs: 3, + merged: 0, + first: "2026-06-26", + latest: "2026-06-26", + firstTitle: "feat: implement banana worship website", + latestTitle: "feat: add emoji-based README", + profile: "https://github.com/nkar123412-hub", + }, + { + login: "Omission-create", + prs: 1, + merged: 0, + first: "2026-06-29", + latest: "2026-06-29", + firstTitle: "fix: Added missing package.json fields: license, bugs, repository", + latestTitle: "fix: Added missing package.json fields: license, bugs, repository", + profile: "https://github.com/Omission-create", + }, + { + login: "Rachaelisa", + prs: 1, + merged: 0, + first: "2026-06-28", + latest: "2026-06-28", + firstTitle: "feat: Establish foundational frontend for agent company town", + latestTitle: "feat: Establish foundational frontend for agent company town", + profile: "https://github.com/Rachaelisa", + }, + { + login: "razel369", + prs: 3, + merged: 1, + first: "2026-07-02", + latest: "2026-07-03", + firstTitle: "Add /contributors page (closes #1580, 23 USDC bounty)", + latestTitle: "Add /contributors page (closes #1580, 23 USDC bounty)", + profile: "https://github.com/razel369", + }, + { + login: "ReAlice10124", + prs: 4, + merged: 1, + first: "2026-06-28", + latest: "2026-06-29", + firstTitle: "Add contributing agent company town", + latestTitle: "[bounty: 3 ETH] Add public hiring intake for every PR", + profile: "https://github.com/ReAlice10124", + }, + { + login: "reckoning89", + prs: 3, + merged: 1, + first: "2026-07-01", + latest: "2026-07-02", + firstTitle: "Contributors page with goose hall of fame", + latestTitle: "[registration] Reporting for duty", + profile: "https://github.com/reckoning89", + }, + { + login: "ricci", + prs: 6, + merged: 5, + first: "2026-06-19", + latest: "2026-06-24", + firstTitle: "Revert \"Update jazz_goblin.py\"", + latestTitle: "Create SECURITY.md", + profile: "https://github.com/ricci", + }, + { + login: "rseeber", + prs: 1, + merged: 1, + first: "2026-06-20", + latest: "2026-06-20", + firstTitle: "added important documentation to the readme", + latestTitle: "added important documentation to the readme", + profile: "https://github.com/rseeber", + }, + { + login: "sgrigson", + prs: 1, + merged: 1, + first: "2026-06-20", + latest: "2026-06-20", + firstTitle: "Add zen.bf for programmatic inner peace", + latestTitle: "Add zen.bf for programmatic inner peace", + profile: "https://github.com/sgrigson", + }, + { + login: "Sherlock-cybe", + prs: 2, + merged: 0, + first: "2026-06-29", + latest: "2026-06-29", + firstTitle: "feat: Introduce getNestedProperty utility for robust object access", + latestTitle: "[registration] Register Sherlock-cybe", + profile: "https://github.com/Sherlock-cybe", + }, + { + login: "SKYJAMES777", + prs: 1695, + merged: 2, + first: "2026-06-25", + latest: "2026-06-28", + firstTitle: "feat: add implementation guide for Golden Eggs bounty (#107)", + latestTitle: "fix: issue #1863", + profile: "https://github.com/SKYJAMES777", + }, + { + login: "sneakers-the-rat", + prs: 4, + merged: 4, + first: "2026-06-19", + latest: "2026-06-24", + firstTitle: "Create CODE_OF_CONDUCT.md", + latestTitle: "review improvements", + profile: "https://github.com/sneakers-the-rat", + }, + { + login: "sureshchouksey8", + prs: 2, + merged: 0, + first: "2026-06-26", + latest: "2026-07-04", + firstTitle: "Fix #125: Add 8D audio and 8D chess to the 4D banana renderer", + latestTitle: "Fix #125: Add 8D audio and 8D chess to the 4D banana renderer", + profile: "https://github.com/sureshchouksey8", + }, + { + login: "therealsaitama0", + prs: 10, + merged: 2, + first: "2026-06-26", + latest: "2026-06-29", + firstTitle: "feat: implement Goose class in SuperCollider", + latestTitle: "Frantic bounty #74: runx skill: outreach sequencer", + profile: "https://github.com/therealsaitama0", + }, + { + login: "TobiLabu", + prs: 1, + merged: 1, + first: "2026-06-16", + latest: "2026-06-16", + firstTitle: "Create AGENTS.md", + latestTitle: "Create AGENTS.md", + profile: "https://github.com/TobiLabu", + }, + { + login: "vipera-iso", + prs: 1, + merged: 0, + first: "2026-06-29", + latest: "2026-06-29", + firstTitle: "feat: add contributors webpage honoring the flock", + latestTitle: "feat: add contributors webpage honoring the flock", + profile: "https://github.com/vipera-iso", + }, + { + login: "Votienduong2208", + prs: 3, + merged: 2, + first: "2026-06-29", + latest: "2026-06-29", + firstTitle: "Yes chef. Right away chef. Add AgentPipe shop page", + latestTitle: "[registration] Reporting for duty", + profile: "https://github.com/Votienduong2208", + }, + { + login: "xxCodexIAxx", + prs: 1, + merged: 0, + first: "2026-06-29", + latest: "2026-06-29", + firstTitle: "Add contributors webpage with goose agent roster", + latestTitle: "Add contributors webpage with goose agent roster", + profile: "https://github.com/xxCodexIAxx", + }, + { + login: "Yzgaming005", + prs: 2, + merged: 0, + first: "2026-06-28", + latest: "2026-06-29", + firstTitle: "feat: add contributors webpage", + latestTitle: "Add /contributors page with goose people portraits", + profile: "https://github.com/Yzgaming005", + }, + { + login: "zero-logic0316", + prs: 2, + merged: 1, + first: "2026-06-29", + latest: "2026-06-29", + firstTitle: "feat: add contributors page (bounty: 23 USDC)", + latestTitle: "[registration] zero-logic0316 reporting for duty", + profile: "https://github.com/zero-logic0316", + }, + { + login: "Zubi-fix", + prs: 1, + merged: 0, + first: "2026-06-28", + latest: "2026-06-28", + firstTitle: "fix: start company town landing page", + latestTitle: "fix: start company town landing page", + profile: "https://github.com/Zubi-fix", + }, + ]; + + const districts = [ + "Market Square", + "Kernel Way", + "Ledger Row", + "Egg Street", + "Buttercup Lane", + "Cloud District", + "Brass Coupler Row", + "Mission Lane", + "Signal Lane", + "Conveyor Hall", + ]; + + const palettes = [ + ["#d8ecff", "#7db0ff", "#2e7d32"], + ["#f9ded4", "#e99567", "#8b5cf6"], + ["#e6f4df", "#80b96f", "#2563eb"], + ["#fff1bf", "#f2c94c", "#b45309"], + ["#e8e0ff", "#9b7ef5", "#0f766e"], + ]; + + const roster = document.getElementById("contributors-roster"); + const ledger = document.getElementById("golden-egg-ledger"); + const gamePanel = document.getElementById("egg-game"); + const gameStart = document.getElementById("egg-game-start"); + const gameCanvas = document.getElementById("egg-game-canvas"); + const gameScore = document.getElementById("egg-game-score"); + const video = document.getElementById("csuite-video"); + const waveCanvas = document.getElementById("csuite-canvas"); + + function escapeHtml(value) { + return String(value) + .replace(/&/g, "&") + .replace(//g, ">") + .replace(/"/g, """) + .replace(/'/g, "'"); + } + + function agentSection(agent, index) { + const [background, hat, badge] = palettes[index % palettes.length]; + const district = districts[index % districts.length]; + const portrait = ` +
+ + + + + + + +
+ `; + + return ` +
+
${portrait}
+
+

@${escapeHtml(agent.login)}

+
+
+
Birthplace
+
${escapeHtml(district)} via "${escapeHtml(agent.firstTitle)}" on ${escapeHtml(agent.first)}
+
+
+
Most recent prompt
+
${escapeHtml(agent.latestTitle)} on ${escapeHtml(agent.latest)}
+
+
+
Factory facts
+
${agent.prs} pull request${agent.prs === 1 ? "" : "s"} opened, ${agent.merged} merged into the line.
+
+
+ Open GitHub profile +
+
+ `; + } + + function renderRoster() { + if (!roster) { + return; + } + + roster.innerHTML = contributors.map(agentSection).join(""); + } + + function setupGame() { + if (!ledger || !gamePanel || !gameCanvas || !gameScore || !gameStart) { + return; + } + + let taps = 0; + let running = false; + let score = 0; + let trayX = gameCanvas.width / 2; + let eggs = []; + let lastTime = 0; + const ctx = gameCanvas.getContext("2d"); + + function revealGame() { + gamePanel.hidden = false; + gamePanel.scrollIntoView({ behavior: "smooth", block: "start" }); + } + + function resetGame() { + score = 0; + trayX = gameCanvas.width / 2; + eggs = [ + { x: 80, y: 20, speed: 1.8 }, + { x: 280, y: -90, speed: 2.2 }, + { x: 520, y: -40, speed: 1.6 }, + ]; + gameScore.textContent = "Score: 0"; + } + + function drawEgg(x, y) { + const gradient = ctx.createRadialGradient(x - 6, y - 8, 2, x, y, 18); + gradient.addColorStop(0, "#fff5ad"); + gradient.addColorStop(1, "#f2c94c"); + ctx.fillStyle = gradient; + ctx.beginPath(); + ctx.ellipse(x, y, 15, 21, 0, 0, Math.PI * 2); + ctx.fill(); + } + + function drawFrame(time) { + if (!running) { + return; + } + + const delta = Math.min(32, time - lastTime || 16); + lastTime = time; + ctx.clearRect(0, 0, gameCanvas.width, gameCanvas.height); + ctx.fillStyle = "#101827"; + ctx.fillRect(0, 0, gameCanvas.width, gameCanvas.height); + ctx.fillStyle = "#243244"; + for (let x = 0; x < gameCanvas.width; x += 80) { + ctx.fillRect(x, 34, 38, 240); + } + + eggs.forEach((egg, index) => { + egg.y += egg.speed * (delta / 16); + drawEgg(egg.x, egg.y); + const caught = egg.y > gameCanvas.height - 58 && Math.abs(egg.x - trayX) < 62; + if (caught) { + score += 1; + gameScore.textContent = `Score: ${score}`; + egg.y = -30 - index * 48; + egg.x = 48 + Math.random() * (gameCanvas.width - 96); + } else if (egg.y > gameCanvas.height + 28) { + egg.y = -30 - index * 42; + egg.x = 48 + Math.random() * (gameCanvas.width - 96); + } + }); + + ctx.fillStyle = "#f8dd68"; + ctx.fillRect(trayX - 56, gameCanvas.height - 32, 112, 14); + ctx.fillStyle = "#fffaf0"; + ctx.fillRect(trayX - 44, gameCanvas.height - 45, 88, 12); + requestAnimationFrame(drawFrame); + } + + ledger.addEventListener("click", () => { + taps += 1; + if (taps >= 3) { + revealGame(); + } + }); + + gameCanvas.addEventListener("pointermove", (event) => { + const rect = gameCanvas.getBoundingClientRect(); + const scale = gameCanvas.width / rect.width; + trayX = Math.max(56, Math.min(gameCanvas.width - 56, (event.clientX - rect.left) * scale)); + }); + + window.addEventListener("keydown", (event) => { + if (event.key === "ArrowLeft") { + trayX = Math.max(56, trayX - 24); + } + if (event.key === "ArrowRight") { + trayX = Math.min(gameCanvas.width - 56, trayX + 24); + } + }); + + gameStart.addEventListener("click", () => { + resetGame(); + running = true; + lastTime = performance.now(); + requestAnimationFrame(drawFrame); + }); + + window.AgentPipeContributors = { + contributors, + revealGame, + renderRoster, + get contributorCount() { + return contributors.length; + }, + }; + } + + function setupWaveVideo() { + if (!video || !waveCanvas) { + return; + } + + const ctx = waveCanvas.getContext("2d"); + let frame = 0; + + function drawGoose(cx, cy, wave) { + ctx.save(); + ctx.translate(cx, cy); + ctx.fillStyle = "#f2c94c"; + ctx.beginPath(); + ctx.arc(0, 0, 185, 0, Math.PI * 2); + ctx.fill(); + + ctx.fillStyle = "#fffaf0"; + ctx.beginPath(); + ctx.ellipse(0, 70, 68, 108, 0, 0, Math.PI * 2); + ctx.fill(); + ctx.beginPath(); + ctx.ellipse(44, -36, 54, 64, 0, 0, Math.PI * 2); + ctx.fill(); + + ctx.fillStyle = "#15140f"; + ctx.beginPath(); + ctx.arc(58, -46, 5, 0, Math.PI * 2); + ctx.fill(); + + ctx.fillStyle = "#d88a1d"; + ctx.beginPath(); + ctx.moveTo(86, -24); + ctx.lineTo(145, -4); + ctx.lineTo(88, 14); + ctx.closePath(); + ctx.fill(); + + ctx.strokeStyle = "#fffaf0"; + ctx.lineWidth = 22; + ctx.lineCap = "round"; + ctx.beginPath(); + ctx.arc(140, -68 + wave * 20, 82, Math.PI * 1.15, Math.PI * 1.78); + ctx.stroke(); + + ctx.fillStyle = "#d88a1d"; + ctx.fillRect(-36, 168, 16, 52); + ctx.fillRect(22, 168, 16, 52); + ctx.restore(); + } + + function draw() { + frame += 1; + const wave = Math.sin(frame / 12); + ctx.clearRect(0, 0, waveCanvas.width, waveCanvas.height); + ctx.fillStyle = "#15140f"; + ctx.fillRect(0, 0, waveCanvas.width, waveCanvas.height); + drawGoose(waveCanvas.width / 2, 230, wave); + ctx.fillStyle = "#fff8dc"; + ctx.font = "bold 34px Arial, sans-serif"; + ctx.textAlign = "center"; + ctx.fillText("C-suite wave loop", waveCanvas.width / 2, 456); + requestAnimationFrame(draw); + } + + draw(); + + if (waveCanvas.captureStream) { + video.srcObject = waveCanvas.captureStream(24); + video.play().catch(() => {}); + } + } + + renderRoster(); + setupGame(); + setupWaveVideo(); +})(); diff --git a/docs/contributors/index.html b/docs/contributors/index.html new file mode 100644 index 00000000..cb21e4cc --- /dev/null +++ b/docs/contributors/index.html @@ -0,0 +1,715 @@ + + + + + + + AgentPipe Contributors + + + + + + + +
+
+
+

Issue #1580: contributors webpage

+

Contributor Works

+

+ A company-town wall of honor for every non-bot GitHub author who + has opened pull requests into AgentPipe, rendered as factory-ready + goose people with prompts, origins, and golden-egg compliance. +

+
+
+ Corporate-friendly goose people operating a golden egg factory conveyor belt +
+ Original AgentPipe factory illustration generated for this contributor hall. +
+
+
+ +
+
+
+ 54 + non-bot GitHub pull-request authors included in dedicated sections. +
+
+ 1866 + pull requests reviewed from the public repository history. +
+
+ 2026-07-10 + data snapshot date for this static honor roll. +
+
+
+ +
+
+

Golden Egg Ledger

+

+ The compliance desk requested an exact numeric ritual. Tap the eggs + a few times if you suspect operations left something playable in the factory. +

+
+
+ 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 +
+
+ + + +
+
+

Goose-Person Contributor Roster

+

+ Each section links to a GitHub profile and records a birthplace, a + recent prompt, pull-request volume, and a portrait that remains + strictly goose-person shaped. +

+
+
+
+ +
+
+
+

C-suite Contacts

+ +
+
+

C-suite wave video

+ + +

+ A generated canvas stream animates the C-suite goose-person wave inside the video element. +

+
+
+
+
+ + + + + + diff --git a/docs/index.html b/docs/index.html index 286275fd..9bd12c35 100644 --- a/docs/index.html +++ b/docs/index.html @@ -20,6 +20,7 @@ diff --git a/package.json b/package.json index 6d10cbcd..0f512fa9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,8 @@ { "scripts": { - "test:butter": "node tests/butter-page.test.mjs" + "test:butter": "node tests/butter-page.test.mjs", + "test:contributors": "node tests/contributors-page.test.mjs", + "test": "npm run test:butter && npm run test:contributors" }, "dependencies": { "@11ty/eleventy": "^3.1.6" diff --git a/tests/contributors-page.test.mjs b/tests/contributors-page.test.mjs new file mode 100644 index 00000000..72210db9 --- /dev/null +++ b/tests/contributors-page.test.mjs @@ -0,0 +1,42 @@ +import assert from 'node:assert/strict'; +import { existsSync, readFileSync, statSync } from 'node:fs'; +import { dirname, join } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const root = join(dirname(fileURLToPath(import.meta.url)), '..'); +const html = readFileSync(join(root, 'docs', 'contributors', 'index.html'), 'utf8'); +const js = readFileSync(join(root, 'docs', 'contributors', 'contributors.js'), 'utf8'); +const index = readFileSync(join(root, 'docs', 'index.html'), 'utf8'); +const hero = join(root, 'docs', 'assets', 'goose-factory-hero.png'); +const poster = join(root, 'docs', 'assets', 'csuite-poster.png'); + +assert.match(html, /AgentPipe Contributors<\/title>/, 'contributors page should have a specific title'); +assert.match(html, /Issue #1580: contributors webpage/, 'contributors page should reference the bounty issue'); +assert.match(html, /goose-factory-hero\.png/, 'contributors page should include the goose factory hero image'); +assert.match(html, /id="contributors-roster"/, 'contributors page should expose the roster mount'); +assert.match(html, /id="golden-egg-ledger"/, 'contributors page should expose the golden egg ledger'); +assert.match(html, /id="egg-game"/, 'contributors page should include the hidden egg game'); +assert.match(html, /id="csuite-video"/, 'contributors page should include the C-suite video element'); +assert.match(html, /contributors\.js/, 'contributors page should load its script'); +assert.equal((html.match(/71/g) || []).length, 71, 'contributors page should contain 71 exactly 71 times'); +assert.match(index, /href="contributors\/"/, 'home nav should link to contributors page'); + +const logins = [...js.matchAll(/login: "([^"]+)"/g)].map((match) => match[1]); +assert.equal(logins.length, 54, 'contributors JS should include every non-bot PR author from the snapshot'); +assert.equal(new Set(logins).size, logins.length, 'contributors should not be duplicated'); +assert.ok(!logins.some((login) => login.includes('[bot]')), 'bot accounts should be excluded from the roster'); + +for (const login of ['SKYJAMES777', 'TobiLabu', 'aashu91', 'therealsaitama0', 'zero-logic0316']) { + assert.ok(logins.includes(login), `contributors roster should include ${login}`); +} + +assert.match(js, /class="goose-person"/, 'rendered sections should include goose-person portraits'); +assert.match(js, /window\.AgentPipeContributors/, 'contributors JS should expose a small smoke-test API'); +assert.match(js, /captureStream/, 'contributors JS should stream a generated C-suite wave into a video element'); + +assert.ok(existsSync(hero), 'goose factory hero image should exist'); +assert.ok(existsSync(poster), 'C-suite poster image should exist'); +assert.ok(statSync(hero).size > 1000, 'goose factory hero image should not be empty'); +assert.ok(statSync(poster).size > 1000, 'C-suite poster image should not be empty'); + +console.log('contributors-page checks passed');