54c66efe9b
- Changed CLI usage instructions from `dart run cursor_gen` to `cursor_gen` for global activation. - Updated project-brief.yaml example and README to reflect new command usage. - Added app_context section in project-brief.yaml for theme variants and RBAC roles. - Fixed bundled template resolution for local and global installs to prevent 'Template not found' errors. - Version bump to 1.0.1 with corresponding updates in CHANGELOG and pubspec.yaml.
189 lines
8.0 KiB
Markdown
189 lines
8.0 KiB
Markdown
# Flutter Cursor Generator — Complete Implementation
|
|
|
|
> AI-powered, project-specific Cursor configuration generator for Flutter teams.
|
|
> Implements all 6 pillars from the architecture review.
|
|
|
|
## Repository Structure
|
|
|
|
```
|
|
flutter-cursor-gen/
|
|
├── flutter-cursor-templates/ ← Shared template repo (hosted internally)
|
|
│ ├── generator/ ← Dart CLI tool
|
|
│ │ ├── bin/cursor_gen.dart ← Entry point
|
|
│ │ ├── src/ ← Core modules
|
|
│ │ │ ├── brief_loader.dart ← Parses project-brief.yaml
|
|
│ │ │ ├── resolver.dart ← Maps brief → template files
|
|
│ │ │ ├── renderer.dart ← Substitutes {{PLACEHOLDERS}}
|
|
│ │ │ ├── validator.dart ← Schema validation
|
|
│ │ │ ├── version_manager.dart ← Pillar 1: version locking
|
|
│ │ │ ├── override_manager.dart ← Pillar 2: custom/ preservation
|
|
│ │ │ ├── wizard.dart ← Interactive brief creator
|
|
│ │ │ └── telemetry.dart ← Pillar 6: opt-in analytics
|
|
│ │ ├── test/
|
|
│ │ │ ├── generator_test.dart ← Pillar 3: full test suite
|
|
│ │ │ └── golden/ ← Golden output files per stack combo
|
|
│ │ ├── brief-schema.json ← IDE autocomplete for project-brief.yaml
|
|
│ │ └── pubspec.yaml
|
|
│ ├── templates/
|
|
│ │ ├── rules/
|
|
│ │ │ ├── universal/ ← Always included (flutter-core, ui-ux, project-context)
|
|
│ │ │ ├── security/ ← Pillar 5: always-on security rules
|
|
│ │ │ ├── error-handling/ ← Always-on error handling
|
|
│ │ │ ├── state-management/ ← bloc | riverpod | getx | hooks_riverpod
|
|
│ │ │ ├── architecture/ ← clean | feature_first | mvvm | mvc | layered
|
|
│ │ │ ├── backend/ ← firebase | supabase | rest | realtime
|
|
│ │ │ ├── routing/ ← gorouter | getx_nav | auto_route
|
|
│ │ │ ├── testing/ ← testing-{sm} + testing-e2e-{tool}
|
|
│ │ │ ├── platform/ ← Pillar 4: ios | android | web | desktop
|
|
│ │ │ ├── codegen/ ← Pillar 4: freezed | json_serializable | injectable | retrofit
|
|
│ │ │ └── i18n/ ← localization rules
|
|
│ │ ├── skills/ ← scaffold-feature | scaffold-screen | generate-tests | ...
|
|
│ │ ├── agents/ ← code-reviewer | test-writer | ui-validator | migration | security
|
|
│ │ └── hooks/ ← arch-guard.ts | flutter-analyze.ts | hooks.json
|
|
│ ├── .github/workflows/
|
|
│ │ └── template-ci.yml ← Pillar 3: CI for templates
|
|
│ ├── VERSION
|
|
│ └── CHANGELOG.md
|
|
│
|
|
└── example-project/ ← One reference app: commented project-brief.yaml + custom/ demo
|
|
├── project-brief.yaml ← All stack options documented in-file
|
|
└── .cursor/custom/ ← Pillar 2: never overwritten by the generator
|
|
```
|
|
|
|
---
|
|
|
|
## Quick Start
|
|
|
|
### 1. Install the CLI globally
|
|
|
|
From pub.dev:
|
|
|
|
```bash
|
|
dart pub global activate cursor_gen
|
|
```
|
|
|
|
From this repository:
|
|
|
|
```bash
|
|
cd flutter-cursor-templates/generator
|
|
dart pub global activate --source path .
|
|
```
|
|
|
|
From Git:
|
|
|
|
```bash
|
|
dart pub global activate --source git https://github.com/company/flutter-cursor-templates --git-path generator
|
|
```
|
|
|
|
If `cursor_gen` is not found after activation, add Dart's global bin directory to your shell:
|
|
|
|
```bash
|
|
export PATH="$PATH":"$HOME/.pub-cache/bin"
|
|
```
|
|
|
|
### 2. Create your brief (interactive wizard)
|
|
|
|
```bash
|
|
cursor_gen --wizard
|
|
```
|
|
|
|
Or copy the single reference brief (every option is explained in comments):
|
|
|
|
```bash
|
|
cp path/to/flutter-cursor-gen/example-project/project-brief.yaml .
|
|
```
|
|
|
|
### 3. Generate your .cursor/ directory
|
|
|
|
```bash
|
|
cursor_gen --validate
|
|
cursor_gen
|
|
```
|
|
|
|
### 4. Commit and share with your team
|
|
|
|
```bash
|
|
git add .cursor/ project-brief.yaml
|
|
git commit -m "chore: add cursor AI config for this project"
|
|
```
|
|
|
|
---
|
|
|
|
## All CLI commands
|
|
|
|
```bash
|
|
cursor_gen # First-time setup
|
|
cursor_gen --wizard # Interactive brief creator
|
|
cursor_gen --validate # Validate brief without generating
|
|
cursor_gen --refresh # Re-generate (preserves custom/ + CURSOR:CUSTOM blocks)
|
|
cursor_gen --diff # Preview changes before refresh
|
|
cursor_gen --check-updates # Check for template version updates
|
|
cursor_gen --telemetry # Show usage analytics report
|
|
```
|
|
|
|
---
|
|
|
|
## Six Pillars — What Was Built
|
|
|
|
### 🔴 Pillar 1 — Template Versioning & Update Propagation
|
|
- `cursor_templates_version` field in `project-brief.yaml` locks the version
|
|
- `version_manager.dart` writes `.cursor-gen-lock.json` after every generation
|
|
- `--check-updates` shows diff between locked and latest version
|
|
- `--diff` previews what would change before `--refresh`
|
|
- `CHANGELOG.md` documents all template changes
|
|
|
|
### 🔴 Pillar 2 — Override / Customization Layer
|
|
- `.cursor/custom/` folder is **never touched** by the generator
|
|
- `CURSOR:CUSTOM` / `CURSOR:CUSTOM:END` markers preserve inline customizations on `--refresh`
|
|
- `override_manager.dart` snapshots and restores custom content around every generation
|
|
- `custom/README.md` explains the system to new team members
|
|
|
|
### 🔴 Pillar 3 — Generator Testing & Output Quality Gates
|
|
- `generator_test.dart`: full test suite covering resolver, renderer, validator
|
|
- Golden file tests for all 3 stack combinations (BLoC+Clean, Riverpod+FF, GetX+MVC)
|
|
- `--check-updates` validates no unreplaced `{{PLACEHOLDER}}` patterns survive
|
|
- CI pipeline in `.github/workflows/template-ci.yml` runs all combinations on every PR
|
|
- Lint step detects duplicate `alwaysApply: true` conflicts
|
|
|
|
### 🟠 Pillar 4 — Multi-Platform & Code Generation Awareness
|
|
- `platforms` field in brief: `[ios, android, web, desktop]` → generates platform-specific rules
|
|
- Web: warns about `dart:io`, PWA requirements, renderer differences
|
|
- Desktop: window management, keyboard shortcuts, context menus
|
|
- `codegen` field: `[freezed, json_serializable, injectable, retrofit]` → generates tool-specific rules
|
|
- Each codegen template explains "never edit `.g.dart`" and build_runner usage
|
|
|
|
### 🟠 Pillar 5 — Security as Rules, Not Just an Agent
|
|
- `security-standards.mdc` has `alwaysApply: true` — enforced on EVERY file write
|
|
- Covers: secure storage, certificate pinning, no hardcoded secrets, PII logging rules, obfuscation
|
|
- `error-handling.mdc` also always-on: global error boundaries, crash reporters, typed errors
|
|
- Security _agent_ still exists for deep consultation — but is a second layer, not the only layer
|
|
|
|
### 🟡 Pillar 6 — Observability & Feedback Loop
|
|
- `telemetry_opt_in: true` in brief enables local telemetry (never sent anywhere)
|
|
- `telemetry.dart` logs generation history to `.cursor/telemetry.json`
|
|
- `--telemetry` command prints report + quarterly review checklist
|
|
- Feedback loop questions built into the report: which rules most violated, which agents ignored
|
|
|
|
### Additional fixes (lower priority gaps)
|
|
- **Brief discovery UX**: `--wizard` interactive CLI, `brief-schema.json` for IDE autocomplete
|
|
- **arch-guard documented**: `arch-guard.ts.tmpl` fully implemented with per-architecture rules
|
|
- **i18n rules**: `localization.mdc.tmpl` — ARB format, ICU plurals, never-hardcode-strings rule
|
|
- **Error handling**: `error-handling.mdc.tmpl` — FlutterError.onError, AppError sealed class, crash reporters
|
|
|
|
---
|
|
|
|
## Running Tests (Pillar 3)
|
|
|
|
```bash
|
|
cd flutter-cursor-templates/generator
|
|
dart pub get
|
|
dart test test/generator_test.dart
|
|
```
|
|
|
|
Update golden files after intentional template changes:
|
|
```bash
|
|
# Delete the golden you want to update, then run:
|
|
dart test test/generator_test.dart --name "Golden"
|
|
# The test will create new goldens on first run
|
|
```
|