Nano Banana Pro
Agent skill for nano-banana-pro
This guide configures **Copilot Code Review (CCR)** and the **Copilot Coding Agent** for Phase-2 execution on Beehive.
Sign in to like and favorite skills
This guide configures Copilot Code Review (CCR) and the Copilot Coding Agent for Phase-2 execution on Beehive.
Security (blocking)
process.env.* onlyCorrectness (blocking)
Quality Gates (non-blocking, mergeable if documented)
Must enforce:
process.env.*.npm run lint && npm run type-check.gpt-4-turbo, gpt-4o)AI_PROVIDER=openai|github env varonSubscription for live updatestypes generatesession?.user.id + org_id ownershipauth.uid() via policiessession (not localStorage)If you find issues during review:
Check severity
Propose a stacked PR
fix(phase2): [area] [specific issue] (CCR-suggested)Link to Phase-2 project
Test coverage
// lib/providers/openai-adapter.ts async function streamCompletion( params: StreamCompletionParams, signal?: AbortSignal ): Promise<ReadableStream<string>> { if (!process.env.OPENAI_API_KEY) { throw new Error("OPENAI_API_KEY not set"); } try { const response = await fetch( "https://api.openai.com/v1/chat/completions", { method: "POST", headers: { "Authorization": `Bearer ${process.env.OPENAI_API_KEY}`, "Content-Type": "application/json", }, body: JSON.stringify({ ...params, stream: true, }), signal, } ); return response.body!; } catch (err) { if (err instanceof Error && err.name === "AbortError") { // Stream cancelled by user → OK throw new Error("Stream cancelled"); } // Trigger fallback in provider selector throw new Error(`OpenAI error: ${err.message}`); } }
Tests:
test("streamCompletion respects AbortSignal", async () => { const controller = new AbortController(); const promise = streamCompletion({ ... }, controller.signal); controller.abort(); await expect(promise).rejects.toThrow("Stream cancelled"); }); test("streamCompletion throws on missing API key", async () => { delete process.env.OPENAI_API_KEY; await expect(streamCompletion({ ... })).rejects.toThrow("OPENAI_API_KEY not set"); });
// ❌ DON'T DO THIS const API_KEY = "sk-proj-xxxxx"; // HARDCODED SECRET! const response = await fetch("...", { headers: { "Authorization": `Bearer ${API_KEY}` } });
→ CCR blocks merge. Request fix: Use
process.env.OPENAI_API_KEY.
Before approving a PR, verify:
console.log(user) or console.log(data) in prod codeWhen opening a stacked PR:
process.env.*lib/providers/ (interface, openai, github-models)lib/supabase/client.ts, lib/supabase/types.tsmiddleware.ts (session verification)app/dashboard/*/page.tsx (use useSupabaseQuery hook)app/api/*/route.ts (check user ownership)**/*.test.ts, e2e/**docs/PROVIDER_INTEGRATION.md, docs/DATABASE_SCHEMA.md, docs/INTEGRATION_QUICKSTART.mdRemember: CCR is here to speed up Phase-2. Be decisive, propose stacked PRs early, and keep the feedback loop tight.
Let's ship it! 🚀