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.
- package/README.md +36 -29
- package/package.json +1 -1
- package/src/index.js +297 -127
- package/src/index.test.js +165 -68
- /package/templates/{utility-agent/.cursorrules → agents/utility-agent/.cursor/rules}/action-control.md +0 -0
- /package/templates/{utility-agent/.cursorrules → agents/utility-agent/.cursor/rules}/context-management.md +0 -0
- /package/templates/{utility-agent/.cursorrules → agents/utility-agent/.cursor/rules}/hallucination-prevention.md +0 -0
- /package/templates/{utility-agent/.cursorrules → agents/utility-agent/.cursor/rules}/overview.md +0 -0
- /package/templates/{utility-agent/.cursorrules → agents/utility-agent/.cursor/rules}/token-optimization.md +0 -0
- /package/templates/{utility-agent → agents/utility-agent}/CLAUDE.md +0 -0
- /package/templates/{product-manager/.cursorrules → business/product-manager/.cursor/rules}/communication.md +0 -0
- /package/templates/{product-manager/.cursorrules → business/product-manager/.cursor/rules}/discovery.md +0 -0
- /package/templates/{product-manager/.cursorrules → business/product-manager/.cursor/rules}/metrics.md +0 -0
- /package/templates/{product-manager/.cursorrules → business/product-manager/.cursor/rules}/overview.md +0 -0
- /package/templates/{product-manager/.cursorrules → business/product-manager/.cursor/rules}/prioritization.md +0 -0
- /package/templates/{product-manager/.cursorrules → business/product-manager/.cursor/rules}/requirements.md +0 -0
- /package/templates/{product-manager → business/product-manager}/CLAUDE.md +0 -0
- /package/templates/{ux-designer/.cursorrules → creative/ux-designer/.cursor/rules}/accessibility.md +0 -0
- /package/templates/{ux-designer/.cursorrules → creative/ux-designer/.cursor/rules}/emotional-design.md +0 -0
- /package/templates/{ux-designer/.cursorrules → creative/ux-designer/.cursor/rules}/handoff.md +0 -0
- /package/templates/{ux-designer/.cursorrules → creative/ux-designer/.cursor/rules}/information-architecture.md +0 -0
- /package/templates/{ux-designer/.cursorrules → creative/ux-designer/.cursor/rules}/interaction-design.md +0 -0
- /package/templates/{ux-designer/.cursorrules → creative/ux-designer/.cursor/rules}/overview.md +0 -0
- /package/templates/{ux-designer/.cursorrules → creative/ux-designer/.cursor/rules}/research.md +0 -0
- /package/templates/{ux-designer/.cursorrules → creative/ux-designer/.cursor/rules}/visual-design.md +0 -0
- /package/templates/{ux-designer → creative/ux-designer}/CLAUDE.md +0 -0
- /package/templates/{educator/.cursorrules → education/educator/.cursor/rules}/accessibility.md +0 -0
- /package/templates/{educator/.cursorrules → education/educator/.cursor/rules}/assessment.md +0 -0
- /package/templates/{educator/.cursorrules → education/educator/.cursor/rules}/curriculum.md +0 -0
- /package/templates/{educator/.cursorrules → education/educator/.cursor/rules}/engagement.md +0 -0
- /package/templates/{educator/.cursorrules → education/educator/.cursor/rules}/instructional-design.md +0 -0
- /package/templates/{educator/.cursorrules → education/educator/.cursor/rules}/overview.md +0 -0
- /package/templates/{educator/.cursorrules → education/educator/.cursor/rules}/retention.md +0 -0
- /package/templates/{educator → education/educator}/CLAUDE.md +0 -0
- /package/templates/{blockchain/.cursorrules → engineering/blockchain/.cursor/rules}/defi-patterns.md +0 -0
- /package/templates/{blockchain/.cursorrules → engineering/blockchain/.cursor/rules}/gas-optimization.md +0 -0
- /package/templates/{blockchain/.cursorrules → engineering/blockchain/.cursor/rules}/overview.md +0 -0
- /package/templates/{blockchain/.cursorrules → engineering/blockchain/.cursor/rules}/security.md +0 -0
- /package/templates/{blockchain/.cursorrules → engineering/blockchain/.cursor/rules}/smart-contracts.md +0 -0
- /package/templates/{blockchain/.cursorrules → engineering/blockchain/.cursor/rules}/testing.md +0 -0
- /package/templates/{blockchain/.cursorrules → engineering/blockchain/.cursor/rules}/web3-integration.md +0 -0
- /package/templates/{blockchain → engineering/blockchain}/CLAUDE.md +0 -0
- /package/templates/{cli-tools/.cursorrules → engineering/cli-tools/.cursor/rules}/architecture.md +0 -0
- /package/templates/{cli-tools/.cursorrules → engineering/cli-tools/.cursor/rules}/arguments.md +0 -0
- /package/templates/{cli-tools/.cursorrules → engineering/cli-tools/.cursor/rules}/distribution.md +0 -0
- /package/templates/{cli-tools/.cursorrules → engineering/cli-tools/.cursor/rules}/error-handling.md +0 -0
- /package/templates/{cli-tools/.cursorrules → engineering/cli-tools/.cursor/rules}/overview.md +0 -0
- /package/templates/{cli-tools/.cursorrules → engineering/cli-tools/.cursor/rules}/testing.md +0 -0
- /package/templates/{cli-tools/.cursorrules → engineering/cli-tools/.cursor/rules}/user-experience.md +0 -0
- /package/templates/{cli-tools → engineering/cli-tools}/CLAUDE.md +0 -0
- /package/templates/{data-engineering/.cursorrules → engineering/data-engineering/.cursor/rules}/data-modeling.md +0 -0
- /package/templates/{data-engineering/.cursorrules → engineering/data-engineering/.cursor/rules}/data-quality.md +0 -0
- /package/templates/{data-engineering/.cursorrules → engineering/data-engineering/.cursor/rules}/overview.md +0 -0
- /package/templates/{data-engineering/.cursorrules → engineering/data-engineering/.cursor/rules}/performance.md +0 -0
- /package/templates/{data-engineering/.cursorrules → engineering/data-engineering/.cursor/rules}/pipeline-design.md +0 -0
- /package/templates/{data-engineering/.cursorrules → engineering/data-engineering/.cursor/rules}/security.md +0 -0
- /package/templates/{data-engineering/.cursorrules → engineering/data-engineering/.cursor/rules}/testing.md +0 -0
- /package/templates/{data-engineering → engineering/data-engineering}/CLAUDE.md +0 -0
- /package/templates/{devops-sre/.cursorrules → engineering/devops-sre/.cursor/rules}/capacity-planning.md +0 -0
- /package/templates/{devops-sre/.cursorrules → engineering/devops-sre/.cursor/rules}/change-management.md +0 -0
- /package/templates/{devops-sre/.cursorrules → engineering/devops-sre/.cursor/rules}/chaos-engineering.md +0 -0
- /package/templates/{devops-sre/.cursorrules → engineering/devops-sre/.cursor/rules}/disaster-recovery.md +0 -0
- /package/templates/{devops-sre/.cursorrules → engineering/devops-sre/.cursor/rules}/incident-management.md +0 -0
- /package/templates/{devops-sre/.cursorrules → engineering/devops-sre/.cursor/rules}/observability.md +0 -0
- /package/templates/{devops-sre/.cursorrules → engineering/devops-sre/.cursor/rules}/overview.md +0 -0
- /package/templates/{devops-sre/.cursorrules → engineering/devops-sre/.cursor/rules}/postmortems.md +0 -0
- /package/templates/{devops-sre/.cursorrules → engineering/devops-sre/.cursor/rules}/runbooks.md +0 -0
- /package/templates/{devops-sre/.cursorrules → engineering/devops-sre/.cursor/rules}/slo-sli.md +0 -0
- /package/templates/{devops-sre/.cursorrules → engineering/devops-sre/.cursor/rules}/toil-reduction.md +0 -0
- /package/templates/{devops-sre → engineering/devops-sre}/CLAUDE.md +0 -0
- /package/templates/{fullstack/.cursorrules → engineering/fullstack/.cursor/rules}/api-contracts.md +0 -0
- /package/templates/{fullstack/.cursorrules → engineering/fullstack/.cursor/rules}/architecture.md +0 -0
- /package/templates/{fullstack/.cursorrules → engineering/fullstack/.cursor/rules}/overview.md +0 -0
- /package/templates/{fullstack/.cursorrules → engineering/fullstack/.cursor/rules}/shared-types.md +0 -0
- /package/templates/{fullstack/.cursorrules → engineering/fullstack/.cursor/rules}/testing.md +0 -0
- /package/templates/{fullstack → engineering/fullstack}/CLAUDE.md +0 -0
- /package/templates/{ml-ai/.cursorrules → engineering/ml-ai/.cursor/rules}/data-engineering.md +0 -0
- /package/templates/{ml-ai/.cursorrules → engineering/ml-ai/.cursor/rules}/deployment.md +0 -0
- /package/templates/{ml-ai/.cursorrules → engineering/ml-ai/.cursor/rules}/model-development.md +0 -0
- /package/templates/{ml-ai/.cursorrules → engineering/ml-ai/.cursor/rules}/monitoring.md +0 -0
- /package/templates/{ml-ai/.cursorrules → engineering/ml-ai/.cursor/rules}/overview.md +0 -0
- /package/templates/{ml-ai/.cursorrules → engineering/ml-ai/.cursor/rules}/security.md +0 -0
- /package/templates/{ml-ai/.cursorrules → engineering/ml-ai/.cursor/rules}/testing.md +0 -0
- /package/templates/{ml-ai → engineering/ml-ai}/CLAUDE.md +0 -0
- /package/templates/{mobile/.cursorrules → engineering/mobile/.cursor/rules}/navigation.md +0 -0
- /package/templates/{mobile/.cursorrules → engineering/mobile/.cursor/rules}/offline-first.md +0 -0
- /package/templates/{mobile/.cursorrules → engineering/mobile/.cursor/rules}/overview.md +0 -0
- /package/templates/{mobile/.cursorrules → engineering/mobile/.cursor/rules}/performance.md +0 -0
- /package/templates/{mobile/.cursorrules → engineering/mobile/.cursor/rules}/testing.md +0 -0
- /package/templates/{mobile → engineering/mobile}/CLAUDE.md +0 -0
- /package/templates/{platform-engineering/.cursorrules → engineering/platform-engineering/.cursor/rules}/ci-cd.md +0 -0
- /package/templates/{platform-engineering/.cursorrules → engineering/platform-engineering/.cursor/rules}/developer-experience.md +0 -0
- /package/templates/{platform-engineering/.cursorrules → engineering/platform-engineering/.cursor/rules}/infrastructure-as-code.md +0 -0
- /package/templates/{platform-engineering/.cursorrules → engineering/platform-engineering/.cursor/rules}/kubernetes.md +0 -0
- /package/templates/{platform-engineering/.cursorrules → engineering/platform-engineering/.cursor/rules}/observability.md +0 -0
- /package/templates/{platform-engineering/.cursorrules → engineering/platform-engineering/.cursor/rules}/overview.md +0 -0
- /package/templates/{platform-engineering/.cursorrules → engineering/platform-engineering/.cursor/rules}/security.md +0 -0
- /package/templates/{platform-engineering/.cursorrules → engineering/platform-engineering/.cursor/rules}/testing.md +0 -0
- /package/templates/{platform-engineering → engineering/platform-engineering}/CLAUDE.md +0 -0
- /package/templates/{qa-engineering/.cursorrules → engineering/qa-engineering/.cursor/rules}/automation.md +0 -0
- /package/templates/{qa-engineering/.cursorrules → engineering/qa-engineering/.cursor/rules}/metrics.md +0 -0
- /package/templates/{qa-engineering/.cursorrules → engineering/qa-engineering/.cursor/rules}/overview.md +0 -0
- /package/templates/{qa-engineering/.cursorrules → engineering/qa-engineering/.cursor/rules}/quality-gates.md +0 -0
- /package/templates/{qa-engineering/.cursorrules → engineering/qa-engineering/.cursor/rules}/test-design.md +0 -0
- /package/templates/{qa-engineering/.cursorrules → engineering/qa-engineering/.cursor/rules}/test-strategy.md +0 -0
- /package/templates/{qa-engineering → engineering/qa-engineering}/CLAUDE.md +0 -0
- /package/templates/{testing/.cursorrules → engineering/testing/.cursor/rules}/advanced-techniques.md +0 -0
- /package/templates/{testing/.cursorrules → engineering/testing/.cursor/rules}/ci-cd-integration.md +0 -0
- /package/templates/{testing/.cursorrules → engineering/testing/.cursor/rules}/overview.md +0 -0
- /package/templates/{testing/.cursorrules → engineering/testing/.cursor/rules}/performance-testing.md +0 -0
- /package/templates/{testing/.cursorrules → engineering/testing/.cursor/rules}/quality-metrics.md +0 -0
- /package/templates/{testing/.cursorrules → engineering/testing/.cursor/rules}/reliability.md +0 -0
- /package/templates/{testing/.cursorrules → engineering/testing/.cursor/rules}/tdd-methodology.md +0 -0
- /package/templates/{testing/.cursorrules → engineering/testing/.cursor/rules}/test-data.md +0 -0
- /package/templates/{testing/.cursorrules → engineering/testing/.cursor/rules}/test-design.md +0 -0
- /package/templates/{testing/.cursorrules → engineering/testing/.cursor/rules}/test-types.md +0 -0
- /package/templates/{testing → engineering/testing}/CLAUDE.md +0 -0
- /package/templates/{web-backend/.cursorrules → engineering/web-backend/.cursor/rules}/api-design.md +0 -0
- /package/templates/{web-backend/.cursorrules → engineering/web-backend/.cursor/rules}/authentication.md +0 -0
- /package/templates/{web-backend/.cursorrules → engineering/web-backend/.cursor/rules}/database-patterns.md +0 -0
- /package/templates/{web-backend/.cursorrules → engineering/web-backend/.cursor/rules}/error-handling.md +0 -0
- /package/templates/{web-backend/.cursorrules → engineering/web-backend/.cursor/rules}/overview.md +0 -0
- /package/templates/{web-backend/.cursorrules → engineering/web-backend/.cursor/rules}/security.md +0 -0
- /package/templates/{web-backend/.cursorrules → engineering/web-backend/.cursor/rules}/testing.md +0 -0
- /package/templates/{web-backend → engineering/web-backend}/CLAUDE.md +0 -0
- /package/templates/{web-frontend/.cursorrules → engineering/web-frontend/.cursor/rules}/accessibility.md +0 -0
- /package/templates/{web-frontend/.cursorrules → engineering/web-frontend/.cursor/rules}/component-patterns.md +0 -0
- /package/templates/{web-frontend/.cursorrules → engineering/web-frontend/.cursor/rules}/overview.md +0 -0
- /package/templates/{web-frontend/.cursorrules → engineering/web-frontend/.cursor/rules}/performance.md +0 -0
- /package/templates/{web-frontend/.cursorrules → engineering/web-frontend/.cursor/rules}/state-management.md +0 -0
- /package/templates/{web-frontend/.cursorrules → engineering/web-frontend/.cursor/rules}/styling.md +0 -0
- /package/templates/{web-frontend/.cursorrules → engineering/web-frontend/.cursor/rules}/testing.md +0 -0
- /package/templates/{web-frontend → engineering/web-frontend}/CLAUDE.md +0 -0
- /package/templates/{cpp-expert/.cursorrules → languages/cpp-expert/.cursor/rules}/concurrency.md +0 -0
- /package/templates/{cpp-expert/.cursorrules → languages/cpp-expert/.cursor/rules}/error-handling.md +0 -0
- /package/templates/{cpp-expert/.cursorrules → languages/cpp-expert/.cursor/rules}/memory-and-ownership.md +0 -0
- /package/templates/{cpp-expert/.cursorrules → languages/cpp-expert/.cursor/rules}/modern-cpp.md +0 -0
- /package/templates/{cpp-expert/.cursorrules → languages/cpp-expert/.cursor/rules}/overview.md +0 -0
- /package/templates/{cpp-expert/.cursorrules → languages/cpp-expert/.cursor/rules}/performance.md +0 -0
- /package/templates/{cpp-expert/.cursorrules → languages/cpp-expert/.cursor/rules}/testing.md +0 -0
- /package/templates/{cpp-expert/.cursorrules → languages/cpp-expert/.cursor/rules}/tooling.md +0 -0
- /package/templates/{cpp-expert → languages/cpp-expert}/CLAUDE.md +0 -0
- /package/templates/{csharp-expert/.cursorrules → languages/csharp-expert/.cursor/rules}/aspnet-core.md +0 -0
- /package/templates/{csharp-expert/.cursorrules → languages/csharp-expert/.cursor/rules}/async-patterns.md +0 -0
- /package/templates/{csharp-expert/.cursorrules → languages/csharp-expert/.cursor/rules}/dependency-injection.md +0 -0
- /package/templates/{csharp-expert/.cursorrules → languages/csharp-expert/.cursor/rules}/error-handling.md +0 -0
- /package/templates/{csharp-expert/.cursorrules → languages/csharp-expert/.cursor/rules}/language-features.md +0 -0
- /package/templates/{csharp-expert/.cursorrules → languages/csharp-expert/.cursor/rules}/overview.md +0 -0
- /package/templates/{csharp-expert/.cursorrules → languages/csharp-expert/.cursor/rules}/performance.md +0 -0
- /package/templates/{csharp-expert/.cursorrules → languages/csharp-expert/.cursor/rules}/testing.md +0 -0
- /package/templates/{csharp-expert/.cursorrules → languages/csharp-expert/.cursor/rules}/tooling.md +0 -0
- /package/templates/{csharp-expert → languages/csharp-expert}/CLAUDE.md +0 -0
- /package/templates/{golang-expert/.cursorrules → languages/golang-expert/.cursor/rules}/concurrency.md +0 -0
- /package/templates/{golang-expert/.cursorrules → languages/golang-expert/.cursor/rules}/error-handling.md +0 -0
- /package/templates/{golang-expert/.cursorrules → languages/golang-expert/.cursor/rules}/interfaces-and-types.md +0 -0
- /package/templates/{golang-expert/.cursorrules → languages/golang-expert/.cursor/rules}/overview.md +0 -0
- /package/templates/{golang-expert/.cursorrules → languages/golang-expert/.cursor/rules}/performance.md +0 -0
- /package/templates/{golang-expert/.cursorrules → languages/golang-expert/.cursor/rules}/production-patterns.md +0 -0
- /package/templates/{golang-expert/.cursorrules → languages/golang-expert/.cursor/rules}/stdlib-and-tooling.md +0 -0
- /package/templates/{golang-expert/.cursorrules → languages/golang-expert/.cursor/rules}/testing.md +0 -0
- /package/templates/{golang-expert → languages/golang-expert}/CLAUDE.md +0 -0
- /package/templates/{java-expert/.cursorrules → languages/java-expert/.cursor/rules}/concurrency.md +0 -0
- /package/templates/{java-expert/.cursorrules → languages/java-expert/.cursor/rules}/error-handling.md +0 -0
- /package/templates/{java-expert/.cursorrules → languages/java-expert/.cursor/rules}/modern-java.md +0 -0
- /package/templates/{java-expert/.cursorrules → languages/java-expert/.cursor/rules}/overview.md +0 -0
- /package/templates/{java-expert/.cursorrules → languages/java-expert/.cursor/rules}/performance.md +0 -0
- /package/templates/{java-expert/.cursorrules → languages/java-expert/.cursor/rules}/persistence.md +0 -0
- /package/templates/{java-expert/.cursorrules → languages/java-expert/.cursor/rules}/spring-boot.md +0 -0
- /package/templates/{java-expert/.cursorrules → languages/java-expert/.cursor/rules}/testing.md +0 -0
- /package/templates/{java-expert/.cursorrules → languages/java-expert/.cursor/rules}/tooling.md +0 -0
- /package/templates/{java-expert → languages/java-expert}/CLAUDE.md +0 -0
- /package/templates/{javascript-expert/.cursorrules → languages/javascript-expert/.cursor/rules}/language-deep-dive.md +0 -0
- /package/templates/{javascript-expert/.cursorrules → languages/javascript-expert/.cursor/rules}/node-patterns.md +0 -0
- /package/templates/{javascript-expert/.cursorrules → languages/javascript-expert/.cursor/rules}/overview.md +0 -0
- /package/templates/{javascript-expert/.cursorrules → languages/javascript-expert/.cursor/rules}/performance.md +0 -0
- /package/templates/{javascript-expert/.cursorrules → languages/javascript-expert/.cursor/rules}/react-patterns.md +0 -0
- /package/templates/{javascript-expert/.cursorrules → languages/javascript-expert/.cursor/rules}/testing.md +0 -0
- /package/templates/{javascript-expert/.cursorrules → languages/javascript-expert/.cursor/rules}/tooling.md +0 -0
- /package/templates/{javascript-expert/.cursorrules → languages/javascript-expert/.cursor/rules}/typescript-deep-dive.md +0 -0
- /package/templates/{javascript-expert → languages/javascript-expert}/CLAUDE.md +0 -0
- /package/templates/{kotlin-expert/.cursorrules → languages/kotlin-expert/.cursor/rules}/coroutines.md +0 -0
- /package/templates/{kotlin-expert/.cursorrules → languages/kotlin-expert/.cursor/rules}/error-handling.md +0 -0
- /package/templates/{kotlin-expert/.cursorrules → languages/kotlin-expert/.cursor/rules}/frameworks.md +0 -0
- /package/templates/{kotlin-expert/.cursorrules → languages/kotlin-expert/.cursor/rules}/language-features.md +0 -0
- /package/templates/{kotlin-expert/.cursorrules → languages/kotlin-expert/.cursor/rules}/overview.md +0 -0
- /package/templates/{kotlin-expert/.cursorrules → languages/kotlin-expert/.cursor/rules}/performance.md +0 -0
- /package/templates/{kotlin-expert/.cursorrules → languages/kotlin-expert/.cursor/rules}/testing.md +0 -0
- /package/templates/{kotlin-expert/.cursorrules → languages/kotlin-expert/.cursor/rules}/tooling.md +0 -0
- /package/templates/{kotlin-expert → languages/kotlin-expert}/CLAUDE.md +0 -0
- /package/templates/{python-expert/.cursorrules → languages/python-expert/.cursor/rules}/async-python.md +0 -0
- /package/templates/{python-expert/.cursorrules → languages/python-expert/.cursor/rules}/overview.md +0 -0
- /package/templates/{python-expert/.cursorrules → languages/python-expert/.cursor/rules}/patterns-and-idioms.md +0 -0
- /package/templates/{python-expert/.cursorrules → languages/python-expert/.cursor/rules}/performance.md +0 -0
- /package/templates/{python-expert/.cursorrules → languages/python-expert/.cursor/rules}/testing.md +0 -0
- /package/templates/{python-expert/.cursorrules → languages/python-expert/.cursor/rules}/tooling.md +0 -0
- /package/templates/{python-expert/.cursorrules → languages/python-expert/.cursor/rules}/type-system.md +0 -0
- /package/templates/{python-expert/.cursorrules → languages/python-expert/.cursor/rules}/web-and-apis.md +0 -0
- /package/templates/{python-expert → languages/python-expert}/CLAUDE.md +0 -0
- /package/templates/{rust-expert/.cursorrules → languages/rust-expert/.cursor/rules}/concurrency.md +0 -0
- /package/templates/{rust-expert/.cursorrules → languages/rust-expert/.cursor/rules}/ecosystem-and-tooling.md +0 -0
- /package/templates/{rust-expert/.cursorrules → languages/rust-expert/.cursor/rules}/error-handling.md +0 -0
- /package/templates/{rust-expert/.cursorrules → languages/rust-expert/.cursor/rules}/overview.md +0 -0
- /package/templates/{rust-expert/.cursorrules → languages/rust-expert/.cursor/rules}/ownership-and-borrowing.md +0 -0
- /package/templates/{rust-expert/.cursorrules → languages/rust-expert/.cursor/rules}/performance-and-unsafe.md +0 -0
- /package/templates/{rust-expert/.cursorrules → languages/rust-expert/.cursor/rules}/testing.md +0 -0
- /package/templates/{rust-expert/.cursorrules → languages/rust-expert/.cursor/rules}/traits-and-generics.md +0 -0
- /package/templates/{rust-expert → languages/rust-expert}/CLAUDE.md +0 -0
- /package/templates/{swift-expert/.cursorrules → languages/swift-expert/.cursor/rules}/concurrency.md +0 -0
- /package/templates/{swift-expert/.cursorrules → languages/swift-expert/.cursor/rules}/error-handling.md +0 -0
- /package/templates/{swift-expert/.cursorrules → languages/swift-expert/.cursor/rules}/language-features.md +0 -0
- /package/templates/{swift-expert/.cursorrules → languages/swift-expert/.cursor/rules}/overview.md +0 -0
- /package/templates/{swift-expert/.cursorrules → languages/swift-expert/.cursor/rules}/performance.md +0 -0
- /package/templates/{swift-expert/.cursorrules → languages/swift-expert/.cursor/rules}/swiftui.md +0 -0
- /package/templates/{swift-expert/.cursorrules → languages/swift-expert/.cursor/rules}/testing.md +0 -0
- /package/templates/{swift-expert/.cursorrules → languages/swift-expert/.cursor/rules}/tooling.md +0 -0
- /package/templates/{swift-expert → languages/swift-expert}/CLAUDE.md +0 -0
- /package/templates/{documentation/.cursorrules → professional/documentation/.cursor/rules}/adr.md +0 -0
- /package/templates/{documentation/.cursorrules → professional/documentation/.cursor/rules}/api-documentation.md +0 -0
- /package/templates/{documentation/.cursorrules → professional/documentation/.cursor/rules}/code-comments.md +0 -0
- /package/templates/{documentation/.cursorrules → professional/documentation/.cursor/rules}/maintenance.md +0 -0
- /package/templates/{documentation/.cursorrules → professional/documentation/.cursor/rules}/overview.md +0 -0
- /package/templates/{documentation/.cursorrules → professional/documentation/.cursor/rules}/readme-standards.md +0 -0
- /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 .
|
|
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
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
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 \`.
|
|
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 \`.
|
|
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 \`.
|
|
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 \`.
|
|
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 =
|
|
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 .
|
|
853
|
+
// 1. Install .cursor/rules/ for Cursor IDE
|
|
788
854
|
if (ides.includes('cursor')) {
|
|
789
855
|
installedFor.push('cursor');
|
|
790
|
-
const
|
|
791
|
-
|
|
792
|
-
if (!dryRun && !fs.existsSync(
|
|
793
|
-
fs.mkdirSync(
|
|
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(
|
|
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(
|
|
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 (
|
|
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 =
|
|
836
|
-
const dest = path.join(
|
|
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: '.
|
|
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
|
|
1077
|
-
|
|
1078
|
-
|
|
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
|
|
1083
|
-
const
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
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
|
-
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
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
|
-
//
|
|
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
|
|
1108
|
-
const
|
|
1109
|
-
|
|
1110
|
-
if (
|
|
1111
|
-
console.log(` ${colors.
|
|
1112
|
-
|
|
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(
|
|
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
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1206
|
-
|
|
1207
|
-
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
const
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
modifiedFiles.push(rule);
|
|
1216
|
-
stats.skipped++;
|
|
1217
|
-
} else {
|
|
1218
|
-
console.log(` ${colors.red('[remove]')} ${rule}${!isUnmodified ? ' (modified, --force)' : ''}`);
|
|
1219
|
-
filesToRemove.push({ path: destPath, name: rule });
|
|
1220
|
-
}
|
|
1221
|
-
|
|
1222
|
-
// Check for -1 variant
|
|
1223
|
-
const altPath = path.join(cursorrules, rule.replace('.md', '-1.md'));
|
|
1224
|
-
if (fs.existsSync(altPath)) {
|
|
1225
|
-
console.log(` ${colors.red('[remove]')} ${rule.replace('.md', '-1.md')} (alternate file)`);
|
|
1226
|
-
filesToRemove.push({ path: altPath, name: rule.replace('.md', '-1.md') });
|
|
1227
|
-
}
|
|
1228
|
-
}
|
|
1229
|
-
|
|
1230
|
-
// Check template-specific rules
|
|
1231
|
-
for (const [templateName, templateInfo] of Object.entries(TEMPLATES)) {
|
|
1232
|
-
for (const rule of templateInfo.rules) {
|
|
1233
|
-
const destName = `${templateName}-${rule}`;
|
|
1234
|
-
const destPath = path.join(cursorrules, destName);
|
|
1235
|
-
const srcPath = path.join(TEMPLATES_DIR, templateName, '.cursorrules', rule);
|
|
1236
|
-
|
|
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]')} ${
|
|
1243
|
-
modifiedFiles.push(
|
|
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]')} ${
|
|
1247
|
-
filesToRemove.push({ path: destPath, name:
|
|
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
|
|
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]')} ${
|
|
1255
|
-
filesToRemove.push({ path: altPath, name:
|
|
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(
|
|
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,
|