docs: add frontend development guidelines
This commit is contained in:
5
.trellis/spec/frontend/component-guidelines.md
Normal file
5
.trellis/spec/frontend/component-guidelines.md
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
# Component Guidelines
|
||||||
|
|
||||||
|
Use typed React function components. `App.tsx` owns session/editor composition, while reusable map and UI concerns live in named components. Prefer the shared `ui/button.tsx` primitive for commands. Do not create business UI with `querySelector` or `innerHTML`.
|
||||||
|
|
||||||
|
Forms use controlled inputs and submit handlers. Keep map canvas DOM owned by OpenLayers and surrounding controls owned by React.
|
||||||
5
.trellis/spec/frontend/directory-structure.md
Normal file
5
.trellis/spec/frontend/directory-structure.md
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
# Directory Structure
|
||||||
|
|
||||||
|
The Vite workbench lives in `workbench/client/`. Application code is under `src/`: `components/` for UI, `map/` for OpenLayers adapters, `lib/` for API clients, `types/` for API contracts, and `ui/` for shared primitives. The Node HTTP server remains `workbench/server.js`.
|
||||||
|
|
||||||
|
Keep OpenLayers construction and source mutation outside page components; `src/components/MapCanvas.tsx` owns lifecycle and `src/map/layers.ts` owns the layer registry.
|
||||||
3
.trellis/spec/frontend/hook-guidelines.md
Normal file
3
.trellis/spec/frontend/hook-guidelines.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# Hook Guidelines
|
||||||
|
|
||||||
|
Use effects for imperative OpenLayers lifecycle only. `MapCanvas.tsx` constructs one map on mount, updates sources when server state changes, and updates visibility separately. Store callback-sensitive values such as selected road and scene mode in refs so stable OpenLayers style callbacks see current values.
|
||||||
39
.trellis/spec/frontend/index.md
Normal file
39
.trellis/spec/frontend/index.md
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
# Frontend Development Guidelines
|
||||||
|
|
||||||
|
> Best practices for frontend development in this project.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
This directory contains guidelines for frontend development. Fill in each file with your project's specific conventions.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Guidelines Index
|
||||||
|
|
||||||
|
| Guide | Description | Status |
|
||||||
|
|-------|-------------|--------|
|
||||||
|
| [Directory Structure](./directory-structure.md) | Module organization and file layout | To fill |
|
||||||
|
| [Component Guidelines](./component-guidelines.md) | Component patterns, props, composition | To fill |
|
||||||
|
| [Hook Guidelines](./hook-guidelines.md) | Custom hooks, data fetching patterns | To fill |
|
||||||
|
| [State Management](./state-management.md) | Local state, global state, server state | To fill |
|
||||||
|
| [Quality Guidelines](./quality-guidelines.md) | Code standards, forbidden patterns | To fill |
|
||||||
|
| [Type Safety](./type-safety.md) | Type patterns, validation | To fill |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## How to Fill These Guidelines
|
||||||
|
|
||||||
|
For each guideline file:
|
||||||
|
|
||||||
|
1. Document your project's **actual conventions** (not ideals)
|
||||||
|
2. Include **code examples** from your codebase
|
||||||
|
3. List **forbidden patterns** and why
|
||||||
|
4. Add **common mistakes** your team has made
|
||||||
|
|
||||||
|
The goal is to help AI assistants and new team members understand how YOUR project works.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Language**: All documentation should be written in **English**.
|
||||||
3
.trellis/spec/frontend/state-management.md
Normal file
3
.trellis/spec/frontend/state-management.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# State Management
|
||||||
|
|
||||||
|
Use component `useState` for server state, selection, staged overrides, layer visibility and UI filters. `src/lib/api.ts` is the sole browser HTTP boundary. Keep staged overrides separate from persisted `WorkbenchState.overrides`; save them before compile.
|
||||||
3
.trellis/spec/frontend/type-safety.md
Normal file
3
.trellis/spec/frontend/type-safety.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# Type Safety
|
||||||
|
|
||||||
|
Define browser contracts in `src/types/state.ts` from actual workbench API payloads. Use `unknown` for extensible GeoJSON properties and comparison payloads, then narrow locally. Run `npm run test:client` after TypeScript changes; avoid `any` and broad assertions.
|
||||||
127
.trellis/tasks/00-bootstrap-guidelines/prd.md
Normal file
127
.trellis/tasks/00-bootstrap-guidelines/prd.md
Normal file
@@ -0,0 +1,127 @@
|
|||||||
|
# Bootstrap Task: Fill Project Development Guidelines
|
||||||
|
|
||||||
|
**You (the AI) are running this task. The developer does not read this file.**
|
||||||
|
|
||||||
|
The developer just ran `trellis init` on this project for the first time.
|
||||||
|
`.trellis/` now exists with empty spec scaffolding, and this bootstrap task
|
||||||
|
exists under `.trellis/tasks/`. When they want to work on it, they should start
|
||||||
|
this task from a session that provides Trellis session identity.
|
||||||
|
|
||||||
|
**Your job**: help them populate `.trellis/spec/` with the team's real
|
||||||
|
coding conventions. Every future AI session — this project's
|
||||||
|
`trellis-implement` and `trellis-check` sub-agents — auto-loads spec files
|
||||||
|
listed in per-task jsonl manifests. Empty spec = sub-agents write generic
|
||||||
|
code. Real spec = sub-agents match the team's actual patterns.
|
||||||
|
|
||||||
|
Don't dump instructions. Open with a short greeting, figure out if the repo
|
||||||
|
has any existing convention docs (CLAUDE.md, .cursorrules, etc.), and drive
|
||||||
|
the rest conversationally.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Status (update the checkboxes as you complete each item)
|
||||||
|
|
||||||
|
- [x] Fill frontend guidelines
|
||||||
|
- [x] Add code examples
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Spec files to populate
|
||||||
|
|
||||||
|
|
||||||
|
### Frontend guidelines
|
||||||
|
|
||||||
|
| File | What to document |
|
||||||
|
|------|------------------|
|
||||||
|
| `.trellis/spec/frontend/directory-structure.md` | Component/page/hook organization |
|
||||||
|
| `.trellis/spec/frontend/component-guidelines.md` | Component patterns, props conventions |
|
||||||
|
| `.trellis/spec/frontend/hook-guidelines.md` | Custom hook naming, patterns |
|
||||||
|
| `.trellis/spec/frontend/state-management.md` | State library, patterns, what goes where |
|
||||||
|
| `.trellis/spec/frontend/type-safety.md` | TypeScript conventions, type organization |
|
||||||
|
| `.trellis/spec/frontend/quality-guidelines.md` | Linting, testing, accessibility |
|
||||||
|
|
||||||
|
|
||||||
|
### Thinking guides (already populated)
|
||||||
|
|
||||||
|
`.trellis/spec/guides/` contains general thinking guides pre-filled with
|
||||||
|
best practices. Customize only if something clearly doesn't fit this project.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## How to fill the spec
|
||||||
|
|
||||||
|
### Step 1: Import from existing convention files first (preferred)
|
||||||
|
|
||||||
|
Search the repo for existing convention docs. If any exist, read them and
|
||||||
|
extract the relevant rules into the matching `.trellis/spec/` files —
|
||||||
|
usually much faster than documenting from scratch.
|
||||||
|
|
||||||
|
| File / Directory | Tool |
|
||||||
|
|------|------|
|
||||||
|
| `CLAUDE.md` / `CLAUDE.local.md` | Claude Code |
|
||||||
|
| `AGENTS.md` | Codex / Claude Code / agent-compatible tools |
|
||||||
|
| `.cursorrules` | Cursor |
|
||||||
|
| `.cursor/rules/*.mdc` | Cursor (rules directory) |
|
||||||
|
| `.windsurfrules` | Windsurf |
|
||||||
|
| `.clinerules` | Cline |
|
||||||
|
| `.roomodes` | Roo Code |
|
||||||
|
| `.github/copilot-instructions.md` | GitHub Copilot |
|
||||||
|
| `.vscode/settings.json` → `github.copilot.chat.codeGeneration.instructions` | VS Code Copilot |
|
||||||
|
| `CONVENTIONS.md` / `.aider.conf.yml` | aider |
|
||||||
|
| `CONTRIBUTING.md` | General project conventions |
|
||||||
|
| `.editorconfig` | Editor formatting rules |
|
||||||
|
|
||||||
|
### Step 2: Analyze the codebase for anything not covered by existing docs
|
||||||
|
|
||||||
|
Scan real code to discover patterns. Before writing each spec file:
|
||||||
|
- Find 2-3 real examples of each pattern in the codebase.
|
||||||
|
- Reference real file paths (not hypothetical ones).
|
||||||
|
- Document anti-patterns the team clearly avoids.
|
||||||
|
|
||||||
|
### Step 3: Document reality, not ideals
|
||||||
|
|
||||||
|
**Critical**: write what the code *actually does*, not what it should do.
|
||||||
|
Sub-agents match the spec, so aspirational patterns that don't exist in the
|
||||||
|
codebase will cause sub-agents to write code that looks out of place.
|
||||||
|
|
||||||
|
If the team has known tech debt, document the current state — improvement
|
||||||
|
is a separate conversation, not a bootstrap concern.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Quick explainer of the runtime (share when they ask "why do we need spec at all")
|
||||||
|
|
||||||
|
- Every AI coding task spawns two sub-agents: `trellis-implement` (writes
|
||||||
|
code) and `trellis-check` (verifies quality).
|
||||||
|
- Each task has `implement.jsonl` / `check.jsonl` manifests listing which
|
||||||
|
spec files to load.
|
||||||
|
- The platform hook auto-injects those spec files + the task's `prd.md`
|
||||||
|
into every sub-agent prompt, so the sub-agent codes/reviews per team
|
||||||
|
conventions without anyone pasting them manually.
|
||||||
|
- Source of truth: `.trellis/spec/`. That's why filling it well now pays
|
||||||
|
off forever.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Completion
|
||||||
|
|
||||||
|
When the developer confirms the checklist items above are done with real
|
||||||
|
examples (not placeholders), guide them to run:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python3 ./.trellis/scripts/task.py finish
|
||||||
|
python3 ./.trellis/scripts/task.py archive 00-bootstrap-guidelines
|
||||||
|
```
|
||||||
|
|
||||||
|
After archive, every new developer who joins this project will get a
|
||||||
|
`00-join-<slug>` onboarding task instead of this bootstrap task.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Suggested opening line
|
||||||
|
|
||||||
|
"Welcome to Trellis! Your init just set me up to help you fill the project
|
||||||
|
spec — a one-time setup so every future AI session follows the team's
|
||||||
|
conventions instead of writing generic code. Before we start, do you have
|
||||||
|
any existing convention docs (CLAUDE.md, .cursorrules, CONTRIBUTING.md,
|
||||||
|
etc.) I can pull from, or should I scan the codebase from scratch?"
|
||||||
28
.trellis/tasks/00-bootstrap-guidelines/task.json
Normal file
28
.trellis/tasks/00-bootstrap-guidelines/task.json
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
{
|
||||||
|
"id": "00-bootstrap-guidelines",
|
||||||
|
"name": "00-bootstrap-guidelines",
|
||||||
|
"title": "Bootstrap Guidelines",
|
||||||
|
"description": "Fill in project development guidelines for AI agents",
|
||||||
|
"status": "in_progress",
|
||||||
|
"dev_type": "docs",
|
||||||
|
"scope": null,
|
||||||
|
"package": null,
|
||||||
|
"priority": "P1",
|
||||||
|
"creator": "dingkang",
|
||||||
|
"assignee": "dingkang",
|
||||||
|
"createdAt": "2026-08-26",
|
||||||
|
"completedAt": null,
|
||||||
|
"branch": null,
|
||||||
|
"base_branch": null,
|
||||||
|
"worktree_path": null,
|
||||||
|
"commit": null,
|
||||||
|
"pr_url": null,
|
||||||
|
"subtasks": [],
|
||||||
|
"children": [],
|
||||||
|
"parent": null,
|
||||||
|
"relatedFiles": [
|
||||||
|
".trellis/spec/frontend/"
|
||||||
|
],
|
||||||
|
"notes": "First-time setup task created by trellis init (frontend project)",
|
||||||
|
"meta": {}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user