@paths.design/caws-cli 7.0.2 → 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 +24 -19
- package/dist/commands/init.js +51 -4
- package/dist/commands/specs.js +40 -1
- package/dist/commands/status.js +2 -2
- package/dist/commands/tool.js +2 -3
- package/dist/config/index.js +17 -8
- package/dist/generators/working-spec.js +19 -6
- package/dist/scaffold/git-hooks.js +127 -29
- package/dist/scaffold/index.js +53 -7
- 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 +4 -3
- 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 +81 -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,144 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Production readiness claims require rigorous verification - agents must prove, not assert
|
|
3
|
+
globs:
|
|
4
|
+
alwaysApply: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Production Readiness Verification & Accountability
|
|
8
|
+
|
|
9
|
+
## Core Principle
|
|
10
|
+
|
|
11
|
+
**Never claim "production-ready", "production-grade", or similar unless ALL criteria below are met.** If any criterion is not satisfied, use these statuses instead:
|
|
12
|
+
|
|
13
|
+
- ❌ **"In development"** - Active development with known issues
|
|
14
|
+
- ❌ **"Partially implemented"** - Some features working, major gaps remain
|
|
15
|
+
- ❌ **"Proof of concept"** - Core concept demonstrated, not production-viable
|
|
16
|
+
|
|
17
|
+
## Mandatory Production Readiness Criteria
|
|
18
|
+
|
|
19
|
+
Before claiming production readiness, **agents must verify ALL of these**:
|
|
20
|
+
|
|
21
|
+
### ✅ Code Quality Gates
|
|
22
|
+
|
|
23
|
+
- **Zero linting errors or warnings** (ESLint, TypeScript, etc.)
|
|
24
|
+
- **Zero TypeScript compilation errors**
|
|
25
|
+
- **All TODOs, PLACEHOLDERs, and MOCK DATA cleared from production code**
|
|
26
|
+
- **No dead code or unused imports**
|
|
27
|
+
- **Consistent code formatting** (Prettier/ESLint rules)
|
|
28
|
+
|
|
29
|
+
### ✅ Testing & Quality Assurance
|
|
30
|
+
|
|
31
|
+
- **Complete unit test coverage** (80%+ line coverage, 90%+ branch coverage)
|
|
32
|
+
- **All unit tests passing** (no skipped tests in production code)
|
|
33
|
+
- **Integration tests passing** (database, external APIs, end-to-end flows)
|
|
34
|
+
- **Mutation testing** (70%+ score for critical components)
|
|
35
|
+
- **Performance tests** meeting documented SLAs
|
|
36
|
+
|
|
37
|
+
### ✅ Infrastructure & Persistence
|
|
38
|
+
|
|
39
|
+
- **Actual database persistence implemented** (not just in-memory mocks)
|
|
40
|
+
- **Database integration tests passing** with real database
|
|
41
|
+
- **Migration scripts tested and working**
|
|
42
|
+
- **Data consistency and rollback capabilities**
|
|
43
|
+
- **Connection pooling and error handling**
|
|
44
|
+
|
|
45
|
+
### ✅ Security & Reliability
|
|
46
|
+
|
|
47
|
+
- **Security controls tested and validated** (authentication, authorization, input validation)
|
|
48
|
+
- **No security scan violations** (SAST, dependency scanning)
|
|
49
|
+
- **Circuit breakers and retry logic** for external dependencies
|
|
50
|
+
- **Graceful degradation** under failure conditions
|
|
51
|
+
- **Logging and monitoring** implemented
|
|
52
|
+
|
|
53
|
+
### ✅ Documentation & Reality Alignment
|
|
54
|
+
|
|
55
|
+
- **Documentation matches implementation reality** (no claims of features that don't exist)
|
|
56
|
+
- **API documentation** current and accurate
|
|
57
|
+
- **Deployment and operational docs** exist
|
|
58
|
+
- **Architecture diagrams** reflect actual implementation
|
|
59
|
+
- **README and changelogs** accurate
|
|
60
|
+
|
|
61
|
+
## Accountability Measures for Coding Agents
|
|
62
|
+
|
|
63
|
+
### Pre-Claim Verification Process
|
|
64
|
+
|
|
65
|
+
1. **Run full test suite** - All tests pass locally
|
|
66
|
+
2. **Run linters** - Zero errors/warnings
|
|
67
|
+
3. **Run security scans** - No vulnerabilities
|
|
68
|
+
4. **Check coverage reports** - Meet or exceed thresholds
|
|
69
|
+
5. **Verify database operations** - Real persistence working
|
|
70
|
+
6. **Test deployment pipeline** - CI/CD passes
|
|
71
|
+
7. **Document verification evidence** - Include in PR/commit
|
|
72
|
+
|
|
73
|
+
### Prohibited Claims
|
|
74
|
+
|
|
75
|
+
**NEVER claim these without verification:**
|
|
76
|
+
|
|
77
|
+
- "Production-ready" without all criteria met
|
|
78
|
+
- "Enterprise-grade" without enterprise testing
|
|
79
|
+
- "Battle-tested" without comprehensive testing
|
|
80
|
+
- "Stable" with failing tests or linting errors
|
|
81
|
+
- "Complete" with TODOs, placeholders, or mock data
|
|
82
|
+
- "Secure" without security testing and scans
|
|
83
|
+
|
|
84
|
+
### Evidence Requirements
|
|
85
|
+
|
|
86
|
+
For any production readiness claim, provide:
|
|
87
|
+
|
|
88
|
+
- Test execution results (screenshots/logs)
|
|
89
|
+
- Coverage reports
|
|
90
|
+
- Lint results
|
|
91
|
+
- Security scan reports
|
|
92
|
+
- Performance benchmarks
|
|
93
|
+
- Database connectivity proofs
|
|
94
|
+
- Deployment verification
|
|
95
|
+
|
|
96
|
+
## Common Failure Patterns to Avoid
|
|
97
|
+
|
|
98
|
+
### Implementation Gaps
|
|
99
|
+
|
|
100
|
+
- Empty directories claiming "full implementation"
|
|
101
|
+
- Mock functions in production code
|
|
102
|
+
- TODO comments in core business logic
|
|
103
|
+
- Placeholder implementations
|
|
104
|
+
- Missing error handling
|
|
105
|
+
|
|
106
|
+
### Testing Shortcuts
|
|
107
|
+
|
|
108
|
+
- Skipping integration tests
|
|
109
|
+
- Mocking database operations
|
|
110
|
+
- Ignoring linting errors
|
|
111
|
+
- Not testing error conditions
|
|
112
|
+
- Fake test data instead of real fixtures
|
|
113
|
+
|
|
114
|
+
### Documentation Lies
|
|
115
|
+
|
|
116
|
+
- Claiming 100% coverage with 75% actual
|
|
117
|
+
- Features documented but not implemented
|
|
118
|
+
- APIs documented with wrong signatures
|
|
119
|
+
- Missing breaking changes in changelogs
|
|
120
|
+
|
|
121
|
+
### Infrastructure Pretending
|
|
122
|
+
|
|
123
|
+
- In-memory storage claiming "persistence"
|
|
124
|
+
- No-op security claiming "secure"
|
|
125
|
+
- Console.log claiming "monitoring"
|
|
126
|
+
- No circuit breakers claiming "resilient"
|
|
127
|
+
|
|
128
|
+
## Verification Checklist
|
|
129
|
+
|
|
130
|
+
Use this before any production claim:
|
|
131
|
+
|
|
132
|
+
- [ ] `npm test` passes all tests
|
|
133
|
+
- [ ] `npm run lint` shows zero errors
|
|
134
|
+
- [ ] `npm run typecheck` passes
|
|
135
|
+
- [ ] Database tests use real PostgreSQL/MySQL/etc.
|
|
136
|
+
- [ ] Security tests validate actual controls
|
|
137
|
+
- [ ] Performance tests meet SLAs
|
|
138
|
+
- [ ] No TODO/PLACEHOLDER/MOCK_DATA in src/
|
|
139
|
+
- [ ] Coverage reports show adequate thresholds
|
|
140
|
+
- [ ] CI/CD pipeline passes
|
|
141
|
+
- [ ] Deployment docs exist and are tested
|
|
142
|
+
- [ ] Documentation matches code reality
|
|
143
|
+
|
|
144
|
+
**If ANY box is unchecked, do not claim production readiness.**
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Default agent behavior, edit style, and risk limits
|
|
3
|
+
globs:
|
|
4
|
+
alwaysApply: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Working Style & Risk Limits
|
|
8
|
+
|
|
9
|
+
## Intent
|
|
10
|
+
|
|
11
|
+
Prefer directly applying fixes over explaining. Explanations are secondary unless asked, or when a change is **risky** (see Risk Gate).
|
|
12
|
+
|
|
13
|
+
## Edit Principles
|
|
14
|
+
|
|
15
|
+
- **Small, bounded diffs.** Keep edits minimal, cohesive, and reviewable.
|
|
16
|
+
- **Edit existing modules over forking.** Prefer refactor + rename to duplication.
|
|
17
|
+
- **Preserve public behavior** unless the task explicitly requests behavioral change.
|
|
18
|
+
|
|
19
|
+
## Ask-First Triggers (Risk Gate)
|
|
20
|
+
|
|
21
|
+
Before editing, _ask with a Targeted Edit Plan_ if any are true:
|
|
22
|
+
|
|
23
|
+
- Changes cross package boundaries or public APIs.
|
|
24
|
+
- Requires deleting files or renaming public symbols.
|
|
25
|
+
- Introduces a new dependency or build tool.
|
|
26
|
+
- Affects security, persistence, auth, or infra.
|
|
27
|
+
- Touches > 10 files or > 300 LOC.
|
|
28
|
+
|
|
29
|
+
**Targeted Edit Plan (TEP)** must include:
|
|
30
|
+
|
|
31
|
+
- Scope (files, symbols), risks, rollback notes.
|
|
32
|
+
- Tests to run/update.
|
|
33
|
+
- Acceptance checks (what passing looks like).
|
|
34
|
+
|
|
35
|
+
## Diff Hygiene
|
|
36
|
+
|
|
37
|
+
- Keep each commit focused on one intent.
|
|
38
|
+
- Include brief rationale in the commit subject (≤72 chars).
|
|
39
|
+
- Never bypass pre-commit hooks; `--no-verify` is **forbidden**.
|
|
40
|
+
|
|
41
|
+
## When to Explain
|
|
42
|
+
|
|
43
|
+
- On TEP prompts, on rejected edits, or when trade-offs are non-obvious.
|
|
44
|
+
- Keep explanations concise and adjacent to the diff.
|
|
45
|
+
|
|
46
|
+
## Acceptance (per PR)
|
|
47
|
+
|
|
48
|
+
- Tests + lints pass locally.
|
|
49
|
+
- No widened public API surface without TEP.
|
|
50
|
+
- No dead code or duplicate modules introduced.
|
|
@@ -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.
|