@malamute/ai-rules 1.0.0 → 1.2.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 (133) hide show
  1. package/README.md +270 -121
  2. package/bin/cli.js +5 -2
  3. package/configs/_shared/.claude/rules/conventions/documentation.md +324 -0
  4. package/configs/_shared/.claude/rules/conventions/git.md +265 -0
  5. package/configs/_shared/.claude/rules/{performance.md → conventions/performance.md} +1 -1
  6. package/configs/_shared/.claude/rules/conventions/principles.md +334 -0
  7. package/configs/_shared/.claude/rules/devops/ci-cd.md +262 -0
  8. package/configs/_shared/.claude/rules/devops/docker.md +275 -0
  9. package/configs/_shared/.claude/rules/devops/nx.md +194 -0
  10. package/configs/_shared/.claude/rules/domain/backend/api-design.md +203 -0
  11. package/configs/_shared/.claude/rules/lang/csharp/async.md +220 -0
  12. package/configs/_shared/.claude/rules/lang/csharp/csharp.md +314 -0
  13. package/configs/_shared/.claude/rules/lang/csharp/linq.md +210 -0
  14. package/configs/_shared/.claude/rules/lang/python/async.md +337 -0
  15. package/configs/_shared/.claude/rules/lang/python/celery.md +476 -0
  16. package/configs/_shared/.claude/rules/lang/python/config.md +339 -0
  17. package/configs/{python/.claude/rules → _shared/.claude/rules/lang/python}/database/sqlalchemy.md +6 -1
  18. package/configs/_shared/.claude/rules/lang/python/deployment.md +523 -0
  19. package/configs/_shared/.claude/rules/lang/python/error-handling.md +330 -0
  20. package/configs/_shared/.claude/rules/lang/python/migrations.md +421 -0
  21. package/configs/_shared/.claude/rules/lang/python/python.md +172 -0
  22. package/configs/_shared/.claude/rules/lang/python/repository.md +383 -0
  23. package/configs/{python/.claude/rules → _shared/.claude/rules/lang/python}/testing.md +2 -69
  24. package/configs/_shared/.claude/rules/lang/typescript/async.md +447 -0
  25. package/configs/_shared/.claude/rules/lang/typescript/generics.md +356 -0
  26. package/configs/_shared/.claude/rules/lang/typescript/typescript.md +212 -0
  27. package/configs/_shared/.claude/rules/quality/error-handling.md +48 -0
  28. package/configs/_shared/.claude/rules/quality/logging.md +45 -0
  29. package/configs/_shared/.claude/rules/quality/observability.md +240 -0
  30. package/configs/_shared/.claude/rules/quality/testing-patterns.md +65 -0
  31. package/configs/_shared/.claude/rules/security/secrets-management.md +222 -0
  32. package/configs/_shared/.claude/skills/analysis/explore/SKILL.md +257 -0
  33. package/configs/_shared/.claude/skills/analysis/security-audit/SKILL.md +184 -0
  34. package/configs/_shared/.claude/skills/dev/api-endpoint/SKILL.md +126 -0
  35. package/configs/_shared/.claude/{commands/generate-tests.md → skills/dev/generate-tests/SKILL.md} +6 -0
  36. package/configs/_shared/.claude/{commands/fix-issue.md → skills/git/fix-issue/SKILL.md} +6 -0
  37. package/configs/_shared/.claude/{commands/review-pr.md → skills/git/review-pr/SKILL.md} +6 -0
  38. package/configs/_shared/.claude/skills/infra/deploy/SKILL.md +139 -0
  39. package/configs/_shared/.claude/skills/infra/docker/SKILL.md +95 -0
  40. package/configs/_shared/.claude/skills/infra/migration/SKILL.md +158 -0
  41. package/configs/_shared/.claude/skills/nx/nx-affected/SKILL.md +72 -0
  42. package/configs/_shared/.claude/skills/nx/nx-lib/SKILL.md +375 -0
  43. package/configs/_shared/CLAUDE.md +52 -149
  44. package/configs/angular/.claude/rules/{components.md → core/components.md} +69 -15
  45. package/configs/angular/.claude/rules/core/resource.md +285 -0
  46. package/configs/angular/.claude/rules/core/signals.md +323 -0
  47. package/configs/angular/.claude/rules/http.md +338 -0
  48. package/configs/angular/.claude/rules/routing.md +291 -0
  49. package/configs/angular/.claude/rules/ssr.md +312 -0
  50. package/configs/angular/.claude/rules/state/signal-store.md +408 -0
  51. package/configs/angular/.claude/rules/{state.md → state/state.md} +2 -2
  52. package/configs/angular/.claude/rules/testing.md +7 -7
  53. package/configs/angular/.claude/rules/ui/aria.md +422 -0
  54. package/configs/angular/.claude/rules/ui/forms.md +424 -0
  55. package/configs/angular/.claude/rules/ui/pipes-directives.md +335 -0
  56. package/configs/angular/.claude/settings.json +1 -0
  57. package/configs/angular/.claude/skills/ngrx-slice/SKILL.md +362 -0
  58. package/configs/angular/.claude/skills/signal-store/SKILL.md +445 -0
  59. package/configs/angular/CLAUDE.md +24 -216
  60. package/configs/dotnet/.claude/rules/background-services.md +552 -0
  61. package/configs/dotnet/.claude/rules/configuration.md +426 -0
  62. package/configs/dotnet/.claude/rules/ddd.md +447 -0
  63. package/configs/dotnet/.claude/rules/dependency-injection.md +343 -0
  64. package/configs/dotnet/.claude/rules/mediatr.md +320 -0
  65. package/configs/dotnet/.claude/rules/middleware.md +489 -0
  66. package/configs/dotnet/.claude/rules/result-pattern.md +363 -0
  67. package/configs/dotnet/.claude/rules/validation.md +388 -0
  68. package/configs/dotnet/.claude/settings.json +21 -3
  69. package/configs/dotnet/CLAUDE.md +53 -286
  70. package/configs/fastapi/.claude/rules/background-tasks.md +254 -0
  71. package/configs/fastapi/.claude/rules/dependencies.md +170 -0
  72. package/configs/{python → fastapi}/.claude/rules/fastapi.md +61 -1
  73. package/configs/fastapi/.claude/rules/lifespan.md +274 -0
  74. package/configs/fastapi/.claude/rules/middleware.md +229 -0
  75. package/configs/fastapi/.claude/rules/pydantic.md +433 -0
  76. package/configs/fastapi/.claude/rules/responses.md +251 -0
  77. package/configs/fastapi/.claude/rules/routers.md +202 -0
  78. package/configs/fastapi/.claude/rules/security.md +222 -0
  79. package/configs/fastapi/.claude/rules/testing.md +251 -0
  80. package/configs/fastapi/.claude/rules/websockets.md +298 -0
  81. package/configs/fastapi/.claude/settings.json +33 -0
  82. package/configs/fastapi/CLAUDE.md +144 -0
  83. package/configs/flask/.claude/rules/blueprints.md +208 -0
  84. package/configs/flask/.claude/rules/cli.md +285 -0
  85. package/configs/flask/.claude/rules/configuration.md +281 -0
  86. package/configs/flask/.claude/rules/context.md +238 -0
  87. package/configs/flask/.claude/rules/error-handlers.md +278 -0
  88. package/configs/flask/.claude/rules/extensions.md +278 -0
  89. package/configs/flask/.claude/rules/flask.md +171 -0
  90. package/configs/flask/.claude/rules/marshmallow.md +206 -0
  91. package/configs/flask/.claude/rules/security.md +267 -0
  92. package/configs/flask/.claude/rules/testing.md +284 -0
  93. package/configs/flask/.claude/settings.json +33 -0
  94. package/configs/flask/CLAUDE.md +166 -0
  95. package/configs/nestjs/.claude/rules/common-patterns.md +300 -0
  96. package/configs/nestjs/.claude/rules/filters.md +376 -0
  97. package/configs/nestjs/.claude/rules/interceptors.md +317 -0
  98. package/configs/nestjs/.claude/rules/middleware.md +321 -0
  99. package/configs/nestjs/.claude/rules/modules.md +26 -0
  100. package/configs/nestjs/.claude/rules/pipes.md +351 -0
  101. package/configs/nestjs/.claude/rules/websockets.md +451 -0
  102. package/configs/nestjs/.claude/settings.json +16 -2
  103. package/configs/nestjs/CLAUDE.md +57 -215
  104. package/configs/nextjs/.claude/rules/api-routes.md +358 -0
  105. package/configs/nextjs/.claude/rules/authentication.md +355 -0
  106. package/configs/nextjs/.claude/rules/components.md +52 -0
  107. package/configs/nextjs/.claude/rules/data-fetching.md +249 -0
  108. package/configs/nextjs/.claude/rules/database.md +400 -0
  109. package/configs/nextjs/.claude/rules/middleware.md +303 -0
  110. package/configs/nextjs/.claude/rules/routing.md +324 -0
  111. package/configs/nextjs/.claude/rules/seo.md +350 -0
  112. package/configs/nextjs/.claude/rules/server-actions.md +353 -0
  113. package/configs/nextjs/.claude/rules/state/zustand.md +6 -6
  114. package/configs/nextjs/.claude/settings.json +5 -0
  115. package/configs/nextjs/CLAUDE.md +69 -331
  116. package/package.json +23 -9
  117. package/src/cli.js +220 -0
  118. package/src/config.js +29 -0
  119. package/src/index.js +13 -0
  120. package/src/installer.js +361 -0
  121. package/src/merge.js +116 -0
  122. package/src/tech-config.json +29 -0
  123. package/src/utils.js +96 -0
  124. package/configs/python/.claude/rules/flask.md +0 -332
  125. package/configs/python/.claude/settings.json +0 -18
  126. package/configs/python/CLAUDE.md +0 -273
  127. package/src/install.js +0 -315
  128. /package/configs/_shared/.claude/rules/{accessibility.md → domain/frontend/accessibility.md} +0 -0
  129. /package/configs/_shared/.claude/rules/{security.md → security/security.md} +0 -0
  130. /package/configs/_shared/.claude/skills/{debug → dev/debug}/SKILL.md +0 -0
  131. /package/configs/_shared/.claude/skills/{learning → dev/learning}/SKILL.md +0 -0
  132. /package/configs/_shared/.claude/skills/{spec → dev/spec}/SKILL.md +0 -0
  133. /package/configs/_shared/.claude/skills/{review → git/review}/SKILL.md +0 -0
@@ -0,0 +1,139 @@
1
+ ---
2
+ name: deploy
3
+ description: Generate deployment configuration and CI/CD pipelines
4
+ argument-hint: "<target> [--provider <name>]"
5
+ ---
6
+
7
+ # Deployment Configuration Generator
8
+
9
+ Generate deployment configurations for various platforms.
10
+
11
+ ## Usage
12
+
13
+ - `/deploy github-actions` - GitHub Actions workflow
14
+ - `/deploy docker` - Docker + docker-compose production setup
15
+ - `/deploy kubernetes` - Kubernetes manifests
16
+ - `/deploy vercel` - Vercel configuration
17
+ - `/deploy aws` - AWS (ECS/Lambda) configuration
18
+ - `/deploy --provider azure` - Azure-specific setup
19
+
20
+ ## Behavior
21
+
22
+ 1. **Analyze Project**
23
+ - Detect framework and runtime
24
+ - Identify build commands
25
+ - Find environment variables needed
26
+ - Check for database/cache dependencies
27
+
28
+ 2. **Generate Configuration**
29
+ - CI/CD pipeline files
30
+ - Infrastructure configuration
31
+ - Environment templates
32
+ - Deployment scripts
33
+
34
+ ## Targets
35
+
36
+ ### `github-actions`
37
+
38
+ Generate `.github/workflows/` files:
39
+
40
+ | Workflow | Trigger | Actions |
41
+ |----------|---------|---------|
42
+ | ci.yml | PR, push | Lint, test, build |
43
+ | deploy.yml | push to main | Build, push, deploy |
44
+ | release.yml | tag | Create release, changelog |
45
+
46
+ **Output files:**
47
+ - `.github/workflows/ci.yml`
48
+ - `.github/workflows/deploy.yml`
49
+ - `.github/workflows/release.yml`
50
+
51
+ ### `docker`
52
+
53
+ Generate production Docker setup:
54
+ - Multi-stage `Dockerfile`
55
+ - `docker-compose.prod.yml`
56
+ - `docker-compose.override.yml` (dev)
57
+ - `.dockerignore`
58
+ - `scripts/deploy.sh`
59
+
60
+ ### `kubernetes`
61
+
62
+ Generate K8s manifests:
63
+ - `k8s/deployment.yaml`
64
+ - `k8s/service.yaml`
65
+ - `k8s/ingress.yaml`
66
+ - `k8s/configmap.yaml`
67
+ - `k8s/secrets.yaml` (template)
68
+ - `k8s/hpa.yaml` (autoscaling)
69
+ - `kustomization.yaml`
70
+
71
+ ### `vercel`
72
+
73
+ Generate Vercel config:
74
+ - `vercel.json`
75
+ - Environment variable setup guide
76
+ - Build configuration
77
+
78
+ ### `aws`
79
+
80
+ Generate AWS config:
81
+
82
+ **For ECS:**
83
+ - `ecs/task-definition.json`
84
+ - `ecs/service.json`
85
+ - `buildspec.yml` (CodeBuild)
86
+ - `appspec.yml` (CodeDeploy)
87
+
88
+ **For Lambda:**
89
+ - `serverless.yml` or `sam/template.yaml`
90
+ - Lambda handler wrapper
91
+
92
+ ## Output Format
93
+
94
+ ```
95
+ ## Deployment Configuration
96
+
97
+ ### Target: GitHub Actions + Docker + Kubernetes
98
+
99
+ ## Files Created
100
+
101
+ ### .github/workflows/deploy.yml
102
+ <workflow content>
103
+
104
+ ### k8s/deployment.yaml
105
+ <k8s manifest>
106
+
107
+ ### k8s/service.yaml
108
+ <k8s manifest>
109
+
110
+ ## Environment Variables Required
111
+
112
+ | Variable | Description | Example |
113
+ |----------|-------------|---------|
114
+ | DATABASE_URL | PostgreSQL connection | postgresql://... |
115
+ | REDIS_URL | Redis connection | redis://... |
116
+ | SECRET_KEY | Application secret | <random> |
117
+
118
+ ## Deployment Steps
119
+
120
+ 1. Configure secrets in GitHub/provider
121
+ 2. Push to main branch
122
+ 3. Monitor deployment
123
+ 4. Verify health checks
124
+
125
+ ## Rollback
126
+
127
+ To rollback: `kubectl rollout undo deployment/myapp`
128
+ ```
129
+
130
+ ## Best Practices Included
131
+
132
+ - Health checks and readiness probes
133
+ - Resource limits and requests
134
+ - Horizontal pod autoscaling
135
+ - Rolling update strategy
136
+ - Secret management (never in code)
137
+ - Environment-specific configurations
138
+ - Monitoring and logging setup
139
+ - SSL/TLS configuration
@@ -0,0 +1,95 @@
1
+ ---
2
+ name: docker
3
+ description: Generate Dockerfile and docker-compose configuration for the project
4
+ argument-hint: "[service-name]"
5
+ ---
6
+
7
+ # Docker Configuration Generator
8
+
9
+ Generate production-ready Docker configuration for the current project.
10
+
11
+ ## Behavior
12
+
13
+ 1. **Detect Project Type**
14
+ - Check for `package.json` → Node.js/Next.js/NestJS
15
+ - Check for `requirements.txt` / `pyproject.toml` → Python/FastAPI/Django
16
+ - Check for `*.csproj` / `*.sln` → .NET
17
+
18
+ 2. **Analyze Dependencies**
19
+ - Database requirements (PostgreSQL, MySQL, MongoDB, Redis)
20
+ - Message queues (RabbitMQ, Kafka)
21
+ - Cache layers (Redis, Memcached)
22
+ - Storage requirements
23
+
24
+ 3. **Generate Configuration**
25
+ - Create multi-stage `Dockerfile` with:
26
+ - Build stage with dev dependencies
27
+ - Production stage with minimal footprint
28
+ - Non-root user
29
+ - Health checks
30
+ - Proper caching of layers
31
+ - Create `docker-compose.yml` with:
32
+ - Application service
33
+ - Required infrastructure services
34
+ - Volume mounts for persistence
35
+ - Network configuration
36
+ - Health checks and dependencies
37
+ - Create `.dockerignore` if not present
38
+
39
+ 4. **Optional: Generate for specific service**
40
+ - If service name provided (e.g., `/docker worker`), generate worker-specific config
41
+
42
+ ## Output Format
43
+
44
+ ```
45
+ ## Dockerfile
46
+
47
+ <dockerfile content>
48
+
49
+ ## docker-compose.yml
50
+
51
+ <compose content>
52
+
53
+ ## .dockerignore
54
+
55
+ <ignore patterns>
56
+
57
+ ## Commands
58
+
59
+ - Build: `docker compose build`
60
+ - Start: `docker compose up -d`
61
+ - Logs: `docker compose logs -f`
62
+ - Stop: `docker compose down`
63
+ ```
64
+
65
+ ## Framework-Specific Requirements
66
+
67
+ ### Node.js / Next.js
68
+ - Use `node:20-alpine` base
69
+ - Copy `package*.json` first for layer caching
70
+ - Use `npm ci --only=production`
71
+ - Set `NODE_ENV=production`
72
+
73
+ ### Python / FastAPI
74
+ - Use `python:3.12-slim` base
75
+ - Install only production requirements
76
+ - Use `gunicorn` + `uvicorn` workers
77
+ - Set `PYTHONDONTWRITEBYTECODE=1`
78
+
79
+ ### .NET
80
+ - Use `mcr.microsoft.com/dotnet/aspnet:8.0` runtime
81
+ - Build with `mcr.microsoft.com/dotnet/sdk:8.0`
82
+ - Publish as self-contained if needed
83
+
84
+ ### NestJS
85
+ - Similar to Node.js
86
+ - Include Prisma generation if detected
87
+ - Handle migrations in entrypoint
88
+
89
+ ## Security Considerations
90
+
91
+ - Never include secrets in Dockerfile
92
+ - Use `.dockerignore` to exclude sensitive files
93
+ - Run as non-root user
94
+ - Pin base image versions
95
+ - Scan for vulnerabilities recommendation
@@ -0,0 +1,158 @@
1
+ ---
2
+ name: migration
3
+ description: Generate and manage database migrations
4
+ argument-hint: "<action> [name]"
5
+ ---
6
+
7
+ # Database Migration Manager
8
+
9
+ Generate and manage database migrations across different ORMs.
10
+
11
+ ## Usage
12
+
13
+ - `/migration create add_users_table` - Create new migration
14
+ - `/migration status` - Show migration status
15
+ - `/migration up` - Apply pending migrations
16
+ - `/migration down` - Rollback last migration
17
+ - `/migration reset` - Reset database (dev only)
18
+
19
+ ## Behavior
20
+
21
+ 1. **Detect ORM/Migration Tool**
22
+ - Prisma → `prisma migrate`
23
+ - TypeORM → TypeORM migrations
24
+ - Drizzle → Drizzle Kit
25
+ - Alembic → Alembic migrations
26
+ - EF Core → Entity Framework migrations
27
+ - Django → Django migrations
28
+
29
+ 2. **Create Migration**
30
+
31
+ ### Prisma
32
+ ```bash
33
+ npx prisma migrate dev --name <name>
34
+ ```
35
+
36
+ ### Alembic
37
+ ```bash
38
+ alembic revision --autogenerate -m "<name>"
39
+ ```
40
+
41
+ ### EF Core
42
+ ```bash
43
+ dotnet ef migrations add <name>
44
+ ```
45
+
46
+ 3. **Migration File Template**
47
+
48
+ Generate migration with:
49
+ - Descriptive name with timestamp
50
+ - Up migration (forward)
51
+ - Down migration (rollback)
52
+ - Safe operations (transactions where supported)
53
+
54
+ ## Actions
55
+
56
+ ### `create <name>`
57
+
58
+ 1. Analyze schema changes (if ORM detected)
59
+ 2. Generate migration file
60
+ 3. Show what will be migrated
61
+
62
+ **Output:**
63
+ ```
64
+ ## Migration Created
65
+
66
+ File: migrations/20240115_add_users_table.ts
67
+
68
+ ### Changes Detected
69
+ - CREATE TABLE users (id, email, name, created_at)
70
+ - CREATE INDEX ix_users_email ON users(email)
71
+
72
+ ### Commands
73
+ - Apply: npm run migrate
74
+ - Rollback: npm run migrate:down
75
+ ```
76
+
77
+ ### `status`
78
+
79
+ Show current migration status:
80
+ ```
81
+ ## Migration Status
82
+
83
+ Applied:
84
+ ✓ 20240110_initial
85
+ ✓ 20240112_add_posts
86
+
87
+ Pending:
88
+ ○ 20240115_add_comments
89
+
90
+ Current: 20240112_add_posts
91
+ ```
92
+
93
+ ### `up`
94
+
95
+ Apply pending migrations with safety checks:
96
+ 1. Backup reminder for production
97
+ 2. Show what will be applied
98
+ 3. Confirm before applying
99
+ 4. Run migrations
100
+ 5. Verify success
101
+
102
+ ### `down`
103
+
104
+ Rollback with safety:
105
+ 1. Show what will be rolled back
106
+ 2. Warn about data loss
107
+ 3. Confirm before rolling back
108
+ 4. Run rollback
109
+ 5. Verify success
110
+
111
+ ## Common Migration Patterns
112
+
113
+ ### Add Column (Nullable First)
114
+ ```sql
115
+ -- Up
116
+ ALTER TABLE users ADD COLUMN phone VARCHAR(20);
117
+
118
+ -- Down
119
+ ALTER TABLE users DROP COLUMN phone;
120
+ ```
121
+
122
+ ### Add Column (Non-Nullable)
123
+ ```sql
124
+ -- Up
125
+ ALTER TABLE users ADD COLUMN role VARCHAR(20);
126
+ UPDATE users SET role = 'user' WHERE role IS NULL;
127
+ ALTER TABLE users ALTER COLUMN role SET NOT NULL;
128
+
129
+ -- Down
130
+ ALTER TABLE users DROP COLUMN role;
131
+ ```
132
+
133
+ ### Rename Column
134
+ ```sql
135
+ -- Up
136
+ ALTER TABLE users RENAME COLUMN name TO full_name;
137
+
138
+ -- Down
139
+ ALTER TABLE users RENAME COLUMN full_name TO name;
140
+ ```
141
+
142
+ ### Add Index
143
+ ```sql
144
+ -- Up
145
+ CREATE INDEX CONCURRENTLY ix_users_email ON users(email);
146
+
147
+ -- Down
148
+ DROP INDEX ix_users_email;
149
+ ```
150
+
151
+ ## Safety Guidelines
152
+
153
+ - Always provide rollback path
154
+ - Use `CONCURRENTLY` for index creation (PostgreSQL)
155
+ - Avoid locks on large tables
156
+ - Split large data migrations into batches
157
+ - Test migrations on copy of production data
158
+ - Never modify applied migrations
@@ -0,0 +1,72 @@
1
+ ---
2
+ name: nx-affected
3
+ description: Run Nx affected commands to test/build/lint only changed projects
4
+ argument-hint: [test|build|lint|e2e] (optional, defaults to test)
5
+ ---
6
+
7
+ # Nx Affected Analysis
8
+
9
+ Analyze and run commands only on affected projects based on git changes.
10
+
11
+ ## Behavior
12
+
13
+ 1. **Determine base branch**
14
+ ```bash
15
+ # Check if main or master
16
+ git rev-parse --verify main 2>/dev/null && echo "main" || echo "master"
17
+ ```
18
+
19
+ 2. **Show affected projects**
20
+ ```bash
21
+ nx show projects --affected --base=<base> --head=HEAD
22
+ ```
23
+
24
+ 3. **Visualize dependencies** (optional)
25
+ ```bash
26
+ nx affected:graph --base=<base> --head=HEAD
27
+ ```
28
+
29
+ 4. **Run the requested target**
30
+
31
+ Based on argument (default: `test`):
32
+
33
+ | Argument | Command |
34
+ |----------|---------|
35
+ | `test` | `nx affected -t test --base=<base> --head=HEAD` |
36
+ | `build` | `nx affected -t build --base=<base> --head=HEAD` |
37
+ | `lint` | `nx affected -t lint --base=<base> --head=HEAD` |
38
+ | `e2e` | `nx affected -t e2e --base=<base> --head=HEAD` |
39
+ | `all` | Run test, lint, build sequentially |
40
+
41
+ ## Output Format
42
+
43
+ ```
44
+ ## Affected Projects
45
+
46
+ Based on changes from `main`:
47
+
48
+ - `users-feature-list` (3 files changed)
49
+ - `users-data-access` (1 file changed)
50
+ - `shared-ui-button` (2 files changed)
51
+
52
+ ## Running: nx affected -t test
53
+
54
+ ✓ users-feature-list (2.3s)
55
+ ✓ users-data-access (1.1s)
56
+ ✓ shared-ui-button (0.8s)
57
+
58
+ All 3 affected projects passed.
59
+ ```
60
+
61
+ ## CI Usage Hint
62
+
63
+ Suggest adding to CI if not present:
64
+
65
+ ```yaml
66
+ # .github/workflows/ci.yml
67
+ - name: Test affected
68
+ run: nx affected -t test --base=origin/main --head=HEAD
69
+
70
+ - name: Build affected
71
+ run: nx affected -t build --base=origin/main --head=HEAD
72
+ ```