diff --git a/README.md b/README.md index 4f03fbc..4257634 100644 --- a/README.md +++ b/README.md @@ -100,7 +100,7 @@ _**[See the Python version of this loop harness here](https://github.com/rxdt/lo 1. Copy this directory (or use it as a GitHub template), then `git init` and `node harness/harness.mjs setup`. 2. Make it yours: set `name` in `package.json` (root), and the `` in `frontend/index.html`. 3. Write your grand vision into `docs/plan.md`. -4. Optionally add the first spec in `docs/specs/`, or have an agent draft the first specs. +4. Add your first spec in `docs/specs/` (see [Creating Your First Spec](docs/creating-specs.md)), or have an agent draft the first specs. 5. Replace the seed app. `frontend/src/main.ts` and its unit test `frontend/tests/home.spec.ts` are a minimal wired-up "Hello, world" proving the whole gate. Grow them, don't delete them. 6. Strict TypeScript, ESLint, Stylelint, Vitest @ 100% coverage, Playwright, and Lighthouse budgets are configured in `harness/`. 7. Your coding preferences go in `harness/preferences.ts`. diff --git a/docs/creating-specs.md b/docs/creating-specs.md new file mode 100644 index 0000000..84797e9 --- /dev/null +++ b/docs/creating-specs.md @@ -0,0 +1,99 @@ +# Creating Your First LoopGate Spec + +This guide explains how to turn a project idea into a clear, actionable specification for autonomous coding agents in LoopGate JS. + +--- + +## 1. How Documentation Fits Together + +LoopGate JS relies on three core documents under `docs/` to organize work between humans and AI agents: + +| Document | Purpose | Owner | +| :--- | :--- | :--- | +| **`docs/plan.md`** | **The Grand Vision**: High-level objective, features, technical approach, and major project milestones. | Human (or delegated to agents) | +| **`docs/specs/*.md`** | **Actionable Tasks**: Concrete, track-specific instructions defining WHAT to build, test criteria, and boundaries. | Human / Agent | +| **`docs/PROJECT_STATUS.md`** | **Current State**: Snapshot of active focus, pass/fail status of gates, next actions, and changelog. | Human & Agent (updated each iteration) | + +--- + +## 2. Step-by-Step: From Idea to Spec + +### Step 1: Align with `docs/plan.md` +Check `docs/plan.md` to determine which milestone or feature you are addressing. Ensure the objective is well-defined. + +### Step 2: Copy the Base Template +Create a new file in `docs/specs/` using `docs/specs/base.md` as the template: + +```bash +cp docs/specs/base.md docs/specs/dark-mode-toggle.md +``` + +### Step 3: Fill in the Sections +1. **Priority Header**: State priority (`PRIORITY 1`, `2`, or `3`) and a 1–2 sentence problem statement. +2. **Scope**: Detail frameworks, APIs, files, or CSS classes to use. +3. **Priorities / Milestones**: Break the work into concrete sub-tasks with verifiable definitions of done (e.g., test commands). +4. **Guardrails**: Define constraints (e.g. use CSS custom properties, avoid measuring DOM via TypeScript). +5. **Acceptance Criteria**: State measurable checks (e.g., `pnpm gate` passes, 100% test coverage). +6. **Out of Scope**: Explicitly list non-goals to prevent agent scope creep. + +### Step 4: Update `docs/PROJECT_STATUS.md` +Point the active focus to your new spec (e.g., `Active spec: docs/specs/dark-mode-toggle.md → Milestone 1`). + +--- + +## 3. Example Spec: Frontend Dark Mode Toggle + +Here is a minimal, complete example of a frontend feature spec (`docs/specs/dark-mode-toggle.md`): + +```markdown +# Dark Mode Toggle Spec + +> **PRIORITY 1.** Add a theme toggle button in the header that switches between light and dark themes using CSS variables and persists preference in localStorage. + +## Scope +- Modify \`frontend/index.html\` to include the theme toggle button in the header. +- Add theme color variables (\`--bg-primary\`, \`--text-primary\`) in \`frontend/src/style.css\`. +- Add event listeners and localStorage persistence in \`frontend/src/theme.ts\`. + +## Priorities + +1. Milestone 1: Theme State Management & CSS Tokens + - Define CSS custom properties for \`[data-theme="dark"]\` and \`[data-theme="light"]\`. + - Implement \`initTheme()\` and \`toggleTheme()\` helper functions. + - Files created or updated: \`frontend/src/style.css\`, \`frontend/src/theme.ts\` + - Definition of done: \`pnpm --filter frontend test -- src/theme.test.ts\` + +2. Milestone 2: UI Integration & Accessibility + - Mount button with \`aria-label="Toggle dark mode"\` and \`data-hook="theme-toggle"\`. + - Update e2e tests in \`frontend/tests/home.spec.ts\` to verify theme toggling across viewports. + - Definition of done: \`pnpm gate\` exits 0. + +## Guardrails +- Use semantic CSS custom properties; do not hardcode hex values in component styles. +- Selector discipline: Target the button using \`data-hook="theme-toggle"\`. +- Keep bundle lean; do not introduce third-party icon packages. + +## Acceptance Criteria +- Clicking the toggle flips \`data-theme\` attribute on \`<html>\` or \`<body>\`. +- Theme selection persists across page reloads via \`localStorage\`. +- Unit tests achieve 100% line and branch coverage. +- \`pnpm gate\` passes cleanly. + +## Out of Scope +- System OS theme detection / matchMedia auto-switching (Milestone 2 follow-up). +- Animation transitions for theme change. + +## Changelog +- Initial draft of dark mode toggle spec. +``` + +--- + +## 4. Verifying Specs + +Before running autonomous loops, ensure the project satisfies the gate: + +```bash +pnpm preflight # Fast format and lint checks +pnpm gate # Full validation suite (types, unit tests, e2e, security) +```