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.
Files changed (197) hide show
  1. package/README.md +30 -24
  2. package/package.json +1 -1
  3. package/src/index.js +212 -123
  4. package/src/index.test.js +137 -66
  5. /package/templates/blockchain/{.cursorrules → .cursor/rules}/defi-patterns.md +0 -0
  6. /package/templates/blockchain/{.cursorrules → .cursor/rules}/gas-optimization.md +0 -0
  7. /package/templates/blockchain/{.cursorrules → .cursor/rules}/overview.md +0 -0
  8. /package/templates/blockchain/{.cursorrules → .cursor/rules}/security.md +0 -0
  9. /package/templates/blockchain/{.cursorrules → .cursor/rules}/smart-contracts.md +0 -0
  10. /package/templates/blockchain/{.cursorrules → .cursor/rules}/testing.md +0 -0
  11. /package/templates/blockchain/{.cursorrules → .cursor/rules}/web3-integration.md +0 -0
  12. /package/templates/cli-tools/{.cursorrules → .cursor/rules}/architecture.md +0 -0
  13. /package/templates/cli-tools/{.cursorrules → .cursor/rules}/arguments.md +0 -0
  14. /package/templates/cli-tools/{.cursorrules → .cursor/rules}/distribution.md +0 -0
  15. /package/templates/cli-tools/{.cursorrules → .cursor/rules}/error-handling.md +0 -0
  16. /package/templates/cli-tools/{.cursorrules → .cursor/rules}/overview.md +0 -0
  17. /package/templates/cli-tools/{.cursorrules → .cursor/rules}/testing.md +0 -0
  18. /package/templates/cli-tools/{.cursorrules → .cursor/rules}/user-experience.md +0 -0
  19. /package/templates/cpp-expert/{.cursorrules → .cursor/rules}/concurrency.md +0 -0
  20. /package/templates/cpp-expert/{.cursorrules → .cursor/rules}/error-handling.md +0 -0
  21. /package/templates/cpp-expert/{.cursorrules → .cursor/rules}/memory-and-ownership.md +0 -0
  22. /package/templates/cpp-expert/{.cursorrules → .cursor/rules}/modern-cpp.md +0 -0
  23. /package/templates/cpp-expert/{.cursorrules → .cursor/rules}/overview.md +0 -0
  24. /package/templates/cpp-expert/{.cursorrules → .cursor/rules}/performance.md +0 -0
  25. /package/templates/cpp-expert/{.cursorrules → .cursor/rules}/testing.md +0 -0
  26. /package/templates/cpp-expert/{.cursorrules → .cursor/rules}/tooling.md +0 -0
  27. /package/templates/csharp-expert/{.cursorrules → .cursor/rules}/aspnet-core.md +0 -0
  28. /package/templates/csharp-expert/{.cursorrules → .cursor/rules}/async-patterns.md +0 -0
  29. /package/templates/csharp-expert/{.cursorrules → .cursor/rules}/dependency-injection.md +0 -0
  30. /package/templates/csharp-expert/{.cursorrules → .cursor/rules}/error-handling.md +0 -0
  31. /package/templates/csharp-expert/{.cursorrules → .cursor/rules}/language-features.md +0 -0
  32. /package/templates/csharp-expert/{.cursorrules → .cursor/rules}/overview.md +0 -0
  33. /package/templates/csharp-expert/{.cursorrules → .cursor/rules}/performance.md +0 -0
  34. /package/templates/csharp-expert/{.cursorrules → .cursor/rules}/testing.md +0 -0
  35. /package/templates/csharp-expert/{.cursorrules → .cursor/rules}/tooling.md +0 -0
  36. /package/templates/data-engineering/{.cursorrules → .cursor/rules}/data-modeling.md +0 -0
  37. /package/templates/data-engineering/{.cursorrules → .cursor/rules}/data-quality.md +0 -0
  38. /package/templates/data-engineering/{.cursorrules → .cursor/rules}/overview.md +0 -0
  39. /package/templates/data-engineering/{.cursorrules → .cursor/rules}/performance.md +0 -0
  40. /package/templates/data-engineering/{.cursorrules → .cursor/rules}/pipeline-design.md +0 -0
  41. /package/templates/data-engineering/{.cursorrules → .cursor/rules}/security.md +0 -0
  42. /package/templates/data-engineering/{.cursorrules → .cursor/rules}/testing.md +0 -0
  43. /package/templates/devops-sre/{.cursorrules → .cursor/rules}/capacity-planning.md +0 -0
  44. /package/templates/devops-sre/{.cursorrules → .cursor/rules}/change-management.md +0 -0
  45. /package/templates/devops-sre/{.cursorrules → .cursor/rules}/chaos-engineering.md +0 -0
  46. /package/templates/devops-sre/{.cursorrules → .cursor/rules}/disaster-recovery.md +0 -0
  47. /package/templates/devops-sre/{.cursorrules → .cursor/rules}/incident-management.md +0 -0
  48. /package/templates/devops-sre/{.cursorrules → .cursor/rules}/observability.md +0 -0
  49. /package/templates/devops-sre/{.cursorrules → .cursor/rules}/overview.md +0 -0
  50. /package/templates/devops-sre/{.cursorrules → .cursor/rules}/postmortems.md +0 -0
  51. /package/templates/devops-sre/{.cursorrules → .cursor/rules}/runbooks.md +0 -0
  52. /package/templates/devops-sre/{.cursorrules → .cursor/rules}/slo-sli.md +0 -0
  53. /package/templates/devops-sre/{.cursorrules → .cursor/rules}/toil-reduction.md +0 -0
  54. /package/templates/documentation/{.cursorrules → .cursor/rules}/adr.md +0 -0
  55. /package/templates/documentation/{.cursorrules → .cursor/rules}/api-documentation.md +0 -0
  56. /package/templates/documentation/{.cursorrules → .cursor/rules}/code-comments.md +0 -0
  57. /package/templates/documentation/{.cursorrules → .cursor/rules}/maintenance.md +0 -0
  58. /package/templates/documentation/{.cursorrules → .cursor/rules}/overview.md +0 -0
  59. /package/templates/documentation/{.cursorrules → .cursor/rules}/readme-standards.md +0 -0
  60. /package/templates/educator/{.cursorrules → .cursor/rules}/accessibility.md +0 -0
  61. /package/templates/educator/{.cursorrules → .cursor/rules}/assessment.md +0 -0
  62. /package/templates/educator/{.cursorrules → .cursor/rules}/curriculum.md +0 -0
  63. /package/templates/educator/{.cursorrules → .cursor/rules}/engagement.md +0 -0
  64. /package/templates/educator/{.cursorrules → .cursor/rules}/instructional-design.md +0 -0
  65. /package/templates/educator/{.cursorrules → .cursor/rules}/overview.md +0 -0
  66. /package/templates/educator/{.cursorrules → .cursor/rules}/retention.md +0 -0
  67. /package/templates/fullstack/{.cursorrules → .cursor/rules}/api-contracts.md +0 -0
  68. /package/templates/fullstack/{.cursorrules → .cursor/rules}/architecture.md +0 -0
  69. /package/templates/fullstack/{.cursorrules → .cursor/rules}/overview.md +0 -0
  70. /package/templates/fullstack/{.cursorrules → .cursor/rules}/shared-types.md +0 -0
  71. /package/templates/fullstack/{.cursorrules → .cursor/rules}/testing.md +0 -0
  72. /package/templates/golang-expert/{.cursorrules → .cursor/rules}/concurrency.md +0 -0
  73. /package/templates/golang-expert/{.cursorrules → .cursor/rules}/error-handling.md +0 -0
  74. /package/templates/golang-expert/{.cursorrules → .cursor/rules}/interfaces-and-types.md +0 -0
  75. /package/templates/golang-expert/{.cursorrules → .cursor/rules}/overview.md +0 -0
  76. /package/templates/golang-expert/{.cursorrules → .cursor/rules}/performance.md +0 -0
  77. /package/templates/golang-expert/{.cursorrules → .cursor/rules}/production-patterns.md +0 -0
  78. /package/templates/golang-expert/{.cursorrules → .cursor/rules}/stdlib-and-tooling.md +0 -0
  79. /package/templates/golang-expert/{.cursorrules → .cursor/rules}/testing.md +0 -0
  80. /package/templates/java-expert/{.cursorrules → .cursor/rules}/concurrency.md +0 -0
  81. /package/templates/java-expert/{.cursorrules → .cursor/rules}/error-handling.md +0 -0
  82. /package/templates/java-expert/{.cursorrules → .cursor/rules}/modern-java.md +0 -0
  83. /package/templates/java-expert/{.cursorrules → .cursor/rules}/overview.md +0 -0
  84. /package/templates/java-expert/{.cursorrules → .cursor/rules}/performance.md +0 -0
  85. /package/templates/java-expert/{.cursorrules → .cursor/rules}/persistence.md +0 -0
  86. /package/templates/java-expert/{.cursorrules → .cursor/rules}/spring-boot.md +0 -0
  87. /package/templates/java-expert/{.cursorrules → .cursor/rules}/testing.md +0 -0
  88. /package/templates/java-expert/{.cursorrules → .cursor/rules}/tooling.md +0 -0
  89. /package/templates/javascript-expert/{.cursorrules → .cursor/rules}/language-deep-dive.md +0 -0
  90. /package/templates/javascript-expert/{.cursorrules → .cursor/rules}/node-patterns.md +0 -0
  91. /package/templates/javascript-expert/{.cursorrules → .cursor/rules}/overview.md +0 -0
  92. /package/templates/javascript-expert/{.cursorrules → .cursor/rules}/performance.md +0 -0
  93. /package/templates/javascript-expert/{.cursorrules → .cursor/rules}/react-patterns.md +0 -0
  94. /package/templates/javascript-expert/{.cursorrules → .cursor/rules}/testing.md +0 -0
  95. /package/templates/javascript-expert/{.cursorrules → .cursor/rules}/tooling.md +0 -0
  96. /package/templates/javascript-expert/{.cursorrules → .cursor/rules}/typescript-deep-dive.md +0 -0
  97. /package/templates/kotlin-expert/{.cursorrules → .cursor/rules}/coroutines.md +0 -0
  98. /package/templates/kotlin-expert/{.cursorrules → .cursor/rules}/error-handling.md +0 -0
  99. /package/templates/kotlin-expert/{.cursorrules → .cursor/rules}/frameworks.md +0 -0
  100. /package/templates/kotlin-expert/{.cursorrules → .cursor/rules}/language-features.md +0 -0
  101. /package/templates/kotlin-expert/{.cursorrules → .cursor/rules}/overview.md +0 -0
  102. /package/templates/kotlin-expert/{.cursorrules → .cursor/rules}/performance.md +0 -0
  103. /package/templates/kotlin-expert/{.cursorrules → .cursor/rules}/testing.md +0 -0
  104. /package/templates/kotlin-expert/{.cursorrules → .cursor/rules}/tooling.md +0 -0
  105. /package/templates/ml-ai/{.cursorrules → .cursor/rules}/data-engineering.md +0 -0
  106. /package/templates/ml-ai/{.cursorrules → .cursor/rules}/deployment.md +0 -0
  107. /package/templates/ml-ai/{.cursorrules → .cursor/rules}/model-development.md +0 -0
  108. /package/templates/ml-ai/{.cursorrules → .cursor/rules}/monitoring.md +0 -0
  109. /package/templates/ml-ai/{.cursorrules → .cursor/rules}/overview.md +0 -0
  110. /package/templates/ml-ai/{.cursorrules → .cursor/rules}/security.md +0 -0
  111. /package/templates/ml-ai/{.cursorrules → .cursor/rules}/testing.md +0 -0
  112. /package/templates/mobile/{.cursorrules → .cursor/rules}/navigation.md +0 -0
  113. /package/templates/mobile/{.cursorrules → .cursor/rules}/offline-first.md +0 -0
  114. /package/templates/mobile/{.cursorrules → .cursor/rules}/overview.md +0 -0
  115. /package/templates/mobile/{.cursorrules → .cursor/rules}/performance.md +0 -0
  116. /package/templates/mobile/{.cursorrules → .cursor/rules}/testing.md +0 -0
  117. /package/templates/platform-engineering/{.cursorrules → .cursor/rules}/ci-cd.md +0 -0
  118. /package/templates/platform-engineering/{.cursorrules → .cursor/rules}/developer-experience.md +0 -0
  119. /package/templates/platform-engineering/{.cursorrules → .cursor/rules}/infrastructure-as-code.md +0 -0
  120. /package/templates/platform-engineering/{.cursorrules → .cursor/rules}/kubernetes.md +0 -0
  121. /package/templates/platform-engineering/{.cursorrules → .cursor/rules}/observability.md +0 -0
  122. /package/templates/platform-engineering/{.cursorrules → .cursor/rules}/overview.md +0 -0
  123. /package/templates/platform-engineering/{.cursorrules → .cursor/rules}/security.md +0 -0
  124. /package/templates/platform-engineering/{.cursorrules → .cursor/rules}/testing.md +0 -0
  125. /package/templates/product-manager/{.cursorrules → .cursor/rules}/communication.md +0 -0
  126. /package/templates/product-manager/{.cursorrules → .cursor/rules}/discovery.md +0 -0
  127. /package/templates/product-manager/{.cursorrules → .cursor/rules}/metrics.md +0 -0
  128. /package/templates/product-manager/{.cursorrules → .cursor/rules}/overview.md +0 -0
  129. /package/templates/product-manager/{.cursorrules → .cursor/rules}/prioritization.md +0 -0
  130. /package/templates/product-manager/{.cursorrules → .cursor/rules}/requirements.md +0 -0
  131. /package/templates/python-expert/{.cursorrules → .cursor/rules}/async-python.md +0 -0
  132. /package/templates/python-expert/{.cursorrules → .cursor/rules}/overview.md +0 -0
  133. /package/templates/python-expert/{.cursorrules → .cursor/rules}/patterns-and-idioms.md +0 -0
  134. /package/templates/python-expert/{.cursorrules → .cursor/rules}/performance.md +0 -0
  135. /package/templates/python-expert/{.cursorrules → .cursor/rules}/testing.md +0 -0
  136. /package/templates/python-expert/{.cursorrules → .cursor/rules}/tooling.md +0 -0
  137. /package/templates/python-expert/{.cursorrules → .cursor/rules}/type-system.md +0 -0
  138. /package/templates/python-expert/{.cursorrules → .cursor/rules}/web-and-apis.md +0 -0
  139. /package/templates/qa-engineering/{.cursorrules → .cursor/rules}/automation.md +0 -0
  140. /package/templates/qa-engineering/{.cursorrules → .cursor/rules}/metrics.md +0 -0
  141. /package/templates/qa-engineering/{.cursorrules → .cursor/rules}/overview.md +0 -0
  142. /package/templates/qa-engineering/{.cursorrules → .cursor/rules}/quality-gates.md +0 -0
  143. /package/templates/qa-engineering/{.cursorrules → .cursor/rules}/test-design.md +0 -0
  144. /package/templates/qa-engineering/{.cursorrules → .cursor/rules}/test-strategy.md +0 -0
  145. /package/templates/rust-expert/{.cursorrules → .cursor/rules}/concurrency.md +0 -0
  146. /package/templates/rust-expert/{.cursorrules → .cursor/rules}/ecosystem-and-tooling.md +0 -0
  147. /package/templates/rust-expert/{.cursorrules → .cursor/rules}/error-handling.md +0 -0
  148. /package/templates/rust-expert/{.cursorrules → .cursor/rules}/overview.md +0 -0
  149. /package/templates/rust-expert/{.cursorrules → .cursor/rules}/ownership-and-borrowing.md +0 -0
  150. /package/templates/rust-expert/{.cursorrules → .cursor/rules}/performance-and-unsafe.md +0 -0
  151. /package/templates/rust-expert/{.cursorrules → .cursor/rules}/testing.md +0 -0
  152. /package/templates/rust-expert/{.cursorrules → .cursor/rules}/traits-and-generics.md +0 -0
  153. /package/templates/swift-expert/{.cursorrules → .cursor/rules}/concurrency.md +0 -0
  154. /package/templates/swift-expert/{.cursorrules → .cursor/rules}/error-handling.md +0 -0
  155. /package/templates/swift-expert/{.cursorrules → .cursor/rules}/language-features.md +0 -0
  156. /package/templates/swift-expert/{.cursorrules → .cursor/rules}/overview.md +0 -0
  157. /package/templates/swift-expert/{.cursorrules → .cursor/rules}/performance.md +0 -0
  158. /package/templates/swift-expert/{.cursorrules → .cursor/rules}/swiftui.md +0 -0
  159. /package/templates/swift-expert/{.cursorrules → .cursor/rules}/testing.md +0 -0
  160. /package/templates/swift-expert/{.cursorrules → .cursor/rules}/tooling.md +0 -0
  161. /package/templates/testing/{.cursorrules → .cursor/rules}/advanced-techniques.md +0 -0
  162. /package/templates/testing/{.cursorrules → .cursor/rules}/ci-cd-integration.md +0 -0
  163. /package/templates/testing/{.cursorrules → .cursor/rules}/overview.md +0 -0
  164. /package/templates/testing/{.cursorrules → .cursor/rules}/performance-testing.md +0 -0
  165. /package/templates/testing/{.cursorrules → .cursor/rules}/quality-metrics.md +0 -0
  166. /package/templates/testing/{.cursorrules → .cursor/rules}/reliability.md +0 -0
  167. /package/templates/testing/{.cursorrules → .cursor/rules}/tdd-methodology.md +0 -0
  168. /package/templates/testing/{.cursorrules → .cursor/rules}/test-data.md +0 -0
  169. /package/templates/testing/{.cursorrules → .cursor/rules}/test-design.md +0 -0
  170. /package/templates/testing/{.cursorrules → .cursor/rules}/test-types.md +0 -0
  171. /package/templates/utility-agent/{.cursorrules → .cursor/rules}/action-control.md +0 -0
  172. /package/templates/utility-agent/{.cursorrules → .cursor/rules}/context-management.md +0 -0
  173. /package/templates/utility-agent/{.cursorrules → .cursor/rules}/hallucination-prevention.md +0 -0
  174. /package/templates/utility-agent/{.cursorrules → .cursor/rules}/overview.md +0 -0
  175. /package/templates/utility-agent/{.cursorrules → .cursor/rules}/token-optimization.md +0 -0
  176. /package/templates/ux-designer/{.cursorrules → .cursor/rules}/accessibility.md +0 -0
  177. /package/templates/ux-designer/{.cursorrules → .cursor/rules}/emotional-design.md +0 -0
  178. /package/templates/ux-designer/{.cursorrules → .cursor/rules}/handoff.md +0 -0
  179. /package/templates/ux-designer/{.cursorrules → .cursor/rules}/information-architecture.md +0 -0
  180. /package/templates/ux-designer/{.cursorrules → .cursor/rules}/interaction-design.md +0 -0
  181. /package/templates/ux-designer/{.cursorrules → .cursor/rules}/overview.md +0 -0
  182. /package/templates/ux-designer/{.cursorrules → .cursor/rules}/research.md +0 -0
  183. /package/templates/ux-designer/{.cursorrules → .cursor/rules}/visual-design.md +0 -0
  184. /package/templates/web-backend/{.cursorrules → .cursor/rules}/api-design.md +0 -0
  185. /package/templates/web-backend/{.cursorrules → .cursor/rules}/authentication.md +0 -0
  186. /package/templates/web-backend/{.cursorrules → .cursor/rules}/database-patterns.md +0 -0
  187. /package/templates/web-backend/{.cursorrules → .cursor/rules}/error-handling.md +0 -0
  188. /package/templates/web-backend/{.cursorrules → .cursor/rules}/overview.md +0 -0
  189. /package/templates/web-backend/{.cursorrules → .cursor/rules}/security.md +0 -0
  190. /package/templates/web-backend/{.cursorrules → .cursor/rules}/testing.md +0 -0
  191. /package/templates/web-frontend/{.cursorrules → .cursor/rules}/accessibility.md +0 -0
  192. /package/templates/web-frontend/{.cursorrules → .cursor/rules}/component-patterns.md +0 -0
  193. /package/templates/web-frontend/{.cursorrules → .cursor/rules}/overview.md +0 -0
  194. /package/templates/web-frontend/{.cursorrules → .cursor/rules}/performance.md +0 -0
  195. /package/templates/web-frontend/{.cursorrules → .cursor/rules}/state-management.md +0 -0
  196. /package/templates/web-frontend/{.cursorrules → .cursor/rules}/styling.md +0 -0
  197. /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
- - **`.cursorrules/`** - Rule files for Cursor IDE
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
- ├── .cursorrules/ # Rule files (Cursor IDE)
208
- ├── core-principles.md # Shared
209
- ├── code-quality.md # Shared
210
- ├── security-fundamentals.md # Shared
211
- ├── git-workflow.md # Shared
212
- ├── communication.md # Shared
213
- ├── web-frontend-overview.md # Template-specific
214
- ├── web-frontend-accessibility.md # Template-specific
215
- ├── web-frontend-component-patterns.md # Template-specific
216
- ├── web-frontend-performance.md # Template-specific
217
- ├── web-frontend-state-management.md # Template-specific
218
- ├── web-frontend-styling.md # Template-specific
219
- └── web-frontend-testing.md # Template-specific
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 `.cursorrules/`:
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 `.cursorrules/` or `CLAUDE.md` directly. Changes take effect immediately.
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 `.cursorrules/` directory. Existing files are preserved unless they have the same name.
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 `.cursorrules/` support)
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
- └── .cursorrules/
346
- ├── overview.md # Scope and core principles (required)
347
- ├── topic-one.md # Domain-specific rules
348
- ├── topic-two.md
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
- - `.cursorrules/overview.md` - Scope, core principles, and project structure
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.17.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 .cursorrules/ directory (Cursor IDE)
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 \`.cursorrules/\` provide domain-specific guidance for the AI assistant.
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 \`.cursorrules/\`. The AI assistant automatically reads these when working on your project.
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 \`.cursorrules/\`
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 \`.cursorrules/\`. Changes take effect immediately.
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, '.cursorrules', rule);
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 .cursorrules/ for Cursor IDE
791
+ // 1. Install .cursor/rules/ for Cursor IDE
788
792
  if (ides.includes('cursor')) {
789
793
  installedFor.push('cursor');
790
- const cursorrules = path.join(targetDir, '.cursorrules');
791
-
792
- if (!dryRun && !fs.existsSync(cursorrules)) {
793
- fs.mkdirSync(cursorrules, { recursive: true });
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('► Installing shared rules (.cursorrules/)...'));
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(cursorrules, rule);
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 (.cursorrules/)...`));
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, '.cursorrules', rule);
836
- const dest = path.join(cursorrules, `${template}-${rule}`);
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: '.cursorrules/ (Cursor IDE)',
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 cursorrules = path.join(targetDir, '.cursorrules');
1077
-
1078
- if (fs.existsSync(cursorrules)) {
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 rule of TEMPLATES[template].rules) {
1083
- const destName = `${template}-${rule}`;
1084
- const destPath = path.join(cursorrules, destName);
1085
- const srcPath = path.join(TEMPLATES_DIR, template, '.cursorrules', rule);
1086
-
1087
- if (!fs.existsSync(destPath)) {
1088
- console.log(` ${colors.dim('[not found]')} ${destName}`);
1089
- stats.notFound++;
1090
- continue;
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
- const isUnmodified = isOurFile(destPath, srcPath);
1094
-
1095
- if (!isUnmodified && !force) {
1096
- console.log(` ${colors.yellow('[modified]')} ${destName} (use --force to remove)`);
1097
- modifiedFiles.push(destName);
1098
- stats.skipped++;
1099
- } else {
1100
- console.log(` ${colors.red('[remove]')} ${destName}${!isUnmodified ? ' (modified, --force)' : ''}`);
1101
- filesToRemove.push({ path: destPath, name: destName });
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
- // Also check for -1 variant files
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 altName = `${template}-${rule.replace('.md', '-1.md')}`;
1108
- const altPath = path.join(cursorrules, altName);
1109
-
1110
- if (fs.existsSync(altPath)) {
1111
- console.log(` ${colors.red('[remove]')} ${altName} (alternate file)`);
1112
- filesToRemove.push({ path: altPath, name: altName });
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('No .cursorrules/ directory found.\n'));
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 cursorrules = path.join(targetDir, '.cursorrules');
1200
-
1201
- if (fs.existsSync(cursorrules)) {
1202
- console.log(colors.yellow('► Scanning .cursorrules/ directory...'));
1203
-
1204
- // Check shared rules
1205
- for (const rule of SHARED_RULES) {
1206
- const destPath = path.join(cursorrules, rule);
1207
- const srcPath = path.join(TEMPLATES_DIR, '_shared', rule);
1208
-
1209
- if (!fs.existsSync(destPath)) continue;
1210
-
1211
- const isUnmodified = isOurFile(destPath, srcPath);
1212
-
1213
- if (!isUnmodified && !force) {
1214
- console.log(` ${colors.yellow('[modified]')} ${rule} (use --force to remove)`);
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]')} ${destName} (use --force to remove)`);
1243
- modifiedFiles.push(destName);
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]')} ${destName}${!isUnmodified ? ' (modified, --force)' : ''}`);
1247
- filesToRemove.push({ path: destPath, name: destName });
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 altName = destName.replace('.md', '-1.md');
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]')} ${altName} (alternate file)`);
1255
- filesToRemove.push({ path: altPath, name: altName });
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('No .cursorrules/ directory found.\n'));
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,