LeanSpec Development Skill
Unified guide for all LeanSpec development: coding, commands, publishing, CI/CD, and runner research.
Quick Navigation
Core Principles
- Use pnpm — Never npm or yarn
- DRY — Extract shared logic, avoid duplication
- Test What Matters — Business logic and data integrity, not presentation
- Leverage Turborepo — Smart caching (19s → 126ms builds)
- i18n is MANDATORY — Every user-facing string needs both en AND zh-CN (see I18N.md)
- Follow Rust Quality — All code must pass
cargo clippy -- -D warnings
Commands
Daily Development
pnpm install # Install dependencies
pnpm dev # Start web UI + Rust HTTP server
pnpm dev:watch # Same + auto-rebuild Rust on changes
pnpm dev:web # Start web UI only
pnpm dev:desktop # Start desktop app
pnpm build # Build all TS packages
pnpm build:rust # Build Rust (debug)
pnpm build:rust:release # Build Rust (release)
pnpm typecheck # ← NEVER SKIP before marking work complete
pnpm test # Run all tests
pnpm test:watch # Watch mode
pnpm test:coverage # With coverage
pnpm test:rust # Rust tests only
pnpm format # Format all code
pnpm cli # Run LeanSpec CLI
Validation
pnpm pre-push # Quick: typecheck + clippy
pnpm pre-release # Full: build + typecheck + test + lint
⚠️ Always run pnpm typecheck before marking work complete.
Rust
pnpm build:rust # Debug build
pnpm build:rust:release # Release build
pnpm check:rust # Quick check without building
pnpm lint:rust # Clippy with warnings as errors
pnpm format:rust # Format Rust code
pnpm format:rust:check # Check Rust formatting
# Low-level
cargo build --manifest-path rust/Cargo.toml
node scripts/copy-rust-binaries.mjs --debug
Documentation
pnpm docs:dev # Start docs dev server
pnpm docs:build # Build docs site
Desktop
pnpm dev:desktop # Start desktop app in dev mode
cd packages/desktop
pnpm bundle:linux # Debian package
pnpm bundle:macos # DMG
pnpm bundle:windows # NSIS installer
Critical Rules
Rules enforced by hooks or CI:
- Light/Dark Theme — ALL UI must support both themes
- i18n — Update BOTH en and zh-CN → I18N.md ⚠️ commonly forgotten
- Regression Tests — Bug fixes MUST include failing-then-passing tests
- Rust Quality — Must pass
cargo clippy -- -D warnings
- Rust Params Structs — Functions with >7 args must use a params struct (enforced by
clippy.toml)
- Use shadcn/ui — No native HTML form elements
- cursor-pointer — All clickable items must use
cursor-pointer
See RULES.md for complete requirements.
Publishing & Releases
Production Release (Recommended)
# 1. Update version (root only)
npm version patch # or minor/major
# 2. Sync all packages
pnpm sync-versions
# 3. Validate everything
pnpm pre-release
# 4. Commit and push with tags
git add .
git commit -m "chore: release vX.X.X"
git push --follow-tags
# 5. Create GitHub Release (triggers publish workflow)
gh release create vX.X.X --title "vX.X.X" --notes "Release notes here"
Development Release
# Publish dev version via GitHub Actions
gh workflow run publish.yml --field dev=true
# Dry run (validates without publishing)
gh workflow run publish.yml --field dev=true --field dry_run=true
# Install and test
npm install -g lean-spec@dev
lean-spec --version
Version Management
- Root
package.json is the single source of truth for versions
pnpm sync-versions propagates to all packages (including Rust crates)
- CI automatically validates version alignment
- Never manually edit package versions — use
npm version + pnpm sync-versions
Distribution Architecture
LeanSpec uses optional dependencies for platform-specific Rust binaries:
| Type |
Packages |
| Main (published) |
lean-spec, @leanspec/mcp, @leanspec/ui |
| Platform (published) |
@leanspec/cli-{platform}, @leanspec/mcp-{platform} (5 platforms each) |
| Internal (not published) |
@leanspec/desktop, @leanspec/ui-components |
⚠️ Platform packages MUST be published before main packages. The CI workflow handles this automatically.
See PUBLISHING.md and NPM-DISTRIBUTION.md for details.
Changelog
Update CHANGELOG.md following Keep a Changelog format and Semantic Versioning.
Discovering Changes
# Commits since last tag
git log $(git describe --tags --abbrev=0)..HEAD --oneline
# Files changed since last release
git diff $(git describe --tags --abbrev=0)..HEAD --stat
Entry Format
Only include shipped/implemented changes — not planned specs, drafts, or WIP.
Add under ## [Unreleased] using these categories: Added, Changed, Fixed, Deprecated, Removed, Security, Technical.
- **Feature Name** ([spec 123](https://web.lean-spec.dev/specs/123)) - Brief description
- Sub-bullet with implementation details
Writing Style
- Bold feature name followed by description
- Link related specs when applicable
- Present tense — "Adds support for..." not "Added"
- Be specific — include command names, flag names, component names
- Group related changes under single bullet with sub-bullets
- Include breaking changes with Breaking: prefix
Creating a Release
- Move entries from
[Unreleased] to new version: ## [X.Y.Z] - YYYY-MM-DD
- Add release link at bottom:
[X.Y.Z]: https://github.com/codervisor/lean-spec/releases/tag/vX.Y.Z
CI/CD (GitHub Actions)
All workflow interactions use the gh CLI. Check status before triggering new runs; minimum 30s between polls.
Available Workflows
| Workflow |
File |
Triggers |
Purpose |
| CI |
ci.yml |
push, PR to main |
Build, test, lint (Node.js + Rust) |
| Publish |
publish.yml |
release, manual |
Publish to npm (all platforms) |
| Desktop Build |
desktop-build.yml |
push, PR, manual |
Build Tauri desktop apps |
| Copilot Setup |
copilot-setup-steps.yml |
push, PR, manual |
Setup environment for Copilot agent |
Quick Reference
# Check status
gh run list --limit 10
gh run list --workflow ci.yml --limit 5
gh run view <run-id>
gh run watch <run-id>
# Trigger
gh workflow run ci.yml
gh workflow run publish.yml --field dev=true
# Debug failures
gh run view <run-id> --log-failed
gh run rerun <run-id> --failed
# Artifacts
gh run download <run-id>
gh run download <run-id> --name ui-dist
See CI-WORKFLOWS.md, CI-COMMANDS.md, and CI-TROUBLESHOOTING.md for details.
Runner Research
Research AI agent runners to keep LeanSpec's runner registry current as the ecosystem evolves.
Workflow
- Read current state:
rust/leanspec-core/src/sessions/runner.rs (RunnerRegistry::builtins())
- Read catalog: runners-catalog.md
- Research via
web_search: Config format changes, CLI changes, new env vars, new capabilities, deprecations, new runners
- Compare & identify gaps: Cross-reference findings against registry
- Report: Minor updates → update catalog directly; major changes → create a spec
Runner Tiers
- Tier 1 (high priority): Claude Code, Copilot, Cursor, Windsurf, Codex, Gemini
- Tier 2 (medium): Kiro, Amp, Aider, Goose, Continue, Roo Code
- Tier 3 (monitor): Droid, Kimi, Qodo, Trae, Qwen Code, OpenHands, Crush, CodeBuddy, Kilo, Augment
Key Source Files
| File |
Purpose |
rust/leanspec-core/src/sessions/runner.rs |
Runner registry with detection config |
schemas/runners.json |
JSON schema for custom runner config |
packages/cli/templates/_shared/agents-components/ |
AGENTS.md template components |
1---2name: leanspec-development3description: Development workflows, commands, publishing, CI/CD, changelog management, and contribution guidelines for LeanSpec. Use when contributing code, fixing bugs, setting up dev environment, running tests or linting, working with the monorepo structure, looking up build/dev/test/publish/format/lint commands, preparing releases, publishing to npm, bumping versions, syncing package versions, testing dev builds, troubleshooting npm distribution, updating changelogs, triggering CI/CD workflows, monitoring build status, debugging failed runs, managing artifacts, checking CI before releases, or researching AI agent runners. Triggers include any development, scripting, publishing, CI/CD, changelog, or runner research task in this project.4---56# LeanSpec Development Skill78Unified guide for all LeanSpec development: coding, commands, publishing, CI/CD, and runner research.910## Quick Navigation1112| Goal | Reference |13|------|-----------|14| **Mandatory rules & conventions** | [RULES.md](./references/RULES.md) |15| **Changelog format & workflow** | [Changelog](#changelog) (below) |16| **i18n file locations & patterns** | [I18N.md](./references/I18N.md) |17| **Monorepo structure & packages** | [STRUCTURE.md](./references/STRUCTURE.md) |18| **Full release checklist** | [PUBLISHING.md](./references/PUBLISHING.md) |19| **npm distribution architecture** | [NPM-DISTRIBUTION.md](./references/NPM-DISTRIBUTION.md) |20| **Dev publishing workflow** | [DEV-PUBLISHING.md](./references/DEV-PUBLISHING.md) |21| **CI workflow details** | [CI-WORKFLOWS.md](./references/CI-WORKFLOWS.md) |22| **gh CLI command reference** | [CI-COMMANDS.md](./references/CI-COMMANDS.md) |23| **CI troubleshooting** | [CI-TROUBLESHOOTING.md](./references/CI-TROUBLESHOOTING.md) |24| **Runner ecosystem catalog** | [runners-catalog.md](./references/runners-catalog.md) |2526## Core Principles27281. **Use pnpm** — Never npm or yarn292. **DRY** — Extract shared logic, avoid duplication303. **Test What Matters** — Business logic and data integrity, not presentation314. **Leverage Turborepo** — Smart caching (19s → 126ms builds)325. **i18n is MANDATORY** — Every user-facing string needs both en AND zh-CN (see [I18N.md](./references/I18N.md))336. **Follow Rust Quality** — All code must pass `cargo clippy -- -D warnings`3435---3637## Commands3839### Daily Development4041```bash42pnpm install # Install dependencies43pnpm dev # Start web UI + Rust HTTP server44pnpm dev:watch # Same + auto-rebuild Rust on changes45pnpm dev:web # Start web UI only46pnpm dev:desktop # Start desktop app47pnpm build # Build all TS packages48pnpm build:rust # Build Rust (debug)49pnpm build:rust:release # Build Rust (release)50pnpm typecheck # ← NEVER SKIP before marking work complete51pnpm test # Run all tests52pnpm test:watch # Watch mode53pnpm test:coverage # With coverage54pnpm test:rust # Rust tests only55pnpm format # Format all code56pnpm cli # Run LeanSpec CLI57```5859### Validation6061```bash62pnpm pre-push # Quick: typecheck + clippy63pnpm pre-release # Full: build + typecheck + test + lint64```6566**⚠️ Always run `pnpm typecheck` before marking work complete.**6768### Rust6970```bash71pnpm build:rust # Debug build72pnpm build:rust:release # Release build73pnpm check:rust # Quick check without building74pnpm lint:rust # Clippy with warnings as errors75pnpm format:rust # Format Rust code76pnpm format:rust:check # Check Rust formatting7778# Low-level79cargo build --manifest-path rust/Cargo.toml80node scripts/copy-rust-binaries.mjs --debug81```8283### Documentation8485```bash86pnpm docs:dev # Start docs dev server87pnpm docs:build # Build docs site88```8990### Desktop9192```bash93pnpm dev:desktop # Start desktop app in dev mode94cd packages/desktop95pnpm bundle:linux # Debian package96pnpm bundle:macos # DMG97pnpm bundle:windows # NSIS installer98```99100---101102## Critical Rules103104Rules enforced by hooks or CI:1051061. **Light/Dark Theme** — ALL UI must support both themes1072. **i18n** — Update BOTH en and zh-CN → [I18N.md](./references/I18N.md) ⚠️ commonly forgotten1083. **Regression Tests** — Bug fixes MUST include failing-then-passing tests1094. **Rust Quality** — Must pass `cargo clippy -- -D warnings`1105. **Rust Params Structs** — Functions with >7 args must use a params struct (enforced by `clippy.toml`)1116. **Use shadcn/ui** — No native HTML form elements1127. **cursor-pointer** — All clickable items must use `cursor-pointer`113114**See [RULES.md](./references/RULES.md) for complete requirements.**115116---117118## Publishing & Releases119120### Production Release (Recommended)121122```bash123# 1. Update version (root only)124npm version patch # or minor/major125126# 2. Sync all packages127pnpm sync-versions128129# 3. Validate everything130pnpm pre-release131132# 4. Commit and push with tags133git add .134git commit -m "chore: release vX.X.X"135git push --follow-tags136137# 5. Create GitHub Release (triggers publish workflow)138gh release create vX.X.X --title "vX.X.X" --notes "Release notes here"139```140141### Development Release142143```bash144# Publish dev version via GitHub Actions145gh workflow run publish.yml --field dev=true146147# Dry run (validates without publishing)148gh workflow run publish.yml --field dev=true --field dry_run=true149150# Install and test151npm install -g lean-spec@dev152lean-spec --version153```154155### Version Management156157- Root `package.json` is the single source of truth for versions158- `pnpm sync-versions` propagates to all packages (including Rust crates)159- CI automatically validates version alignment160- **Never manually edit package versions** — use `npm version` + `pnpm sync-versions`161162### Distribution Architecture163164LeanSpec uses optional dependencies for platform-specific Rust binaries:165166| Type | Packages |167|------|----------|168| **Main** (published) | `lean-spec`, `@leanspec/mcp`, `@leanspec/ui` |169| **Platform** (published) | `@leanspec/cli-{platform}`, `@leanspec/mcp-{platform}` (5 platforms each) |170| **Internal** (not published) | `@leanspec/desktop`, `@leanspec/ui-components` |171172⚠️ **Platform packages MUST be published before main packages.** The CI workflow handles this automatically.173174See [PUBLISHING.md](./references/PUBLISHING.md) and [NPM-DISTRIBUTION.md](./references/NPM-DISTRIBUTION.md) for details.175176---177178## Changelog179180Update `CHANGELOG.md` following [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) format and [Semantic Versioning](https://semver.org/spec/v2.0.0.html).181182### Discovering Changes183184```bash185# Commits since last tag186git log $(git describe --tags --abbrev=0)..HEAD --oneline187188# Files changed since last release189git diff $(git describe --tags --abbrev=0)..HEAD --stat190```191192### Entry Format193194**Only include shipped/implemented changes** — not planned specs, drafts, or WIP.195196Add under `## [Unreleased]` using these categories: **Added**, **Changed**, **Fixed**, **Deprecated**, **Removed**, **Security**, **Technical**.197198```markdown199- **Feature Name** ([spec 123](https://web.lean-spec.dev/specs/123)) - Brief description200 - Sub-bullet with implementation details201```202203### Writing Style2042051. **Bold feature name** followed by description2062. **Link related specs** when applicable2073. **Present tense** — "Adds support for..." not "Added"2084. **Be specific** — include command names, flag names, component names2095. **Group related changes** under single bullet with sub-bullets2106. Include breaking changes with **Breaking:** prefix211212### Creating a Release2132141. Move entries from `[Unreleased]` to new version: `## [X.Y.Z] - YYYY-MM-DD`2152. Add release link at bottom: `[X.Y.Z]: https://github.com/codervisor/lean-spec/releases/tag/vX.Y.Z`216217---218219## CI/CD (GitHub Actions)220221All workflow interactions use the `gh` CLI. Check status before triggering new runs; minimum 30s between polls.222223### Available Workflows224225| Workflow | File | Triggers | Purpose |226|----------|------|----------|---------|227| **CI** | `ci.yml` | push, PR to main | Build, test, lint (Node.js + Rust) |228| **Publish** | `publish.yml` | release, manual | Publish to npm (all platforms) |229| **Desktop Build** | `desktop-build.yml` | push, PR, manual | Build Tauri desktop apps |230| **Copilot Setup** | `copilot-setup-steps.yml` | push, PR, manual | Setup environment for Copilot agent |231232### Quick Reference233234```bash235# Check status236gh run list --limit 10237gh run list --workflow ci.yml --limit 5238gh run view <run-id>239gh run watch <run-id>240241# Trigger242gh workflow run ci.yml243gh workflow run publish.yml --field dev=true244245# Debug failures246gh run view <run-id> --log-failed247gh run rerun <run-id> --failed248249# Artifacts250gh run download <run-id>251gh run download <run-id> --name ui-dist252```253254See [CI-WORKFLOWS.md](./references/CI-WORKFLOWS.md), [CI-COMMANDS.md](./references/CI-COMMANDS.md), and [CI-TROUBLESHOOTING.md](./references/CI-TROUBLESHOOTING.md) for details.255256---257258## Runner Research259260Research AI agent runners to keep LeanSpec's runner registry current as the ecosystem evolves.261262### Workflow2632641. **Read current state**: `rust/leanspec-core/src/sessions/runner.rs` (`RunnerRegistry::builtins()`)2652. **Read catalog**: [runners-catalog.md](./references/runners-catalog.md)2663. **Research via `web_search`**: Config format changes, CLI changes, new env vars, new capabilities, deprecations, new runners2674. **Compare & identify gaps**: Cross-reference findings against registry2685. **Report**: Minor updates → update catalog directly; major changes → create a spec269270### Runner Tiers2712721. **Tier 1** (high priority): Claude Code, Copilot, Cursor, Windsurf, Codex, Gemini2732. **Tier 2** (medium): Kiro, Amp, Aider, Goose, Continue, Roo Code2743. **Tier 3** (monitor): Droid, Kimi, Qodo, Trae, Qwen Code, OpenHands, Crush, CodeBuddy, Kilo, Augment275276### Key Source Files277278| File | Purpose |279|------|---------|280| `rust/leanspec-core/src/sessions/runner.rs` | Runner registry with detection config |281| `schemas/runners.json` | JSON schema for custom runner config |282| `packages/cli/templates/_shared/agents-components/` | AGENTS.md template components |