agentic-team-templates 0.17.0 → 0.19.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 (223) hide show
  1. package/README.md +36 -29
  2. package/package.json +1 -1
  3. package/src/index.js +297 -127
  4. package/src/index.test.js +165 -68
  5. /package/templates/{utility-agent/.cursorrules → agents/utility-agent/.cursor/rules}/action-control.md +0 -0
  6. /package/templates/{utility-agent/.cursorrules → agents/utility-agent/.cursor/rules}/context-management.md +0 -0
  7. /package/templates/{utility-agent/.cursorrules → agents/utility-agent/.cursor/rules}/hallucination-prevention.md +0 -0
  8. /package/templates/{utility-agent/.cursorrules → agents/utility-agent/.cursor/rules}/overview.md +0 -0
  9. /package/templates/{utility-agent/.cursorrules → agents/utility-agent/.cursor/rules}/token-optimization.md +0 -0
  10. /package/templates/{utility-agent → agents/utility-agent}/CLAUDE.md +0 -0
  11. /package/templates/{product-manager/.cursorrules → business/product-manager/.cursor/rules}/communication.md +0 -0
  12. /package/templates/{product-manager/.cursorrules → business/product-manager/.cursor/rules}/discovery.md +0 -0
  13. /package/templates/{product-manager/.cursorrules → business/product-manager/.cursor/rules}/metrics.md +0 -0
  14. /package/templates/{product-manager/.cursorrules → business/product-manager/.cursor/rules}/overview.md +0 -0
  15. /package/templates/{product-manager/.cursorrules → business/product-manager/.cursor/rules}/prioritization.md +0 -0
  16. /package/templates/{product-manager/.cursorrules → business/product-manager/.cursor/rules}/requirements.md +0 -0
  17. /package/templates/{product-manager → business/product-manager}/CLAUDE.md +0 -0
  18. /package/templates/{ux-designer/.cursorrules → creative/ux-designer/.cursor/rules}/accessibility.md +0 -0
  19. /package/templates/{ux-designer/.cursorrules → creative/ux-designer/.cursor/rules}/emotional-design.md +0 -0
  20. /package/templates/{ux-designer/.cursorrules → creative/ux-designer/.cursor/rules}/handoff.md +0 -0
  21. /package/templates/{ux-designer/.cursorrules → creative/ux-designer/.cursor/rules}/information-architecture.md +0 -0
  22. /package/templates/{ux-designer/.cursorrules → creative/ux-designer/.cursor/rules}/interaction-design.md +0 -0
  23. /package/templates/{ux-designer/.cursorrules → creative/ux-designer/.cursor/rules}/overview.md +0 -0
  24. /package/templates/{ux-designer/.cursorrules → creative/ux-designer/.cursor/rules}/research.md +0 -0
  25. /package/templates/{ux-designer/.cursorrules → creative/ux-designer/.cursor/rules}/visual-design.md +0 -0
  26. /package/templates/{ux-designer → creative/ux-designer}/CLAUDE.md +0 -0
  27. /package/templates/{educator/.cursorrules → education/educator/.cursor/rules}/accessibility.md +0 -0
  28. /package/templates/{educator/.cursorrules → education/educator/.cursor/rules}/assessment.md +0 -0
  29. /package/templates/{educator/.cursorrules → education/educator/.cursor/rules}/curriculum.md +0 -0
  30. /package/templates/{educator/.cursorrules → education/educator/.cursor/rules}/engagement.md +0 -0
  31. /package/templates/{educator/.cursorrules → education/educator/.cursor/rules}/instructional-design.md +0 -0
  32. /package/templates/{educator/.cursorrules → education/educator/.cursor/rules}/overview.md +0 -0
  33. /package/templates/{educator/.cursorrules → education/educator/.cursor/rules}/retention.md +0 -0
  34. /package/templates/{educator → education/educator}/CLAUDE.md +0 -0
  35. /package/templates/{blockchain/.cursorrules → engineering/blockchain/.cursor/rules}/defi-patterns.md +0 -0
  36. /package/templates/{blockchain/.cursorrules → engineering/blockchain/.cursor/rules}/gas-optimization.md +0 -0
  37. /package/templates/{blockchain/.cursorrules → engineering/blockchain/.cursor/rules}/overview.md +0 -0
  38. /package/templates/{blockchain/.cursorrules → engineering/blockchain/.cursor/rules}/security.md +0 -0
  39. /package/templates/{blockchain/.cursorrules → engineering/blockchain/.cursor/rules}/smart-contracts.md +0 -0
  40. /package/templates/{blockchain/.cursorrules → engineering/blockchain/.cursor/rules}/testing.md +0 -0
  41. /package/templates/{blockchain/.cursorrules → engineering/blockchain/.cursor/rules}/web3-integration.md +0 -0
  42. /package/templates/{blockchain → engineering/blockchain}/CLAUDE.md +0 -0
  43. /package/templates/{cli-tools/.cursorrules → engineering/cli-tools/.cursor/rules}/architecture.md +0 -0
  44. /package/templates/{cli-tools/.cursorrules → engineering/cli-tools/.cursor/rules}/arguments.md +0 -0
  45. /package/templates/{cli-tools/.cursorrules → engineering/cli-tools/.cursor/rules}/distribution.md +0 -0
  46. /package/templates/{cli-tools/.cursorrules → engineering/cli-tools/.cursor/rules}/error-handling.md +0 -0
  47. /package/templates/{cli-tools/.cursorrules → engineering/cli-tools/.cursor/rules}/overview.md +0 -0
  48. /package/templates/{cli-tools/.cursorrules → engineering/cli-tools/.cursor/rules}/testing.md +0 -0
  49. /package/templates/{cli-tools/.cursorrules → engineering/cli-tools/.cursor/rules}/user-experience.md +0 -0
  50. /package/templates/{cli-tools → engineering/cli-tools}/CLAUDE.md +0 -0
  51. /package/templates/{data-engineering/.cursorrules → engineering/data-engineering/.cursor/rules}/data-modeling.md +0 -0
  52. /package/templates/{data-engineering/.cursorrules → engineering/data-engineering/.cursor/rules}/data-quality.md +0 -0
  53. /package/templates/{data-engineering/.cursorrules → engineering/data-engineering/.cursor/rules}/overview.md +0 -0
  54. /package/templates/{data-engineering/.cursorrules → engineering/data-engineering/.cursor/rules}/performance.md +0 -0
  55. /package/templates/{data-engineering/.cursorrules → engineering/data-engineering/.cursor/rules}/pipeline-design.md +0 -0
  56. /package/templates/{data-engineering/.cursorrules → engineering/data-engineering/.cursor/rules}/security.md +0 -0
  57. /package/templates/{data-engineering/.cursorrules → engineering/data-engineering/.cursor/rules}/testing.md +0 -0
  58. /package/templates/{data-engineering → engineering/data-engineering}/CLAUDE.md +0 -0
  59. /package/templates/{devops-sre/.cursorrules → engineering/devops-sre/.cursor/rules}/capacity-planning.md +0 -0
  60. /package/templates/{devops-sre/.cursorrules → engineering/devops-sre/.cursor/rules}/change-management.md +0 -0
  61. /package/templates/{devops-sre/.cursorrules → engineering/devops-sre/.cursor/rules}/chaos-engineering.md +0 -0
  62. /package/templates/{devops-sre/.cursorrules → engineering/devops-sre/.cursor/rules}/disaster-recovery.md +0 -0
  63. /package/templates/{devops-sre/.cursorrules → engineering/devops-sre/.cursor/rules}/incident-management.md +0 -0
  64. /package/templates/{devops-sre/.cursorrules → engineering/devops-sre/.cursor/rules}/observability.md +0 -0
  65. /package/templates/{devops-sre/.cursorrules → engineering/devops-sre/.cursor/rules}/overview.md +0 -0
  66. /package/templates/{devops-sre/.cursorrules → engineering/devops-sre/.cursor/rules}/postmortems.md +0 -0
  67. /package/templates/{devops-sre/.cursorrules → engineering/devops-sre/.cursor/rules}/runbooks.md +0 -0
  68. /package/templates/{devops-sre/.cursorrules → engineering/devops-sre/.cursor/rules}/slo-sli.md +0 -0
  69. /package/templates/{devops-sre/.cursorrules → engineering/devops-sre/.cursor/rules}/toil-reduction.md +0 -0
  70. /package/templates/{devops-sre → engineering/devops-sre}/CLAUDE.md +0 -0
  71. /package/templates/{fullstack/.cursorrules → engineering/fullstack/.cursor/rules}/api-contracts.md +0 -0
  72. /package/templates/{fullstack/.cursorrules → engineering/fullstack/.cursor/rules}/architecture.md +0 -0
  73. /package/templates/{fullstack/.cursorrules → engineering/fullstack/.cursor/rules}/overview.md +0 -0
  74. /package/templates/{fullstack/.cursorrules → engineering/fullstack/.cursor/rules}/shared-types.md +0 -0
  75. /package/templates/{fullstack/.cursorrules → engineering/fullstack/.cursor/rules}/testing.md +0 -0
  76. /package/templates/{fullstack → engineering/fullstack}/CLAUDE.md +0 -0
  77. /package/templates/{ml-ai/.cursorrules → engineering/ml-ai/.cursor/rules}/data-engineering.md +0 -0
  78. /package/templates/{ml-ai/.cursorrules → engineering/ml-ai/.cursor/rules}/deployment.md +0 -0
  79. /package/templates/{ml-ai/.cursorrules → engineering/ml-ai/.cursor/rules}/model-development.md +0 -0
  80. /package/templates/{ml-ai/.cursorrules → engineering/ml-ai/.cursor/rules}/monitoring.md +0 -0
  81. /package/templates/{ml-ai/.cursorrules → engineering/ml-ai/.cursor/rules}/overview.md +0 -0
  82. /package/templates/{ml-ai/.cursorrules → engineering/ml-ai/.cursor/rules}/security.md +0 -0
  83. /package/templates/{ml-ai/.cursorrules → engineering/ml-ai/.cursor/rules}/testing.md +0 -0
  84. /package/templates/{ml-ai → engineering/ml-ai}/CLAUDE.md +0 -0
  85. /package/templates/{mobile/.cursorrules → engineering/mobile/.cursor/rules}/navigation.md +0 -0
  86. /package/templates/{mobile/.cursorrules → engineering/mobile/.cursor/rules}/offline-first.md +0 -0
  87. /package/templates/{mobile/.cursorrules → engineering/mobile/.cursor/rules}/overview.md +0 -0
  88. /package/templates/{mobile/.cursorrules → engineering/mobile/.cursor/rules}/performance.md +0 -0
  89. /package/templates/{mobile/.cursorrules → engineering/mobile/.cursor/rules}/testing.md +0 -0
  90. /package/templates/{mobile → engineering/mobile}/CLAUDE.md +0 -0
  91. /package/templates/{platform-engineering/.cursorrules → engineering/platform-engineering/.cursor/rules}/ci-cd.md +0 -0
  92. /package/templates/{platform-engineering/.cursorrules → engineering/platform-engineering/.cursor/rules}/developer-experience.md +0 -0
  93. /package/templates/{platform-engineering/.cursorrules → engineering/platform-engineering/.cursor/rules}/infrastructure-as-code.md +0 -0
  94. /package/templates/{platform-engineering/.cursorrules → engineering/platform-engineering/.cursor/rules}/kubernetes.md +0 -0
  95. /package/templates/{platform-engineering/.cursorrules → engineering/platform-engineering/.cursor/rules}/observability.md +0 -0
  96. /package/templates/{platform-engineering/.cursorrules → engineering/platform-engineering/.cursor/rules}/overview.md +0 -0
  97. /package/templates/{platform-engineering/.cursorrules → engineering/platform-engineering/.cursor/rules}/security.md +0 -0
  98. /package/templates/{platform-engineering/.cursorrules → engineering/platform-engineering/.cursor/rules}/testing.md +0 -0
  99. /package/templates/{platform-engineering → engineering/platform-engineering}/CLAUDE.md +0 -0
  100. /package/templates/{qa-engineering/.cursorrules → engineering/qa-engineering/.cursor/rules}/automation.md +0 -0
  101. /package/templates/{qa-engineering/.cursorrules → engineering/qa-engineering/.cursor/rules}/metrics.md +0 -0
  102. /package/templates/{qa-engineering/.cursorrules → engineering/qa-engineering/.cursor/rules}/overview.md +0 -0
  103. /package/templates/{qa-engineering/.cursorrules → engineering/qa-engineering/.cursor/rules}/quality-gates.md +0 -0
  104. /package/templates/{qa-engineering/.cursorrules → engineering/qa-engineering/.cursor/rules}/test-design.md +0 -0
  105. /package/templates/{qa-engineering/.cursorrules → engineering/qa-engineering/.cursor/rules}/test-strategy.md +0 -0
  106. /package/templates/{qa-engineering → engineering/qa-engineering}/CLAUDE.md +0 -0
  107. /package/templates/{testing/.cursorrules → engineering/testing/.cursor/rules}/advanced-techniques.md +0 -0
  108. /package/templates/{testing/.cursorrules → engineering/testing/.cursor/rules}/ci-cd-integration.md +0 -0
  109. /package/templates/{testing/.cursorrules → engineering/testing/.cursor/rules}/overview.md +0 -0
  110. /package/templates/{testing/.cursorrules → engineering/testing/.cursor/rules}/performance-testing.md +0 -0
  111. /package/templates/{testing/.cursorrules → engineering/testing/.cursor/rules}/quality-metrics.md +0 -0
  112. /package/templates/{testing/.cursorrules → engineering/testing/.cursor/rules}/reliability.md +0 -0
  113. /package/templates/{testing/.cursorrules → engineering/testing/.cursor/rules}/tdd-methodology.md +0 -0
  114. /package/templates/{testing/.cursorrules → engineering/testing/.cursor/rules}/test-data.md +0 -0
  115. /package/templates/{testing/.cursorrules → engineering/testing/.cursor/rules}/test-design.md +0 -0
  116. /package/templates/{testing/.cursorrules → engineering/testing/.cursor/rules}/test-types.md +0 -0
  117. /package/templates/{testing → engineering/testing}/CLAUDE.md +0 -0
  118. /package/templates/{web-backend/.cursorrules → engineering/web-backend/.cursor/rules}/api-design.md +0 -0
  119. /package/templates/{web-backend/.cursorrules → engineering/web-backend/.cursor/rules}/authentication.md +0 -0
  120. /package/templates/{web-backend/.cursorrules → engineering/web-backend/.cursor/rules}/database-patterns.md +0 -0
  121. /package/templates/{web-backend/.cursorrules → engineering/web-backend/.cursor/rules}/error-handling.md +0 -0
  122. /package/templates/{web-backend/.cursorrules → engineering/web-backend/.cursor/rules}/overview.md +0 -0
  123. /package/templates/{web-backend/.cursorrules → engineering/web-backend/.cursor/rules}/security.md +0 -0
  124. /package/templates/{web-backend/.cursorrules → engineering/web-backend/.cursor/rules}/testing.md +0 -0
  125. /package/templates/{web-backend → engineering/web-backend}/CLAUDE.md +0 -0
  126. /package/templates/{web-frontend/.cursorrules → engineering/web-frontend/.cursor/rules}/accessibility.md +0 -0
  127. /package/templates/{web-frontend/.cursorrules → engineering/web-frontend/.cursor/rules}/component-patterns.md +0 -0
  128. /package/templates/{web-frontend/.cursorrules → engineering/web-frontend/.cursor/rules}/overview.md +0 -0
  129. /package/templates/{web-frontend/.cursorrules → engineering/web-frontend/.cursor/rules}/performance.md +0 -0
  130. /package/templates/{web-frontend/.cursorrules → engineering/web-frontend/.cursor/rules}/state-management.md +0 -0
  131. /package/templates/{web-frontend/.cursorrules → engineering/web-frontend/.cursor/rules}/styling.md +0 -0
  132. /package/templates/{web-frontend/.cursorrules → engineering/web-frontend/.cursor/rules}/testing.md +0 -0
  133. /package/templates/{web-frontend → engineering/web-frontend}/CLAUDE.md +0 -0
  134. /package/templates/{cpp-expert/.cursorrules → languages/cpp-expert/.cursor/rules}/concurrency.md +0 -0
  135. /package/templates/{cpp-expert/.cursorrules → languages/cpp-expert/.cursor/rules}/error-handling.md +0 -0
  136. /package/templates/{cpp-expert/.cursorrules → languages/cpp-expert/.cursor/rules}/memory-and-ownership.md +0 -0
  137. /package/templates/{cpp-expert/.cursorrules → languages/cpp-expert/.cursor/rules}/modern-cpp.md +0 -0
  138. /package/templates/{cpp-expert/.cursorrules → languages/cpp-expert/.cursor/rules}/overview.md +0 -0
  139. /package/templates/{cpp-expert/.cursorrules → languages/cpp-expert/.cursor/rules}/performance.md +0 -0
  140. /package/templates/{cpp-expert/.cursorrules → languages/cpp-expert/.cursor/rules}/testing.md +0 -0
  141. /package/templates/{cpp-expert/.cursorrules → languages/cpp-expert/.cursor/rules}/tooling.md +0 -0
  142. /package/templates/{cpp-expert → languages/cpp-expert}/CLAUDE.md +0 -0
  143. /package/templates/{csharp-expert/.cursorrules → languages/csharp-expert/.cursor/rules}/aspnet-core.md +0 -0
  144. /package/templates/{csharp-expert/.cursorrules → languages/csharp-expert/.cursor/rules}/async-patterns.md +0 -0
  145. /package/templates/{csharp-expert/.cursorrules → languages/csharp-expert/.cursor/rules}/dependency-injection.md +0 -0
  146. /package/templates/{csharp-expert/.cursorrules → languages/csharp-expert/.cursor/rules}/error-handling.md +0 -0
  147. /package/templates/{csharp-expert/.cursorrules → languages/csharp-expert/.cursor/rules}/language-features.md +0 -0
  148. /package/templates/{csharp-expert/.cursorrules → languages/csharp-expert/.cursor/rules}/overview.md +0 -0
  149. /package/templates/{csharp-expert/.cursorrules → languages/csharp-expert/.cursor/rules}/performance.md +0 -0
  150. /package/templates/{csharp-expert/.cursorrules → languages/csharp-expert/.cursor/rules}/testing.md +0 -0
  151. /package/templates/{csharp-expert/.cursorrules → languages/csharp-expert/.cursor/rules}/tooling.md +0 -0
  152. /package/templates/{csharp-expert → languages/csharp-expert}/CLAUDE.md +0 -0
  153. /package/templates/{golang-expert/.cursorrules → languages/golang-expert/.cursor/rules}/concurrency.md +0 -0
  154. /package/templates/{golang-expert/.cursorrules → languages/golang-expert/.cursor/rules}/error-handling.md +0 -0
  155. /package/templates/{golang-expert/.cursorrules → languages/golang-expert/.cursor/rules}/interfaces-and-types.md +0 -0
  156. /package/templates/{golang-expert/.cursorrules → languages/golang-expert/.cursor/rules}/overview.md +0 -0
  157. /package/templates/{golang-expert/.cursorrules → languages/golang-expert/.cursor/rules}/performance.md +0 -0
  158. /package/templates/{golang-expert/.cursorrules → languages/golang-expert/.cursor/rules}/production-patterns.md +0 -0
  159. /package/templates/{golang-expert/.cursorrules → languages/golang-expert/.cursor/rules}/stdlib-and-tooling.md +0 -0
  160. /package/templates/{golang-expert/.cursorrules → languages/golang-expert/.cursor/rules}/testing.md +0 -0
  161. /package/templates/{golang-expert → languages/golang-expert}/CLAUDE.md +0 -0
  162. /package/templates/{java-expert/.cursorrules → languages/java-expert/.cursor/rules}/concurrency.md +0 -0
  163. /package/templates/{java-expert/.cursorrules → languages/java-expert/.cursor/rules}/error-handling.md +0 -0
  164. /package/templates/{java-expert/.cursorrules → languages/java-expert/.cursor/rules}/modern-java.md +0 -0
  165. /package/templates/{java-expert/.cursorrules → languages/java-expert/.cursor/rules}/overview.md +0 -0
  166. /package/templates/{java-expert/.cursorrules → languages/java-expert/.cursor/rules}/performance.md +0 -0
  167. /package/templates/{java-expert/.cursorrules → languages/java-expert/.cursor/rules}/persistence.md +0 -0
  168. /package/templates/{java-expert/.cursorrules → languages/java-expert/.cursor/rules}/spring-boot.md +0 -0
  169. /package/templates/{java-expert/.cursorrules → languages/java-expert/.cursor/rules}/testing.md +0 -0
  170. /package/templates/{java-expert/.cursorrules → languages/java-expert/.cursor/rules}/tooling.md +0 -0
  171. /package/templates/{java-expert → languages/java-expert}/CLAUDE.md +0 -0
  172. /package/templates/{javascript-expert/.cursorrules → languages/javascript-expert/.cursor/rules}/language-deep-dive.md +0 -0
  173. /package/templates/{javascript-expert/.cursorrules → languages/javascript-expert/.cursor/rules}/node-patterns.md +0 -0
  174. /package/templates/{javascript-expert/.cursorrules → languages/javascript-expert/.cursor/rules}/overview.md +0 -0
  175. /package/templates/{javascript-expert/.cursorrules → languages/javascript-expert/.cursor/rules}/performance.md +0 -0
  176. /package/templates/{javascript-expert/.cursorrules → languages/javascript-expert/.cursor/rules}/react-patterns.md +0 -0
  177. /package/templates/{javascript-expert/.cursorrules → languages/javascript-expert/.cursor/rules}/testing.md +0 -0
  178. /package/templates/{javascript-expert/.cursorrules → languages/javascript-expert/.cursor/rules}/tooling.md +0 -0
  179. /package/templates/{javascript-expert/.cursorrules → languages/javascript-expert/.cursor/rules}/typescript-deep-dive.md +0 -0
  180. /package/templates/{javascript-expert → languages/javascript-expert}/CLAUDE.md +0 -0
  181. /package/templates/{kotlin-expert/.cursorrules → languages/kotlin-expert/.cursor/rules}/coroutines.md +0 -0
  182. /package/templates/{kotlin-expert/.cursorrules → languages/kotlin-expert/.cursor/rules}/error-handling.md +0 -0
  183. /package/templates/{kotlin-expert/.cursorrules → languages/kotlin-expert/.cursor/rules}/frameworks.md +0 -0
  184. /package/templates/{kotlin-expert/.cursorrules → languages/kotlin-expert/.cursor/rules}/language-features.md +0 -0
  185. /package/templates/{kotlin-expert/.cursorrules → languages/kotlin-expert/.cursor/rules}/overview.md +0 -0
  186. /package/templates/{kotlin-expert/.cursorrules → languages/kotlin-expert/.cursor/rules}/performance.md +0 -0
  187. /package/templates/{kotlin-expert/.cursorrules → languages/kotlin-expert/.cursor/rules}/testing.md +0 -0
  188. /package/templates/{kotlin-expert/.cursorrules → languages/kotlin-expert/.cursor/rules}/tooling.md +0 -0
  189. /package/templates/{kotlin-expert → languages/kotlin-expert}/CLAUDE.md +0 -0
  190. /package/templates/{python-expert/.cursorrules → languages/python-expert/.cursor/rules}/async-python.md +0 -0
  191. /package/templates/{python-expert/.cursorrules → languages/python-expert/.cursor/rules}/overview.md +0 -0
  192. /package/templates/{python-expert/.cursorrules → languages/python-expert/.cursor/rules}/patterns-and-idioms.md +0 -0
  193. /package/templates/{python-expert/.cursorrules → languages/python-expert/.cursor/rules}/performance.md +0 -0
  194. /package/templates/{python-expert/.cursorrules → languages/python-expert/.cursor/rules}/testing.md +0 -0
  195. /package/templates/{python-expert/.cursorrules → languages/python-expert/.cursor/rules}/tooling.md +0 -0
  196. /package/templates/{python-expert/.cursorrules → languages/python-expert/.cursor/rules}/type-system.md +0 -0
  197. /package/templates/{python-expert/.cursorrules → languages/python-expert/.cursor/rules}/web-and-apis.md +0 -0
  198. /package/templates/{python-expert → languages/python-expert}/CLAUDE.md +0 -0
  199. /package/templates/{rust-expert/.cursorrules → languages/rust-expert/.cursor/rules}/concurrency.md +0 -0
  200. /package/templates/{rust-expert/.cursorrules → languages/rust-expert/.cursor/rules}/ecosystem-and-tooling.md +0 -0
  201. /package/templates/{rust-expert/.cursorrules → languages/rust-expert/.cursor/rules}/error-handling.md +0 -0
  202. /package/templates/{rust-expert/.cursorrules → languages/rust-expert/.cursor/rules}/overview.md +0 -0
  203. /package/templates/{rust-expert/.cursorrules → languages/rust-expert/.cursor/rules}/ownership-and-borrowing.md +0 -0
  204. /package/templates/{rust-expert/.cursorrules → languages/rust-expert/.cursor/rules}/performance-and-unsafe.md +0 -0
  205. /package/templates/{rust-expert/.cursorrules → languages/rust-expert/.cursor/rules}/testing.md +0 -0
  206. /package/templates/{rust-expert/.cursorrules → languages/rust-expert/.cursor/rules}/traits-and-generics.md +0 -0
  207. /package/templates/{rust-expert → languages/rust-expert}/CLAUDE.md +0 -0
  208. /package/templates/{swift-expert/.cursorrules → languages/swift-expert/.cursor/rules}/concurrency.md +0 -0
  209. /package/templates/{swift-expert/.cursorrules → languages/swift-expert/.cursor/rules}/error-handling.md +0 -0
  210. /package/templates/{swift-expert/.cursorrules → languages/swift-expert/.cursor/rules}/language-features.md +0 -0
  211. /package/templates/{swift-expert/.cursorrules → languages/swift-expert/.cursor/rules}/overview.md +0 -0
  212. /package/templates/{swift-expert/.cursorrules → languages/swift-expert/.cursor/rules}/performance.md +0 -0
  213. /package/templates/{swift-expert/.cursorrules → languages/swift-expert/.cursor/rules}/swiftui.md +0 -0
  214. /package/templates/{swift-expert/.cursorrules → languages/swift-expert/.cursor/rules}/testing.md +0 -0
  215. /package/templates/{swift-expert/.cursorrules → languages/swift-expert/.cursor/rules}/tooling.md +0 -0
  216. /package/templates/{swift-expert → languages/swift-expert}/CLAUDE.md +0 -0
  217. /package/templates/{documentation/.cursorrules → professional/documentation/.cursor/rules}/adr.md +0 -0
  218. /package/templates/{documentation/.cursorrules → professional/documentation/.cursor/rules}/api-documentation.md +0 -0
  219. /package/templates/{documentation/.cursorrules → professional/documentation/.cursor/rules}/code-comments.md +0 -0
  220. /package/templates/{documentation/.cursorrules → professional/documentation/.cursor/rules}/maintenance.md +0 -0
  221. /package/templates/{documentation/.cursorrules → professional/documentation/.cursor/rules}/overview.md +0 -0
  222. /package/templates/{documentation/.cursorrules → professional/documentation/.cursor/rules}/readme-standards.md +0 -0
  223. /package/templates/{documentation → professional/documentation}/CLAUDE.md +0 -0
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'));
@@ -18,109 +22,146 @@ const CURRENT_VERSION = packageJson.version;
18
22
  const REPO_URL = 'https://github.com/djm204/agentic-team-templates';
19
23
  const CHANGELOG_URL = `${REPO_URL}/releases/tag/${PACKAGE_NAME}-v${CURRENT_VERSION}`;
20
24
 
25
+ // Template categories (storage-only, not exposed to CLI users)
26
+ const CATEGORIES = [
27
+ 'engineering',
28
+ 'languages',
29
+ 'creative',
30
+ 'business',
31
+ 'professional',
32
+ 'education',
33
+ 'agents',
34
+ ];
35
+
21
36
  // Available templates
22
37
  const TEMPLATES = {
23
38
  'blockchain': {
39
+ category: 'engineering',
24
40
  description: 'Smart contracts, DeFi protocols, and Web3 applications (Solidity, Foundry, Viem)',
25
41
  rules: ['defi-patterns.md', 'gas-optimization.md', 'overview.md', 'security.md', 'smart-contracts.md', 'testing.md', 'web3-integration.md']
26
42
  },
27
43
  'cpp-expert': {
44
+ category: 'languages',
28
45
  description: 'Principal-level C++ engineering (modern C++, RAII, concurrency, templates, performance)',
29
46
  rules: ['concurrency.md', 'error-handling.md', 'memory-and-ownership.md', 'modern-cpp.md', 'overview.md', 'performance.md', 'testing.md', 'tooling.md']
30
47
  },
31
48
  'csharp-expert': {
49
+ category: 'languages',
32
50
  description: 'Principal-level C# engineering (async, DI, EF Core, ASP.NET Core, testing)',
33
51
  rules: ['aspnet-core.md', 'async-patterns.md', 'dependency-injection.md', 'error-handling.md', 'language-features.md', 'overview.md', 'performance.md', 'testing.md', 'tooling.md']
34
52
  },
35
53
  'cli-tools': {
54
+ category: 'engineering',
36
55
  description: 'Command-line applications and developer tools (Cobra, Commander, Click)',
37
56
  rules: ['architecture.md', 'arguments.md', 'distribution.md', 'error-handling.md', 'overview.md', 'testing.md', 'user-experience.md']
38
57
  },
39
58
  'data-engineering': {
59
+ category: 'engineering',
40
60
  description: 'Data platforms and pipelines (ETL, data modeling, data quality)',
41
61
  rules: ['data-modeling.md', 'data-quality.md', 'overview.md', 'performance.md', 'pipeline-design.md', 'security.md', 'testing.md']
42
62
  },
43
63
  'devops-sre': {
64
+ category: 'engineering',
44
65
  description: 'DevOps and SRE practices (incident management, observability, SLOs, chaos engineering)',
45
66
  rules: ['capacity-planning.md', 'change-management.md', 'chaos-engineering.md', 'disaster-recovery.md', 'incident-management.md', 'observability.md', 'overview.md', 'postmortems.md', 'runbooks.md', 'slo-sli.md', 'toil-reduction.md']
46
67
  },
47
68
  'documentation': {
69
+ category: 'professional',
48
70
  description: 'Technical documentation standards (READMEs, API docs, ADRs, code comments)',
49
71
  rules: ['adr.md', 'api-documentation.md', 'code-comments.md', 'maintenance.md', 'overview.md', 'readme-standards.md']
50
72
  },
51
73
  'educator': {
74
+ category: 'education',
52
75
  description: 'World-class pedagogy with evidence-based teaching, learning retention, gamification, and assessment design',
53
76
  rules: ['accessibility.md', 'assessment.md', 'curriculum.md', 'engagement.md', 'instructional-design.md', 'overview.md', 'retention.md']
54
77
  },
55
78
  'fullstack': {
79
+ category: 'engineering',
56
80
  description: 'Full-stack web applications (Next.js, Nuxt, SvelteKit, Remix)',
57
81
  rules: ['api-contracts.md', 'architecture.md', 'overview.md', 'shared-types.md', 'testing.md']
58
82
  },
59
83
  'golang-expert': {
84
+ category: 'languages',
60
85
  description: 'Principal-level Go engineering (concurrency, stdlib, production patterns, testing)',
61
86
  rules: ['concurrency.md', 'error-handling.md', 'interfaces-and-types.md', 'overview.md', 'performance.md', 'production-patterns.md', 'stdlib-and-tooling.md', 'testing.md']
62
87
  },
63
88
  'java-expert': {
89
+ category: 'languages',
64
90
  description: 'Principal-level Java engineering (JVM, Spring Boot, concurrency, JPA, testing)',
65
91
  rules: ['concurrency.md', 'error-handling.md', 'modern-java.md', 'overview.md', 'performance.md', 'persistence.md', 'spring-boot.md', 'testing.md', 'tooling.md']
66
92
  },
67
93
  'javascript-expert': {
94
+ category: 'languages',
68
95
  description: 'Principal-level JavaScript & TypeScript engineering (Node.js, React, type system, testing)',
69
96
  rules: ['language-deep-dive.md', 'node-patterns.md', 'overview.md', 'performance.md', 'react-patterns.md', 'testing.md', 'tooling.md', 'typescript-deep-dive.md']
70
97
  },
71
98
  'kotlin-expert': {
99
+ category: 'languages',
72
100
  description: 'Principal-level Kotlin engineering (coroutines, multiplatform, Ktor, Spring Boot, testing)',
73
101
  rules: ['coroutines.md', 'error-handling.md', 'frameworks.md', 'language-features.md', 'overview.md', 'performance.md', 'testing.md', 'tooling.md']
74
102
  },
75
103
  'ml-ai': {
104
+ category: 'engineering',
76
105
  description: 'Machine learning and AI systems (model development, deployment, monitoring)',
77
106
  rules: ['data-engineering.md', 'deployment.md', 'model-development.md', 'monitoring.md', 'overview.md', 'security.md', 'testing.md']
78
107
  },
79
108
  'mobile': {
109
+ category: 'engineering',
80
110
  description: 'Mobile applications (React Native, Flutter, native iOS/Android)',
81
111
  rules: ['navigation.md', 'offline-first.md', 'overview.md', 'performance.md', 'testing.md']
82
112
  },
83
113
  'platform-engineering': {
114
+ category: 'engineering',
84
115
  description: 'Internal developer platforms, infrastructure automation, and reliability engineering',
85
116
  rules: ['ci-cd.md', 'developer-experience.md', 'infrastructure-as-code.md', 'kubernetes.md', 'observability.md', 'overview.md', 'security.md', 'testing.md']
86
117
  },
87
118
  'product-manager': {
119
+ category: 'business',
88
120
  description: 'Product management with customer-centric discovery, prioritization, and execution',
89
121
  rules: ['communication.md', 'discovery.md', 'metrics.md', 'overview.md', 'prioritization.md', 'requirements.md']
90
122
  },
91
123
  'python-expert': {
124
+ category: 'languages',
92
125
  description: 'Principal-level Python engineering (type system, async, testing, FastAPI, Django)',
93
126
  rules: ['async-python.md', 'overview.md', 'patterns-and-idioms.md', 'performance.md', 'testing.md', 'tooling.md', 'type-system.md', 'web-and-apis.md']
94
127
  },
95
128
  'qa-engineering': {
129
+ category: 'engineering',
96
130
  description: 'Quality assurance programs for confident, rapid software delivery',
97
131
  rules: ['automation.md', 'metrics.md', 'overview.md', 'quality-gates.md', 'test-design.md', 'test-strategy.md']
98
132
  },
99
133
  'rust-expert': {
134
+ category: 'languages',
100
135
  description: 'Principal-level Rust engineering (ownership, concurrency, unsafe, traits, async)',
101
136
  rules: ['concurrency.md', 'ecosystem-and-tooling.md', 'error-handling.md', 'overview.md', 'ownership-and-borrowing.md', 'performance-and-unsafe.md', 'testing.md', 'traits-and-generics.md']
102
137
  },
103
138
  'swift-expert': {
139
+ category: 'languages',
104
140
  description: 'Principal-level Swift engineering (concurrency, SwiftUI, protocols, testing, Apple platforms)',
105
141
  rules: ['concurrency.md', 'error-handling.md', 'language-features.md', 'overview.md', 'performance.md', 'swiftui.md', 'testing.md', 'tooling.md']
106
142
  },
107
143
  'testing': {
144
+ category: 'engineering',
108
145
  description: 'Comprehensive testing practices (TDD, test design, CI/CD integration, performance testing)',
109
146
  rules: ['advanced-techniques.md', 'ci-cd-integration.md', 'overview.md', 'performance-testing.md', 'quality-metrics.md', 'reliability.md', 'tdd-methodology.md', 'test-data.md', 'test-design.md', 'test-types.md']
110
147
  },
111
148
  'utility-agent': {
149
+ category: 'agents',
112
150
  description: 'AI agent utilities with context management and hallucination prevention',
113
151
  rules: ['action-control.md', 'context-management.md', 'hallucination-prevention.md', 'overview.md', 'token-optimization.md']
114
152
  },
115
153
  'ux-designer': {
154
+ category: 'creative',
116
155
  description: 'Principal-level UX design with user research, interaction design, design systems, accessibility, and emotional design',
117
156
  rules: ['accessibility.md', 'emotional-design.md', 'handoff.md', 'information-architecture.md', 'interaction-design.md', 'overview.md', 'research.md', 'visual-design.md']
118
157
  },
119
158
  'web-backend': {
159
+ category: 'engineering',
120
160
  description: 'Backend APIs and services (REST, GraphQL, microservices)',
121
161
  rules: ['api-design.md', 'authentication.md', 'database-patterns.md', 'error-handling.md', 'overview.md', 'security.md', 'testing.md']
122
162
  },
123
163
  'web-frontend': {
164
+ category: 'engineering',
124
165
  description: 'Frontend web applications (SPAs, SSR, static sites, PWAs)',
125
166
  rules: ['accessibility.md', 'component-patterns.md', 'overview.md', 'performance.md', 'state-management.md', 'styling.md', 'testing.md']
126
167
  }
@@ -162,6 +203,17 @@ function resolveTemplateAlias(name) {
162
203
  return TEMPLATE_ALIASES[name] || name;
163
204
  }
164
205
 
206
+ /**
207
+ * Get the source path for a template's rule files
208
+ * @param {string} template - Template name
209
+ * @param {string} rule - Rule filename
210
+ * @returns {string} Full path to the rule file in templates/<category>/<template>/.cursor/rules/
211
+ */
212
+ function getTemplateRulePath(template, rule) {
213
+ const { category } = TEMPLATES[template];
214
+ return path.join(TEMPLATES_DIR, category, template, '.cursor', 'rules', rule);
215
+ }
216
+
165
217
  const SHARED_RULES = [
166
218
  'code-quality.md',
167
219
  'communication.md',
@@ -255,7 +307,7 @@ ${colors.yellow('Removal Options:')}
255
307
  --reset Remove ALL installed content (shared rules, templates, generated files)
256
308
 
257
309
  ${colors.yellow('IDE Targets:')}
258
- cursor .cursorrules/ directory (Cursor IDE)
310
+ cursor .cursor/rules/ directory (Cursor IDE)
259
311
  claude CLAUDE.md file (Claude Code, Cursor with Claude)
260
312
  codex .github/copilot-instructions.md (GitHub Copilot)
261
313
 
@@ -306,11 +358,25 @@ function printTemplates() {
306
358
 
307
359
  console.log(colors.yellow('Available Templates:\n'));
308
360
 
361
+ // Group templates by category
362
+ const byCategory = {};
309
363
  for (const [name, info] of Object.entries(TEMPLATES)) {
310
- const aliases = aliasesByTemplate[name];
311
- const aliasSuffix = aliases ? ` ${colors.dim(`(aliases: ${aliases.join(', ')})`)}` : '';
312
- console.log(` ${colors.green(name)}${aliasSuffix}`);
313
- console.log(` ${info.description}\n`);
364
+ const cat = info.category;
365
+ if (!byCategory[cat]) byCategory[cat] = [];
366
+ byCategory[cat].push({ name, info });
367
+ }
368
+
369
+ for (const category of CATEGORIES) {
370
+ const templates = byCategory[category];
371
+ if (!templates || templates.length === 0) continue;
372
+ const label = category.charAt(0).toUpperCase() + category.slice(1);
373
+ console.log(colors.blue(` ${label}:`));
374
+ for (const { name, info } of templates) {
375
+ const aliases = aliasesByTemplate[name];
376
+ const aliasSuffix = aliases ? ` ${colors.dim(`(aliases: ${aliases.join(', ')})`)}` : '';
377
+ console.log(` ${colors.green(name)}${aliasSuffix}`);
378
+ console.log(` ${info.description}\n`);
379
+ }
314
380
  }
315
381
 
316
382
  console.log(colors.blue('Shared rules (always included):'));
@@ -574,7 +640,7 @@ ${rules}`;
574
640
 
575
641
  return `# CLAUDE.md - Development Guide
576
642
 
577
- This project uses AI-assisted development with Cursor. The rules in \`.cursorrules/\` provide domain-specific guidance for the AI assistant.
643
+ This project uses AI-assisted development with Cursor. The rules in \`.cursor/rules/\` provide domain-specific guidance for the AI assistant.
578
644
 
579
645
  ---
580
646
 
@@ -587,7 +653,7 @@ ${templateList}
587
653
 
588
654
  ### Rule Files
589
655
 
590
- All rules are in \`.cursorrules/\`. The AI assistant automatically reads these when working on your project.
656
+ All rules are in \`.cursor/rules/\`. The AI assistant automatically reads these when working on your project.
591
657
 
592
658
  #### Shared Rules (Apply to All Code)
593
659
 
@@ -650,13 +716,13 @@ A feature is complete when:
650
716
 
651
717
  ### Adding Project-Specific Rules
652
718
 
653
- 1. Create new \`.md\` files in \`.cursorrules/\`
719
+ 1. Create new \`.md\` files in \`.cursor/rules/\`
654
720
  2. Follow the existing naming convention
655
721
  3. Include clear examples and anti-patterns
656
722
 
657
723
  ### Modifying Existing Rules
658
724
 
659
- Edit files directly in \`.cursorrules/\`. Changes take effect immediately.
725
+ Edit files directly in \`.cursor/rules/\`. Changes take effect immediately.
660
726
 
661
727
  ### Updating Templates
662
728
 
@@ -705,7 +771,7 @@ function generateCopilotInstructionsContent(installedTemplates) {
705
771
  // Read and concatenate template-specific rules
706
772
  const templateRulesContent = installedTemplates.map(template => {
707
773
  return TEMPLATES[template].rules.map(rule => {
708
- const rulePath = path.join(TEMPLATES_DIR, template, '.cursorrules', rule);
774
+ const rulePath = getTemplateRulePath(template, rule);
709
775
  try {
710
776
  return fs.readFileSync(rulePath, 'utf8');
711
777
  } catch {
@@ -772,7 +838,7 @@ A feature is complete when:
772
838
  `;
773
839
  }
774
840
 
775
- function install(targetDir, templates, dryRun = false, force = false, ides = DEFAULT_IDES) {
841
+ async function install(targetDir, templates, dryRun = false, force = false, ides = DEFAULT_IDES, skipConfirm = false) {
776
842
  const stats = { copied: 0, skipped: 0, updated: 0, renamed: 0 };
777
843
  const renamedFiles = [];
778
844
  const installedFor = [];
@@ -784,20 +850,20 @@ function install(targetDir, templates, dryRun = false, force = false, ides = DEF
784
850
  }
785
851
  console.log();
786
852
 
787
- // 1. Install .cursorrules/ for Cursor IDE
853
+ // 1. Install .cursor/rules/ for Cursor IDE
788
854
  if (ides.includes('cursor')) {
789
855
  installedFor.push('cursor');
790
- const cursorrules = path.join(targetDir, '.cursorrules');
791
-
792
- if (!dryRun && !fs.existsSync(cursorrules)) {
793
- fs.mkdirSync(cursorrules, { recursive: true });
856
+ const cursorRulesDir = path.join(targetDir, CURSOR_RULES_DIR);
857
+
858
+ if (!dryRun && !fs.existsSync(cursorRulesDir)) {
859
+ fs.mkdirSync(cursorRulesDir, { recursive: true });
794
860
  }
795
861
 
796
862
  // Install shared rules
797
- console.log(colors.green('► Installing shared rules (.cursorrules/)...'));
863
+ console.log(colors.green(`► Installing shared rules (${CURSOR_RULES_DIR}/)...`));
798
864
  for (const rule of SHARED_RULES) {
799
865
  const src = path.join(TEMPLATES_DIR, '_shared', rule);
800
- const dest = path.join(cursorrules, rule);
866
+ const dest = path.join(cursorRulesDir, rule);
801
867
 
802
868
  if (dryRun) {
803
869
  const exists = fs.existsSync(dest);
@@ -829,11 +895,11 @@ function install(targetDir, templates, dryRun = false, force = false, ides = DEF
829
895
 
830
896
  // Install template-specific rules
831
897
  for (const template of templates) {
832
- console.log(colors.green(`► Installing ${template} template (.cursorrules/)...`));
833
-
898
+ console.log(colors.green(`► Installing ${template} template (${CURSOR_RULES_DIR}/)...`));
899
+
834
900
  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}`);
901
+ const src = getTemplateRulePath(template, rule);
902
+ const dest = path.join(cursorRulesDir, `${template}-${rule}`);
837
903
  const destName = `${template}-${rule}`;
838
904
 
839
905
  if (dryRun) {
@@ -864,6 +930,63 @@ function install(targetDir, templates, dryRun = false, force = false, ides = DEF
864
930
  }
865
931
  console.log();
866
932
  }
933
+
934
+ // Legacy .cursorrules/ detection and cleanup
935
+ const legacyDir = path.join(targetDir, LEGACY_CURSORRULES_DIR);
936
+ if (fs.existsSync(legacyDir)) {
937
+ console.log(colors.yellow(`⚠ Deprecated ${LEGACY_CURSORRULES_DIR}/ directory detected.`));
938
+ console.log(colors.yellow(` Cursor now uses ${CURSOR_RULES_DIR}/ for rule files.`));
939
+ console.log(colors.yellow(` New rules have been installed to ${CURSOR_RULES_DIR}/.`));
940
+ console.log();
941
+ console.log(colors.yellow(` Your existing ${LEGACY_CURSORRULES_DIR}/ files are still present.`));
942
+ console.log(colors.yellow(` Support for ${LEGACY_CURSORRULES_DIR}/ will be removed in a future version.`));
943
+ console.log();
944
+
945
+ if (!dryRun) {
946
+ const shouldCleanup = skipConfirm || await confirm(
947
+ colors.yellow(`? Would you like to remove the deprecated ${LEGACY_CURSORRULES_DIR}/ directory?`)
948
+ );
949
+
950
+ if (shouldCleanup) {
951
+ // Copy legacy rule files to .cursor/rules/ before removing (don't overwrite existing)
952
+ const legacyEntries = fs.readdirSync(legacyDir, { withFileTypes: true });
953
+ let copiedCount = 0;
954
+ for (const entry of legacyEntries) {
955
+ if (!entry.isFile()) continue;
956
+ const name = entry.name;
957
+ const legacyPath = path.join(legacyDir, name);
958
+ const destPath = path.join(cursorRulesDir, name);
959
+ if (!fs.existsSync(destPath)) {
960
+ fs.copyFileSync(legacyPath, destPath);
961
+ console.log(colors.dim(` ${colors.green('[migrated]')} ${name} → ${CURSOR_RULES_DIR}/`));
962
+ copiedCount++;
963
+ }
964
+ }
965
+ if (copiedCount > 0) {
966
+ console.log(colors.green(` ✓ Migrated ${copiedCount} file(s) from ${LEGACY_CURSORRULES_DIR}/ to ${CURSOR_RULES_DIR}/.`));
967
+ }
968
+ fs.rmSync(legacyDir, { recursive: true });
969
+ console.log(colors.green(` ✓ Removed deprecated ${LEGACY_CURSORRULES_DIR}/ directory.`));
970
+ } else {
971
+ // Create reference file so Cursor AI knows about legacy rules
972
+ const noticePath = path.join(cursorRulesDir, 'legacy-cursorrules-notice.md');
973
+ const noticeContent = `# Legacy Rules Notice
974
+
975
+ This project contains additional rule files in the deprecated \`.cursorrules/\` directory
976
+ at the project root. Those rules are still active and should be consulted alongside the
977
+ rules in this directory.
978
+
979
+ The \`.cursorrules/\` directory will be removed in a future version.
980
+ To clean up manually, move any custom rules to \`.cursor/rules/\` and delete \`.cursorrules/\`.
981
+ `;
982
+ fs.writeFileSync(noticePath, noticeContent);
983
+ console.log(colors.dim(` Created ${CURSOR_RULES_DIR}/legacy-cursorrules-notice.md as a reference.`));
984
+ }
985
+ } else {
986
+ console.log(colors.dim(' (dry-run: skipping cleanup prompt)'));
987
+ }
988
+ console.log();
989
+ }
867
990
  }
868
991
 
869
992
  // 2. Generate CLAUDE.md for Claude Code
@@ -990,7 +1113,7 @@ function install(targetDir, templates, dryRun = false, force = false, ides = DEF
990
1113
  console.log(colors.yellow('Installed for:'));
991
1114
  for (const ide of installedFor) {
992
1115
  const ideInfo = {
993
- cursor: '.cursorrules/ (Cursor IDE)',
1116
+ cursor: '.cursor/rules/ (Cursor IDE)',
994
1117
  claude: 'CLAUDE.md (Claude Code)',
995
1118
  codex: '.github/copilot-instructions.md (GitHub Copilot)'
996
1119
  };
@@ -1071,52 +1194,76 @@ async function remove(targetDir, templates, dryRun = false, force = false, skipC
1071
1194
  console.log(`${colors.blue('Templates:')} ${templates.join(', ')}`);
1072
1195
  console.log();
1073
1196
 
1074
- // 1. Collect files to remove from .cursorrules/
1197
+ // 1. Collect files to remove from .cursor/rules/ (and legacy .cursorrules/)
1075
1198
  if (ides.includes('cursor')) {
1076
- const cursorrules = path.join(targetDir, '.cursorrules');
1077
-
1078
- if (fs.existsSync(cursorrules)) {
1199
+ const cursorRulesDir = path.join(targetDir, CURSOR_RULES_DIR);
1200
+ const legacyDir = path.join(targetDir, LEGACY_CURSORRULES_DIR);
1201
+ const dirsToScan = [];
1202
+
1203
+ if (fs.existsSync(cursorRulesDir)) dirsToScan.push({ dir: cursorRulesDir, label: CURSOR_RULES_DIR });
1204
+ if (fs.existsSync(legacyDir)) dirsToScan.push({ dir: legacyDir, label: LEGACY_CURSORRULES_DIR });
1205
+
1206
+ if (dirsToScan.length > 0) {
1079
1207
  for (const template of templates) {
1080
1208
  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;
1209
+
1210
+ for (const { dir, label } of dirsToScan) {
1211
+ for (const rule of TEMPLATES[template].rules) {
1212
+ const destName = `${template}-${rule}`;
1213
+ const destPath = path.join(dir, destName);
1214
+ const srcPath = getTemplateRulePath(template, rule);
1215
+
1216
+ if (!fs.existsSync(destPath)) {
1217
+ continue;
1218
+ }
1219
+
1220
+ const isUnmodified = isOurFile(destPath, srcPath);
1221
+ const displayName = `${destName} (${label}/)`;
1222
+
1223
+ if (!isUnmodified && !force) {
1224
+ console.log(` ${colors.yellow('[modified]')} ${displayName} (use --force to remove)`);
1225
+ modifiedFiles.push(displayName);
1226
+ stats.skipped++;
1227
+ } else {
1228
+ console.log(` ${colors.red('[remove]')} ${displayName}${!isUnmodified ? ' (modified, --force)' : ''}`);
1229
+ filesToRemove.push({ path: destPath, name: displayName });
1230
+ }
1091
1231
  }
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 });
1232
+
1233
+ // Also check for -1 variant files
1234
+ for (const rule of TEMPLATES[template].rules) {
1235
+ const altName = `${template}-${rule.replace('.md', '-1.md')}`;
1236
+ const altPath = path.join(dir, altName);
1237
+
1238
+ if (fs.existsSync(altPath)) {
1239
+ console.log(` ${colors.red('[remove]')} ${altName} (${label}/, alternate file)`);
1240
+ filesToRemove.push({ path: altPath, name: altName });
1241
+ }
1102
1242
  }
1103
1243
  }
1104
-
1105
- // Also check for -1 variant files
1244
+
1245
+ // Check for legacy-cursorrules-notice.md in new dir
1246
+ const noticePath = path.join(cursorRulesDir, 'legacy-cursorrules-notice.md');
1247
+ if (fs.existsSync(noticePath)) {
1248
+ console.log(` ${colors.red('[remove]')} legacy-cursorrules-notice.md`);
1249
+ filesToRemove.push({ path: noticePath, name: 'legacy-cursorrules-notice.md' });
1250
+ }
1251
+
1252
+ // Log not-found for templates that weren't in either dir
1106
1253
  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 });
1254
+ const destName = `${template}-${rule}`;
1255
+ const inNew = fs.existsSync(path.join(cursorRulesDir, destName));
1256
+ const inLegacy = fs.existsSync(path.join(legacyDir, destName));
1257
+ if (!inNew && !inLegacy) {
1258
+ console.log(` ${colors.dim('[not found]')} ${destName}`);
1259
+ stats.notFound++;
1113
1260
  }
1114
1261
  }
1115
-
1262
+
1116
1263
  console.log();
1117
1264
  }
1118
1265
  } else {
1119
- console.log(colors.dim('No .cursorrules/ directory found.\n'));
1266
+ console.log(colors.dim(`No ${CURSOR_RULES_DIR}/ or ${LEGACY_CURSORRULES_DIR}/ directory found.\n`));
1120
1267
  }
1121
1268
  }
1122
1269
 
@@ -1194,86 +1341,105 @@ async function reset(targetDir, dryRun = false, force = false, skipConfirm = fal
1194
1341
  console.log(`${colors.blue('Target IDEs:')} ${ides.join(', ')}`);
1195
1342
  console.log();
1196
1343
 
1197
- // 1. Remove .cursorrules/ contents for Cursor
1344
+ // 1. Remove .cursor/rules/ and legacy .cursorrules/ contents for Cursor
1198
1345
  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
-
1346
+ const cursorRulesDir = path.join(targetDir, CURSOR_RULES_DIR);
1347
+ const legacyDir = path.join(targetDir, LEGACY_CURSORRULES_DIR);
1348
+ const dirsToScan = [];
1349
+
1350
+ if (fs.existsSync(cursorRulesDir)) dirsToScan.push({ dir: cursorRulesDir, label: CURSOR_RULES_DIR });
1351
+ if (fs.existsSync(legacyDir)) dirsToScan.push({ dir: legacyDir, label: LEGACY_CURSORRULES_DIR });
1352
+
1353
+ if (dirsToScan.length > 0) {
1354
+ for (const { dir, label } of dirsToScan) {
1355
+ console.log(colors.yellow(`► Scanning ${label}/ directory...`));
1356
+
1357
+ // Check shared rules
1358
+ for (const rule of SHARED_RULES) {
1359
+ const destPath = path.join(dir, rule);
1360
+ const srcPath = path.join(TEMPLATES_DIR, '_shared', rule);
1361
+
1237
1362
  if (!fs.existsSync(destPath)) continue;
1238
-
1363
+
1239
1364
  const isUnmodified = isOurFile(destPath, srcPath);
1240
-
1365
+
1241
1366
  if (!isUnmodified && !force) {
1242
- console.log(` ${colors.yellow('[modified]')} ${destName} (use --force to remove)`);
1243
- modifiedFiles.push(destName);
1367
+ console.log(` ${colors.yellow('[modified]')} ${rule} (use --force to remove)`);
1368
+ modifiedFiles.push(`${rule} (${label}/)`);
1244
1369
  stats.skipped++;
1245
1370
  } else {
1246
- console.log(` ${colors.red('[remove]')} ${destName}${!isUnmodified ? ' (modified, --force)' : ''}`);
1247
- filesToRemove.push({ path: destPath, name: destName });
1371
+ console.log(` ${colors.red('[remove]')} ${rule}${!isUnmodified ? ' (modified, --force)' : ''}`);
1372
+ filesToRemove.push({ path: destPath, name: `${rule} (${label}/)` });
1248
1373
  }
1249
-
1374
+
1250
1375
  // Check for -1 variant
1251
- const altName = destName.replace('.md', '-1.md');
1252
- const altPath = path.join(cursorrules, altName);
1376
+ const altPath = path.join(dir, rule.replace('.md', '-1.md'));
1253
1377
  if (fs.existsSync(altPath)) {
1254
- console.log(` ${colors.red('[remove]')} ${altName} (alternate file)`);
1255
- filesToRemove.push({ path: altPath, name: altName });
1378
+ console.log(` ${colors.red('[remove]')} ${rule.replace('.md', '-1.md')} (alternate file)`);
1379
+ filesToRemove.push({ path: altPath, name: rule.replace('.md', '-1.md') });
1256
1380
  }
1257
1381
  }
1382
+
1383
+ // Check template-specific rules
1384
+ for (const [templateName, templateInfo] of Object.entries(TEMPLATES)) {
1385
+ for (const rule of templateInfo.rules) {
1386
+ const destName = `${templateName}-${rule}`;
1387
+ const destPath = path.join(dir, destName);
1388
+ const srcPath = getTemplateRulePath(templateName, rule);
1389
+
1390
+ if (!fs.existsSync(destPath)) continue;
1391
+
1392
+ const isUnmodified = isOurFile(destPath, srcPath);
1393
+
1394
+ if (!isUnmodified && !force) {
1395
+ console.log(` ${colors.yellow('[modified]')} ${destName} (use --force to remove)`);
1396
+ modifiedFiles.push(`${destName} (${label}/)`);
1397
+ stats.skipped++;
1398
+ } else {
1399
+ console.log(` ${colors.red('[remove]')} ${destName}${!isUnmodified ? ' (modified, --force)' : ''}`);
1400
+ filesToRemove.push({ path: destPath, name: `${destName} (${label}/)` });
1401
+ }
1402
+
1403
+ // Check for -1 variant
1404
+ const altName = destName.replace('.md', '-1.md');
1405
+ const altPath = path.join(dir, altName);
1406
+ if (fs.existsSync(altPath)) {
1407
+ console.log(` ${colors.red('[remove]')} ${altName} (alternate file)`);
1408
+ filesToRemove.push({ path: altPath, name: altName });
1409
+ }
1410
+ }
1411
+ }
1412
+
1413
+ // Check for legacy-cursorrules-notice.md
1414
+ const noticePath = path.join(dir, 'legacy-cursorrules-notice.md');
1415
+ if (fs.existsSync(noticePath)) {
1416
+ console.log(` ${colors.red('[remove]')} legacy-cursorrules-notice.md`);
1417
+ filesToRemove.push({ path: noticePath, name: 'legacy-cursorrules-notice.md' });
1418
+ }
1419
+
1420
+ // Check if we should remove the directory itself (only if it would be empty)
1421
+ const remainingFiles = fs.readdirSync(dir).filter(f => {
1422
+ const fullPath = path.join(dir, f);
1423
+ const willBeRemoved = filesToRemove.some(fr => fr.path === fullPath);
1424
+ return !willBeRemoved;
1425
+ });
1426
+
1427
+ if (remainingFiles.length === 0 || force) {
1428
+ console.log(` ${colors.red('[remove]')} ${label}/ directory`);
1429
+ dirsToRemove.push(dir);
1430
+ // If removing .cursor/rules/, also check if .cursor/ would be empty
1431
+ if (label === CURSOR_RULES_DIR) {
1432
+ const cursorDir = path.join(targetDir, '.cursor');
1433
+ dirsToRemove.push(cursorDir);
1434
+ }
1435
+ } else if (remainingFiles.length > 0) {
1436
+ console.log(colors.dim(` ${label}/ will be kept (${remainingFiles.length} non-template file(s) remain)`));
1437
+ }
1438
+
1439
+ console.log();
1258
1440
  }
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
1441
  } else {
1276
- console.log(colors.dim('No .cursorrules/ directory found.\n'));
1442
+ console.log(colors.dim(`No ${CURSOR_RULES_DIR}/ or ${LEGACY_CURSORRULES_DIR}/ directory found.\n`));
1277
1443
  }
1278
1444
  }
1279
1445
 
@@ -1286,8 +1452,8 @@ async function reset(targetDir, dryRun = false, force = false, skipConfirm = fal
1286
1452
 
1287
1453
  // Check if it contains our signature content
1288
1454
  const content = fs.readFileSync(claudePath, 'utf8');
1289
- const isOurs = content.includes('# CLAUDE.md - Development Guide') &&
1290
- content.includes('.cursorrules/');
1455
+ const isOurs = content.includes('# CLAUDE.md - Development Guide') &&
1456
+ (content.includes('.cursor/rules/') || content.includes('.cursorrules/'));
1291
1457
 
1292
1458
  if (!isOurs && !force) {
1293
1459
  console.log(` ${colors.yellow('[modified]')} CLAUDE.md (doesn't match template, use --force)`);
@@ -1532,7 +1698,7 @@ export async function run(args) {
1532
1698
  }
1533
1699
 
1534
1700
  // Install to current directory
1535
- install(process.cwd(), resolvedTemplates, dryRun, force, targetIdes);
1701
+ await install(process.cwd(), resolvedTemplates, dryRun, force, targetIdes, skipConfirm);
1536
1702
  }
1537
1703
 
1538
1704
  // Export internals for testing
@@ -1541,6 +1707,9 @@ export const _internals = {
1541
1707
  CURRENT_VERSION,
1542
1708
  REPO_URL,
1543
1709
  CHANGELOG_URL,
1710
+ CURSOR_RULES_DIR,
1711
+ LEGACY_CURSORRULES_DIR,
1712
+ CATEGORIES,
1544
1713
  TEMPLATES,
1545
1714
  TEMPLATE_ALIASES,
1546
1715
  SHARED_RULES,
@@ -1549,6 +1718,7 @@ export const _internals = {
1549
1718
  compareVersions,
1550
1719
  checkForUpdates,
1551
1720
  resolveTemplateAlias,
1721
+ getTemplateRulePath,
1552
1722
  filesMatch,
1553
1723
  parseMarkdownSections,
1554
1724
  generateSectionSignature,