agentic-team-templates 0.17.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 +212 -123
- package/src/index.test.js +137 -66
- /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/ux-designer/{.cursorrules → .cursor/rules}/accessibility.md +0 -0
- /package/templates/ux-designer/{.cursorrules → .cursor/rules}/emotional-design.md +0 -0
- /package/templates/ux-designer/{.cursorrules → .cursor/rules}/handoff.md +0 -0
- /package/templates/ux-designer/{.cursorrules → .cursor/rules}/information-architecture.md +0 -0
- /package/templates/ux-designer/{.cursorrules → .cursor/rules}/interaction-design.md +0 -0
- /package/templates/ux-designer/{.cursorrules → .cursor/rules}/overview.md +0 -0
- /package/templates/ux-designer/{.cursorrules → .cursor/rules}/research.md +0 -0
- /package/templates/ux-designer/{.cursorrules → .cursor/rules}/visual-design.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'));
|
|
@@ -255,7 +259,7 @@ ${colors.yellow('Removal Options:')}
|
|
|
255
259
|
--reset Remove ALL installed content (shared rules, templates, generated files)
|
|
256
260
|
|
|
257
261
|
${colors.yellow('IDE Targets:')}
|
|
258
|
-
cursor .
|
|
262
|
+
cursor .cursor/rules/ directory (Cursor IDE)
|
|
259
263
|
claude CLAUDE.md file (Claude Code, Cursor with Claude)
|
|
260
264
|
codex .github/copilot-instructions.md (GitHub Copilot)
|
|
261
265
|
|
|
@@ -574,7 +578,7 @@ ${rules}`;
|
|
|
574
578
|
|
|
575
579
|
return `# CLAUDE.md - Development Guide
|
|
576
580
|
|
|
577
|
-
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.
|
|
578
582
|
|
|
579
583
|
---
|
|
580
584
|
|
|
@@ -587,7 +591,7 @@ ${templateList}
|
|
|
587
591
|
|
|
588
592
|
### Rule Files
|
|
589
593
|
|
|
590
|
-
All rules are in \`.
|
|
594
|
+
All rules are in \`.cursor/rules/\`. The AI assistant automatically reads these when working on your project.
|
|
591
595
|
|
|
592
596
|
#### Shared Rules (Apply to All Code)
|
|
593
597
|
|
|
@@ -650,13 +654,13 @@ A feature is complete when:
|
|
|
650
654
|
|
|
651
655
|
### Adding Project-Specific Rules
|
|
652
656
|
|
|
653
|
-
1. Create new \`.md\` files in \`.
|
|
657
|
+
1. Create new \`.md\` files in \`.cursor/rules/\`
|
|
654
658
|
2. Follow the existing naming convention
|
|
655
659
|
3. Include clear examples and anti-patterns
|
|
656
660
|
|
|
657
661
|
### Modifying Existing Rules
|
|
658
662
|
|
|
659
|
-
Edit files directly in \`.
|
|
663
|
+
Edit files directly in \`.cursor/rules/\`. Changes take effect immediately.
|
|
660
664
|
|
|
661
665
|
### Updating Templates
|
|
662
666
|
|
|
@@ -705,7 +709,7 @@ function generateCopilotInstructionsContent(installedTemplates) {
|
|
|
705
709
|
// Read and concatenate template-specific rules
|
|
706
710
|
const templateRulesContent = installedTemplates.map(template => {
|
|
707
711
|
return TEMPLATES[template].rules.map(rule => {
|
|
708
|
-
const rulePath = path.join(TEMPLATES_DIR, template, '.
|
|
712
|
+
const rulePath = path.join(TEMPLATES_DIR, template, '.cursor', 'rules', rule);
|
|
709
713
|
try {
|
|
710
714
|
return fs.readFileSync(rulePath, 'utf8');
|
|
711
715
|
} catch {
|
|
@@ -772,7 +776,7 @@ A feature is complete when:
|
|
|
772
776
|
`;
|
|
773
777
|
}
|
|
774
778
|
|
|
775
|
-
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) {
|
|
776
780
|
const stats = { copied: 0, skipped: 0, updated: 0, renamed: 0 };
|
|
777
781
|
const renamedFiles = [];
|
|
778
782
|
const installedFor = [];
|
|
@@ -784,20 +788,20 @@ function install(targetDir, templates, dryRun = false, force = false, ides = DEF
|
|
|
784
788
|
}
|
|
785
789
|
console.log();
|
|
786
790
|
|
|
787
|
-
// 1. Install .
|
|
791
|
+
// 1. Install .cursor/rules/ for Cursor IDE
|
|
788
792
|
if (ides.includes('cursor')) {
|
|
789
793
|
installedFor.push('cursor');
|
|
790
|
-
const
|
|
791
|
-
|
|
792
|
-
if (!dryRun && !fs.existsSync(
|
|
793
|
-
fs.mkdirSync(
|
|
794
|
+
const cursorRulesDir = path.join(targetDir, CURSOR_RULES_DIR);
|
|
795
|
+
|
|
796
|
+
if (!dryRun && !fs.existsSync(cursorRulesDir)) {
|
|
797
|
+
fs.mkdirSync(cursorRulesDir, { recursive: true });
|
|
794
798
|
}
|
|
795
799
|
|
|
796
800
|
// Install shared rules
|
|
797
|
-
console.log(colors.green(
|
|
801
|
+
console.log(colors.green(`► Installing shared rules (${CURSOR_RULES_DIR}/)...`));
|
|
798
802
|
for (const rule of SHARED_RULES) {
|
|
799
803
|
const src = path.join(TEMPLATES_DIR, '_shared', rule);
|
|
800
|
-
const dest = path.join(
|
|
804
|
+
const dest = path.join(cursorRulesDir, rule);
|
|
801
805
|
|
|
802
806
|
if (dryRun) {
|
|
803
807
|
const exists = fs.existsSync(dest);
|
|
@@ -829,11 +833,11 @@ function install(targetDir, templates, dryRun = false, force = false, ides = DEF
|
|
|
829
833
|
|
|
830
834
|
// Install template-specific rules
|
|
831
835
|
for (const template of templates) {
|
|
832
|
-
console.log(colors.green(`► Installing ${template} template (
|
|
833
|
-
|
|
836
|
+
console.log(colors.green(`► Installing ${template} template (${CURSOR_RULES_DIR}/)...`));
|
|
837
|
+
|
|
834
838
|
for (const rule of TEMPLATES[template].rules) {
|
|
835
|
-
const src = path.join(TEMPLATES_DIR, template, '.
|
|
836
|
-
const dest = path.join(
|
|
839
|
+
const src = path.join(TEMPLATES_DIR, template, '.cursor', 'rules', rule);
|
|
840
|
+
const dest = path.join(cursorRulesDir, `${template}-${rule}`);
|
|
837
841
|
const destName = `${template}-${rule}`;
|
|
838
842
|
|
|
839
843
|
if (dryRun) {
|
|
@@ -864,6 +868,46 @@ function install(targetDir, templates, dryRun = false, force = false, ides = DEF
|
|
|
864
868
|
}
|
|
865
869
|
console.log();
|
|
866
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
|
+
}
|
|
867
911
|
}
|
|
868
912
|
|
|
869
913
|
// 2. Generate CLAUDE.md for Claude Code
|
|
@@ -990,7 +1034,7 @@ function install(targetDir, templates, dryRun = false, force = false, ides = DEF
|
|
|
990
1034
|
console.log(colors.yellow('Installed for:'));
|
|
991
1035
|
for (const ide of installedFor) {
|
|
992
1036
|
const ideInfo = {
|
|
993
|
-
cursor: '.
|
|
1037
|
+
cursor: '.cursor/rules/ (Cursor IDE)',
|
|
994
1038
|
claude: 'CLAUDE.md (Claude Code)',
|
|
995
1039
|
codex: '.github/copilot-instructions.md (GitHub Copilot)'
|
|
996
1040
|
};
|
|
@@ -1071,52 +1115,76 @@ async function remove(targetDir, templates, dryRun = false, force = false, skipC
|
|
|
1071
1115
|
console.log(`${colors.blue('Templates:')} ${templates.join(', ')}`);
|
|
1072
1116
|
console.log();
|
|
1073
1117
|
|
|
1074
|
-
// 1. Collect files to remove from .cursorrules/
|
|
1118
|
+
// 1. Collect files to remove from .cursor/rules/ (and legacy .cursorrules/)
|
|
1075
1119
|
if (ides.includes('cursor')) {
|
|
1076
|
-
const
|
|
1077
|
-
|
|
1078
|
-
|
|
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) {
|
|
1079
1128
|
for (const template of templates) {
|
|
1080
1129
|
console.log(colors.yellow(`► Scanning ${template} template files...`));
|
|
1081
|
-
|
|
1082
|
-
for (const
|
|
1083
|
-
const
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
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
|
+
}
|
|
1091
1152
|
}
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
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
|
+
}
|
|
1102
1163
|
}
|
|
1103
1164
|
}
|
|
1104
|
-
|
|
1105
|
-
//
|
|
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
|
|
1106
1174
|
for (const rule of TEMPLATES[template].rules) {
|
|
1107
|
-
const
|
|
1108
|
-
const
|
|
1109
|
-
|
|
1110
|
-
if (
|
|
1111
|
-
console.log(` ${colors.
|
|
1112
|
-
|
|
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++;
|
|
1113
1181
|
}
|
|
1114
1182
|
}
|
|
1115
|
-
|
|
1183
|
+
|
|
1116
1184
|
console.log();
|
|
1117
1185
|
}
|
|
1118
1186
|
} else {
|
|
1119
|
-
console.log(colors.dim(
|
|
1187
|
+
console.log(colors.dim(`No ${CURSOR_RULES_DIR}/ or ${LEGACY_CURSORRULES_DIR}/ directory found.\n`));
|
|
1120
1188
|
}
|
|
1121
1189
|
}
|
|
1122
1190
|
|
|
@@ -1194,86 +1262,105 @@ async function reset(targetDir, dryRun = false, force = false, skipConfirm = fal
|
|
|
1194
1262
|
console.log(`${colors.blue('Target IDEs:')} ${ides.join(', ')}`);
|
|
1195
1263
|
console.log();
|
|
1196
1264
|
|
|
1197
|
-
// 1. Remove .cursorrules/ contents for Cursor
|
|
1265
|
+
// 1. Remove .cursor/rules/ and legacy .cursorrules/ contents for Cursor
|
|
1198
1266
|
if (ides.includes('cursor')) {
|
|
1199
|
-
const
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1206
|
-
|
|
1207
|
-
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
const
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
modifiedFiles.push(rule);
|
|
1216
|
-
stats.skipped++;
|
|
1217
|
-
} else {
|
|
1218
|
-
console.log(` ${colors.red('[remove]')} ${rule}${!isUnmodified ? ' (modified, --force)' : ''}`);
|
|
1219
|
-
filesToRemove.push({ path: destPath, name: rule });
|
|
1220
|
-
}
|
|
1221
|
-
|
|
1222
|
-
// Check for -1 variant
|
|
1223
|
-
const altPath = path.join(cursorrules, rule.replace('.md', '-1.md'));
|
|
1224
|
-
if (fs.existsSync(altPath)) {
|
|
1225
|
-
console.log(` ${colors.red('[remove]')} ${rule.replace('.md', '-1.md')} (alternate file)`);
|
|
1226
|
-
filesToRemove.push({ path: altPath, name: rule.replace('.md', '-1.md') });
|
|
1227
|
-
}
|
|
1228
|
-
}
|
|
1229
|
-
|
|
1230
|
-
// Check template-specific rules
|
|
1231
|
-
for (const [templateName, templateInfo] of Object.entries(TEMPLATES)) {
|
|
1232
|
-
for (const rule of templateInfo.rules) {
|
|
1233
|
-
const destName = `${templateName}-${rule}`;
|
|
1234
|
-
const destPath = path.join(cursorrules, destName);
|
|
1235
|
-
const srcPath = path.join(TEMPLATES_DIR, templateName, '.cursorrules', rule);
|
|
1236
|
-
|
|
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
|
+
|
|
1237
1283
|
if (!fs.existsSync(destPath)) continue;
|
|
1238
|
-
|
|
1284
|
+
|
|
1239
1285
|
const isUnmodified = isOurFile(destPath, srcPath);
|
|
1240
|
-
|
|
1286
|
+
|
|
1241
1287
|
if (!isUnmodified && !force) {
|
|
1242
|
-
console.log(` ${colors.yellow('[modified]')} ${
|
|
1243
|
-
modifiedFiles.push(
|
|
1288
|
+
console.log(` ${colors.yellow('[modified]')} ${rule} (use --force to remove)`);
|
|
1289
|
+
modifiedFiles.push(`${rule} (${label}/)`);
|
|
1244
1290
|
stats.skipped++;
|
|
1245
1291
|
} else {
|
|
1246
|
-
console.log(` ${colors.red('[remove]')} ${
|
|
1247
|
-
filesToRemove.push({ path: destPath, name:
|
|
1292
|
+
console.log(` ${colors.red('[remove]')} ${rule}${!isUnmodified ? ' (modified, --force)' : ''}`);
|
|
1293
|
+
filesToRemove.push({ path: destPath, name: `${rule} (${label}/)` });
|
|
1248
1294
|
}
|
|
1249
|
-
|
|
1295
|
+
|
|
1250
1296
|
// Check for -1 variant
|
|
1251
|
-
const
|
|
1252
|
-
const altPath = path.join(cursorrules, altName);
|
|
1297
|
+
const altPath = path.join(dir, rule.replace('.md', '-1.md'));
|
|
1253
1298
|
if (fs.existsSync(altPath)) {
|
|
1254
|
-
console.log(` ${colors.red('[remove]')} ${
|
|
1255
|
-
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') });
|
|
1256
1301
|
}
|
|
1257
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();
|
|
1258
1361
|
}
|
|
1259
|
-
|
|
1260
|
-
// Check if we should remove the directory itself (only if it would be empty)
|
|
1261
|
-
const remainingFiles = fs.readdirSync(cursorrules).filter(f => {
|
|
1262
|
-
const fullPath = path.join(cursorrules, f);
|
|
1263
|
-
const willBeRemoved = filesToRemove.some(fr => fr.path === fullPath);
|
|
1264
|
-
return !willBeRemoved;
|
|
1265
|
-
});
|
|
1266
|
-
|
|
1267
|
-
if (remainingFiles.length === 0 || force) {
|
|
1268
|
-
console.log(` ${colors.red('[remove]')} .cursorrules/ directory`);
|
|
1269
|
-
dirsToRemove.push(cursorrules);
|
|
1270
|
-
} else if (remainingFiles.length > 0) {
|
|
1271
|
-
console.log(colors.dim(` .cursorrules/ will be kept (${remainingFiles.length} non-template file(s) remain)`));
|
|
1272
|
-
}
|
|
1273
|
-
|
|
1274
|
-
console.log();
|
|
1275
1362
|
} else {
|
|
1276
|
-
console.log(colors.dim(
|
|
1363
|
+
console.log(colors.dim(`No ${CURSOR_RULES_DIR}/ or ${LEGACY_CURSORRULES_DIR}/ directory found.\n`));
|
|
1277
1364
|
}
|
|
1278
1365
|
}
|
|
1279
1366
|
|
|
@@ -1286,8 +1373,8 @@ async function reset(targetDir, dryRun = false, force = false, skipConfirm = fal
|
|
|
1286
1373
|
|
|
1287
1374
|
// Check if it contains our signature content
|
|
1288
1375
|
const content = fs.readFileSync(claudePath, 'utf8');
|
|
1289
|
-
const isOurs = content.includes('# CLAUDE.md - Development Guide') &&
|
|
1290
|
-
content.includes('.cursorrules/');
|
|
1376
|
+
const isOurs = content.includes('# CLAUDE.md - Development Guide') &&
|
|
1377
|
+
(content.includes('.cursor/rules/') || content.includes('.cursorrules/'));
|
|
1291
1378
|
|
|
1292
1379
|
if (!isOurs && !force) {
|
|
1293
1380
|
console.log(` ${colors.yellow('[modified]')} CLAUDE.md (doesn't match template, use --force)`);
|
|
@@ -1532,7 +1619,7 @@ export async function run(args) {
|
|
|
1532
1619
|
}
|
|
1533
1620
|
|
|
1534
1621
|
// Install to current directory
|
|
1535
|
-
install(process.cwd(), resolvedTemplates, dryRun, force, targetIdes);
|
|
1622
|
+
await install(process.cwd(), resolvedTemplates, dryRun, force, targetIdes, skipConfirm);
|
|
1536
1623
|
}
|
|
1537
1624
|
|
|
1538
1625
|
// Export internals for testing
|
|
@@ -1541,6 +1628,8 @@ export const _internals = {
|
|
|
1541
1628
|
CURRENT_VERSION,
|
|
1542
1629
|
REPO_URL,
|
|
1543
1630
|
CHANGELOG_URL,
|
|
1631
|
+
CURSOR_RULES_DIR,
|
|
1632
|
+
LEGACY_CURSORRULES_DIR,
|
|
1544
1633
|
TEMPLATES,
|
|
1545
1634
|
TEMPLATE_ALIASES,
|
|
1546
1635
|
SHARED_RULES,
|