Installs a 3-layer Cursor-aligned agent pipeline so future agent
sessions can orient quickly and stay inside guard rails:
L1 — context for any agent reading the repo:
- AGENTS.md (top-level orientation, conventions, no-go zones)
- .cursor/rules/ (no-go-zones, api-routes, prisma, prisma-schema-map)
- .cursor/skills/ (add-api-route, add-prisma-model)
- docs/SCHEMA_MAP.md generated from prisma/schema.prisma
- scripts/generate-schema-map.ts (regenerate the map; wired up as
`npm run schema:map`)
L2 — subagent roles for the 9-stage idea-to-feature pipeline:
- .cursor/agents/role-*.md (conductor, architect, ia-architect,
design-system-auditor, implementer, reviewer, ux-reviewer,
a11y-auditor, doc-writer) with explicit multitask annotations.
L3 — pipeline scaffolding:
- .github/CODEOWNERS, PR template, and CI workflows (ci.yml,
preview-smoke.yml, visual-diff.yml, pr-health-rollup.yml).
Test job is intentionally disabled until Playwright is wired up.
- .convoys/ folder for per-feature run notes + scripts/log-convoy-event.sh.
- scripts/wt.sh worktree helper.
- src/lib/flags/index.ts simple env-driven feature flag wrapper.
- tests/smoke/app.smoke.spec.ts (Playwright smoke; excluded from
tsc until @playwright/test is installed — see tsconfig change).
Also writes .agent-context-manifest.yml so the sync-agent-context
skill can detect drift and offer selective updates from upstream.
Follow-ups (not in this commit):
- Install @playwright/test and re-enable the test job in ci.yml.
- Review .cursor/agents/role-*.md and trim any roles that don't
apply to this codebase.
Co-authored-by: Cursor <cursoragent@cursor.com>
32 lines
1.2 KiB
TypeScript
32 lines
1.2 KiB
TypeScript
import { test, expect } from '@playwright/test';
|
|
|
|
/**
|
|
* Smoke tests run against a deployed preview URL.
|
|
* BASE_URL is injected by the GitHub Action (PREVIEW_URL).
|
|
*
|
|
* Add or replace tests here for each critical user path you ship.
|
|
* Keep this file fast (<60s total). For deeper E2E, use a separate suite.
|
|
*/
|
|
|
|
const BASE = process.env.BASE_URL ?? 'http://localhost:3000';
|
|
|
|
test.describe('smoke: app boots and core pages render', () => {
|
|
test('home redirects or renders without 5xx', async ({ page }) => {
|
|
const response = await page.goto(BASE);
|
|
expect(response?.status(), 'home should not 5xx').toBeLessThan(500);
|
|
});
|
|
|
|
test('sign-in page renders', async ({ page }) => {
|
|
await page.goto(`${BASE}/login`);
|
|
await expect(page.getByRole('button', { name: /sign in/i })).toBeVisible({ timeout: 10_000 });
|
|
});
|
|
|
|
test('public health endpoint responds', async ({ request }) => {
|
|
const res = await request.get(`${BASE}/api/health`);
|
|
expect(res.ok(), `${BASE}/api/health should respond 2xx`).toBeTruthy();
|
|
});
|
|
});
|
|
|
|
// Add convoy-specific smoke tests below as features ship. Each new flag-gated
|
|
// feature should add a smoke test that exercises the happy path with the flag
|
|
// forced on (if your flag wrapper supports query-string overrides).
|