@paths.design/caws-cli 7.0.1 → 7.0.3
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/dist/budget-derivation.js +5 -4
- package/dist/commands/diagnose.js +26 -20
- package/dist/commands/init.js +72 -5
- package/dist/commands/specs.js +40 -1
- package/dist/commands/status.js +2 -2
- package/dist/commands/templates.js +10 -0
- package/dist/commands/tool.js +2 -3
- package/dist/commands/validate.js +12 -0
- package/dist/config/index.js +17 -8
- package/dist/generators/working-spec.js +42 -9
- package/dist/index.js +3 -1
- package/dist/scaffold/cursor-hooks.js +10 -2
- package/dist/scaffold/git-hooks.js +189 -32
- package/dist/scaffold/index.js +105 -17
- package/dist/templates/.caws/tools/README.md +20 -0
- package/dist/templates/.cursor/README.md +311 -0
- package/dist/templates/.cursor/hooks/audit.sh +55 -0
- package/dist/templates/.cursor/hooks/block-dangerous.sh +83 -0
- package/dist/templates/.cursor/hooks/caws-quality-check.sh +52 -0
- package/dist/templates/.cursor/hooks/caws-scope-guard.sh +130 -0
- package/dist/templates/.cursor/hooks/caws-tool-validation.sh +121 -0
- package/dist/templates/.cursor/hooks/format.sh +38 -0
- package/dist/templates/.cursor/hooks/naming-check.sh +64 -0
- package/dist/templates/.cursor/hooks/scan-secrets.sh +46 -0
- package/dist/templates/.cursor/hooks/scope-guard.sh +52 -0
- package/dist/templates/.cursor/hooks/validate-spec.sh +83 -0
- package/dist/templates/.cursor/hooks.json +59 -0
- package/dist/templates/.cursor/rules/00-claims-verification.mdc +144 -0
- package/dist/templates/.cursor/rules/01-working-style.mdc +50 -0
- package/dist/templates/.cursor/rules/02-quality-gates.mdc +370 -0
- package/dist/templates/.cursor/rules/03-naming-and-refactor.mdc +33 -0
- package/dist/templates/.cursor/rules/04-logging-language-style.mdc +23 -0
- package/dist/templates/.cursor/rules/05-safe-defaults-guards.mdc +23 -0
- package/dist/templates/.cursor/rules/06-typescript-conventions.mdc +36 -0
- package/dist/templates/.cursor/rules/07-process-ops.mdc +20 -0
- package/dist/templates/.cursor/rules/08-solid-and-architecture.mdc +16 -0
- package/dist/templates/.cursor/rules/09-docstrings.mdc +89 -0
- package/dist/templates/.cursor/rules/10-documentation-quality-standards.mdc +390 -0
- package/dist/templates/.cursor/rules/11-scope-management-waivers.mdc +385 -0
- package/dist/templates/.cursor/rules/12-implementation-completeness.mdc +516 -0
- package/dist/templates/.cursor/rules/13-language-agnostic-standards.mdc +588 -0
- package/dist/templates/.cursor/rules/README.md +148 -0
- package/dist/templates/.github/copilot/instructions.md +311 -0
- package/dist/templates/.idea/runConfigurations/CAWS_Evaluate.xml +5 -0
- package/dist/templates/.idea/runConfigurations/CAWS_Validate.xml +5 -0
- package/dist/templates/.vscode/launch.json +56 -0
- package/dist/templates/.vscode/settings.json +93 -0
- package/dist/templates/.windsurf/workflows/caws-guided-development.md +92 -0
- package/dist/templates/COMMIT_CONVENTIONS.md +86 -0
- package/dist/templates/OIDC_SETUP.md +300 -0
- package/dist/templates/agents.md +1047 -0
- package/dist/templates/codemod/README.md +1 -0
- package/dist/templates/codemod/test.js +93 -0
- package/dist/templates/docs/README.md +150 -0
- package/dist/templates/scripts/quality-gates/check-god-objects.js +146 -0
- package/dist/templates/scripts/quality-gates/run-quality-gates.js +50 -0
- package/dist/templates/scripts/v3/analysis/todo_analyzer.py +1997 -0
- package/dist/tool-loader.js +6 -1
- package/dist/tool-validator.js +8 -2
- package/dist/utils/detection.js +34 -6
- package/dist/utils/git-lock.js +118 -0
- package/dist/utils/gitignore-updater.js +148 -0
- package/dist/utils/quality-gates.js +47 -7
- package/dist/utils/spec-resolver.js +23 -3
- package/dist/utils/yaml-validation.js +155 -0
- package/dist/validation/spec-validation.js +105 -2
- package/package.json +2 -2
- package/templates/.caws/schemas/waivers.schema.json +30 -0
- package/templates/.caws/schemas/working-spec.schema.json +133 -0
- package/templates/.caws/templates/working-spec.template.yml +74 -0
- package/templates/.caws/tools/README.md +20 -0
- package/templates/.caws/tools/scope-guard.js +208 -0
- package/templates/.caws/tools-allow.json +331 -0
- package/templates/.caws/waivers.yml +19 -0
- package/templates/.cursor/hooks/scope-guard.sh +2 -2
- package/templates/.cursor/hooks/validate-spec.sh +42 -7
- package/templates/apps/tools/caws/COMPLETION_REPORT.md +0 -331
- package/templates/apps/tools/caws/MIGRATION_SUMMARY.md +0 -360
- package/templates/apps/tools/caws/README.md +0 -463
- package/templates/apps/tools/caws/TEST_STATUS.md +0 -365
- package/templates/apps/tools/caws/attest.js +0 -357
- package/templates/apps/tools/caws/ci-optimizer.js +0 -642
- package/templates/apps/tools/caws/config.ts +0 -245
- package/templates/apps/tools/caws/cross-functional.js +0 -876
- package/templates/apps/tools/caws/dashboard.js +0 -1112
- package/templates/apps/tools/caws/flake-detector.ts +0 -362
- package/templates/apps/tools/caws/gates.js +0 -198
- package/templates/apps/tools/caws/gates.ts +0 -271
- package/templates/apps/tools/caws/language-adapters.ts +0 -381
- package/templates/apps/tools/caws/language-support.d.ts +0 -367
- package/templates/apps/tools/caws/language-support.d.ts.map +0 -1
- package/templates/apps/tools/caws/language-support.js +0 -585
- package/templates/apps/tools/caws/legacy-assessment.ts +0 -408
- package/templates/apps/tools/caws/legacy-assessor.js +0 -764
- package/templates/apps/tools/caws/mutant-analyzer.js +0 -734
- package/templates/apps/tools/caws/perf-budgets.ts +0 -349
- package/templates/apps/tools/caws/prompt-lint.js.backup +0 -274
- package/templates/apps/tools/caws/property-testing.js +0 -707
- package/templates/apps/tools/caws/provenance.d.ts +0 -14
- package/templates/apps/tools/caws/provenance.d.ts.map +0 -1
- package/templates/apps/tools/caws/provenance.js +0 -132
- package/templates/apps/tools/caws/provenance.js.backup +0 -73
- package/templates/apps/tools/caws/provenance.ts +0 -211
- package/templates/apps/tools/caws/security-provenance.ts +0 -483
- package/templates/apps/tools/caws/shared/base-tool.ts +0 -281
- package/templates/apps/tools/caws/shared/config-manager.ts +0 -366
- package/templates/apps/tools/caws/shared/gate-checker.ts +0 -849
- package/templates/apps/tools/caws/shared/types.ts +0 -444
- package/templates/apps/tools/caws/shared/validator.ts +0 -305
- package/templates/apps/tools/caws/shared/waivers-manager.ts +0 -174
- package/templates/apps/tools/caws/spec-test-mapper.ts +0 -391
- package/templates/apps/tools/caws/test-quality.js +0 -578
- package/templates/apps/tools/caws/validate.js +0 -76
- package/templates/apps/tools/caws/validate.ts +0 -228
- package/templates/apps/tools/caws/waivers.js +0 -344
- /package/{templates/apps/tools/caws → dist/templates/.caws}/schemas/waivers.schema.json +0 -0
- /package/{templates/apps/tools/caws → dist/templates/.caws}/schemas/working-spec.schema.json +0 -0
- /package/{templates/apps/tools/caws → dist/templates/.caws}/templates/working-spec.template.yml +0 -0
- /package/{templates/apps/tools/caws → dist/templates/.caws/tools}/scope-guard.js +0 -0
- /package/{templates/apps/tools/caws → dist/templates/.caws}/tools-allow.json +0 -0
- /package/{templates/apps/tools/caws → dist/templates/.caws}/waivers.yml +0 -0
|
@@ -0,0 +1,370 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Comprehensive testing standards and verification requirements
|
|
3
|
+
globs:
|
|
4
|
+
alwaysApply: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Testing Standards & Verification Requirements
|
|
8
|
+
|
|
9
|
+
## Testing Pyramid Requirements
|
|
10
|
+
|
|
11
|
+
### Unit Tests (Foundation Layer)
|
|
12
|
+
|
|
13
|
+
- **Coverage Thresholds**: 80% line coverage, 90% branch coverage minimum
|
|
14
|
+
- **Test Isolation**: Each test completely independent, no shared state
|
|
15
|
+
- **Mock Strategy**: Mock external dependencies, test business logic in isolation
|
|
16
|
+
- **Naming Convention**: `describe('ComponentName', () => { it('should do something', () => {}) })`
|
|
17
|
+
- **Assertion Style**: Use descriptive assertions, avoid generic `toBe(true)`
|
|
18
|
+
|
|
19
|
+
### Integration Tests (Middle Layer)
|
|
20
|
+
|
|
21
|
+
- **Database Integration**: Real database connections, not mocked
|
|
22
|
+
- **External APIs**: Test actual HTTP calls with proper error handling
|
|
23
|
+
- **Component Communication**: Test inter-component contracts
|
|
24
|
+
- **Setup/Teardown**: Proper database seeding and cleanup
|
|
25
|
+
- **Async Handling**: All async operations properly awaited and tested
|
|
26
|
+
|
|
27
|
+
### End-to-End Tests (Top Layer)
|
|
28
|
+
|
|
29
|
+
- **Full User Journeys**: Complete workflows from start to finish
|
|
30
|
+
- **Real Browsers**: Use actual browser automation, not mocked DOM
|
|
31
|
+
- **Data Persistence**: Verify data survives application restarts
|
|
32
|
+
- **Performance Baselines**: Include timing assertions where relevant
|
|
33
|
+
|
|
34
|
+
## Test Quality Standards
|
|
35
|
+
|
|
36
|
+
### Test Structure Requirements
|
|
37
|
+
|
|
38
|
+
```typescript
|
|
39
|
+
describe('ComponentName', () => {
|
|
40
|
+
describe('when condition A', () => {
|
|
41
|
+
it('should behave correctly', () => {
|
|
42
|
+
// Given: Setup preconditions
|
|
43
|
+
// When: Execute the action
|
|
44
|
+
// Then: Verify the outcome
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### Edge Case Coverage
|
|
51
|
+
|
|
52
|
+
- **Null/Undefined**: Test with null, undefined, empty arrays, empty objects
|
|
53
|
+
- **Boundary Values**: Test minimums, maximums, and edge boundaries
|
|
54
|
+
- **Error Conditions**: Test all error paths and exception handling
|
|
55
|
+
- **Concurrency**: Test race conditions and concurrent access
|
|
56
|
+
- **Resource Limits**: Test memory limits, timeouts, rate limits
|
|
57
|
+
|
|
58
|
+
### Test Data Management
|
|
59
|
+
|
|
60
|
+
- **Realistic Fixtures**: Use representative data, not just minimal examples
|
|
61
|
+
- **Factory Pattern**: Create test data factories for consistent object creation
|
|
62
|
+
- **Cleanup Strategy**: Ensure tests don't leave persistent state
|
|
63
|
+
- **Isolation**: Tests must not interfere with each other
|
|
64
|
+
|
|
65
|
+
## Verification Requirements
|
|
66
|
+
|
|
67
|
+
### Pre-Commit Verification
|
|
68
|
+
|
|
69
|
+
- [ ] All unit tests pass (`npm test`)
|
|
70
|
+
- [ ] No tests skipped in production code
|
|
71
|
+
- [ ] Coverage thresholds met
|
|
72
|
+
- [ ] No console errors or warnings in tests
|
|
73
|
+
- [ ] Database tests use real connections
|
|
74
|
+
|
|
75
|
+
### Integration Verification
|
|
76
|
+
|
|
77
|
+
- [ ] Database schema matches migrations
|
|
78
|
+
- [ ] External API contracts validated
|
|
79
|
+
- [ ] Authentication/authorization tested
|
|
80
|
+
- [ ] Error handling verified end-to-end
|
|
81
|
+
|
|
82
|
+
### Performance Verification
|
|
83
|
+
|
|
84
|
+
- [ ] Response times within documented SLAs
|
|
85
|
+
- [ ] Memory usage within limits
|
|
86
|
+
- [ ] Database query performance acceptable
|
|
87
|
+
- [ ] Concurrent user load handled
|
|
88
|
+
|
|
89
|
+
## Test Infrastructure Standards
|
|
90
|
+
|
|
91
|
+
### Testing Tools & Frameworks
|
|
92
|
+
|
|
93
|
+
- **Test Runner**: Jest, Vitest, or equivalent with parallel execution
|
|
94
|
+
- **Assertion Library**: Built-in assertions with descriptive matchers
|
|
95
|
+
- **Mocking**: Comprehensive mocking for external dependencies
|
|
96
|
+
- **Coverage**: Istanbul/NYC for coverage reporting
|
|
97
|
+
- **CI Integration**: Automated test execution in CI pipeline
|
|
98
|
+
|
|
99
|
+
### Database Testing
|
|
100
|
+
|
|
101
|
+
- **Test Database**: Separate database instance for tests
|
|
102
|
+
- **Schema Sync**: Automatic schema setup/teardown
|
|
103
|
+
- **Data Seeding**: Deterministic test data seeding
|
|
104
|
+
- **Transaction Rollback**: Tests wrapped in transactions for cleanup
|
|
105
|
+
|
|
106
|
+
### CI/CD Testing
|
|
107
|
+
|
|
108
|
+
- **Parallel Execution**: Tests run in parallel for speed
|
|
109
|
+
- **Flaky Test Detection**: Automatic retry for known flaky tests
|
|
110
|
+
- **Coverage Reporting**: Coverage reports uploaded to CI
|
|
111
|
+
- **Test Result Storage**: Historical test results tracked
|
|
112
|
+
|
|
113
|
+
## Testing Anti-Patterns (Forbidden)
|
|
114
|
+
|
|
115
|
+
### ❌ Mocking Core Business Logic
|
|
116
|
+
|
|
117
|
+
```typescript
|
|
118
|
+
// DON'T: Mock the function you're supposed to test
|
|
119
|
+
jest.mock('./businessLogic', () => ({
|
|
120
|
+
calculateTotal: jest.fn(() => 100),
|
|
121
|
+
}));
|
|
122
|
+
|
|
123
|
+
test('calculateTotal', () => {
|
|
124
|
+
expect(calculateTotal()).toBe(100); // Tests the mock, not the logic
|
|
125
|
+
});
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### ❌ Testing Implementation Details
|
|
129
|
+
|
|
130
|
+
```typescript
|
|
131
|
+
// DON'T: Test private methods or internal state
|
|
132
|
+
test('internal counter increments', () => {
|
|
133
|
+
component.privateCounter = 5; // Accessing private state
|
|
134
|
+
expect(component.privateCounter).toBe(5);
|
|
135
|
+
});
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
### ❌ Inadequate Error Testing
|
|
139
|
+
|
|
140
|
+
```typescript
|
|
141
|
+
// DON'T: Generic error testing
|
|
142
|
+
test('throws error', () => {
|
|
143
|
+
expect(() => riskyOperation()).toThrow(); // Too vague
|
|
144
|
+
});
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
### ❌ No Cleanup in Integration Tests
|
|
148
|
+
|
|
149
|
+
```typescript
|
|
150
|
+
// DON'T: Leave test data behind
|
|
151
|
+
test('creates user', async () => {
|
|
152
|
+
await createUser({ name: 'test' });
|
|
153
|
+
// No cleanup - data persists
|
|
154
|
+
});
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
## Testing Best Practices
|
|
158
|
+
|
|
159
|
+
### ✅ Proper Error Testing
|
|
160
|
+
|
|
161
|
+
```typescript
|
|
162
|
+
test('throws specific error for invalid input', () => {
|
|
163
|
+
expect(() => validateEmail('invalid')).toThrow(ValidationError);
|
|
164
|
+
expect(() => validateEmail('invalid')).toThrow('Invalid email format');
|
|
165
|
+
});
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
### ✅ Realistic Test Data
|
|
169
|
+
|
|
170
|
+
```typescript
|
|
171
|
+
const realisticUser = {
|
|
172
|
+
id: 'user-123',
|
|
173
|
+
email: 'user@example.com',
|
|
174
|
+
name: 'John Doe',
|
|
175
|
+
createdAt: new Date('2024-01-01'),
|
|
176
|
+
preferences: { theme: 'dark', notifications: true },
|
|
177
|
+
};
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
### ✅ Proper Async Testing
|
|
181
|
+
|
|
182
|
+
```typescript
|
|
183
|
+
test('resolves with correct data', async () => {
|
|
184
|
+
const result = await fetchUserData('user-123');
|
|
185
|
+
expect(result).toEqual(expectedUserData);
|
|
186
|
+
});
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
### ✅ Database Test Cleanup
|
|
190
|
+
|
|
191
|
+
```typescript
|
|
192
|
+
describe('UserService', () => {
|
|
193
|
+
let dbClient;
|
|
194
|
+
|
|
195
|
+
beforeEach(async () => {
|
|
196
|
+
dbClient = await createTestDbConnection();
|
|
197
|
+
await seedTestData(dbClient);
|
|
198
|
+
});
|
|
199
|
+
|
|
200
|
+
afterEach(async () => {
|
|
201
|
+
await cleanupTestData(dbClient);
|
|
202
|
+
await dbClient.end();
|
|
203
|
+
});
|
|
204
|
+
});
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
## Test Documentation Requirements
|
|
208
|
+
|
|
209
|
+
### Test Comments for Complex Logic
|
|
210
|
+
|
|
211
|
+
```typescript
|
|
212
|
+
test('calculates compound interest with monthly compounding', () => {
|
|
213
|
+
// Formula: A = P(1 + r/n)^(nt)
|
|
214
|
+
// Where: A = final amount, P = principal, r = rate, n = compounding frequency, t = time
|
|
215
|
+
const principal = 1000;
|
|
216
|
+
const rate = 0.05; // 5%
|
|
217
|
+
const compoundingFrequency = 12; // monthly
|
|
218
|
+
const timeInYears = 2;
|
|
219
|
+
|
|
220
|
+
const result = calculateCompoundInterest(principal, rate, compoundingFrequency, timeInYears);
|
|
221
|
+
const expected = 1104.54; // Pre-calculated expected value
|
|
222
|
+
|
|
223
|
+
expect(result).toBeCloseTo(expected, 2);
|
|
224
|
+
});
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
### Test Coverage Comments
|
|
228
|
+
|
|
229
|
+
```typescript
|
|
230
|
+
// Test Coverage:
|
|
231
|
+
// ✅ Happy path: valid input -> correct output
|
|
232
|
+
// ✅ Edge case: zero principal -> zero result
|
|
233
|
+
// ✅ Edge case: negative rate -> throws error
|
|
234
|
+
// ✅ Error case: invalid compounding frequency -> throws error
|
|
235
|
+
// ✅ Boundary: very large numbers -> handles precision
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
## Performance Testing Standards
|
|
239
|
+
|
|
240
|
+
### Response Time Assertions
|
|
241
|
+
|
|
242
|
+
```typescript
|
|
243
|
+
test('responds within SLA', async () => {
|
|
244
|
+
const startTime = Date.now();
|
|
245
|
+
const result = await expensiveOperation();
|
|
246
|
+
const duration = Date.now() - startTime;
|
|
247
|
+
|
|
248
|
+
expect(duration).toBeLessThan(5000); // 5 second SLA
|
|
249
|
+
expect(result).toBeDefined();
|
|
250
|
+
});
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
### Load Testing Guidelines
|
|
254
|
+
|
|
255
|
+
- Test with realistic concurrent users
|
|
256
|
+
- Include warm-up periods
|
|
257
|
+
- Measure 95th percentile response times
|
|
258
|
+
- Test memory usage under load
|
|
259
|
+
- Verify graceful degradation
|
|
260
|
+
|
|
261
|
+
## Mutation Testing Standards
|
|
262
|
+
|
|
263
|
+
### Mutation Operators to Cover
|
|
264
|
+
|
|
265
|
+
- **Arithmetic Operators**: `+`, `-`, `*`, `/`, `%`
|
|
266
|
+
- **Logical Operators**: `&&`, `||`, `!`
|
|
267
|
+
- **Comparison Operators**: `==`, `!=`, `<`, `>`, `<=`, `>=`
|
|
268
|
+
- **Conditional Boundaries**: `if` conditions, ternary operators
|
|
269
|
+
- **Return Statements**: Missing/incorrect returns
|
|
270
|
+
- **Variable Assignments**: Wrong variable assignments
|
|
271
|
+
|
|
272
|
+
### Mutation Score Targets
|
|
273
|
+
|
|
274
|
+
- **Critical Components**: 80%+ mutation score
|
|
275
|
+
- **Business Logic**: 70%+ mutation score
|
|
276
|
+
- **Utilities**: 60%+ mutation score
|
|
277
|
+
- **UI Components**: 50%+ mutation score (may be lower due to test complexity)
|
|
278
|
+
|
|
279
|
+
## Accessibility Testing (Web Components)
|
|
280
|
+
|
|
281
|
+
### Screen Reader Testing
|
|
282
|
+
|
|
283
|
+
```typescript
|
|
284
|
+
test("is accessible to screen readers", () => {
|
|
285
|
+
render(<Button>Click me</Button>);
|
|
286
|
+
|
|
287
|
+
// Test ARIA labels
|
|
288
|
+
expect(screen.getByRole("button")).toHaveAttribute("aria-label", "Click me");
|
|
289
|
+
|
|
290
|
+
// Test keyboard navigation
|
|
291
|
+
userEvent.tab();
|
|
292
|
+
expect(screen.getByRole("button")).toHaveFocus();
|
|
293
|
+
});
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
### Color Contrast Testing
|
|
297
|
+
|
|
298
|
+
```typescript
|
|
299
|
+
test("meets color contrast requirements", () => {
|
|
300
|
+
render(<Text variant="error">Error message</Text>);
|
|
301
|
+
|
|
302
|
+
const element = screen.getByText("Error message");
|
|
303
|
+
const styles = window.getComputedStyle(element);
|
|
304
|
+
|
|
305
|
+
// Verify contrast ratio programmatically
|
|
306
|
+
expect(
|
|
307
|
+
getContrastRatio(styles.color, styles.backgroundColor)
|
|
308
|
+
).toBeGreaterThan(4.5);
|
|
309
|
+
});
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
## Execution Discipline
|
|
313
|
+
|
|
314
|
+
- Run unit tests and lints after any major change; iterate until green.
|
|
315
|
+
- If the project defines an engine, confirm Node version via console before running scripts.
|
|
316
|
+
- `.env` files exist; do **not** attempt to cat protected dotfiles. Use framework tooling or documented env loaders.
|
|
317
|
+
|
|
318
|
+
## Commits
|
|
319
|
+
|
|
320
|
+
- `--no-verify` is **not allowed**. If hooks fail, **fix the cause** or split work into smaller audited commits.
|
|
321
|
+
- Commit subjects: **what + why** in one sentence. Bodies for context only when needed.
|
|
322
|
+
|
|
323
|
+
## TODOs & Placeholders
|
|
324
|
+
|
|
325
|
+
Tag placeholders explicitly in code:
|
|
326
|
+
|
|
327
|
+
- `// TODO: ...` (critical, must block if reached)
|
|
328
|
+
- `// PLACEHOLDER: ...` (non-critical placeholder, warn)
|
|
329
|
+
- `// MOCK DATA: ...` (remove before release)
|
|
330
|
+
|
|
331
|
+
**Critical TODOs**: throw at execution site with clear message.
|
|
332
|
+
|
|
333
|
+
## Diagrams/Charts
|
|
334
|
+
|
|
335
|
+
- In Markdown, use **Mermaid** only. Ensure contrast (dark text on light, light on dark backgrounds).
|
|
336
|
+
|
|
337
|
+
## CAWS Integration
|
|
338
|
+
|
|
339
|
+
### Quality Gate Commands
|
|
340
|
+
|
|
341
|
+
```bash
|
|
342
|
+
# Run comprehensive test suite
|
|
343
|
+
caws quality-gates --test-coverage --mutation-testing
|
|
344
|
+
|
|
345
|
+
# Check test quality metrics
|
|
346
|
+
caws metrics track --metric="test_coverage" --value=85
|
|
347
|
+
caws metrics track --metric="mutation_score" --value=70
|
|
348
|
+
|
|
349
|
+
# Update progress with test completion
|
|
350
|
+
caws progress update --criterion-id="TEST-001" --status="completed" --tests-passing=25
|
|
351
|
+
```
|
|
352
|
+
|
|
353
|
+
### Test Analysis
|
|
354
|
+
|
|
355
|
+
```bash
|
|
356
|
+
# Analyze test patterns and budget prediction
|
|
357
|
+
caws test-analysis assess-budget
|
|
358
|
+
caws test-analysis analyze-patterns
|
|
359
|
+
caws test-analysis find-similar
|
|
360
|
+
```
|
|
361
|
+
|
|
362
|
+
## Acceptance
|
|
363
|
+
|
|
364
|
+
- `test`, `lint`, `typecheck` succeed.
|
|
365
|
+
- No TODOs executed at runtime.
|
|
366
|
+
- No style violations flagged by project linters.
|
|
367
|
+
- Coverage thresholds met (80%+ line, 90%+ branch)
|
|
368
|
+
- Mutation testing scores meet targets (70%+ for critical components)
|
|
369
|
+
- All integration tests use real database connections
|
|
370
|
+
- Performance tests meet documented SLAs
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Canonical naming; forbid enhanced/new/final forks; refactor rules
|
|
3
|
+
globs:
|
|
4
|
+
alwaysApply: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Canonical Naming & Refactor Rules
|
|
8
|
+
|
|
9
|
+
## No Duplicate/Fork Names
|
|
10
|
+
|
|
11
|
+
Reject or remove modules/files named with these modifiers:
|
|
12
|
+
`enhanced | unified | better | new | next | final | copy | revamp | improved` (case-insensitive).
|
|
13
|
+
|
|
14
|
+
**Pre-flight check (human-run or agent-run shell):**
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
rg -n --no-ignore -g '!node_modules' '(?i)\b(enhanced|unified|better|new|next|final|copy|revamp|improved)\b'
|
|
18
|
+
rg -n --no-ignore -g '!node_modules' '(?i)(enhanced|unified|new|final|copy).*\.([tj]sx?|mjs|cjs|mts|cts)$'
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
If hits exist in proposed filenames/symbols: **do not proceed**. Use **purpose-first canonical names** and edit the existing module.
|
|
22
|
+
|
|
23
|
+
## Refactor Strategy
|
|
24
|
+
|
|
25
|
+
- **Merge, then delete**: If two files cover one domain, merge into the canonical name, update imports, remove the duplicate.
|
|
26
|
+
- Prefer **Strategy** + feature flags over file forks.
|
|
27
|
+
- Every refactor must include tests proving no behavior change (or updated tests + CHANGELOG if behavior changes).
|
|
28
|
+
|
|
29
|
+
## Acceptance
|
|
30
|
+
|
|
31
|
+
- No banned modifiers present in filenames or public symbols.
|
|
32
|
+
- Imports updated; build is green.
|
|
33
|
+
- Duplicates removed from tree.
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Logging, language tone, emoji policy
|
|
3
|
+
globs:
|
|
4
|
+
alwaysApply: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Logging & Language
|
|
8
|
+
|
|
9
|
+
## Clarity over chronology
|
|
10
|
+
|
|
11
|
+
Remove "phase/week" phrasing in docs/logs. State the **specific improvement**:
|
|
12
|
+
|
|
13
|
+
- ❌ "PHASE 1 optimization"
|
|
14
|
+
- ✅ "Initialize workload analyzer for parallelization"
|
|
15
|
+
|
|
16
|
+
## Emojis
|
|
17
|
+
|
|
18
|
+
- Emojis are banned across code, docs, and commits.
|
|
19
|
+
- Exception (debug logs only): ⚠️, ✅, 🚫.
|
|
20
|
+
|
|
21
|
+
## Commit Tone
|
|
22
|
+
|
|
23
|
+
Professional, neutral, and specific. Avoid hype or vague framing.
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Safe defaults, guard clauses, early returns
|
|
3
|
+
globs:
|
|
4
|
+
alwaysApply: false
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Safe Defaults & Guard Clauses
|
|
8
|
+
|
|
9
|
+
## Intent
|
|
10
|
+
|
|
11
|
+
Minimize null/undefined faults and nesting.
|
|
12
|
+
|
|
13
|
+
## Guidelines (language-agnostic)
|
|
14
|
+
|
|
15
|
+
- Prefer **guard clauses** at top of function to fail fast.
|
|
16
|
+
- Default parameter objects in signatures.
|
|
17
|
+
- Prefer **short-circuiting** / optional access / null-coalescing where supported.
|
|
18
|
+
- Loop defensively on possibly-empty collections.
|
|
19
|
+
|
|
20
|
+
## Acceptance
|
|
21
|
+
|
|
22
|
+
- No deep nesting introduced where guard clauses apply.
|
|
23
|
+
- Inputs validated at boundaries; failures are explicit and early.
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: TypeScript/JS conventions (alias imports, const, types source of truth)
|
|
3
|
+
globs:
|
|
4
|
+
- '**/*.ts'
|
|
5
|
+
- '**/*.tsx'
|
|
6
|
+
- '**/*.mts'
|
|
7
|
+
- '**/*.cts'
|
|
8
|
+
alwaysApply: false
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# TS/JS Conventions
|
|
12
|
+
|
|
13
|
+
## Variables
|
|
14
|
+
|
|
15
|
+
- Prefer `const` over `let` where possible.
|
|
16
|
+
|
|
17
|
+
## Imports
|
|
18
|
+
|
|
19
|
+
- Use aliased imports from `@/` (mapped to `src`).
|
|
20
|
+
- Replace deep relative paths (`../../x`) with `@/...` when available.
|
|
21
|
+
|
|
22
|
+
## Types
|
|
23
|
+
|
|
24
|
+
- Single source of truth at `src/types`.
|
|
25
|
+
- Before creating a new type, check and extend the canonical definition.
|
|
26
|
+
- Avoid duplicate declarations; prefer composition or augmentation.
|
|
27
|
+
|
|
28
|
+
## Modularity
|
|
29
|
+
|
|
30
|
+
- As files approach ~1000 LOC, evaluate separation of concerns; extract cohesive units.
|
|
31
|
+
|
|
32
|
+
## Acceptance
|
|
33
|
+
|
|
34
|
+
- No unnecessary `let`.
|
|
35
|
+
- No duplicate type declarations.
|
|
36
|
+
- No deep relative paths where alias exists.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Process discipline for local servers and hung commands
|
|
3
|
+
globs:
|
|
4
|
+
alwaysApply: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Process Discipline
|
|
8
|
+
|
|
9
|
+
## Servers
|
|
10
|
+
|
|
11
|
+
- Before starting a dev server, check if one is already running on the port; reuse or stop it to avoid duplicates.
|
|
12
|
+
- If multiple processes are attached to the port, list and kill explicitly; document PIDs in the PR note if non-obvious.
|
|
13
|
+
|
|
14
|
+
## Hung/Canceled Commands
|
|
15
|
+
|
|
16
|
+
If a command is canceled or stalls:
|
|
17
|
+
|
|
18
|
+
1. Assume it hung or waited for input.
|
|
19
|
+
2. Re-run with verbose/debug flags.
|
|
20
|
+
3. Surface the prompt/interaction in the PR so reviewers understand the resolution.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Architecture invariants (SOLID) and change isolation
|
|
3
|
+
globs:
|
|
4
|
+
alwaysApply: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Architecture Invariants
|
|
8
|
+
|
|
9
|
+
- SRP: Each module/class has one reason to change.
|
|
10
|
+
- OCP: Prefer extension points over editing stable internals.
|
|
11
|
+
- LSP/ISP/DIP: Respect substitution; segregate interfaces; depend on abstractions.
|
|
12
|
+
|
|
13
|
+
## Change Isolation
|
|
14
|
+
|
|
15
|
+
- Introduce seams (interfaces/strategies) near integration points.
|
|
16
|
+
- Add tests at seams; assert unchanged public behavior.
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Language-specific docstring formats and checklists
|
|
3
|
+
globs:
|
|
4
|
+
alwaysApply: false
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Docstrings by Language (Reference)
|
|
8
|
+
|
|
9
|
+
Provide docstrings for public APIs and exported functions, using the language's native format. Include: summary, params, returns, errors, and an example if helpful.
|
|
10
|
+
|
|
11
|
+
| Language | Doc Type | Include |
|
|
12
|
+
| -------- | -------- | ----------------------------------------------- |
|
|
13
|
+
| C# | XML | `<summary>`, `<param>`, `<returns>`, exceptions |
|
|
14
|
+
| C++ | Doxygen | \brief, \param, \return, \exception |
|
|
15
|
+
| Go | GoDoc | Full-sentence summary; examples via `ExampleX` |
|
|
16
|
+
| Java | Javadoc | One-sentence summary; @param/@return/@throws |
|
|
17
|
+
| JS/TS | JSDoc | Description; @param/@returns; @example |
|
|
18
|
+
| Kotlin | KDoc | Summary; @param/@return; @throws |
|
|
19
|
+
| PHP | PHPDoc | Summary; @param/@return; @throws |
|
|
20
|
+
| Python | PEP257 | One-liner; Args/Returns/Raises; example |
|
|
21
|
+
| Ruby | RDoc | Description; @param/@return; @raise |
|
|
22
|
+
| Rust | rustdoc | `///`; Examples/Panics/Errors sections |
|
|
23
|
+
| Swift | DocC | `///`; - Parameters/Returns/Throws; example |
|
|
24
|
+
|
|
25
|
+
## Examples by Language
|
|
26
|
+
|
|
27
|
+
### C# (XML comments)
|
|
28
|
+
|
|
29
|
+
```csharp
|
|
30
|
+
/// <summary>
|
|
31
|
+
/// Adds two integers.
|
|
32
|
+
/// </summary>
|
|
33
|
+
/// <param name="a">First integer.</param>
|
|
34
|
+
/// <param name="b">Second integer.</param>
|
|
35
|
+
/// <returns>The sum of <paramref name="a"/> and <paramref name="b"/>.</returns>
|
|
36
|
+
/// <example>
|
|
37
|
+
/// <code>
|
|
38
|
+
/// var result = calculator.Add(2, 3); // 5
|
|
39
|
+
/// </code>
|
|
40
|
+
/// </example>
|
|
41
|
+
public int Add(int a, int b) => a + b;
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### JavaScript / TypeScript (JSDoc)
|
|
45
|
+
|
|
46
|
+
```ts
|
|
47
|
+
/**
|
|
48
|
+
* Adds two numbers.
|
|
49
|
+
*
|
|
50
|
+
* @param {number} a - First number.
|
|
51
|
+
* @param {number} b - Second number.
|
|
52
|
+
* @returns {number} Sum of a and b.
|
|
53
|
+
* @example
|
|
54
|
+
* add(2, 3); // 5
|
|
55
|
+
*/
|
|
56
|
+
function add(a, b) {
|
|
57
|
+
return a + b;
|
|
58
|
+
}
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### Python (PEP 257 / Google style)
|
|
62
|
+
|
|
63
|
+
```python
|
|
64
|
+
def add(a: int, b: int) -> int:
|
|
65
|
+
"""Add two integers.
|
|
66
|
+
|
|
67
|
+
Args:
|
|
68
|
+
a (int): First integer.
|
|
69
|
+
b (int): Second integer.
|
|
70
|
+
|
|
71
|
+
Returns:
|
|
72
|
+
int: Sum of a and b.
|
|
73
|
+
|
|
74
|
+
Raises:
|
|
75
|
+
ValueError: If a or b is negative.
|
|
76
|
+
|
|
77
|
+
Example:
|
|
78
|
+
>>> add(2, 3)
|
|
79
|
+
5
|
|
80
|
+
"""
|
|
81
|
+
if a < 0 or b < 0:
|
|
82
|
+
raise ValueError("Negative not allowed")
|
|
83
|
+
return a + b
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
## Acceptance
|
|
87
|
+
|
|
88
|
+
- Public APIs have docstrings in native style.
|
|
89
|
+
- Docstrings describe behavior, inputs, outputs, and failure modes.
|