chore(harness): make repository agent-ready

Add concise routed context, task-aware agent roles, focused skills, and structured learning promotion.\n\nUnify local development and workspace tooling, add layered test and E2E verification, harden MCP authentication, and gate deployment behind verification and explicit production promotion.
This commit is contained in:
jjbrunton committed 2026-08-27 20:58:48 +01:00
1 parent 5a69bbc1a5
commit 01bb8225ae
125 files changed
+5078 -24529

No files matched your search

+3
View File
@@ -0,0 +1,3 @@
{
"extends": "next/core-web-vitals"
}
+10
View File
@@ -0,0 +1,10 @@
# Web application
Next.js App Router marketing, legal, and redemption UI.
- Prefer server components; add `use client` only when browser state is needed.
- Preserve PostHog provider/page-view integration unless the task changes it.
- Keep metadata current for public pages.
- Never expose server credentials through `NEXT_PUBLIC_*` variables.
- Public redemption must use sandbox/local Supabase during automated tests.
- Verify lint, typecheck, build, and the relevant Playwright flow.
-86
View File
@@ -1,86 +0,0 @@
# Web App - Agent Guidelines
**STRICT RULES - DO NOT VIOLATE**
## Architecture
This is a Next.js 14+ marketing/landing website using:
- **Framework**: Next.js with App Router
- **Styling**: Tailwind CSS
- **Analytics**: PostHog
- **Routing**: File-based routing in `app/` directory
## Directory Structure
```
app/
layout.tsx # Root layout with PostHog provider
page.tsx # Home/landing page
globals.css # Global styles
providers.tsx # PostHog provider wrapper
PostHogPageView.tsx # Page view tracking component
privacy/ # Privacy policy
terms/ # Terms of service
redeem/ # Code redemption page
components/ # Reusable components
public/ # Static assets (images, fonts)
```
## Critical Rules
### App Router
This uses Next.js App Router (not Pages Router):
- Server Components by default
- Use `'use client'` directive for client components
- Metadata exported from layout.tsx and page.tsx
### PostHog Integration
PostHog is configured at root level:
- Provider in `providers.tsx`
- Page view tracking in `PostHogPageView.tsx`
- Wrap all pages in `<PostHogProvider>`
### SEO & Metadata
Metadata is defined in `layout.tsx`:
```typescript
export const metadata: Metadata = {
title: 'Sauci - Ignite Your Connection',
description: '...',
openGraph: { ... },
twitter: { ... },
};
```
Update metadata when adding new pages.
### Styling
- Use Tailwind CSS classes
- Global styles in `globals.css`
- Follow mobile-first responsive design
### Static Pages
Privacy and Terms pages are static content:
- `/privacy` - Privacy policy
- `/terms` - Terms of service
Keep these updated with legal requirements.
### Environment Variables
Required environment variables:
- `NEXT_PUBLIC_POSTHOG_KEY` - PostHog API key
- `NEXT_PUBLIC_POSTHOG_HOST` - PostHog host
## Forbidden Actions
1. **DO NOT** remove PostHog tracking without approval
2. **DO NOT** use Pages Router patterns (use App Router)
3. **DO NOT** add server-side API routes that expose sensitive data
4. **DO NOT** forget to update metadata for new pages
5. **DO NOT** skip mobile responsiveness
6. **DO NOT** commit .env files with real API keys
+2 -2
View File
@@ -120,7 +120,7 @@ export default function Pricing() {
<p className="text-sm text-white/80">
<span className="font-semibold text-white">Pay once per couple.</span>{' '}
Whether monthly or yearly, one subscription unlocks Pro for both you and your partner.
That's two accounts for the price of one.
That&apos;s two accounts for the price of one.
</p>
</div>
</div>
@@ -153,7 +153,7 @@ export default function Pricing() {
transition={{ delay: 0.3 }}
className="text-center text-white/40 text-sm mt-8 max-w-lg mx-auto"
>
Start free with access to selected packs. Upgrade to Pro when you're ready to unlock everything.
Start free with access to selected packs. Upgrade to Pro when you&apos;re ready to unlock everything.
</motion.p>
</div>
</section>
-1798
View File
File diff suppressed because it is too large. Load diff
+9 -6
View File
@@ -5,9 +5,10 @@
"scripts": {
"dev": "next dev",
"build": "next build",
"start": "next start",
"lint": "next lint",
"typecheck": "tsc --noEmit"
"start": "next start",
"lint": "next lint",
"test": "vitest run --passWithNoTests",
"typecheck": "tsc --noEmit"
},
"dependencies": {
"framer-motion": "^11.0.0",
@@ -20,9 +21,11 @@
"devDependencies": {
"@types/node": "^20.0.0",
"@types/react": "^18.3.0",
"@types/react-dom": "^18.3.0",
"autoprefixer": "^10.4.0",
"postcss": "^8.4.0",
"@types/react-dom": "^18.3.0",
"autoprefixer": "^10.4.0",
"eslint": "^8.57.1",
"eslint-config-next": "14.2.35",
"postcss": "^8.4.0",
"tailwindcss": "^3.4.0",
"typescript": "^5.3.0"
}