Update to directory - #5
Conversation
// feat: add new directory component // // Please enter the commit message for your changes. Lines starting // with '#' will be ignored, and an empty message aborts the commit. // // On branch main // Your branch is up to date with 'origin/main'. // // Changes to be committed: // new file: src/Directory.jsx //
…migration support (#5) * Initial plan * Add Railway zero-secrets deployment files and cost guardrails Co-authored-by: executiveusa <191772270+executiveusa@users.noreply.github.com> * Address code review feedback for Railway deployment files Co-authored-by: executiveusa <191772270+executiveusa@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: executiveusa <191772270+executiveusa@users.noreply.github.com>
… brand tokens - fix(schema): added images + logo_src fields to zod schema - fix(fallback-image): replaced broken @/assets import with URL string - feat(hero): rebranded to Directorio Kupuri™ - feat(nav): Submit → Publicar Negocio - feat(tailwind): Kupuri brand color tokens (sage/teal/coral/cream/gold/black) ZTE-20260323-0006 | owner: forjadora | status: completed
There was a problem hiding this comment.
Pull request overview
This PR appears to rebrand/customize the directory template for “Kupuri Media™”, add a Supabase “businesses” schema + assorted planning docs, and introduce deployment/ops scaffolding (Railway/Coolify/maintenance page + an auto-deploy GitHub Actions workflow).
Changes:
- UI/branding updates (Hero + Nav text, Tailwind palette, image fallback behavior).
- Adds multiple operational/deployment artifacts (Railway config, maintenance page, Coolify docs, GitHub Actions auto-deploy workflow).
- Adds Supabase-related schema/docs plus several “agent automation”/task prompt documents and editor config files.
Reviewed changes
Copilot reviewed 34 out of 36 changed files in this pull request and generated 22 comments.
Show a summary per file
| File | Description |
|---|---|
| tasks.md | Adds task checklist/planning doc for building the directory. |
| tailwind.config.ts | Adds “Kupuri Media™” brand color palette. |
| src/server.js | Adds an Express+Supabase API server (currently not integrated with repo scripts/deps). |
| src/Directory.jsx | Adds a React directory page (appears incomplete/unwired for this Next.js repo). |
| settings.jsonc | Adds root-level Copilot/editor configuration. |
| seo-optimization.md | Adds SEO task checklist doc. |
| README.md | Adds setup instructions + “autonomous agent” instructions section. |
| railway.toml | Adds Railway build/deploy configuration + resource guardrails. |
| public/maintenance.html | Adds a static maintenance mode page. |
| monetization-and-tracking.md | Adds monetization/tracking task checklist doc. |
| meta-prompt.md | Adds a large “meta-prompt” document containing code snippets and process instructions. |
| import React from 'react';.js | Adds an example React component file with an irregular filename. |
| DIRECTORY ALPHA.jsonc | Adds additional Copilot/editor config (root-level). |
| db/supabase/client.ts | Changes Supabase browser client implementation. |
| db/schema.sql | Adds SQL schema for businesses table. |
| COOLIFY_SUPPORT.md | Adds Coolify deployment scaffolding documentation (placeholders). |
| COOLIFY_MIGRATION.md | Adds Coolify migration checklist document. |
| components/nav.tsx | Updates Nav CTA copy to Spanish (“Publicar Negocio”). |
| components/hero.tsx | Rebrands hero content and external link. |
| components/cult/fallback-image.tsx | Switches fallback image from local asset to remote URL. |
| automate-data-collection.md | Adds Apify/Google Maps automation checklist doc. |
| automate-content-generation.md | Adds AI content generation automation checklist doc. |
| app/submit/schema.ts | Updates Zod validation schema for submit flow. |
| app/submit/ai-enrichment-prompt.ts | Adds helper to generate AI enrichment prompt. |
| ai-automation-agents.md | Adds AI automation agent checklist doc. |
| # Project Title.md | Adds placeholder project setup doc with unconventional filename. |
| # Code Citations.md | Adds code citation snippets with unconventional filename. |
| .snapshots/sponsors.md | Adds Snapshots tool sponsor/readme content (includes typo). |
| .snapshots/readme.md | Adds Snapshots directory description. |
| .snapshots/config.json | Adds Snapshots configuration file. |
| .gitignore | Adds ignore rule for master.secrets.json (and adjusts storage path ignore). |
| .github/workflows/zte-autodeploy.yml | Adds a complex auto-deploy workflow with external code execution + auto-merge. |
| .emerald-tablets-tm/PRIME_DIRECTIVE.md | Adds “Emerald Tablets” directive document. |
| .beads/config.yaml | Adds Beads tracker config. |
| .agents | Adds a secret-specification file describing required env vars and modules. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| import { createClient as createSupabaseClient } from "@supabase/supabase-js"; | ||
|
|
||
| export const createClient = () => | ||
| createBrowserClient( | ||
| export function createClient() { | ||
| return createSupabaseClient( | ||
| process.env.NEXT_PUBLIC_SUPABASE_URL!, | ||
| process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY! | ||
| ) | ||
| ); |
There was a problem hiding this comment.
Switching the browser client from @supabase/ssr's createBrowserClient to @supabase/supabase-js's plain createClient will change auth/session storage behavior (default localStorage vs cookie-based). In this codebase the server client/middleware use @supabase/ssr cookie handling, so this change can break SSR/server components reading the user session. Revert to createBrowserClient (or configure the client to use cookie storage) to keep client/server auth consistent.
| // Kupuri Media placeholder — no local asset needed | ||
| const placeholderImg = "https://placehold.co/400x400/edf1e8/9bc1bc?text=K" |
There was a problem hiding this comment.
placeholderImg is a remote URL (placehold.co) used as the src for next/image, but next.config.js currently only allows **.supabase.co in images.remotePatterns. This will cause runtime image errors when the fallback is rendered. Either add an explicit remotePatterns entry for placehold.co (recommended) or switch the fallback to a local asset / unoptimized image.
| // Kupuri Media placeholder — no local asset needed | |
| const placeholderImg = "https://placehold.co/400x400/edf1e8/9bc1bc?text=K" | |
| // Kupuri Media placeholder — inline SVG data URI to avoid remote domain issues | |
| const placeholderImg = | |
| "data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='400' height='400'%3E%3Crect width='100%25' height='100%25' fill='%23edf1e8'/%3E%3Ctext x='50%25' y='50%25' dominant-baseline='middle' text-anchor='middle' fill='%239bc1bc' font-size='120' font-family='system-ui, -apple-system, BlinkMacSystemFont, sans-serif'%3EK%3C/text%3E%3C/svg%3E" |
|
|
||
| interface ImageWithFallbackProps extends Omit<ImageProps, "src"> { | ||
| fallback?: string | ||
| fallback?: string | typeof placeholderImg |
There was a problem hiding this comment.
The fallback?: string | typeof placeholderImg type is effectively just string because placeholderImg is a string constant. Consider simplifying this to fallback?: string to avoid confusing/duplicated typing.
| fallback?: string | typeof placeholderImg | |
| fallback?: string |
| description: z.string().min(1, "Description is required"), | ||
| categories: z.string().min(1, "Category is required"), | ||
| // eslint-disable-next-line @typescript-eslint/no-explicit-any | ||
| images: z.array(z.any()).optional().default([]), |
There was a problem hiding this comment.
images is now validated as an array (z.array(...)), but the submit action builds data via Object.fromEntries(formData.entries()), which will produce a single File value for images (or a single string), not an array. This makes form submissions fail validation whenever an image is provided. Align the schema with the actual FormData shape (e.g., accept File/undefined, or use formData.getAll('images') and validate that array).
| images: z.array(z.any()).optional().default([]), | |
| images: z.any().optional(), |
| export function getAIEnrichmentPrompt(codename: string, categories: string, description: string) { | ||
| return ` | ||
| Codename: ${codename} | ||
| Categories: ${categories} | ||
| Description: ${description} | ||
|
|
||
| Generate tags and labels for the above product. | ||
| `; | ||
| } |
There was a problem hiding this comment.
getAIEnrichmentPrompt is introduced here, but nothing imports it. The submit server action currently calls getAIEnrichmentPrompt(...) without an import, which will fail at build time. Import this function where it’s used (or move it into the calling module) and ensure it’s included in the module graph.
| - name: Create PR + auto-merge | ||
| run: | | ||
| gh pr create \ | ||
| --title "[ZTE][${{ env.BEAD_ID }}] ✅ ${{ github.ref_name }} → main" \ | ||
| --body "All ZTE checks green. Emerald Tablets cert: ✅. Live: ${{ needs.vercel_deploy.outputs.preview_url }}" \ | ||
| --base main --head "${{ github.ref_name }}" 2>/dev/null || true | ||
| gh pr merge --squash --auto --delete-branch \ | ||
| --subject "[ZTE][${{ env.BEAD_ID }}] ✅ auto-merged" \ | ||
| "${{ github.ref_name }}" 2>/dev/null || echo "Merge queued" |
There was a problem hiding this comment.
The auto_merge job creates and merges PRs automatically for any non-main branch once the workflow passes. This is risky for normal development workflows and can bypass required reviews/branch protections if the PAT has sufficient permissions. Recommend removing auto-merge entirely (or gating it behind a protected environment + manual approval and explicit allowlist of branches).
| - name: Create PR + auto-merge | |
| run: | | |
| gh pr create \ | |
| --title "[ZTE][${{ env.BEAD_ID }}] ✅ ${{ github.ref_name }} → main" \ | |
| --body "All ZTE checks green. Emerald Tablets cert: ✅. Live: ${{ needs.vercel_deploy.outputs.preview_url }}" \ | |
| --base main --head "${{ github.ref_name }}" 2>/dev/null || true | |
| gh pr merge --squash --auto --delete-branch \ | |
| --subject "[ZTE][${{ env.BEAD_ID }}] ✅ auto-merged" \ | |
| "${{ github.ref_name }}" 2>/dev/null || echo "Merge queued" | |
| - name: Create PR | |
| run: | | |
| gh pr create \ | |
| --title "[ZTE][${{ env.BEAD_ID }}] ✅ ${{ github.ref_name }} → main" \ | |
| --body "All ZTE checks green. Emerald Tablets cert: ✅. Live: ${{ needs.vercel_deploy.outputs.preview_url }}" \ | |
| --base main --head "${{ github.ref_name }}" 2>/dev/null || true |
| ## Ways to Support | ||
|
|
||
| ### Join the GBTI Network!!! 🙏🙏🙏 | ||
| The GBTI Network is a community of developers who are passionate about open source and community-driven development. Members enjoy access to exclussive tools, resources, a private MineCraft server, a listing in our members directory, co-op opportunities and more. |
There was a problem hiding this comment.
Spelling: "exclussive" should be "exclusive".
| The GBTI Network is a community of developers who are passionate about open source and community-driven development. Members enjoy access to exclussive tools, resources, a private MineCraft server, a listing in our members directory, co-op opportunities and more. | |
| The GBTI Network is a community of developers who are passionate about open source and community-driven development. Members enjoy access to exclusive tools, resources, a private MineCraft server, a listing in our members directory, co-op opportunities and more. |
| # Project Title | ||
|
|
||
| // ...existing code... |
There was a problem hiding this comment.
The filename # Project Title.md (leading # and spaces) is likely accidental and can cause cross-platform issues and awkward linking in docs. Consider renaming it to something conventional (e.g., PROJECT_TITLE.md or PROJECT_SETUP.md) or removing it if it’s a placeholder.
| # Code Citations | ||
|
|
||
| ## License: MIT | ||
| https://github.com/dikshaTomar/helloworld/tree/1dbc240420260f0ecfef1065dfed045aaac11798/.github/workflows/main.yml | ||
|
|
There was a problem hiding this comment.
The filename # Code Citations.md (leading # and spaces) is unconventional and may cause tooling/linking issues. If this file is needed, consider renaming it to a standard doc name (e.g., CODE_CITATIONS.md) and ensure it’s referenced from the README so it doesn’t become orphaned.
| # ◈ EMERALD TABLETS™ — Prime Directive v1.0 | ||
| > Installed at system root: `c:\kupuri-media-cdmx\.emerald-tablets-tm\` | ||
| > Applies to ALL agents, ALL sessions, ALL repos in this workspace. | ||
|
|
||
| --- | ||
|
|
||
| ## TABLET I — THE HUMAN-AI TRUTH | ||
|
|
||
| ``` | ||
| The human is the author. The AI is the executor. | ||
| Every action must serve the human's intent — not the AI's interpretation of it. | ||
| When uncertain: ASK once, then ship the minimal working version. | ||
| When blocked: surface the blocker. Never loop silently. | ||
| ``` | ||
|
|
||
| **Corollary:** No agent shall substitute their judgment for Ivette's priorities. | ||
| When Ivette says "build X," agents build X — not X plus their idea of Y. | ||
|
|
There was a problem hiding this comment.
This document hardcodes a local Windows path (c:\...) and references a specific individual (“Ivette”) as a universal priority authority. If this repo is meant for broader collaboration or open source, consider removing personal/local-machine references or moving them to private/internal documentation to avoid leaking internal context and confusing contributors.
Co-authored-by: kiloconnect[bot] <240665456+kiloconnect[bot]@users.noreply.github.com>
No description provided.