Files
cursor_gen/README.md
T
mansi.kansara 54c66efe9b chore: update README and CLI usage for cursor_gen, version bump to 1.0.1
- 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.
2026-05-13 12:08:52 +05:30

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
```