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.test.js CHANGED
@@ -7,6 +7,9 @@ import { run, _internals } from './index.js';
7
7
  const {
8
8
  PACKAGE_NAME,
9
9
  CURRENT_VERSION,
10
+ CURSOR_RULES_DIR,
11
+ LEGACY_CURSORRULES_DIR,
12
+ CATEGORIES,
10
13
  TEMPLATES,
11
14
  TEMPLATE_ALIASES,
12
15
  SHARED_RULES,
@@ -14,6 +17,7 @@ const {
14
17
  DEFAULT_IDES,
15
18
  compareVersions,
16
19
  resolveTemplateAlias,
20
+ getTemplateRulePath,
17
21
  filesMatch,
18
22
  parseMarkdownSections,
19
23
  generateSectionSignature,
@@ -106,12 +110,15 @@ describe('Constants', () => {
106
110
  expect(Object.keys(TEMPLATES).sort()).toEqual(expectedTemplates.sort());
107
111
  });
108
112
 
109
- it('each template should have description and rules array', () => {
113
+ it('each template should have category, description, and rules array', () => {
110
114
  for (const [name, template] of Object.entries(TEMPLATES)) {
115
+ expect(template).toHaveProperty('category');
116
+ expect(CATEGORIES).toContain(template.category);
117
+
111
118
  expect(template).toHaveProperty('description');
112
119
  expect(typeof template.description).toBe('string');
113
120
  expect(template.description.length).toBeGreaterThan(0);
114
-
121
+
115
122
  expect(template).toHaveProperty('rules');
116
123
  expect(Array.isArray(template.rules)).toBe(true);
117
124
  expect(template.rules.length).toBeGreaterThan(0);
@@ -123,6 +130,15 @@ describe('Constants', () => {
123
130
  expect(template.rules).toContain('overview.md');
124
131
  }
125
132
  });
133
+
134
+ it('each template rule file should exist on disk', () => {
135
+ for (const [name, template] of Object.entries(TEMPLATES)) {
136
+ for (const rule of template.rules) {
137
+ const rulePath = getTemplateRulePath(name, rule);
138
+ expect(fs.existsSync(rulePath), `Missing: ${rulePath}`).toBe(true);
139
+ }
140
+ }
141
+ });
126
142
  });
127
143
 
128
144
  describe('SHARED_RULES', () => {
@@ -715,104 +731,151 @@ describe('Install/Remove/Reset Operations', () => {
715
731
  });
716
732
 
717
733
  describe('install', () => {
718
- it('should create .cursorrules directory', () => {
719
- install(tempDir, ['web-frontend'], false, false, ['cursor']);
720
-
721
- expect(fs.existsSync(path.join(tempDir, '.cursorrules'))).toBe(true);
734
+ it('should create .cursor/rules directory', async () => {
735
+ await install(tempDir, ['web-frontend'], false, false, ['cursor']);
736
+
737
+ expect(fs.existsSync(path.join(tempDir, '.cursor', 'rules'))).toBe(true);
722
738
  });
723
739
 
724
- it('should install shared rules', () => {
725
- install(tempDir, ['web-frontend'], false, false, ['cursor']);
726
-
740
+ it('should install shared rules', async () => {
741
+ await install(tempDir, ['web-frontend'], false, false, ['cursor']);
742
+
727
743
  for (const rule of SHARED_RULES) {
728
- expect(fs.existsSync(path.join(tempDir, '.cursorrules', rule))).toBe(true);
744
+ expect(fs.existsSync(path.join(tempDir, '.cursor', 'rules', rule))).toBe(true);
729
745
  }
730
746
  });
731
747
 
732
- it('should install template-specific rules with prefix', () => {
733
- install(tempDir, ['web-frontend'], false, false, ['cursor']);
734
-
748
+ it('should install template-specific rules with prefix', async () => {
749
+ await install(tempDir, ['web-frontend'], false, false, ['cursor']);
750
+
735
751
  for (const rule of TEMPLATES['web-frontend'].rules) {
736
752
  const prefixedName = `web-frontend-${rule}`;
737
- expect(fs.existsSync(path.join(tempDir, '.cursorrules', prefixedName))).toBe(true);
753
+ expect(fs.existsSync(path.join(tempDir, '.cursor', 'rules', prefixedName))).toBe(true);
738
754
  }
739
755
  });
740
756
 
741
- it('should create CLAUDE.md for claude IDE', () => {
742
- install(tempDir, ['web-frontend'], false, false, ['claude']);
743
-
757
+ it('should create CLAUDE.md for claude IDE', async () => {
758
+ await install(tempDir, ['web-frontend'], false, false, ['claude']);
759
+
744
760
  expect(fs.existsSync(path.join(tempDir, 'CLAUDE.md'))).toBe(true);
745
761
  const content = fs.readFileSync(path.join(tempDir, 'CLAUDE.md'), 'utf8');
746
762
  expect(content).toContain('# CLAUDE.md - Development Guide');
747
763
  });
748
764
 
749
- it('should create copilot-instructions.md for codex IDE', () => {
750
- install(tempDir, ['web-frontend'], false, false, ['codex']);
751
-
765
+ it('should create copilot-instructions.md for codex IDE', async () => {
766
+ await install(tempDir, ['web-frontend'], false, false, ['codex']);
767
+
752
768
  expect(fs.existsSync(path.join(tempDir, '.github', 'copilot-instructions.md'))).toBe(true);
753
769
  });
754
770
 
755
- it('should install for all IDEs by default', () => {
756
- install(tempDir, ['web-frontend'], false, false, DEFAULT_IDES);
757
-
758
- expect(fs.existsSync(path.join(tempDir, '.cursorrules'))).toBe(true);
771
+ it('should install for all IDEs by default', async () => {
772
+ await install(tempDir, ['web-frontend'], false, false, DEFAULT_IDES);
773
+
774
+ expect(fs.existsSync(path.join(tempDir, '.cursor', 'rules'))).toBe(true);
759
775
  expect(fs.existsSync(path.join(tempDir, 'CLAUDE.md'))).toBe(true);
760
776
  expect(fs.existsSync(path.join(tempDir, '.github', 'copilot-instructions.md'))).toBe(true);
761
777
  });
762
778
 
763
- it('should not write files in dry-run mode', () => {
764
- install(tempDir, ['web-frontend'], true, false, ['cursor']);
765
-
766
- expect(fs.existsSync(path.join(tempDir, '.cursorrules'))).toBe(false);
779
+ it('should not write files in dry-run mode', async () => {
780
+ await install(tempDir, ['web-frontend'], true, false, ['cursor']);
781
+
782
+ expect(fs.existsSync(path.join(tempDir, '.cursor', 'rules'))).toBe(false);
767
783
  });
768
784
 
769
- it('should install multiple templates', () => {
770
- install(tempDir, ['web-frontend', 'web-backend'], false, false, ['cursor']);
771
-
785
+ it('should install multiple templates', async () => {
786
+ await install(tempDir, ['web-frontend', 'web-backend'], false, false, ['cursor']);
787
+
772
788
  // Check web-frontend rules
773
- expect(fs.existsSync(path.join(tempDir, '.cursorrules', 'web-frontend-overview.md'))).toBe(true);
789
+ expect(fs.existsSync(path.join(tempDir, '.cursor', 'rules', 'web-frontend-overview.md'))).toBe(true);
774
790
  // Check web-backend rules
775
- expect(fs.existsSync(path.join(tempDir, '.cursorrules', 'web-backend-overview.md'))).toBe(true);
791
+ expect(fs.existsSync(path.join(tempDir, '.cursor', 'rules', 'web-backend-overview.md'))).toBe(true);
792
+ });
793
+
794
+ it('should copy legacy .cursorrules/ files to .cursor/rules/ then remove legacy dir when cleanup confirmed', async () => {
795
+ const legacyDir = path.join(tempDir, LEGACY_CURSORRULES_DIR);
796
+ const cursorRulesDir = path.join(tempDir, '.cursor', 'rules');
797
+ fs.mkdirSync(legacyDir, { recursive: true });
798
+ fs.writeFileSync(path.join(legacyDir, 'old-rule.md'), '# Old rule');
799
+ fs.writeFileSync(path.join(legacyDir, 'custom-guide.md'), '# Custom guide');
800
+
801
+ await install(tempDir, ['web-frontend'], false, false, ['cursor'], true);
802
+
803
+ expect(fs.existsSync(legacyDir)).toBe(false);
804
+ expect(fs.existsSync(path.join(tempDir, '.cursor', 'rules', 'web-frontend-overview.md'))).toBe(true);
805
+ expect(fs.existsSync(path.join(cursorRulesDir, 'old-rule.md'))).toBe(true);
806
+ expect(fs.readFileSync(path.join(cursorRulesDir, 'old-rule.md'), 'utf8')).toBe('# Old rule');
807
+ expect(fs.existsSync(path.join(cursorRulesDir, 'custom-guide.md'))).toBe(true);
808
+ expect(fs.readFileSync(path.join(cursorRulesDir, 'custom-guide.md'), 'utf8')).toBe('# Custom guide');
809
+ });
810
+
811
+ it('should not overwrite existing .cursor/rules/ files when migrating legacy', async () => {
812
+ const legacyDir = path.join(tempDir, LEGACY_CURSORRULES_DIR);
813
+ const cursorRulesDir = path.join(tempDir, '.cursor', 'rules');
814
+ fs.mkdirSync(cursorRulesDir, { recursive: true });
815
+ fs.writeFileSync(path.join(cursorRulesDir, 'my-rule.md'), '# New structure content');
816
+ fs.mkdirSync(legacyDir, { recursive: true });
817
+ fs.writeFileSync(path.join(legacyDir, 'my-rule.md'), '# Legacy content');
818
+
819
+ await install(tempDir, ['web-frontend'], false, false, ['cursor'], true);
820
+
821
+ expect(fs.readFileSync(path.join(cursorRulesDir, 'my-rule.md'), 'utf8')).toBe('# New structure content');
822
+ expect(fs.existsSync(legacyDir)).toBe(false);
823
+ });
824
+
825
+ it('should show legacy warning in dry-run mode without prompting', async () => {
826
+ // Create a legacy .cursorrules/ directory
827
+ const legacyDir = path.join(tempDir, LEGACY_CURSORRULES_DIR);
828
+ fs.mkdirSync(legacyDir, { recursive: true });
829
+ fs.writeFileSync(path.join(legacyDir, 'old-rule.md'), '# Old rule');
830
+
831
+ await install(tempDir, ['web-frontend'], true, false, ['cursor']);
832
+
833
+ // Legacy dir should still exist (dry-run doesn't modify)
834
+ expect(fs.existsSync(legacyDir)).toBe(true);
835
+ // Warning should have been printed
836
+ expect(consoleLogSpy).toHaveBeenCalledWith(
837
+ expect.stringContaining('Deprecated')
838
+ );
776
839
  });
777
840
  });
778
841
 
779
842
  describe('remove', () => {
780
- beforeEach(() => {
843
+ beforeEach(async () => {
781
844
  // First install a template
782
- install(tempDir, ['web-frontend'], false, false, ['cursor']);
845
+ await install(tempDir, ['web-frontend'], false, false, ['cursor']);
783
846
  });
784
847
 
785
848
  it('should remove template-specific files', async () => {
786
849
  await remove(tempDir, ['web-frontend'], false, false, true, ['cursor']);
787
-
850
+
788
851
  for (const rule of TEMPLATES['web-frontend'].rules) {
789
852
  const prefixedName = `web-frontend-${rule}`;
790
- expect(fs.existsSync(path.join(tempDir, '.cursorrules', prefixedName))).toBe(false);
853
+ expect(fs.existsSync(path.join(tempDir, '.cursor', 'rules', prefixedName))).toBe(false);
791
854
  }
792
855
  });
793
856
 
794
857
  it('should keep shared rules when removing template', async () => {
795
858
  await remove(tempDir, ['web-frontend'], false, false, true, ['cursor']);
796
-
859
+
797
860
  for (const rule of SHARED_RULES) {
798
- expect(fs.existsSync(path.join(tempDir, '.cursorrules', rule))).toBe(true);
861
+ expect(fs.existsSync(path.join(tempDir, '.cursor', 'rules', rule))).toBe(true);
799
862
  }
800
863
  });
801
864
 
802
865
  it('should not remove files in dry-run mode', async () => {
803
866
  await remove(tempDir, ['web-frontend'], true, false, true, ['cursor']);
804
-
867
+
805
868
  // Files should still exist
806
- expect(fs.existsSync(path.join(tempDir, '.cursorrules', 'web-frontend-overview.md'))).toBe(true);
869
+ expect(fs.existsSync(path.join(tempDir, '.cursor', 'rules', 'web-frontend-overview.md'))).toBe(true);
807
870
  });
808
871
 
809
872
  it('should skip modified files without force', async () => {
810
873
  // Modify a file
811
- const filePath = path.join(tempDir, '.cursorrules', 'web-frontend-overview.md');
874
+ const filePath = path.join(tempDir, '.cursor', 'rules', 'web-frontend-overview.md');
812
875
  fs.writeFileSync(filePath, '# Modified content');
813
-
876
+
814
877
  await remove(tempDir, ['web-frontend'], false, false, true, ['cursor']);
815
-
878
+
816
879
  // Modified file should still exist
817
880
  expect(fs.existsSync(filePath)).toBe(true);
818
881
  expect(fs.readFileSync(filePath, 'utf8')).toBe('# Modified content');
@@ -820,73 +883,107 @@ describe('Install/Remove/Reset Operations', () => {
820
883
 
821
884
  it('should remove modified files with force', async () => {
822
885
  // Modify a file
823
- const filePath = path.join(tempDir, '.cursorrules', 'web-frontend-overview.md');
886
+ const filePath = path.join(tempDir, '.cursor', 'rules', 'web-frontend-overview.md');
824
887
  fs.writeFileSync(filePath, '# Modified content');
825
-
888
+
826
889
  await remove(tempDir, ['web-frontend'], false, true, true, ['cursor']);
827
-
890
+
828
891
  // Modified file should be removed
829
892
  expect(fs.existsSync(filePath)).toBe(false);
830
893
  });
894
+
895
+ it('should also remove files from legacy .cursorrules/ directory', async () => {
896
+ // Manually create files in legacy location
897
+ const legacyDir = path.join(tempDir, LEGACY_CURSORRULES_DIR);
898
+ fs.mkdirSync(legacyDir, { recursive: true });
899
+ for (const rule of TEMPLATES['web-frontend'].rules) {
900
+ fs.writeFileSync(path.join(legacyDir, `web-frontend-${rule}`), '# legacy content');
901
+ }
902
+
903
+ await remove(tempDir, ['web-frontend'], false, true, true, ['cursor']);
904
+
905
+ // Both new and legacy files should be removed
906
+ for (const rule of TEMPLATES['web-frontend'].rules) {
907
+ const prefixedName = `web-frontend-${rule}`;
908
+ expect(fs.existsSync(path.join(tempDir, '.cursor', 'rules', prefixedName))).toBe(false);
909
+ expect(fs.existsSync(path.join(legacyDir, prefixedName))).toBe(false);
910
+ }
911
+ });
831
912
  });
832
913
 
833
914
  describe('reset', () => {
834
- beforeEach(() => {
915
+ beforeEach(async () => {
835
916
  // Install templates
836
- install(tempDir, ['web-frontend', 'web-backend'], false, false, DEFAULT_IDES);
917
+ await install(tempDir, ['web-frontend', 'web-backend'], false, false, DEFAULT_IDES);
837
918
  });
838
919
 
839
- it('should remove all template files from .cursorrules', async () => {
920
+ it('should remove all template files from .cursor/rules', async () => {
840
921
  await reset(tempDir, false, false, true, ['cursor']);
841
-
922
+
842
923
  // Template files should be removed
843
- expect(fs.existsSync(path.join(tempDir, '.cursorrules', 'web-frontend-overview.md'))).toBe(false);
844
- expect(fs.existsSync(path.join(tempDir, '.cursorrules', 'web-backend-overview.md'))).toBe(false);
924
+ expect(fs.existsSync(path.join(tempDir, '.cursor', 'rules', 'web-frontend-overview.md'))).toBe(false);
925
+ expect(fs.existsSync(path.join(tempDir, '.cursor', 'rules', 'web-backend-overview.md'))).toBe(false);
845
926
  });
846
927
 
847
928
  it('should remove shared rules', async () => {
848
929
  await reset(tempDir, false, false, true, ['cursor']);
849
-
930
+
850
931
  for (const rule of SHARED_RULES) {
851
- expect(fs.existsSync(path.join(tempDir, '.cursorrules', rule))).toBe(false);
932
+ expect(fs.existsSync(path.join(tempDir, '.cursor', 'rules', rule))).toBe(false);
852
933
  }
853
934
  });
854
935
 
855
936
  it('should remove CLAUDE.md', async () => {
856
937
  await reset(tempDir, false, false, true, ['claude']);
857
-
938
+
858
939
  expect(fs.existsSync(path.join(tempDir, 'CLAUDE.md'))).toBe(false);
859
940
  });
860
941
 
861
942
  it('should remove copilot-instructions.md', async () => {
862
943
  await reset(tempDir, false, false, true, ['codex']);
863
-
944
+
864
945
  expect(fs.existsSync(path.join(tempDir, '.github', 'copilot-instructions.md'))).toBe(false);
865
946
  });
866
947
 
867
948
  it('should not remove files in dry-run mode', async () => {
868
949
  await reset(tempDir, true, false, true, DEFAULT_IDES);
869
-
950
+
870
951
  // All files should still exist
871
- expect(fs.existsSync(path.join(tempDir, '.cursorrules'))).toBe(true);
952
+ expect(fs.existsSync(path.join(tempDir, '.cursor', 'rules'))).toBe(true);
872
953
  expect(fs.existsSync(path.join(tempDir, 'CLAUDE.md'))).toBe(true);
873
954
  });
874
955
 
875
- it('should remove empty .cursorrules directory', async () => {
956
+ it('should remove empty .cursor/rules directory', async () => {
876
957
  await reset(tempDir, false, false, true, ['cursor']);
877
-
878
- expect(fs.existsSync(path.join(tempDir, '.cursorrules'))).toBe(false);
958
+
959
+ expect(fs.existsSync(path.join(tempDir, '.cursor', 'rules'))).toBe(false);
879
960
  });
880
961
 
881
- it('should keep .cursorrules if non-template files remain', async () => {
962
+ it('should keep .cursor/rules if non-template files remain', async () => {
882
963
  // Add a custom file
883
- fs.writeFileSync(path.join(tempDir, '.cursorrules', 'my-custom-rules.md'), '# Custom');
884
-
964
+ fs.writeFileSync(path.join(tempDir, '.cursor', 'rules', 'my-custom-rules.md'), '# Custom');
965
+
885
966
  await reset(tempDir, false, false, true, ['cursor']);
886
-
967
+
887
968
  // Directory should still exist with custom file
888
- expect(fs.existsSync(path.join(tempDir, '.cursorrules'))).toBe(true);
889
- expect(fs.existsSync(path.join(tempDir, '.cursorrules', 'my-custom-rules.md'))).toBe(true);
969
+ expect(fs.existsSync(path.join(tempDir, '.cursor', 'rules'))).toBe(true);
970
+ expect(fs.existsSync(path.join(tempDir, '.cursor', 'rules', 'my-custom-rules.md'))).toBe(true);
971
+ });
972
+
973
+ it('should also clean up legacy .cursorrules/ directory', async () => {
974
+ // Manually create legacy directory with template files
975
+ const legacyDir = path.join(tempDir, LEGACY_CURSORRULES_DIR);
976
+ fs.mkdirSync(legacyDir, { recursive: true });
977
+ for (const rule of SHARED_RULES) {
978
+ fs.writeFileSync(path.join(legacyDir, rule), '# legacy shared');
979
+ }
980
+ fs.writeFileSync(path.join(legacyDir, 'web-frontend-overview.md'), '# legacy template');
981
+
982
+ await reset(tempDir, false, true, true, ['cursor']);
983
+
984
+ // Both directories should be cleaned up
985
+ expect(fs.existsSync(path.join(tempDir, '.cursor', 'rules', 'web-frontend-overview.md'))).toBe(false);
986
+ expect(fs.existsSync(path.join(legacyDir, 'web-frontend-overview.md'))).toBe(false);
890
987
  });
891
988
  });
892
989
  });