agentic-team-templates 0.16.0 → 0.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +30 -24
- package/package.json +1 -1
- package/src/index.js +221 -123
- package/src/index.test.js +138 -66
- package/templates/ux-designer/.cursor/rules/accessibility.md +214 -0
- package/templates/ux-designer/.cursor/rules/emotional-design.md +217 -0
- package/templates/ux-designer/.cursor/rules/handoff.md +251 -0
- package/templates/ux-designer/.cursor/rules/information-architecture.md +193 -0
- package/templates/ux-designer/.cursor/rules/interaction-design.md +221 -0
- package/templates/ux-designer/.cursor/rules/overview.md +110 -0
- package/templates/ux-designer/.cursor/rules/research.md +181 -0
- package/templates/ux-designer/.cursor/rules/visual-design.md +191 -0
- package/templates/ux-designer/CLAUDE.md +124 -0
- /package/templates/blockchain/{.cursorrules → .cursor/rules}/defi-patterns.md +0 -0
- /package/templates/blockchain/{.cursorrules → .cursor/rules}/gas-optimization.md +0 -0
- /package/templates/blockchain/{.cursorrules → .cursor/rules}/overview.md +0 -0
- /package/templates/blockchain/{.cursorrules → .cursor/rules}/security.md +0 -0
- /package/templates/blockchain/{.cursorrules → .cursor/rules}/smart-contracts.md +0 -0
- /package/templates/blockchain/{.cursorrules → .cursor/rules}/testing.md +0 -0
- /package/templates/blockchain/{.cursorrules → .cursor/rules}/web3-integration.md +0 -0
- /package/templates/cli-tools/{.cursorrules → .cursor/rules}/architecture.md +0 -0
- /package/templates/cli-tools/{.cursorrules → .cursor/rules}/arguments.md +0 -0
- /package/templates/cli-tools/{.cursorrules → .cursor/rules}/distribution.md +0 -0
- /package/templates/cli-tools/{.cursorrules → .cursor/rules}/error-handling.md +0 -0
- /package/templates/cli-tools/{.cursorrules → .cursor/rules}/overview.md +0 -0
- /package/templates/cli-tools/{.cursorrules → .cursor/rules}/testing.md +0 -0
- /package/templates/cli-tools/{.cursorrules → .cursor/rules}/user-experience.md +0 -0
- /package/templates/cpp-expert/{.cursorrules → .cursor/rules}/concurrency.md +0 -0
- /package/templates/cpp-expert/{.cursorrules → .cursor/rules}/error-handling.md +0 -0
- /package/templates/cpp-expert/{.cursorrules → .cursor/rules}/memory-and-ownership.md +0 -0
- /package/templates/cpp-expert/{.cursorrules → .cursor/rules}/modern-cpp.md +0 -0
- /package/templates/cpp-expert/{.cursorrules → .cursor/rules}/overview.md +0 -0
- /package/templates/cpp-expert/{.cursorrules → .cursor/rules}/performance.md +0 -0
- /package/templates/cpp-expert/{.cursorrules → .cursor/rules}/testing.md +0 -0
- /package/templates/cpp-expert/{.cursorrules → .cursor/rules}/tooling.md +0 -0
- /package/templates/csharp-expert/{.cursorrules → .cursor/rules}/aspnet-core.md +0 -0
- /package/templates/csharp-expert/{.cursorrules → .cursor/rules}/async-patterns.md +0 -0
- /package/templates/csharp-expert/{.cursorrules → .cursor/rules}/dependency-injection.md +0 -0
- /package/templates/csharp-expert/{.cursorrules → .cursor/rules}/error-handling.md +0 -0
- /package/templates/csharp-expert/{.cursorrules → .cursor/rules}/language-features.md +0 -0
- /package/templates/csharp-expert/{.cursorrules → .cursor/rules}/overview.md +0 -0
- /package/templates/csharp-expert/{.cursorrules → .cursor/rules}/performance.md +0 -0
- /package/templates/csharp-expert/{.cursorrules → .cursor/rules}/testing.md +0 -0
- /package/templates/csharp-expert/{.cursorrules → .cursor/rules}/tooling.md +0 -0
- /package/templates/data-engineering/{.cursorrules → .cursor/rules}/data-modeling.md +0 -0
- /package/templates/data-engineering/{.cursorrules → .cursor/rules}/data-quality.md +0 -0
- /package/templates/data-engineering/{.cursorrules → .cursor/rules}/overview.md +0 -0
- /package/templates/data-engineering/{.cursorrules → .cursor/rules}/performance.md +0 -0
- /package/templates/data-engineering/{.cursorrules → .cursor/rules}/pipeline-design.md +0 -0
- /package/templates/data-engineering/{.cursorrules → .cursor/rules}/security.md +0 -0
- /package/templates/data-engineering/{.cursorrules → .cursor/rules}/testing.md +0 -0
- /package/templates/devops-sre/{.cursorrules → .cursor/rules}/capacity-planning.md +0 -0
- /package/templates/devops-sre/{.cursorrules → .cursor/rules}/change-management.md +0 -0
- /package/templates/devops-sre/{.cursorrules → .cursor/rules}/chaos-engineering.md +0 -0
- /package/templates/devops-sre/{.cursorrules → .cursor/rules}/disaster-recovery.md +0 -0
- /package/templates/devops-sre/{.cursorrules → .cursor/rules}/incident-management.md +0 -0
- /package/templates/devops-sre/{.cursorrules → .cursor/rules}/observability.md +0 -0
- /package/templates/devops-sre/{.cursorrules → .cursor/rules}/overview.md +0 -0
- /package/templates/devops-sre/{.cursorrules → .cursor/rules}/postmortems.md +0 -0
- /package/templates/devops-sre/{.cursorrules → .cursor/rules}/runbooks.md +0 -0
- /package/templates/devops-sre/{.cursorrules → .cursor/rules}/slo-sli.md +0 -0
- /package/templates/devops-sre/{.cursorrules → .cursor/rules}/toil-reduction.md +0 -0
- /package/templates/documentation/{.cursorrules → .cursor/rules}/adr.md +0 -0
- /package/templates/documentation/{.cursorrules → .cursor/rules}/api-documentation.md +0 -0
- /package/templates/documentation/{.cursorrules → .cursor/rules}/code-comments.md +0 -0
- /package/templates/documentation/{.cursorrules → .cursor/rules}/maintenance.md +0 -0
- /package/templates/documentation/{.cursorrules → .cursor/rules}/overview.md +0 -0
- /package/templates/documentation/{.cursorrules → .cursor/rules}/readme-standards.md +0 -0
- /package/templates/educator/{.cursorrules → .cursor/rules}/accessibility.md +0 -0
- /package/templates/educator/{.cursorrules → .cursor/rules}/assessment.md +0 -0
- /package/templates/educator/{.cursorrules → .cursor/rules}/curriculum.md +0 -0
- /package/templates/educator/{.cursorrules → .cursor/rules}/engagement.md +0 -0
- /package/templates/educator/{.cursorrules → .cursor/rules}/instructional-design.md +0 -0
- /package/templates/educator/{.cursorrules → .cursor/rules}/overview.md +0 -0
- /package/templates/educator/{.cursorrules → .cursor/rules}/retention.md +0 -0
- /package/templates/fullstack/{.cursorrules → .cursor/rules}/api-contracts.md +0 -0
- /package/templates/fullstack/{.cursorrules → .cursor/rules}/architecture.md +0 -0
- /package/templates/fullstack/{.cursorrules → .cursor/rules}/overview.md +0 -0
- /package/templates/fullstack/{.cursorrules → .cursor/rules}/shared-types.md +0 -0
- /package/templates/fullstack/{.cursorrules → .cursor/rules}/testing.md +0 -0
- /package/templates/golang-expert/{.cursorrules → .cursor/rules}/concurrency.md +0 -0
- /package/templates/golang-expert/{.cursorrules → .cursor/rules}/error-handling.md +0 -0
- /package/templates/golang-expert/{.cursorrules → .cursor/rules}/interfaces-and-types.md +0 -0
- /package/templates/golang-expert/{.cursorrules → .cursor/rules}/overview.md +0 -0
- /package/templates/golang-expert/{.cursorrules → .cursor/rules}/performance.md +0 -0
- /package/templates/golang-expert/{.cursorrules → .cursor/rules}/production-patterns.md +0 -0
- /package/templates/golang-expert/{.cursorrules → .cursor/rules}/stdlib-and-tooling.md +0 -0
- /package/templates/golang-expert/{.cursorrules → .cursor/rules}/testing.md +0 -0
- /package/templates/java-expert/{.cursorrules → .cursor/rules}/concurrency.md +0 -0
- /package/templates/java-expert/{.cursorrules → .cursor/rules}/error-handling.md +0 -0
- /package/templates/java-expert/{.cursorrules → .cursor/rules}/modern-java.md +0 -0
- /package/templates/java-expert/{.cursorrules → .cursor/rules}/overview.md +0 -0
- /package/templates/java-expert/{.cursorrules → .cursor/rules}/performance.md +0 -0
- /package/templates/java-expert/{.cursorrules → .cursor/rules}/persistence.md +0 -0
- /package/templates/java-expert/{.cursorrules → .cursor/rules}/spring-boot.md +0 -0
- /package/templates/java-expert/{.cursorrules → .cursor/rules}/testing.md +0 -0
- /package/templates/java-expert/{.cursorrules → .cursor/rules}/tooling.md +0 -0
- /package/templates/javascript-expert/{.cursorrules → .cursor/rules}/language-deep-dive.md +0 -0
- /package/templates/javascript-expert/{.cursorrules → .cursor/rules}/node-patterns.md +0 -0
- /package/templates/javascript-expert/{.cursorrules → .cursor/rules}/overview.md +0 -0
- /package/templates/javascript-expert/{.cursorrules → .cursor/rules}/performance.md +0 -0
- /package/templates/javascript-expert/{.cursorrules → .cursor/rules}/react-patterns.md +0 -0
- /package/templates/javascript-expert/{.cursorrules → .cursor/rules}/testing.md +0 -0
- /package/templates/javascript-expert/{.cursorrules → .cursor/rules}/tooling.md +0 -0
- /package/templates/javascript-expert/{.cursorrules → .cursor/rules}/typescript-deep-dive.md +0 -0
- /package/templates/kotlin-expert/{.cursorrules → .cursor/rules}/coroutines.md +0 -0
- /package/templates/kotlin-expert/{.cursorrules → .cursor/rules}/error-handling.md +0 -0
- /package/templates/kotlin-expert/{.cursorrules → .cursor/rules}/frameworks.md +0 -0
- /package/templates/kotlin-expert/{.cursorrules → .cursor/rules}/language-features.md +0 -0
- /package/templates/kotlin-expert/{.cursorrules → .cursor/rules}/overview.md +0 -0
- /package/templates/kotlin-expert/{.cursorrules → .cursor/rules}/performance.md +0 -0
- /package/templates/kotlin-expert/{.cursorrules → .cursor/rules}/testing.md +0 -0
- /package/templates/kotlin-expert/{.cursorrules → .cursor/rules}/tooling.md +0 -0
- /package/templates/ml-ai/{.cursorrules → .cursor/rules}/data-engineering.md +0 -0
- /package/templates/ml-ai/{.cursorrules → .cursor/rules}/deployment.md +0 -0
- /package/templates/ml-ai/{.cursorrules → .cursor/rules}/model-development.md +0 -0
- /package/templates/ml-ai/{.cursorrules → .cursor/rules}/monitoring.md +0 -0
- /package/templates/ml-ai/{.cursorrules → .cursor/rules}/overview.md +0 -0
- /package/templates/ml-ai/{.cursorrules → .cursor/rules}/security.md +0 -0
- /package/templates/ml-ai/{.cursorrules → .cursor/rules}/testing.md +0 -0
- /package/templates/mobile/{.cursorrules → .cursor/rules}/navigation.md +0 -0
- /package/templates/mobile/{.cursorrules → .cursor/rules}/offline-first.md +0 -0
- /package/templates/mobile/{.cursorrules → .cursor/rules}/overview.md +0 -0
- /package/templates/mobile/{.cursorrules → .cursor/rules}/performance.md +0 -0
- /package/templates/mobile/{.cursorrules → .cursor/rules}/testing.md +0 -0
- /package/templates/platform-engineering/{.cursorrules → .cursor/rules}/ci-cd.md +0 -0
- /package/templates/platform-engineering/{.cursorrules → .cursor/rules}/developer-experience.md +0 -0
- /package/templates/platform-engineering/{.cursorrules → .cursor/rules}/infrastructure-as-code.md +0 -0
- /package/templates/platform-engineering/{.cursorrules → .cursor/rules}/kubernetes.md +0 -0
- /package/templates/platform-engineering/{.cursorrules → .cursor/rules}/observability.md +0 -0
- /package/templates/platform-engineering/{.cursorrules → .cursor/rules}/overview.md +0 -0
- /package/templates/platform-engineering/{.cursorrules → .cursor/rules}/security.md +0 -0
- /package/templates/platform-engineering/{.cursorrules → .cursor/rules}/testing.md +0 -0
- /package/templates/product-manager/{.cursorrules → .cursor/rules}/communication.md +0 -0
- /package/templates/product-manager/{.cursorrules → .cursor/rules}/discovery.md +0 -0
- /package/templates/product-manager/{.cursorrules → .cursor/rules}/metrics.md +0 -0
- /package/templates/product-manager/{.cursorrules → .cursor/rules}/overview.md +0 -0
- /package/templates/product-manager/{.cursorrules → .cursor/rules}/prioritization.md +0 -0
- /package/templates/product-manager/{.cursorrules → .cursor/rules}/requirements.md +0 -0
- /package/templates/python-expert/{.cursorrules → .cursor/rules}/async-python.md +0 -0
- /package/templates/python-expert/{.cursorrules → .cursor/rules}/overview.md +0 -0
- /package/templates/python-expert/{.cursorrules → .cursor/rules}/patterns-and-idioms.md +0 -0
- /package/templates/python-expert/{.cursorrules → .cursor/rules}/performance.md +0 -0
- /package/templates/python-expert/{.cursorrules → .cursor/rules}/testing.md +0 -0
- /package/templates/python-expert/{.cursorrules → .cursor/rules}/tooling.md +0 -0
- /package/templates/python-expert/{.cursorrules → .cursor/rules}/type-system.md +0 -0
- /package/templates/python-expert/{.cursorrules → .cursor/rules}/web-and-apis.md +0 -0
- /package/templates/qa-engineering/{.cursorrules → .cursor/rules}/automation.md +0 -0
- /package/templates/qa-engineering/{.cursorrules → .cursor/rules}/metrics.md +0 -0
- /package/templates/qa-engineering/{.cursorrules → .cursor/rules}/overview.md +0 -0
- /package/templates/qa-engineering/{.cursorrules → .cursor/rules}/quality-gates.md +0 -0
- /package/templates/qa-engineering/{.cursorrules → .cursor/rules}/test-design.md +0 -0
- /package/templates/qa-engineering/{.cursorrules → .cursor/rules}/test-strategy.md +0 -0
- /package/templates/rust-expert/{.cursorrules → .cursor/rules}/concurrency.md +0 -0
- /package/templates/rust-expert/{.cursorrules → .cursor/rules}/ecosystem-and-tooling.md +0 -0
- /package/templates/rust-expert/{.cursorrules → .cursor/rules}/error-handling.md +0 -0
- /package/templates/rust-expert/{.cursorrules → .cursor/rules}/overview.md +0 -0
- /package/templates/rust-expert/{.cursorrules → .cursor/rules}/ownership-and-borrowing.md +0 -0
- /package/templates/rust-expert/{.cursorrules → .cursor/rules}/performance-and-unsafe.md +0 -0
- /package/templates/rust-expert/{.cursorrules → .cursor/rules}/testing.md +0 -0
- /package/templates/rust-expert/{.cursorrules → .cursor/rules}/traits-and-generics.md +0 -0
- /package/templates/swift-expert/{.cursorrules → .cursor/rules}/concurrency.md +0 -0
- /package/templates/swift-expert/{.cursorrules → .cursor/rules}/error-handling.md +0 -0
- /package/templates/swift-expert/{.cursorrules → .cursor/rules}/language-features.md +0 -0
- /package/templates/swift-expert/{.cursorrules → .cursor/rules}/overview.md +0 -0
- /package/templates/swift-expert/{.cursorrules → .cursor/rules}/performance.md +0 -0
- /package/templates/swift-expert/{.cursorrules → .cursor/rules}/swiftui.md +0 -0
- /package/templates/swift-expert/{.cursorrules → .cursor/rules}/testing.md +0 -0
- /package/templates/swift-expert/{.cursorrules → .cursor/rules}/tooling.md +0 -0
- /package/templates/testing/{.cursorrules → .cursor/rules}/advanced-techniques.md +0 -0
- /package/templates/testing/{.cursorrules → .cursor/rules}/ci-cd-integration.md +0 -0
- /package/templates/testing/{.cursorrules → .cursor/rules}/overview.md +0 -0
- /package/templates/testing/{.cursorrules → .cursor/rules}/performance-testing.md +0 -0
- /package/templates/testing/{.cursorrules → .cursor/rules}/quality-metrics.md +0 -0
- /package/templates/testing/{.cursorrules → .cursor/rules}/reliability.md +0 -0
- /package/templates/testing/{.cursorrules → .cursor/rules}/tdd-methodology.md +0 -0
- /package/templates/testing/{.cursorrules → .cursor/rules}/test-data.md +0 -0
- /package/templates/testing/{.cursorrules → .cursor/rules}/test-design.md +0 -0
- /package/templates/testing/{.cursorrules → .cursor/rules}/test-types.md +0 -0
- /package/templates/utility-agent/{.cursorrules → .cursor/rules}/action-control.md +0 -0
- /package/templates/utility-agent/{.cursorrules → .cursor/rules}/context-management.md +0 -0
- /package/templates/utility-agent/{.cursorrules → .cursor/rules}/hallucination-prevention.md +0 -0
- /package/templates/utility-agent/{.cursorrules → .cursor/rules}/overview.md +0 -0
- /package/templates/utility-agent/{.cursorrules → .cursor/rules}/token-optimization.md +0 -0
- /package/templates/web-backend/{.cursorrules → .cursor/rules}/api-design.md +0 -0
- /package/templates/web-backend/{.cursorrules → .cursor/rules}/authentication.md +0 -0
- /package/templates/web-backend/{.cursorrules → .cursor/rules}/database-patterns.md +0 -0
- /package/templates/web-backend/{.cursorrules → .cursor/rules}/error-handling.md +0 -0
- /package/templates/web-backend/{.cursorrules → .cursor/rules}/overview.md +0 -0
- /package/templates/web-backend/{.cursorrules → .cursor/rules}/security.md +0 -0
- /package/templates/web-backend/{.cursorrules → .cursor/rules}/testing.md +0 -0
- /package/templates/web-frontend/{.cursorrules → .cursor/rules}/accessibility.md +0 -0
- /package/templates/web-frontend/{.cursorrules → .cursor/rules}/component-patterns.md +0 -0
- /package/templates/web-frontend/{.cursorrules → .cursor/rules}/overview.md +0 -0
- /package/templates/web-frontend/{.cursorrules → .cursor/rules}/performance.md +0 -0
- /package/templates/web-frontend/{.cursorrules → .cursor/rules}/state-management.md +0 -0
- /package/templates/web-frontend/{.cursorrules → .cursor/rules}/styling.md +0 -0
- /package/templates/web-frontend/{.cursorrules → .cursor/rules}/testing.md +0 -0
package/README.md
CHANGED
|
@@ -14,7 +14,7 @@ AI coding assistant templates for Cursor IDE, Claude Code, and GitHub Copilot. P
|
|
|
14
14
|
**Installs (configurable via `--ide`):**
|
|
15
15
|
|
|
16
16
|
- **`CLAUDE.md`** - Development guide for Claude-based assistants (Claude Code, Cursor with Claude)
|
|
17
|
-
- **`.
|
|
17
|
+
- **`.cursor/rules/`** - Rule files for Cursor IDE
|
|
18
18
|
- **`.github/copilot-instructions.md`** - Instructions for GitHub Copilot
|
|
19
19
|
|
|
20
20
|
> **Disclaimer:** This project is provided for **educational and experimental purposes only**. The author takes no responsibility for any actions, outputs, or consequences resulting from an LLM or AI assistant following these rules. Use at your own risk. Always review AI-generated code before deploying to production.
|
|
@@ -204,19 +204,20 @@ After running `npx agentic-team-templates web-frontend`:
|
|
|
204
204
|
```text
|
|
205
205
|
your-project/
|
|
206
206
|
├── CLAUDE.md # Development guide (Claude Code, Cursor)
|
|
207
|
-
├── .
|
|
208
|
-
│
|
|
209
|
-
│
|
|
210
|
-
│
|
|
211
|
-
│
|
|
212
|
-
│
|
|
213
|
-
│
|
|
214
|
-
│
|
|
215
|
-
│
|
|
216
|
-
│
|
|
217
|
-
│
|
|
218
|
-
│
|
|
219
|
-
│
|
|
207
|
+
├── .cursor/
|
|
208
|
+
│ └── rules/ # Rule files (Cursor IDE)
|
|
209
|
+
│ ├── core-principles.md # Shared
|
|
210
|
+
│ ├── code-quality.md # Shared
|
|
211
|
+
│ ├── security-fundamentals.md # Shared
|
|
212
|
+
│ ├── git-workflow.md # Shared
|
|
213
|
+
│ ├── communication.md # Shared
|
|
214
|
+
│ ├── web-frontend-overview.md # Template-specific
|
|
215
|
+
│ ├── web-frontend-accessibility.md # Template-specific
|
|
216
|
+
│ ├── web-frontend-component-patterns.md # Template-specific
|
|
217
|
+
│ ├── web-frontend-performance.md # Template-specific
|
|
218
|
+
│ ├── web-frontend-state-management.md # Template-specific
|
|
219
|
+
│ ├── web-frontend-styling.md # Template-specific
|
|
220
|
+
│ └── web-frontend-testing.md # Template-specific
|
|
220
221
|
└── .github/
|
|
221
222
|
└── copilot-instructions.md # Instructions (GitHub Copilot)
|
|
222
223
|
```
|
|
@@ -225,7 +226,7 @@ your-project/
|
|
|
225
226
|
|
|
226
227
|
### Add Project-Specific Rules
|
|
227
228
|
|
|
228
|
-
Create new `.md` files in `.
|
|
229
|
+
Create new `.md` files in `.cursor/rules/`:
|
|
229
230
|
|
|
230
231
|
```markdown
|
|
231
232
|
# my-project-conventions.md
|
|
@@ -237,11 +238,15 @@ All API calls go through `/lib/api.ts`...
|
|
|
237
238
|
|
|
238
239
|
### Modify Existing Rules
|
|
239
240
|
|
|
240
|
-
Edit any file in `.
|
|
241
|
+
Edit any file in `.cursor/rules/` or `CLAUDE.md` directly. Changes take effect immediately.
|
|
241
242
|
|
|
242
243
|
### Combine with Existing Rules
|
|
243
244
|
|
|
244
|
-
Templates merge with your existing `.
|
|
245
|
+
Templates merge with your existing `.cursor/rules/` directory. Existing files are preserved unless they have the same name.
|
|
246
|
+
|
|
247
|
+
### Migrating from `.cursorrules/`
|
|
248
|
+
|
|
249
|
+
If your project uses the older `.cursorrules/` directory, the installer will detect it and offer to clean it up automatically. Cursor now uses `.cursor/rules/` for rule files. Support for `.cursorrules/` will be removed in a future version.
|
|
245
250
|
|
|
246
251
|
## Examples
|
|
247
252
|
|
|
@@ -279,7 +284,7 @@ npx agentic-team-templates ml-ai data-engineering
|
|
|
279
284
|
|
|
280
285
|
- **Node.js**: 18.0.0 or higher
|
|
281
286
|
- **Supported IDEs/Tools**:
|
|
282
|
-
- Cursor IDE (any version with `.
|
|
287
|
+
- Cursor IDE (any version with `.cursor/rules/` support)
|
|
283
288
|
- Claude Code (reads `CLAUDE.md` automatically)
|
|
284
289
|
- GitHub Copilot (reads `.github/copilot-instructions.md`)
|
|
285
290
|
|
|
@@ -342,11 +347,12 @@ We welcome contributions! Here's how to add new templates or improve existing on
|
|
|
342
347
|
```text
|
|
343
348
|
templates/your-template/
|
|
344
349
|
├── CLAUDE.md # Main development guide (required)
|
|
345
|
-
└── .
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
+
└── .cursor/
|
|
351
|
+
└── rules/
|
|
352
|
+
├── overview.md # Scope and core principles (required)
|
|
353
|
+
├── topic-one.md # Domain-specific rules
|
|
354
|
+
├── topic-two.md
|
|
355
|
+
└── ...
|
|
350
356
|
```
|
|
351
357
|
|
|
352
358
|
2. **Follow the existing patterns:**
|
|
@@ -357,7 +363,7 @@ templates/your-template/
|
|
|
357
363
|
|
|
358
364
|
3. **Required files:**
|
|
359
365
|
- `CLAUDE.md` - Comprehensive guide with overview, tech stack, patterns, and examples
|
|
360
|
-
- `.
|
|
366
|
+
- `.cursor/rules/overview.md` - Scope, core principles, and project structure
|
|
361
367
|
|
|
362
368
|
### Template Guidelines
|
|
363
369
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agentic-team-templates",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.18.0",
|
|
4
4
|
"description": "AI coding assistant templates for Cursor IDE. Pre-configured rules and guidelines that help AI assistants write better code. - use at your own risk",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"cursor",
|
package/src/index.js
CHANGED
|
@@ -10,6 +10,10 @@ const __filename = fileURLToPath(import.meta.url);
|
|
|
10
10
|
const __dirname = path.dirname(__filename);
|
|
11
11
|
const TEMPLATES_DIR = path.join(__dirname, '..', 'templates');
|
|
12
12
|
|
|
13
|
+
// Cursor rules directory paths
|
|
14
|
+
const CURSOR_RULES_DIR = '.cursor/rules'; // New path (Cursor IDE)
|
|
15
|
+
const LEGACY_CURSORRULES_DIR = '.cursorrules'; // Deprecated path
|
|
16
|
+
|
|
13
17
|
// Read package.json for version info
|
|
14
18
|
const packageJsonPath = path.join(__dirname, '..', 'package.json');
|
|
15
19
|
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
|
|
@@ -112,6 +116,10 @@ const TEMPLATES = {
|
|
|
112
116
|
description: 'AI agent utilities with context management and hallucination prevention',
|
|
113
117
|
rules: ['action-control.md', 'context-management.md', 'hallucination-prevention.md', 'overview.md', 'token-optimization.md']
|
|
114
118
|
},
|
|
119
|
+
'ux-designer': {
|
|
120
|
+
description: 'Principal-level UX design with user research, interaction design, design systems, accessibility, and emotional design',
|
|
121
|
+
rules: ['accessibility.md', 'emotional-design.md', 'handoff.md', 'information-architecture.md', 'interaction-design.md', 'overview.md', 'research.md', 'visual-design.md']
|
|
122
|
+
},
|
|
115
123
|
'web-backend': {
|
|
116
124
|
description: 'Backend APIs and services (REST, GraphQL, microservices)',
|
|
117
125
|
rules: ['api-design.md', 'authentication.md', 'database-patterns.md', 'error-handling.md', 'overview.md', 'security.md', 'testing.md']
|
|
@@ -143,6 +151,10 @@ const TEMPLATE_ALIASES = {
|
|
|
143
151
|
'cs': 'csharp-expert',
|
|
144
152
|
'teach': 'educator',
|
|
145
153
|
'teacher': 'educator',
|
|
154
|
+
'ux': 'ux-designer',
|
|
155
|
+
'uxd': 'ux-designer',
|
|
156
|
+
'design': 'ux-designer',
|
|
157
|
+
'designer': 'ux-designer',
|
|
146
158
|
};
|
|
147
159
|
|
|
148
160
|
/**
|
|
@@ -247,7 +259,7 @@ ${colors.yellow('Removal Options:')}
|
|
|
247
259
|
--reset Remove ALL installed content (shared rules, templates, generated files)
|
|
248
260
|
|
|
249
261
|
${colors.yellow('IDE Targets:')}
|
|
250
|
-
cursor .
|
|
262
|
+
cursor .cursor/rules/ directory (Cursor IDE)
|
|
251
263
|
claude CLAUDE.md file (Claude Code, Cursor with Claude)
|
|
252
264
|
codex .github/copilot-instructions.md (GitHub Copilot)
|
|
253
265
|
|
|
@@ -262,6 +274,7 @@ ${colors.yellow('Shorthand Aliases:')}
|
|
|
262
274
|
cpp → cpp-expert
|
|
263
275
|
csharp, cs → csharp-expert
|
|
264
276
|
teach, teacher → educator
|
|
277
|
+
ux, uxd, design, designer → ux-designer
|
|
265
278
|
|
|
266
279
|
${colors.yellow('Examples:')}
|
|
267
280
|
npx cursor-templates js
|
|
@@ -565,7 +578,7 @@ ${rules}`;
|
|
|
565
578
|
|
|
566
579
|
return `# CLAUDE.md - Development Guide
|
|
567
580
|
|
|
568
|
-
This project uses AI-assisted development with Cursor. The rules in \`.
|
|
581
|
+
This project uses AI-assisted development with Cursor. The rules in \`.cursor/rules/\` provide domain-specific guidance for the AI assistant.
|
|
569
582
|
|
|
570
583
|
---
|
|
571
584
|
|
|
@@ -578,7 +591,7 @@ ${templateList}
|
|
|
578
591
|
|
|
579
592
|
### Rule Files
|
|
580
593
|
|
|
581
|
-
All rules are in \`.
|
|
594
|
+
All rules are in \`.cursor/rules/\`. The AI assistant automatically reads these when working on your project.
|
|
582
595
|
|
|
583
596
|
#### Shared Rules (Apply to All Code)
|
|
584
597
|
|
|
@@ -641,13 +654,13 @@ A feature is complete when:
|
|
|
641
654
|
|
|
642
655
|
### Adding Project-Specific Rules
|
|
643
656
|
|
|
644
|
-
1. Create new \`.md\` files in \`.
|
|
657
|
+
1. Create new \`.md\` files in \`.cursor/rules/\`
|
|
645
658
|
2. Follow the existing naming convention
|
|
646
659
|
3. Include clear examples and anti-patterns
|
|
647
660
|
|
|
648
661
|
### Modifying Existing Rules
|
|
649
662
|
|
|
650
|
-
Edit files directly in \`.
|
|
663
|
+
Edit files directly in \`.cursor/rules/\`. Changes take effect immediately.
|
|
651
664
|
|
|
652
665
|
### Updating Templates
|
|
653
666
|
|
|
@@ -696,7 +709,7 @@ function generateCopilotInstructionsContent(installedTemplates) {
|
|
|
696
709
|
// Read and concatenate template-specific rules
|
|
697
710
|
const templateRulesContent = installedTemplates.map(template => {
|
|
698
711
|
return TEMPLATES[template].rules.map(rule => {
|
|
699
|
-
const rulePath = path.join(TEMPLATES_DIR, template, '.
|
|
712
|
+
const rulePath = path.join(TEMPLATES_DIR, template, '.cursor', 'rules', rule);
|
|
700
713
|
try {
|
|
701
714
|
return fs.readFileSync(rulePath, 'utf8');
|
|
702
715
|
} catch {
|
|
@@ -763,7 +776,7 @@ A feature is complete when:
|
|
|
763
776
|
`;
|
|
764
777
|
}
|
|
765
778
|
|
|
766
|
-
function install(targetDir, templates, dryRun = false, force = false, ides = DEFAULT_IDES) {
|
|
779
|
+
async function install(targetDir, templates, dryRun = false, force = false, ides = DEFAULT_IDES, skipConfirm = false) {
|
|
767
780
|
const stats = { copied: 0, skipped: 0, updated: 0, renamed: 0 };
|
|
768
781
|
const renamedFiles = [];
|
|
769
782
|
const installedFor = [];
|
|
@@ -775,20 +788,20 @@ function install(targetDir, templates, dryRun = false, force = false, ides = DEF
|
|
|
775
788
|
}
|
|
776
789
|
console.log();
|
|
777
790
|
|
|
778
|
-
// 1. Install .
|
|
791
|
+
// 1. Install .cursor/rules/ for Cursor IDE
|
|
779
792
|
if (ides.includes('cursor')) {
|
|
780
793
|
installedFor.push('cursor');
|
|
781
|
-
const
|
|
782
|
-
|
|
783
|
-
if (!dryRun && !fs.existsSync(
|
|
784
|
-
fs.mkdirSync(
|
|
794
|
+
const cursorRulesDir = path.join(targetDir, CURSOR_RULES_DIR);
|
|
795
|
+
|
|
796
|
+
if (!dryRun && !fs.existsSync(cursorRulesDir)) {
|
|
797
|
+
fs.mkdirSync(cursorRulesDir, { recursive: true });
|
|
785
798
|
}
|
|
786
799
|
|
|
787
800
|
// Install shared rules
|
|
788
|
-
console.log(colors.green(
|
|
801
|
+
console.log(colors.green(`► Installing shared rules (${CURSOR_RULES_DIR}/)...`));
|
|
789
802
|
for (const rule of SHARED_RULES) {
|
|
790
803
|
const src = path.join(TEMPLATES_DIR, '_shared', rule);
|
|
791
|
-
const dest = path.join(
|
|
804
|
+
const dest = path.join(cursorRulesDir, rule);
|
|
792
805
|
|
|
793
806
|
if (dryRun) {
|
|
794
807
|
const exists = fs.existsSync(dest);
|
|
@@ -820,11 +833,11 @@ function install(targetDir, templates, dryRun = false, force = false, ides = DEF
|
|
|
820
833
|
|
|
821
834
|
// Install template-specific rules
|
|
822
835
|
for (const template of templates) {
|
|
823
|
-
console.log(colors.green(`► Installing ${template} template (
|
|
824
|
-
|
|
836
|
+
console.log(colors.green(`► Installing ${template} template (${CURSOR_RULES_DIR}/)...`));
|
|
837
|
+
|
|
825
838
|
for (const rule of TEMPLATES[template].rules) {
|
|
826
|
-
const src = path.join(TEMPLATES_DIR, template, '.
|
|
827
|
-
const dest = path.join(
|
|
839
|
+
const src = path.join(TEMPLATES_DIR, template, '.cursor', 'rules', rule);
|
|
840
|
+
const dest = path.join(cursorRulesDir, `${template}-${rule}`);
|
|
828
841
|
const destName = `${template}-${rule}`;
|
|
829
842
|
|
|
830
843
|
if (dryRun) {
|
|
@@ -855,6 +868,46 @@ function install(targetDir, templates, dryRun = false, force = false, ides = DEF
|
|
|
855
868
|
}
|
|
856
869
|
console.log();
|
|
857
870
|
}
|
|
871
|
+
|
|
872
|
+
// Legacy .cursorrules/ detection and cleanup
|
|
873
|
+
const legacyDir = path.join(targetDir, LEGACY_CURSORRULES_DIR);
|
|
874
|
+
if (fs.existsSync(legacyDir)) {
|
|
875
|
+
console.log(colors.yellow(`⚠ Deprecated ${LEGACY_CURSORRULES_DIR}/ directory detected.`));
|
|
876
|
+
console.log(colors.yellow(` Cursor now uses ${CURSOR_RULES_DIR}/ for rule files.`));
|
|
877
|
+
console.log(colors.yellow(` New rules have been installed to ${CURSOR_RULES_DIR}/.`));
|
|
878
|
+
console.log();
|
|
879
|
+
console.log(colors.yellow(` Your existing ${LEGACY_CURSORRULES_DIR}/ files are still present.`));
|
|
880
|
+
console.log(colors.yellow(` Support for ${LEGACY_CURSORRULES_DIR}/ will be removed in a future version.`));
|
|
881
|
+
console.log();
|
|
882
|
+
|
|
883
|
+
if (!dryRun) {
|
|
884
|
+
const shouldCleanup = skipConfirm || await confirm(
|
|
885
|
+
colors.yellow(`? Would you like to remove the deprecated ${LEGACY_CURSORRULES_DIR}/ directory?`)
|
|
886
|
+
);
|
|
887
|
+
|
|
888
|
+
if (shouldCleanup) {
|
|
889
|
+
fs.rmSync(legacyDir, { recursive: true });
|
|
890
|
+
console.log(colors.green(` ✓ Removed deprecated ${LEGACY_CURSORRULES_DIR}/ directory.`));
|
|
891
|
+
} else {
|
|
892
|
+
// Create reference file so Cursor AI knows about legacy rules
|
|
893
|
+
const noticePath = path.join(cursorRulesDir, 'legacy-cursorrules-notice.md');
|
|
894
|
+
const noticeContent = `# Legacy Rules Notice
|
|
895
|
+
|
|
896
|
+
This project contains additional rule files in the deprecated \`.cursorrules/\` directory
|
|
897
|
+
at the project root. Those rules are still active and should be consulted alongside the
|
|
898
|
+
rules in this directory.
|
|
899
|
+
|
|
900
|
+
The \`.cursorrules/\` directory will be removed in a future version.
|
|
901
|
+
To clean up manually, move any custom rules to \`.cursor/rules/\` and delete \`.cursorrules/\`.
|
|
902
|
+
`;
|
|
903
|
+
fs.writeFileSync(noticePath, noticeContent);
|
|
904
|
+
console.log(colors.dim(` Created ${CURSOR_RULES_DIR}/legacy-cursorrules-notice.md as a reference.`));
|
|
905
|
+
}
|
|
906
|
+
} else {
|
|
907
|
+
console.log(colors.dim(' (dry-run: skipping cleanup prompt)'));
|
|
908
|
+
}
|
|
909
|
+
console.log();
|
|
910
|
+
}
|
|
858
911
|
}
|
|
859
912
|
|
|
860
913
|
// 2. Generate CLAUDE.md for Claude Code
|
|
@@ -981,7 +1034,7 @@ function install(targetDir, templates, dryRun = false, force = false, ides = DEF
|
|
|
981
1034
|
console.log(colors.yellow('Installed for:'));
|
|
982
1035
|
for (const ide of installedFor) {
|
|
983
1036
|
const ideInfo = {
|
|
984
|
-
cursor: '.
|
|
1037
|
+
cursor: '.cursor/rules/ (Cursor IDE)',
|
|
985
1038
|
claude: 'CLAUDE.md (Claude Code)',
|
|
986
1039
|
codex: '.github/copilot-instructions.md (GitHub Copilot)'
|
|
987
1040
|
};
|
|
@@ -1062,52 +1115,76 @@ async function remove(targetDir, templates, dryRun = false, force = false, skipC
|
|
|
1062
1115
|
console.log(`${colors.blue('Templates:')} ${templates.join(', ')}`);
|
|
1063
1116
|
console.log();
|
|
1064
1117
|
|
|
1065
|
-
// 1. Collect files to remove from .cursorrules/
|
|
1118
|
+
// 1. Collect files to remove from .cursor/rules/ (and legacy .cursorrules/)
|
|
1066
1119
|
if (ides.includes('cursor')) {
|
|
1067
|
-
const
|
|
1068
|
-
|
|
1069
|
-
|
|
1120
|
+
const cursorRulesDir = path.join(targetDir, CURSOR_RULES_DIR);
|
|
1121
|
+
const legacyDir = path.join(targetDir, LEGACY_CURSORRULES_DIR);
|
|
1122
|
+
const dirsToScan = [];
|
|
1123
|
+
|
|
1124
|
+
if (fs.existsSync(cursorRulesDir)) dirsToScan.push({ dir: cursorRulesDir, label: CURSOR_RULES_DIR });
|
|
1125
|
+
if (fs.existsSync(legacyDir)) dirsToScan.push({ dir: legacyDir, label: LEGACY_CURSORRULES_DIR });
|
|
1126
|
+
|
|
1127
|
+
if (dirsToScan.length > 0) {
|
|
1070
1128
|
for (const template of templates) {
|
|
1071
1129
|
console.log(colors.yellow(`► Scanning ${template} template files...`));
|
|
1072
|
-
|
|
1073
|
-
for (const
|
|
1074
|
-
const
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1130
|
+
|
|
1131
|
+
for (const { dir, label } of dirsToScan) {
|
|
1132
|
+
for (const rule of TEMPLATES[template].rules) {
|
|
1133
|
+
const destName = `${template}-${rule}`;
|
|
1134
|
+
const destPath = path.join(dir, destName);
|
|
1135
|
+
const srcPath = path.join(TEMPLATES_DIR, template, '.cursor', 'rules', rule);
|
|
1136
|
+
|
|
1137
|
+
if (!fs.existsSync(destPath)) {
|
|
1138
|
+
continue;
|
|
1139
|
+
}
|
|
1140
|
+
|
|
1141
|
+
const isUnmodified = isOurFile(destPath, srcPath);
|
|
1142
|
+
const displayName = `${destName} (${label}/)`;
|
|
1143
|
+
|
|
1144
|
+
if (!isUnmodified && !force) {
|
|
1145
|
+
console.log(` ${colors.yellow('[modified]')} ${displayName} (use --force to remove)`);
|
|
1146
|
+
modifiedFiles.push(displayName);
|
|
1147
|
+
stats.skipped++;
|
|
1148
|
+
} else {
|
|
1149
|
+
console.log(` ${colors.red('[remove]')} ${displayName}${!isUnmodified ? ' (modified, --force)' : ''}`);
|
|
1150
|
+
filesToRemove.push({ path: destPath, name: displayName });
|
|
1151
|
+
}
|
|
1082
1152
|
}
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1153
|
+
|
|
1154
|
+
// Also check for -1 variant files
|
|
1155
|
+
for (const rule of TEMPLATES[template].rules) {
|
|
1156
|
+
const altName = `${template}-${rule.replace('.md', '-1.md')}`;
|
|
1157
|
+
const altPath = path.join(dir, altName);
|
|
1158
|
+
|
|
1159
|
+
if (fs.existsSync(altPath)) {
|
|
1160
|
+
console.log(` ${colors.red('[remove]')} ${altName} (${label}/, alternate file)`);
|
|
1161
|
+
filesToRemove.push({ path: altPath, name: altName });
|
|
1162
|
+
}
|
|
1093
1163
|
}
|
|
1094
1164
|
}
|
|
1095
|
-
|
|
1096
|
-
//
|
|
1165
|
+
|
|
1166
|
+
// Check for legacy-cursorrules-notice.md in new dir
|
|
1167
|
+
const noticePath = path.join(cursorRulesDir, 'legacy-cursorrules-notice.md');
|
|
1168
|
+
if (fs.existsSync(noticePath)) {
|
|
1169
|
+
console.log(` ${colors.red('[remove]')} legacy-cursorrules-notice.md`);
|
|
1170
|
+
filesToRemove.push({ path: noticePath, name: 'legacy-cursorrules-notice.md' });
|
|
1171
|
+
}
|
|
1172
|
+
|
|
1173
|
+
// Log not-found for templates that weren't in either dir
|
|
1097
1174
|
for (const rule of TEMPLATES[template].rules) {
|
|
1098
|
-
const
|
|
1099
|
-
const
|
|
1100
|
-
|
|
1101
|
-
if (
|
|
1102
|
-
console.log(` ${colors.
|
|
1103
|
-
|
|
1175
|
+
const destName = `${template}-${rule}`;
|
|
1176
|
+
const inNew = fs.existsSync(path.join(cursorRulesDir, destName));
|
|
1177
|
+
const inLegacy = fs.existsSync(path.join(legacyDir, destName));
|
|
1178
|
+
if (!inNew && !inLegacy) {
|
|
1179
|
+
console.log(` ${colors.dim('[not found]')} ${destName}`);
|
|
1180
|
+
stats.notFound++;
|
|
1104
1181
|
}
|
|
1105
1182
|
}
|
|
1106
|
-
|
|
1183
|
+
|
|
1107
1184
|
console.log();
|
|
1108
1185
|
}
|
|
1109
1186
|
} else {
|
|
1110
|
-
console.log(colors.dim(
|
|
1187
|
+
console.log(colors.dim(`No ${CURSOR_RULES_DIR}/ or ${LEGACY_CURSORRULES_DIR}/ directory found.\n`));
|
|
1111
1188
|
}
|
|
1112
1189
|
}
|
|
1113
1190
|
|
|
@@ -1185,86 +1262,105 @@ async function reset(targetDir, dryRun = false, force = false, skipConfirm = fal
|
|
|
1185
1262
|
console.log(`${colors.blue('Target IDEs:')} ${ides.join(', ')}`);
|
|
1186
1263
|
console.log();
|
|
1187
1264
|
|
|
1188
|
-
// 1. Remove .cursorrules/ contents for Cursor
|
|
1265
|
+
// 1. Remove .cursor/rules/ and legacy .cursorrules/ contents for Cursor
|
|
1189
1266
|
if (ides.includes('cursor')) {
|
|
1190
|
-
const
|
|
1191
|
-
|
|
1192
|
-
|
|
1193
|
-
|
|
1194
|
-
|
|
1195
|
-
|
|
1196
|
-
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
const
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1206
|
-
modifiedFiles.push(rule);
|
|
1207
|
-
stats.skipped++;
|
|
1208
|
-
} else {
|
|
1209
|
-
console.log(` ${colors.red('[remove]')} ${rule}${!isUnmodified ? ' (modified, --force)' : ''}`);
|
|
1210
|
-
filesToRemove.push({ path: destPath, name: rule });
|
|
1211
|
-
}
|
|
1212
|
-
|
|
1213
|
-
// Check for -1 variant
|
|
1214
|
-
const altPath = path.join(cursorrules, rule.replace('.md', '-1.md'));
|
|
1215
|
-
if (fs.existsSync(altPath)) {
|
|
1216
|
-
console.log(` ${colors.red('[remove]')} ${rule.replace('.md', '-1.md')} (alternate file)`);
|
|
1217
|
-
filesToRemove.push({ path: altPath, name: rule.replace('.md', '-1.md') });
|
|
1218
|
-
}
|
|
1219
|
-
}
|
|
1220
|
-
|
|
1221
|
-
// Check template-specific rules
|
|
1222
|
-
for (const [templateName, templateInfo] of Object.entries(TEMPLATES)) {
|
|
1223
|
-
for (const rule of templateInfo.rules) {
|
|
1224
|
-
const destName = `${templateName}-${rule}`;
|
|
1225
|
-
const destPath = path.join(cursorrules, destName);
|
|
1226
|
-
const srcPath = path.join(TEMPLATES_DIR, templateName, '.cursorrules', rule);
|
|
1227
|
-
|
|
1267
|
+
const cursorRulesDir = path.join(targetDir, CURSOR_RULES_DIR);
|
|
1268
|
+
const legacyDir = path.join(targetDir, LEGACY_CURSORRULES_DIR);
|
|
1269
|
+
const dirsToScan = [];
|
|
1270
|
+
|
|
1271
|
+
if (fs.existsSync(cursorRulesDir)) dirsToScan.push({ dir: cursorRulesDir, label: CURSOR_RULES_DIR });
|
|
1272
|
+
if (fs.existsSync(legacyDir)) dirsToScan.push({ dir: legacyDir, label: LEGACY_CURSORRULES_DIR });
|
|
1273
|
+
|
|
1274
|
+
if (dirsToScan.length > 0) {
|
|
1275
|
+
for (const { dir, label } of dirsToScan) {
|
|
1276
|
+
console.log(colors.yellow(`► Scanning ${label}/ directory...`));
|
|
1277
|
+
|
|
1278
|
+
// Check shared rules
|
|
1279
|
+
for (const rule of SHARED_RULES) {
|
|
1280
|
+
const destPath = path.join(dir, rule);
|
|
1281
|
+
const srcPath = path.join(TEMPLATES_DIR, '_shared', rule);
|
|
1282
|
+
|
|
1228
1283
|
if (!fs.existsSync(destPath)) continue;
|
|
1229
|
-
|
|
1284
|
+
|
|
1230
1285
|
const isUnmodified = isOurFile(destPath, srcPath);
|
|
1231
|
-
|
|
1286
|
+
|
|
1232
1287
|
if (!isUnmodified && !force) {
|
|
1233
|
-
console.log(` ${colors.yellow('[modified]')} ${
|
|
1234
|
-
modifiedFiles.push(
|
|
1288
|
+
console.log(` ${colors.yellow('[modified]')} ${rule} (use --force to remove)`);
|
|
1289
|
+
modifiedFiles.push(`${rule} (${label}/)`);
|
|
1235
1290
|
stats.skipped++;
|
|
1236
1291
|
} else {
|
|
1237
|
-
console.log(` ${colors.red('[remove]')} ${
|
|
1238
|
-
filesToRemove.push({ path: destPath, name:
|
|
1292
|
+
console.log(` ${colors.red('[remove]')} ${rule}${!isUnmodified ? ' (modified, --force)' : ''}`);
|
|
1293
|
+
filesToRemove.push({ path: destPath, name: `${rule} (${label}/)` });
|
|
1239
1294
|
}
|
|
1240
|
-
|
|
1295
|
+
|
|
1241
1296
|
// Check for -1 variant
|
|
1242
|
-
const
|
|
1243
|
-
const altPath = path.join(cursorrules, altName);
|
|
1297
|
+
const altPath = path.join(dir, rule.replace('.md', '-1.md'));
|
|
1244
1298
|
if (fs.existsSync(altPath)) {
|
|
1245
|
-
console.log(` ${colors.red('[remove]')} ${
|
|
1246
|
-
filesToRemove.push({ path: altPath, name:
|
|
1299
|
+
console.log(` ${colors.red('[remove]')} ${rule.replace('.md', '-1.md')} (alternate file)`);
|
|
1300
|
+
filesToRemove.push({ path: altPath, name: rule.replace('.md', '-1.md') });
|
|
1247
1301
|
}
|
|
1248
1302
|
}
|
|
1303
|
+
|
|
1304
|
+
// Check template-specific rules
|
|
1305
|
+
for (const [templateName, templateInfo] of Object.entries(TEMPLATES)) {
|
|
1306
|
+
for (const rule of templateInfo.rules) {
|
|
1307
|
+
const destName = `${templateName}-${rule}`;
|
|
1308
|
+
const destPath = path.join(dir, destName);
|
|
1309
|
+
const srcPath = path.join(TEMPLATES_DIR, templateName, '.cursor', 'rules', rule);
|
|
1310
|
+
|
|
1311
|
+
if (!fs.existsSync(destPath)) continue;
|
|
1312
|
+
|
|
1313
|
+
const isUnmodified = isOurFile(destPath, srcPath);
|
|
1314
|
+
|
|
1315
|
+
if (!isUnmodified && !force) {
|
|
1316
|
+
console.log(` ${colors.yellow('[modified]')} ${destName} (use --force to remove)`);
|
|
1317
|
+
modifiedFiles.push(`${destName} (${label}/)`);
|
|
1318
|
+
stats.skipped++;
|
|
1319
|
+
} else {
|
|
1320
|
+
console.log(` ${colors.red('[remove]')} ${destName}${!isUnmodified ? ' (modified, --force)' : ''}`);
|
|
1321
|
+
filesToRemove.push({ path: destPath, name: `${destName} (${label}/)` });
|
|
1322
|
+
}
|
|
1323
|
+
|
|
1324
|
+
// Check for -1 variant
|
|
1325
|
+
const altName = destName.replace('.md', '-1.md');
|
|
1326
|
+
const altPath = path.join(dir, altName);
|
|
1327
|
+
if (fs.existsSync(altPath)) {
|
|
1328
|
+
console.log(` ${colors.red('[remove]')} ${altName} (alternate file)`);
|
|
1329
|
+
filesToRemove.push({ path: altPath, name: altName });
|
|
1330
|
+
}
|
|
1331
|
+
}
|
|
1332
|
+
}
|
|
1333
|
+
|
|
1334
|
+
// Check for legacy-cursorrules-notice.md
|
|
1335
|
+
const noticePath = path.join(dir, 'legacy-cursorrules-notice.md');
|
|
1336
|
+
if (fs.existsSync(noticePath)) {
|
|
1337
|
+
console.log(` ${colors.red('[remove]')} legacy-cursorrules-notice.md`);
|
|
1338
|
+
filesToRemove.push({ path: noticePath, name: 'legacy-cursorrules-notice.md' });
|
|
1339
|
+
}
|
|
1340
|
+
|
|
1341
|
+
// Check if we should remove the directory itself (only if it would be empty)
|
|
1342
|
+
const remainingFiles = fs.readdirSync(dir).filter(f => {
|
|
1343
|
+
const fullPath = path.join(dir, f);
|
|
1344
|
+
const willBeRemoved = filesToRemove.some(fr => fr.path === fullPath);
|
|
1345
|
+
return !willBeRemoved;
|
|
1346
|
+
});
|
|
1347
|
+
|
|
1348
|
+
if (remainingFiles.length === 0 || force) {
|
|
1349
|
+
console.log(` ${colors.red('[remove]')} ${label}/ directory`);
|
|
1350
|
+
dirsToRemove.push(dir);
|
|
1351
|
+
// If removing .cursor/rules/, also check if .cursor/ would be empty
|
|
1352
|
+
if (label === CURSOR_RULES_DIR) {
|
|
1353
|
+
const cursorDir = path.join(targetDir, '.cursor');
|
|
1354
|
+
dirsToRemove.push(cursorDir);
|
|
1355
|
+
}
|
|
1356
|
+
} else if (remainingFiles.length > 0) {
|
|
1357
|
+
console.log(colors.dim(` ${label}/ will be kept (${remainingFiles.length} non-template file(s) remain)`));
|
|
1358
|
+
}
|
|
1359
|
+
|
|
1360
|
+
console.log();
|
|
1249
1361
|
}
|
|
1250
|
-
|
|
1251
|
-
// Check if we should remove the directory itself (only if it would be empty)
|
|
1252
|
-
const remainingFiles = fs.readdirSync(cursorrules).filter(f => {
|
|
1253
|
-
const fullPath = path.join(cursorrules, f);
|
|
1254
|
-
const willBeRemoved = filesToRemove.some(fr => fr.path === fullPath);
|
|
1255
|
-
return !willBeRemoved;
|
|
1256
|
-
});
|
|
1257
|
-
|
|
1258
|
-
if (remainingFiles.length === 0 || force) {
|
|
1259
|
-
console.log(` ${colors.red('[remove]')} .cursorrules/ directory`);
|
|
1260
|
-
dirsToRemove.push(cursorrules);
|
|
1261
|
-
} else if (remainingFiles.length > 0) {
|
|
1262
|
-
console.log(colors.dim(` .cursorrules/ will be kept (${remainingFiles.length} non-template file(s) remain)`));
|
|
1263
|
-
}
|
|
1264
|
-
|
|
1265
|
-
console.log();
|
|
1266
1362
|
} else {
|
|
1267
|
-
console.log(colors.dim(
|
|
1363
|
+
console.log(colors.dim(`No ${CURSOR_RULES_DIR}/ or ${LEGACY_CURSORRULES_DIR}/ directory found.\n`));
|
|
1268
1364
|
}
|
|
1269
1365
|
}
|
|
1270
1366
|
|
|
@@ -1277,8 +1373,8 @@ async function reset(targetDir, dryRun = false, force = false, skipConfirm = fal
|
|
|
1277
1373
|
|
|
1278
1374
|
// Check if it contains our signature content
|
|
1279
1375
|
const content = fs.readFileSync(claudePath, 'utf8');
|
|
1280
|
-
const isOurs = content.includes('# CLAUDE.md - Development Guide') &&
|
|
1281
|
-
content.includes('.cursorrules/');
|
|
1376
|
+
const isOurs = content.includes('# CLAUDE.md - Development Guide') &&
|
|
1377
|
+
(content.includes('.cursor/rules/') || content.includes('.cursorrules/'));
|
|
1282
1378
|
|
|
1283
1379
|
if (!isOurs && !force) {
|
|
1284
1380
|
console.log(` ${colors.yellow('[modified]')} CLAUDE.md (doesn't match template, use --force)`);
|
|
@@ -1523,7 +1619,7 @@ export async function run(args) {
|
|
|
1523
1619
|
}
|
|
1524
1620
|
|
|
1525
1621
|
// Install to current directory
|
|
1526
|
-
install(process.cwd(), resolvedTemplates, dryRun, force, targetIdes);
|
|
1622
|
+
await install(process.cwd(), resolvedTemplates, dryRun, force, targetIdes, skipConfirm);
|
|
1527
1623
|
}
|
|
1528
1624
|
|
|
1529
1625
|
// Export internals for testing
|
|
@@ -1532,6 +1628,8 @@ export const _internals = {
|
|
|
1532
1628
|
CURRENT_VERSION,
|
|
1533
1629
|
REPO_URL,
|
|
1534
1630
|
CHANGELOG_URL,
|
|
1631
|
+
CURSOR_RULES_DIR,
|
|
1632
|
+
LEGACY_CURSORRULES_DIR,
|
|
1535
1633
|
TEMPLATES,
|
|
1536
1634
|
TEMPLATE_ALIASES,
|
|
1537
1635
|
SHARED_RULES,
|