Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
e463bd3
Add AGENTS.md with Cursor Cloud development instructions
cursoragent May 24, 2026
2162318
Merge pull request #1 from garlobrian52/th_blueprint-dev-setup-a369
garlobrian52 May 24, 2026
530dc92
docs: add FixNow CTA patch for nowfix.pro placeholder links
cursoragent Jun 1, 2026
5eea11f
Merge pull request #2 from garlobrian52/Th_Blueprintfix-placeholder-c…
garlobrian52 Jun 1, 2026
8999ca9
chore: add script for nowfix CTA patch step 1 (copy routes)
cursoragent Jun 1, 2026
4c27857
Merge pull request #3 from garlobrian52/Th_Blueprintapply-nowfix-step…
garlobrian52 Jun 1, 2026
3c3d4ab
Add Workflow DevKit email onboarding example
cursoragent Jun 2, 2026
93c01d9
Merge pull request #4 from garlobrian52/Th_Blueprintworkflow-email-on…
garlobrian52 Jun 2, 2026
7836e39
Align workflow signup example with official handleUserSignup pattern
cursoragent Jun 2, 2026
ae948f8
Merge pull request #5 from garlobrian52/Th_Blueprintalign-workflow-si…
garlobrian52 Jun 2, 2026
ed1f474
Fix Cloud Agent startup by adding environment config
cursoragent Jun 3, 2026
ddc988f
Document Cloud Agent branch naming to prevent ref resolution errors
cursoragent Jun 3, 2026
1820090
Merge pull request #6 from garlobrian52/Th_Blueprintfix-missing-bluep…
garlobrian52 Jun 3, 2026
46b3a9a
Install and Configure Vercel Speed Insights
vercel[bot] Jun 4, 2026
15b0a02
Merge pull request #7 from garlobrian52/vercel/install-and-configure-…
garlobrian52 Jun 4, 2026
688095e
feat: add new fix guide and index pages with metadata and icons
v0agent Jun 4, 2026
e549f81
feat: add Vercel config and update tsconfig.json exclusions
v0agent Jun 4, 2026
7cc935f
Merge pull request #8 from garlobrian52/fix-404-error
garlobrian52 Jun 4, 2026
d7495f8
Fix Vercel config and viewport zoom
cursoragent Jun 4, 2026
704cfb1
Allow mobile viewport scaling
cursoragent Jun 4, 2026
aeb3a28
Merge pull request #9 from garlobrian52/fix-404-error
garlobrian52 Jun 4, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .cursor/environment.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"install": "go mod download"
}
31 changes: 31 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
## Cursor Cloud specific instructions

### Overview

This is the **GitHub MCP Server** — a Go (1.24+) project implementing the Model Context Protocol for GitHub. It's a stateless stdio-based server with no database dependencies.

### Key commands

- **Lint**: `script/lint` (runs `gofmt -s -w .` then `golangci-lint`; auto-installs linter to `bin/` if missing)
- **Test**: `script/test` (runs `go test -race ./...`)
- **Build**: `go build ./cmd/github-mcp-server`
- **Run**: `GITHUB_PERSONAL_ACCESS_TOKEN=<token> ./github-mcp-server stdio`
- **Update toolsnaps** (after changing MCP tool schemas): `UPDATE_TOOLSNAPS=true go test ./...`
- **Regenerate docs** (after changing tools): `script/generate-docs`

See `.github/copilot-instructions.md` for full contributor workflow, project structure, and coding conventions.

### Gotchas

- The server requires `GITHUB_PERSONAL_ACCESS_TOKEN` to be set at runtime. Without it, the server won't start. For unit tests, this is not needed — tests mock the GitHub API.
- E2E tests (`e2e/`) require Docker and a real GitHub PAT (`GITHUB_MCP_SERVER_E2E_TOKEN`). They are not runnable without these.
- `script/lint` auto-downloads `golangci-lint` v2.5.0 to `bin/` on first run. This is cached across runs.
- The `github-mcp-server` binary is gitignored. Build it fresh with `go build ./cmd/github-mcp-server`.
- All lint/test/build commands are fast (~1-2s each when cached).

### Cloud Agent git branches

Cursor Cloud Agents must use an existing ref for checkout and PR base:

- **Base branch:** `Blueprint` (tracks `main`) or `main` directly. Do not use a bare `Blueprint` prefix parsed from feature branch names.
- **Feature branches:** use `blueprint/<short-description>-ee50` (slash-separated). Avoid `Th_Blueprint<task>` names without a separator — they can be misread as ref `Blueprint` and cause startup failures.
108 changes: 108 additions & 0 deletions app/fixes/[slug]/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
import Link from "next/link"
import { notFound } from "next/navigation"
import { FIXES, getFixBySlug } from "@/lib/fixes"
import { ArrowLeft, CheckCircle2 } from "lucide-react"

type Props = { params: Promise<{ slug: string }> }

export async function generateStaticParams() {
return FIXES.map((f) => ({ slug: f.slug }))
}

export async function generateMetadata({ params }: Props) {
const { slug } = await params
const fix = getFixBySlug(slug)
if (!fix) return { title: "Fix not found — FixNow" }
return {
title: `${fix.title} — FixNow`,
description: fix.description,
}
}

export default async function FixGuidePage({ params }: Props) {
const { slug } = await params
const fix = getFixBySlug(slug)
if (!fix) notFound()

return (
<div className="min-h-screen flex flex-col">
<header className="sticky top-0 z-50 border-b bg-[var(--background)]/95 backdrop-blur supports-[backdrop-filter]:bg-[var(--background)]/80">
<div className="mx-auto flex h-14 max-w-5xl items-center justify-between px-4">
<Link href="/" className="text-lg font-semibold tracking-tight">
FixNow
</Link>
<nav className="flex items-center gap-4">
<Link
href="/fixes"
className="text-sm text-[var(--muted-foreground)] hover:text-[var(--foreground)] transition-colors"
>
All Fixes
</Link>
</nav>
</div>
</header>

<main className="flex-1 px-4 py-12">
<div className="mx-auto max-w-2xl">
<Link
href="/fixes"
className="inline-flex items-center gap-1.5 text-sm text-[var(--muted-foreground)] hover:text-[var(--foreground)] transition-colors"
>
<ArrowLeft className="h-4 w-4" />
All fixes
</Link>

<div className="mt-6">
<span className="text-xs font-medium text-[var(--primary)]">
{fix.duration}
</span>
<h1 className="mt-2 text-2xl font-semibold tracking-tight md:text-3xl">
{fix.title}
</h1>
<p className="mt-3 text-[var(--muted-foreground)]">
{fix.description}
</p>
</div>

<ol className="mt-10 space-y-4">
{fix.steps.map((step, i) => (
<li
key={i}
className="flex gap-4 rounded-xl border p-5"
>
<div className="flex h-7 w-7 shrink-0 items-center justify-center rounded-full bg-[var(--primary)] text-xs font-semibold text-[var(--primary-foreground)]">
{i + 1}
</div>
<p className="text-sm leading-relaxed pt-0.5">{step}</p>
</li>
))}
</ol>

<div className="mt-10 rounded-xl border border-[var(--primary)]/20 bg-[var(--primary)]/5 p-6">
<div className="flex items-start gap-3">
<CheckCircle2 className="h-5 w-5 text-[var(--primary)] shrink-0 mt-0.5" />
<div>
<p className="font-medium">{"That's it!"}</p>
<p className="mt-1 text-sm text-[var(--muted-foreground)]">
If you followed these steps, your issue should be resolved. Still stuck?{" "}
<Link href="/fixes" className="text-[var(--primary)] hover:underline">
Try another fix
</Link>
.
</p>
</div>
</div>
</div>
</div>
</main>

<footer className="border-t py-8 px-4 text-center text-sm text-[var(--muted-foreground)]">
<Link href="/" className="hover:text-[var(--foreground)] transition-colors">
FixNow
</Link>
{" · "}
{new Date().getFullYear()}
</footer>
</div>
)
}
88 changes: 88 additions & 0 deletions app/fixes/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
import Link from "next/link"
import { FIXES, fixHref } from "@/lib/fixes"
import { Wifi, Monitor, Smartphone, Printer, KeyRound, Tv } from "lucide-react"

const categoryIcons = {
wifi: Wifi,
computer: Monitor,
phone: Smartphone,
printer: Printer,
account: KeyRound,
streaming: Tv,
}

export const metadata = {
title: "All fixes — FixNow",
description: "Browse step-by-step guides for everyday tech problems.",
}

export default function FixesIndexPage() {
return (
<div className="min-h-screen flex flex-col">
<header className="sticky top-0 z-50 border-b bg-[var(--background)]/95 backdrop-blur supports-[backdrop-filter]:bg-[var(--background)]/80">
<div className="mx-auto flex h-14 max-w-5xl items-center justify-between px-4">
<Link href="/" className="text-lg font-semibold tracking-tight">
FixNow
</Link>
<nav className="flex items-center gap-4">
<Link
href="/fixes"
className="text-sm font-medium text-[var(--foreground)]"
>
All Fixes
</Link>
</nav>
</div>
</header>

<main className="flex-1 px-4 py-12">
<div className="mx-auto max-w-3xl">
<h1 className="text-2xl font-semibold tracking-tight md:text-3xl">
All fixes
</h1>
<p className="mt-2 text-[var(--muted-foreground)]">
Pick a problem and follow clear steps written for normal humans.
</p>
<ul className="mt-8 flex flex-col gap-3">
{FIXES.map((fix) => {
const Icon = categoryIcons[fix.category]
return (
<li key={fix.slug}>
<Link
href={fixHref(fix.slug)}
className="group flex items-start gap-4 rounded-xl border p-5 transition-colors hover:bg-[var(--secondary)]"
>
<div className="flex h-10 w-10 shrink-0 items-center justify-center rounded-lg bg-[var(--primary)]/10">
<Icon className="h-5 w-5 text-[var(--primary)]" />
</div>
<div className="flex-1 min-w-0">
<div className="flex items-center gap-2 flex-wrap">
<span className="font-medium group-hover:text-[var(--foreground)]">
{fix.title}
</span>
<span className="text-xs font-medium text-[var(--primary)]">
{fix.duration}
</span>
</div>
<p className="mt-1 text-sm text-[var(--muted-foreground)]">
{fix.description}
</p>
</div>
</Link>
</li>
)
})}
</ul>
</div>
</main>

<footer className="border-t py-8 px-4 text-center text-sm text-[var(--muted-foreground)]">
<Link href="/" className="hover:text-[var(--foreground)] transition-colors">
FixNow
</Link>
{" · "}
{new Date().getFullYear()}
</footer>
</div>
)
}
44 changes: 44 additions & 0 deletions app/globals.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
@import "tailwindcss";

:root {
--background: oklch(0.99 0 0);
--foreground: oklch(0.15 0 0);
--muted: oklch(0.95 0 0);
--muted-foreground: oklch(0.45 0 0);
--border: oklch(0.90 0 0);
--primary: oklch(0.55 0.25 145);
--primary-foreground: oklch(1 0 0);
--secondary: oklch(0.96 0 0);
--secondary-foreground: oklch(0.15 0 0);
--accent: oklch(0.55 0.25 145);
--accent-foreground: oklch(1 0 0);
--destructive: oklch(0.55 0.2 25);
--destructive-foreground: oklch(1 0 0);
--radius: 0.625rem;
}

@media (prefers-color-scheme: dark) {
:root {
--background: oklch(0.12 0 0);
--foreground: oklch(0.95 0 0);
--muted: oklch(0.20 0 0);
--muted-foreground: oklch(0.65 0 0);
--border: oklch(0.25 0 0);
--primary: oklch(0.65 0.25 145);
--primary-foreground: oklch(0.12 0 0);
--secondary: oklch(0.18 0 0);
--secondary-foreground: oklch(0.95 0 0);
--accent: oklch(0.65 0.25 145);
--accent-foreground: oklch(0.12 0 0);
}
}

* {
border-color: var(--border);
}

body {
background: var(--background);
color: var(--foreground);
font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
}
30 changes: 30 additions & 0 deletions app/layout.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import type { Metadata, Viewport } from "next"
import "./globals.css"

export const metadata: Metadata = {
title: "FixNow — Quick fixes for everyday tech problems",
description:
"Step-by-step guides to fix Wi-Fi, slow computers, phone issues, printers, and more. No jargon, just solutions.",
}

export const viewport: Viewport = {
width: "device-width",
initialScale: 1,
userScalable: true,
themeColor: [
{ media: "(prefers-color-scheme: light)", color: "#ffffff" },
{ media: "(prefers-color-scheme: dark)", color: "#1a1a1a" },
],
}

export default function RootLayout({
children,
}: {
children: React.ReactNode
}) {
return (
<html lang="en" className="bg-[var(--background)]">
<body className="antialiased">{children}</body>
</html>
)
}
Loading