agentic-qe 3.8.2 → 3.8.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/.claude/skills/README.md +29 -7
- package/.claude/skills/TRUST-TIERS.md +26 -10
- package/.claude/skills/a11y-ally/SKILL.md +10 -1
- package/.claude/skills/accessibility-testing/SKILL.md +2 -0
- package/.claude/skills/agentic-quality-engineering/SKILL.md +1 -1
- package/.claude/skills/api-testing-patterns/SKILL.md +8 -0
- package/.claude/skills/api-testing-patterns/config.json +14 -0
- package/.claude/skills/api-testing-patterns/templates/api-test-scaffold.md +87 -0
- package/.claude/skills/bug-reporting-excellence/SKILL.md +14 -0
- package/.claude/skills/code-review-quality/SKILL.md +14 -0
- package/.claude/skills/compatibility-testing/SKILL.md +1 -54
- package/.claude/skills/compliance-testing/SKILL.md +8 -0
- package/.claude/skills/compliance-testing/config.json +13 -0
- package/.claude/skills/consultancy-practices/SKILL.md +1 -32
- package/.claude/skills/context-driven-testing/SKILL.md +0 -41
- package/.claude/skills/contract-testing/SKILL.md +12 -0
- package/.claude/skills/contract-testing/config.json +13 -0
- package/.claude/skills/contract-testing/references/agent-commands.md +103 -0
- package/.claude/skills/contract-testing/references/provider-states.md +45 -0
- package/.claude/skills/coverage-drop-investigator/SKILL.md +90 -0
- package/.claude/skills/coverage-guard/SKILL.md +82 -0
- package/.claude/skills/coverage-guard/scripts/check-coverage.sh +42 -0
- package/.claude/skills/database-testing/SKILL.md +0 -10
- package/.claude/skills/debug-loop/SKILL.md +1 -1
- package/.claude/skills/e2e-flow-verifier/SKILL.md +78 -0
- package/.claude/skills/enterprise-integration-testing/SKILL.md +1 -1
- package/.claude/skills/exploratory-testing-advanced/SKILL.md +8 -0
- package/.claude/skills/exploratory-testing-advanced/references/heuristic-cheatsheet.md +48 -0
- package/.claude/skills/freeze-tests/SKILL.md +67 -0
- package/.claude/skills/freeze-tests/scripts/block-test-edits.sh +27 -0
- package/.claude/skills/localization-testing/SKILL.md +0 -17
- package/.claude/skills/mobile-testing/SKILL.md +2 -49
- package/.claude/skills/mutation-testing/SKILL.md +26 -0
- package/.claude/skills/mutation-testing/config.json +14 -0
- package/.claude/skills/mutation-testing/references/mutation-operators.md +38 -0
- package/.claude/skills/mutation-testing/run-history.json +6 -0
- package/.claude/skills/no-skip/SKILL.md +74 -0
- package/.claude/skills/no-skip/scripts/check-skips.sh +28 -0
- package/.claude/skills/pair-programming/SKILL.md +1 -1
- package/.claude/skills/pentest-validation/SKILL.md +2 -3
- package/.claude/skills/performance-testing/SKILL.md +21 -0
- package/.claude/skills/performance-testing/config.json +18 -0
- package/.claude/skills/performance-testing/references/k6-patterns.md +72 -0
- package/.claude/skills/performance-testing/run-history.json +6 -0
- package/.claude/skills/pr-review/SKILL.md +3 -3
- package/.claude/skills/qcsd-cicd-swarm/SKILL.md +1 -1
- package/.claude/skills/qcsd-development-swarm/SKILL.md +1 -1
- package/.claude/skills/qcsd-ideation-swarm/SKILL.md +1 -1
- package/.claude/skills/qcsd-production-swarm/SKILL.md +1 -1
- package/.claude/skills/qcsd-refinement-swarm/SKILL.md +1 -1
- package/.claude/skills/qe-chaos-resilience/SKILL.md +2 -2
- package/.claude/skills/qe-code-intelligence/SKILL.md +9 -1
- package/.claude/skills/qe-coverage-analysis/SKILL.md +28 -1
- package/.claude/skills/qe-coverage-analysis/run-history.json +6 -0
- package/.claude/skills/qe-defect-intelligence/SKILL.md +1 -1
- package/.claude/skills/qe-learning-optimization/SKILL.md +1 -1
- package/.claude/skills/qe-quality-assessment/SKILL.md +29 -2
- package/.claude/skills/qe-quality-assessment/run-history.json +6 -0
- package/.claude/skills/qe-requirements-validation/SKILL.md +1 -1
- package/.claude/skills/qe-test-execution/SKILL.md +9 -1
- package/.claude/skills/qe-test-generation/SKILL.md +15 -1
- package/.claude/skills/qe-test-generation/config.json +14 -0
- package/.claude/skills/qe-test-generation/templates/test-scaffold-jest.md +72 -0
- package/.claude/skills/qe-visual-accessibility/SKILL.md +1 -1
- package/.claude/skills/quality-metrics/SKILL.md +3 -77
- package/.claude/skills/regression-testing/SKILL.md +13 -48
- package/.claude/skills/risk-based-testing/SKILL.md +6 -51
- package/.claude/skills/security-testing/SKILL.md +30 -0
- package/.claude/skills/security-testing/config.json +13 -0
- package/.claude/skills/security-testing/references/compliance-agent-commands.md +131 -0
- package/.claude/skills/security-testing/references/owasp-top-10.md +66 -0
- package/.claude/skills/security-testing/run-history.json +6 -0
- package/.claude/skills/security-testing/templates/security-report.md +44 -0
- package/.claude/skills/security-watch/SKILL.md +93 -0
- package/.claude/skills/security-watch/scripts/scan-security.sh +46 -0
- package/.claude/skills/shift-left-testing/SKILL.md +16 -87
- package/.claude/skills/skill-stats/SKILL.md +79 -0
- package/.claude/skills/skills-manifest.json +1 -1
- package/.claude/skills/strict-tdd/SKILL.md +72 -0
- package/.claude/skills/strict-tdd/scripts/enforce-red-phase.sh +36 -0
- package/.claude/skills/tdd-london-chicago/SKILL.md +8 -0
- package/.claude/skills/test-automation-strategy/SKILL.md +13 -64
- package/.claude/skills/test-data-management/SKILL.md +1 -104
- package/.claude/skills/test-design-techniques/SKILL.md +2 -151
- package/.claude/skills/test-environment-management/SKILL.md +0 -47
- package/.claude/skills/test-failure-investigator/SKILL.md +99 -0
- package/.claude/skills/test-metrics-dashboard/SKILL.md +97 -0
- package/.claude/skills/trust-tier-manifest.json +135 -61
- package/.claude/skills/validation-pipeline/SKILL.md +1 -1
- package/.claude/skills/verification-quality/SKILL.md +15 -1
- package/.claude/skills/xp-practices/SKILL.md +2 -109
- package/CHANGELOG.md +29 -0
- package/README.md +5 -1
- package/assets/skills/README.md +173 -0
- package/assets/skills/TRUST-TIERS.md +174 -0
- package/assets/skills/a11y-ally/SKILL.md +10 -1
- package/assets/skills/accessibility-testing/SKILL.md +2 -0
- package/assets/skills/agentic-quality-engineering/SKILL.md +1 -1
- package/assets/skills/api-testing-patterns/SKILL.md +8 -0
- package/assets/skills/api-testing-patterns/config.json +14 -0
- package/assets/skills/api-testing-patterns/templates/api-test-scaffold.md +87 -0
- package/assets/skills/bug-reporting-excellence/SKILL.md +14 -0
- package/assets/skills/code-review-quality/SKILL.md +14 -0
- package/assets/skills/compatibility-testing/SKILL.md +1 -54
- package/assets/skills/compliance-testing/SKILL.md +8 -0
- package/assets/skills/compliance-testing/config.json +13 -0
- package/assets/skills/consultancy-practices/SKILL.md +1 -32
- package/assets/skills/context-driven-testing/SKILL.md +0 -41
- package/assets/skills/contract-testing/SKILL.md +12 -0
- package/assets/skills/contract-testing/config.json +13 -0
- package/assets/skills/contract-testing/references/agent-commands.md +103 -0
- package/assets/skills/contract-testing/references/provider-states.md +45 -0
- package/assets/skills/coverage-drop-investigator/SKILL.md +90 -0
- package/assets/skills/coverage-guard/SKILL.md +82 -0
- package/assets/skills/coverage-guard/scripts/check-coverage.sh +42 -0
- package/assets/skills/database-testing/SKILL.md +0 -10
- package/assets/skills/debug-loop/SKILL.md +1 -1
- package/assets/skills/e2e-flow-verifier/SKILL.md +78 -0
- package/assets/skills/enterprise-integration-testing/SKILL.md +1 -1
- package/assets/skills/exploratory-testing-advanced/SKILL.md +8 -0
- package/assets/skills/exploratory-testing-advanced/references/heuristic-cheatsheet.md +48 -0
- package/assets/skills/freeze-tests/SKILL.md +67 -0
- package/assets/skills/freeze-tests/scripts/block-test-edits.sh +27 -0
- package/assets/skills/localization-testing/SKILL.md +0 -17
- package/assets/skills/mobile-testing/SKILL.md +2 -49
- package/assets/skills/mutation-testing/SKILL.md +26 -0
- package/assets/skills/mutation-testing/config.json +14 -0
- package/assets/skills/mutation-testing/references/mutation-operators.md +38 -0
- package/assets/skills/mutation-testing/run-history.json +6 -0
- package/assets/skills/no-skip/SKILL.md +74 -0
- package/assets/skills/no-skip/scripts/check-skips.sh +28 -0
- package/assets/skills/pair-programming/SKILL.md +1 -1
- package/assets/skills/pentest-validation/SKILL.md +2 -3
- package/assets/skills/performance-testing/SKILL.md +21 -0
- package/assets/skills/performance-testing/config.json +18 -0
- package/assets/skills/performance-testing/references/k6-patterns.md +72 -0
- package/assets/skills/performance-testing/run-history.json +6 -0
- package/assets/skills/pr-review/SKILL.md +3 -3
- package/assets/skills/qcsd-cicd-swarm/SKILL.md +1 -1
- package/assets/skills/qcsd-development-swarm/SKILL.md +1 -1
- package/assets/skills/qcsd-ideation-swarm/SKILL.md +1 -1
- package/assets/skills/qcsd-production-swarm/SKILL.md +1 -1
- package/assets/skills/qcsd-refinement-swarm/SKILL.md +1 -1
- package/assets/skills/qe-chaos-resilience/SKILL.md +2 -2
- package/assets/skills/qe-code-intelligence/SKILL.md +9 -1
- package/assets/skills/qe-coverage-analysis/SKILL.md +28 -1
- package/assets/skills/qe-coverage-analysis/run-history.json +6 -0
- package/assets/skills/qe-defect-intelligence/SKILL.md +1 -1
- package/assets/skills/qe-learning-optimization/SKILL.md +1 -1
- package/assets/skills/qe-quality-assessment/SKILL.md +29 -2
- package/assets/skills/qe-quality-assessment/run-history.json +6 -0
- package/assets/skills/qe-requirements-validation/SKILL.md +1 -1
- package/assets/skills/qe-test-execution/SKILL.md +9 -1
- package/assets/skills/qe-test-generation/SKILL.md +15 -1
- package/assets/skills/qe-test-generation/config.json +14 -0
- package/assets/skills/qe-test-generation/templates/test-scaffold-jest.md +72 -0
- package/assets/skills/qe-visual-accessibility/SKILL.md +1 -1
- package/assets/skills/quality-metrics/SKILL.md +3 -77
- package/assets/skills/regression-testing/SKILL.md +13 -48
- package/assets/skills/risk-based-testing/SKILL.md +6 -51
- package/assets/skills/security-testing/SKILL.md +30 -0
- package/assets/skills/security-testing/config.json +13 -0
- package/assets/skills/security-testing/references/compliance-agent-commands.md +131 -0
- package/assets/skills/security-testing/references/owasp-top-10.md +66 -0
- package/assets/skills/security-testing/run-history.json +6 -0
- package/assets/skills/security-testing/templates/security-report.md +44 -0
- package/assets/skills/security-watch/SKILL.md +93 -0
- package/assets/skills/security-watch/scripts/scan-security.sh +46 -0
- package/assets/skills/shift-left-testing/SKILL.md +16 -87
- package/assets/skills/skill-stats/SKILL.md +79 -0
- package/assets/skills/strict-tdd/SKILL.md +72 -0
- package/assets/skills/strict-tdd/scripts/enforce-red-phase.sh +36 -0
- package/assets/skills/tdd-london-chicago/SKILL.md +8 -0
- package/assets/skills/test-automation-strategy/SKILL.md +13 -64
- package/assets/skills/test-data-management/SKILL.md +1 -104
- package/assets/skills/test-design-techniques/SKILL.md +2 -151
- package/assets/skills/test-environment-management/SKILL.md +0 -47
- package/assets/skills/test-failure-investigator/SKILL.md +99 -0
- package/assets/skills/test-metrics-dashboard/SKILL.md +97 -0
- package/assets/skills/trust-tier-manifest.json +135 -61
- package/assets/skills/validation-pipeline/SKILL.md +1 -1
- package/assets/skills/verification-quality/SKILL.md +15 -1
- package/assets/skills/xp-practices/SKILL.md +2 -109
- package/dist/cli/bundle.js +110 -24
- package/dist/init/opencode-installer.js +2 -3
- package/dist/init/phases/07-hooks.js +3 -3
- package/dist/init/settings-merge.js +1 -2
- package/dist/init/skills-installer.d.ts +10 -0
- package/dist/init/skills-installer.js +68 -6
- package/dist/integrations/ruvector/sona-persistence.d.ts +6 -0
- package/dist/integrations/ruvector/sona-persistence.js +26 -1
- package/dist/mcp/bundle.js +29 -8
- package/dist/mcp/entry.js +6 -6
- package/dist/migration/agent-compat.js +2 -2
- package/package.json +2 -2
- package/.claude/skills/aqe-v2-v3-migration/schemas/output.json +0 -513
- package/.claude/skills/aqe-v2-v3-migration/skill.md +0 -325
- package/.claude/skills/qe-contract-testing/SKILL.md +0 -223
- package/.claude/skills/qe-contract-testing/evals/qe-contract-testing.yaml +0 -513
- package/.claude/skills/qe-contract-testing/schemas/output.json +0 -295
- package/.claude/skills/qe-contract-testing/scripts/validate-config.json +0 -42
- package/.claude/skills/qe-security-compliance/SKILL.md +0 -260
- package/.claude/skills/qe-security-compliance/evals/qe-security-compliance.yaml +0 -595
- package/.claude/skills/qe-security-compliance/schemas/output.json +0 -498
- package/.claude/skills/qe-security-compliance/scripts/validate-config.json +0 -41
- package/.opencode/skills/qe-contract-testing.yaml +0 -45
- package/.opencode/skills/qe-security-compliance.yaml +0 -45
- package/assets/skills/aqe-v2-v3-migration/schemas/output.json +0 -513
- package/assets/skills/aqe-v2-v3-migration/skill.md +0 -325
- package/assets/skills/qe-contract-testing/SKILL.md +0 -223
- package/assets/skills/qe-contract-testing/evals/qe-contract-testing.yaml +0 -513
- package/assets/skills/qe-contract-testing/schemas/output.json +0 -295
- package/assets/skills/qe-contract-testing/scripts/validate-config.json +0 -42
- package/assets/skills/qe-security-compliance/SKILL.md +0 -260
- package/assets/skills/qe-security-compliance/evals/qe-security-compliance.yaml +0 -595
- package/assets/skills/qe-security-compliance/schemas/output.json +0 -498
- package/assets/skills/qe-security-compliance/scripts/validate-config.json +0 -41
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
# Contract Testing — Agent CLI Commands & Advanced Patterns
|
|
2
|
+
|
|
3
|
+
Merged from `qe-contract-testing`. Use these when working with v3 agent-specific contract capabilities.
|
|
4
|
+
|
|
5
|
+
## AQE CLI Commands
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
# Generate contract from API spec
|
|
9
|
+
aqe contract generate --api openapi.yaml --output contracts/
|
|
10
|
+
|
|
11
|
+
# Verify provider against contracts
|
|
12
|
+
aqe contract verify --provider http://localhost:3000 --contracts contracts/
|
|
13
|
+
|
|
14
|
+
# Check breaking changes between versions
|
|
15
|
+
aqe contract breaking --old api-v1.yaml --new api-v2.yaml
|
|
16
|
+
|
|
17
|
+
# Test GraphQL schema
|
|
18
|
+
aqe contract graphql --schema schema.graphql --operations queries/
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Agent Workflow
|
|
22
|
+
|
|
23
|
+
```typescript
|
|
24
|
+
// Contract generation
|
|
25
|
+
Task("Generate API contracts", `
|
|
26
|
+
Analyze the REST API and generate consumer contracts:
|
|
27
|
+
- Parse OpenAPI specification
|
|
28
|
+
- Identify critical endpoints
|
|
29
|
+
- Generate Pact contracts
|
|
30
|
+
- Include example requests/responses
|
|
31
|
+
Output to contracts/ directory.
|
|
32
|
+
`, "qe-api-contract")
|
|
33
|
+
|
|
34
|
+
// Breaking change detection
|
|
35
|
+
Task("Check API compatibility", `
|
|
36
|
+
Compare API v2.0 against v1.0:
|
|
37
|
+
- Detect removed endpoints
|
|
38
|
+
- Check parameter changes
|
|
39
|
+
- Verify response schema changes
|
|
40
|
+
- Identify deprecations
|
|
41
|
+
Report breaking vs non-breaking changes.
|
|
42
|
+
`, "qe-api-compatibility")
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## GraphQL Contract Testing
|
|
46
|
+
|
|
47
|
+
```typescript
|
|
48
|
+
await graphqlTester.testContracts({
|
|
49
|
+
schema: 'schema.graphql',
|
|
50
|
+
operations: 'queries/**/*.graphql',
|
|
51
|
+
validation: {
|
|
52
|
+
queryValidity: true,
|
|
53
|
+
responseShapes: true,
|
|
54
|
+
nullability: true,
|
|
55
|
+
deprecations: true
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## Event Contract Testing
|
|
61
|
+
|
|
62
|
+
```typescript
|
|
63
|
+
await contractTester.eventContracts({
|
|
64
|
+
schema: 'events/schemas/',
|
|
65
|
+
events: {
|
|
66
|
+
'user.created': {
|
|
67
|
+
schema: 'UserCreatedEvent.json',
|
|
68
|
+
examples: ['examples/user-created.json']
|
|
69
|
+
},
|
|
70
|
+
'order.completed': {
|
|
71
|
+
schema: 'OrderCompletedEvent.json',
|
|
72
|
+
examples: ['examples/order-completed.json']
|
|
73
|
+
}
|
|
74
|
+
},
|
|
75
|
+
compatibility: 'backward'
|
|
76
|
+
});
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## Contract Report Interface
|
|
80
|
+
|
|
81
|
+
```typescript
|
|
82
|
+
interface ContractReport {
|
|
83
|
+
summary: { contracts: number; passed: number; failed: number; warnings: number };
|
|
84
|
+
consumers: { name: string; contracts: ContractResult[]; compatibility: 'compatible' | 'breaking' | 'unknown' }[];
|
|
85
|
+
breakingChanges: { type: string; location: string; description: string; impact: 'high' | 'medium' | 'low'; migration: string }[];
|
|
86
|
+
deprecations: { item: string; deprecatedIn: string; removeIn: string; replacement: string }[];
|
|
87
|
+
}
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
## Pact Broker Integration
|
|
91
|
+
|
|
92
|
+
```typescript
|
|
93
|
+
await contractTester.withBroker({
|
|
94
|
+
brokerUrl: 'https://pact-broker.example.com',
|
|
95
|
+
auth: { token: process.env.PACT_TOKEN },
|
|
96
|
+
operations: { publish: true, canIDeploy: true, webhooks: true }
|
|
97
|
+
});
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
## Coordination
|
|
101
|
+
|
|
102
|
+
**Primary Agents**: qe-api-contract, qe-api-compatibility, qe-graphql-tester
|
|
103
|
+
**Coordinator**: qe-contract-coordinator
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# Provider States Reference
|
|
2
|
+
|
|
3
|
+
Provider states define the preconditions that must exist on the provider for a contract interaction to succeed.
|
|
4
|
+
|
|
5
|
+
## Pattern: State Setup
|
|
6
|
+
```javascript
|
|
7
|
+
// provider-states.js
|
|
8
|
+
const states = {
|
|
9
|
+
'a user exists': async () => {
|
|
10
|
+
await db.users.create({ id: 1, name: 'Test User', email: 'test@example.com' });
|
|
11
|
+
},
|
|
12
|
+
'no users exist': async () => {
|
|
13
|
+
await db.users.deleteAll();
|
|
14
|
+
},
|
|
15
|
+
'user 1 has 3 orders': async () => {
|
|
16
|
+
await db.users.create({ id: 1, name: 'Test User' });
|
|
17
|
+
await db.orders.bulkCreate([
|
|
18
|
+
{ userId: 1, status: 'shipped' },
|
|
19
|
+
{ userId: 1, status: 'pending' },
|
|
20
|
+
{ userId: 1, status: 'delivered' }
|
|
21
|
+
]);
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Common Mistakes
|
|
27
|
+
1. **State not cleaned up** — use transactions or truncate after each test
|
|
28
|
+
2. **Hardcoded IDs** — use factories or fixtures that generate consistent IDs
|
|
29
|
+
3. **Missing state** — provider test passes without state setup (no data = no error)
|
|
30
|
+
4. **Overly specific states** — "user John with email john@..." couples to consumer
|
|
31
|
+
|
|
32
|
+
## Pact Broker Webhook Setup
|
|
33
|
+
```bash
|
|
34
|
+
# Verify provider when consumer publishes new contract
|
|
35
|
+
curl -X POST ${PACT_BROKER_URL}/webhooks \
|
|
36
|
+
-H "Content-Type: application/json" \
|
|
37
|
+
-d '{
|
|
38
|
+
"events": [{ "name": "contract_content_changed" }],
|
|
39
|
+
"request": {
|
|
40
|
+
"method": "POST",
|
|
41
|
+
"url": "${CI_TRIGGER_URL}",
|
|
42
|
+
"body": { "pact_url": "${pactbroker.pactUrl}" }
|
|
43
|
+
}
|
|
44
|
+
}'
|
|
45
|
+
```
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: coverage-drop-investigator
|
|
3
|
+
description: "Use when test coverage has dropped and you need to find which changes caused it and what tests to add. Traces coverage regressions to specific commits and files."
|
|
4
|
+
user-invocable: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Coverage Drop Investigator
|
|
8
|
+
|
|
9
|
+
Runbook-style skill for investigating coverage regressions. Identifies which changes caused coverage to drop and recommends targeted tests.
|
|
10
|
+
|
|
11
|
+
## Activation
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
/coverage-drop-investigator
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Investigation Flow
|
|
18
|
+
|
|
19
|
+
### Step 1: Measure Current Coverage
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
# Generate coverage report
|
|
23
|
+
npx jest --coverage --coverageReporters=json-summary
|
|
24
|
+
|
|
25
|
+
# View summary
|
|
26
|
+
cat coverage/coverage-summary.json | jq '.total'
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
### Step 2: Find When Coverage Dropped
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
# Compare coverage with main branch
|
|
33
|
+
git stash && npx jest --coverage --coverageReporters=json-summary
|
|
34
|
+
mv coverage/coverage-summary.json coverage/baseline.json
|
|
35
|
+
git stash pop && npx jest --coverage --coverageReporters=json-summary
|
|
36
|
+
|
|
37
|
+
# Compare
|
|
38
|
+
jq -s '.[0].total.statements.pct as $baseline | .[1].total.statements.pct as $current | {baseline: $baseline, current: $current, delta: ($current - $baseline)}' coverage/baseline.json coverage/coverage-summary.json
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### Step 3: Identify Uncovered Files
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
# Find files with lowest coverage
|
|
45
|
+
cat coverage/coverage-summary.json | jq 'to_entries | map(select(.key != "total")) | sort_by(.value.statements.pct) | .[0:10] | .[] | {file: .key, statements: .value.statements.pct, branches: .value.branches.pct}'
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### Step 4: Map to Recent Changes
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
# Find recently changed files with low coverage
|
|
52
|
+
git diff --name-only main...HEAD | while read file; do
|
|
53
|
+
jq --arg f "$file" '.[$f] // empty | {file: $f, statements: .statements.pct}' coverage/coverage-summary.json
|
|
54
|
+
done
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### Step 5: Recommend Tests
|
|
58
|
+
|
|
59
|
+
For each uncovered file, identify:
|
|
60
|
+
1. **Uncovered functions** — need new test cases
|
|
61
|
+
2. **Uncovered branches** — need conditional test cases (if/else paths)
|
|
62
|
+
3. **Uncovered lines** — may indicate dead code or missing edge cases
|
|
63
|
+
|
|
64
|
+
### Step 6: Report
|
|
65
|
+
|
|
66
|
+
```markdown
|
|
67
|
+
## Coverage Drop Report
|
|
68
|
+
- **Current**: {{current_pct}}%
|
|
69
|
+
- **Baseline (main)**: {{baseline_pct}}%
|
|
70
|
+
- **Delta**: {{delta}}%
|
|
71
|
+
- **Files causing drop**:
|
|
72
|
+
| File | Coverage | Changed Lines | Tests Needed |
|
|
73
|
+
|------|----------|--------------|-------------|
|
|
74
|
+
| {{file}} | {{pct}}% | {{lines}} | {{count}} |
|
|
75
|
+
- **Recommended action**: {{write_tests / accept_drop / mark_as_excluded}}
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## Composition
|
|
79
|
+
|
|
80
|
+
After investigation:
|
|
81
|
+
- **`/qe-test-generation`** — generate tests for uncovered files
|
|
82
|
+
- **`/mutation-testing`** — verify existing tests actually catch bugs
|
|
83
|
+
- **`/coverage-guard`** — prevent future drops
|
|
84
|
+
|
|
85
|
+
## Gotchas
|
|
86
|
+
|
|
87
|
+
- Coverage can drop because NEW code was added without tests, not because tests were removed
|
|
88
|
+
- 100% coverage is not always the goal — focus on critical paths, not getters/setters
|
|
89
|
+
- Branch coverage drops are more concerning than line coverage drops — branches indicate logic paths
|
|
90
|
+
- Coverage tools may count generated code or type definitions — exclude with coveragePathIgnorePatterns
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: coverage-guard
|
|
3
|
+
description: "Use when you want to prevent coverage regressions during development. Activate with /coverage-guard to warn when coverage drops below threshold after code changes."
|
|
4
|
+
user-invocable: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Coverage Guard Mode
|
|
8
|
+
|
|
9
|
+
When activated, checks coverage after test runs and warns if it drops below the configured threshold.
|
|
10
|
+
|
|
11
|
+
## What It Does
|
|
12
|
+
|
|
13
|
+
After any test execution (via Bash tool), compares coverage to the threshold in config.json. Warns (doesn't block) if coverage decreased.
|
|
14
|
+
|
|
15
|
+
## Activation
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
/coverage-guard
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Configuration
|
|
22
|
+
|
|
23
|
+
Edit `config.json` in this skill directory to set thresholds:
|
|
24
|
+
|
|
25
|
+
```json
|
|
26
|
+
{
|
|
27
|
+
"thresholds": {
|
|
28
|
+
"statements": 80,
|
|
29
|
+
"branches": 70,
|
|
30
|
+
"functions": 75,
|
|
31
|
+
"lines": 80
|
|
32
|
+
},
|
|
33
|
+
"coverageCommand": "npx jest --coverage --coverageReporters=json-summary",
|
|
34
|
+
"coverageFile": "coverage/coverage-summary.json"
|
|
35
|
+
}
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Hook Configuration
|
|
39
|
+
|
|
40
|
+
```json
|
|
41
|
+
{
|
|
42
|
+
"hooks": {
|
|
43
|
+
"PostToolUse": [
|
|
44
|
+
{
|
|
45
|
+
"matcher": "Bash",
|
|
46
|
+
"hook": ".claude/skills/coverage-guard/scripts/check-coverage.sh",
|
|
47
|
+
"condition": "command contains 'jest' OR command contains 'vitest' OR command contains 'npm test'"
|
|
48
|
+
}
|
|
49
|
+
]
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## Enforcement Logic
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
#!/bin/bash
|
|
58
|
+
# check-coverage.sh
|
|
59
|
+
COVERAGE_FILE="coverage/coverage-summary.json"
|
|
60
|
+
THRESHOLD=80
|
|
61
|
+
|
|
62
|
+
if [ -f "$COVERAGE_FILE" ]; then
|
|
63
|
+
STATEMENTS=$(jq '.total.statements.pct' "$COVERAGE_FILE")
|
|
64
|
+
BRANCHES=$(jq '.total.branches.pct' "$COVERAGE_FILE")
|
|
65
|
+
|
|
66
|
+
if (( $(echo "$STATEMENTS < $THRESHOLD" | bc -l) )); then
|
|
67
|
+
echo "WARNING: Statement coverage ($STATEMENTS%) below threshold ($THRESHOLD%)"
|
|
68
|
+
echo "Coverage dropped — check which files lost coverage."
|
|
69
|
+
fi
|
|
70
|
+
|
|
71
|
+
if (( $(echo "$BRANCHES < 70" | bc -l) )); then
|
|
72
|
+
echo "WARNING: Branch coverage ($BRANCHES%) below 70%"
|
|
73
|
+
fi
|
|
74
|
+
fi
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## Gotchas
|
|
78
|
+
|
|
79
|
+
- Coverage check runs AFTER the test command — if tests crash, no coverage report is generated
|
|
80
|
+
- Coverage-summary.json must be configured as a reporter — default Jest config may not include it
|
|
81
|
+
- Threshold comparisons use floating point — `79.999%` will trigger below `80%` threshold
|
|
82
|
+
- Branch coverage is typically 10-15% lower than line coverage — set thresholds accordingly
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# check-coverage.sh — Coverage Guard hook
|
|
3
|
+
# Checks coverage after test runs and warns if below threshold.
|
|
4
|
+
# Called by PostToolUse hook on Bash commands containing jest/vitest/npm test
|
|
5
|
+
|
|
6
|
+
COVERAGE_FILE="coverage/coverage-summary.json"
|
|
7
|
+
THRESHOLD=${COVERAGE_THRESHOLD:-80}
|
|
8
|
+
BRANCH_THRESHOLD=${BRANCH_COVERAGE_THRESHOLD:-70}
|
|
9
|
+
|
|
10
|
+
if [ ! -f "$COVERAGE_FILE" ]; then
|
|
11
|
+
# No coverage report generated — skip silently
|
|
12
|
+
exit 0
|
|
13
|
+
fi
|
|
14
|
+
|
|
15
|
+
# Extract coverage percentages
|
|
16
|
+
STATEMENTS=$(node -e "console.log(require('./$COVERAGE_FILE').total.statements.pct)" 2>/dev/null)
|
|
17
|
+
BRANCHES=$(node -e "console.log(require('./$COVERAGE_FILE').total.branches.pct)" 2>/dev/null)
|
|
18
|
+
FUNCTIONS=$(node -e "console.log(require('./$COVERAGE_FILE').total.functions.pct)" 2>/dev/null)
|
|
19
|
+
|
|
20
|
+
if [ -z "$STATEMENTS" ]; then
|
|
21
|
+
exit 0
|
|
22
|
+
fi
|
|
23
|
+
|
|
24
|
+
EXIT_CODE=0
|
|
25
|
+
|
|
26
|
+
# Check statement coverage
|
|
27
|
+
if [ "$(echo "$STATEMENTS < $THRESHOLD" | bc -l 2>/dev/null)" = "1" ]; then
|
|
28
|
+
echo "WARNING: Statement coverage (${STATEMENTS}%) below threshold (${THRESHOLD}%)"
|
|
29
|
+
EXIT_CODE=1
|
|
30
|
+
fi
|
|
31
|
+
|
|
32
|
+
# Check branch coverage
|
|
33
|
+
if [ -n "$BRANCHES" ] && [ "$(echo "$BRANCHES < $BRANCH_THRESHOLD" | bc -l 2>/dev/null)" = "1" ]; then
|
|
34
|
+
echo "WARNING: Branch coverage (${BRANCHES}%) below threshold (${BRANCH_THRESHOLD}%)"
|
|
35
|
+
EXIT_CODE=1
|
|
36
|
+
fi
|
|
37
|
+
|
|
38
|
+
if [ $EXIT_CODE -eq 0 ]; then
|
|
39
|
+
echo "Coverage OK: statements=${STATEMENTS}%, branches=${BRANCHES}%, functions=${FUNCTIONS}%"
|
|
40
|
+
fi
|
|
41
|
+
|
|
42
|
+
exit $EXIT_CODE
|
|
@@ -58,14 +58,6 @@ When testing database operations:
|
|
|
58
58
|
| **Transaction** | ACID properties | Concurrent access |
|
|
59
59
|
| **Performance** | Query speed | Optimization |
|
|
60
60
|
|
|
61
|
-
### ACID Properties
|
|
62
|
-
| Property | Test Focus |
|
|
63
|
-
|----------|------------|
|
|
64
|
-
| **Atomicity** | All or nothing (rollback on error) |
|
|
65
|
-
| **Consistency** | Constraints always valid |
|
|
66
|
-
| **Isolation** | Concurrent transactions don't interfere |
|
|
67
|
-
| **Durability** | Committed data persists |
|
|
68
|
-
|
|
69
61
|
---
|
|
70
62
|
|
|
71
63
|
## Schema Testing
|
|
@@ -242,8 +234,6 @@ const dbFleet = await FleetManager.coordinate({
|
|
|
242
234
|
|
|
243
235
|
## Remember
|
|
244
236
|
|
|
245
|
-
**Database bugs are catastrophic.** Data loss is unrecoverable. Corruption spreads silently. Performance issues compound.
|
|
246
|
-
|
|
247
237
|
**Test migrations before production:** Forward works, rollback works, data preserved, performance acceptable. Never deploy untested migrations.
|
|
248
238
|
|
|
249
239
|
**With Agents:** `qe-test-data-architect` generates realistic test data with referential integrity. `qe-test-executor` validates migrations automatically in CI/CD.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: debug-loop
|
|
3
|
-
description:
|
|
3
|
+
description: "Use when debugging a failing test or runtime error with hypothesis-driven investigation, autonomous command validation, and systematic root cause elimination."
|
|
4
4
|
trust_tier: 0
|
|
5
5
|
domain: debugging
|
|
6
6
|
---
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: e2e-flow-verifier
|
|
3
|
+
description: "Use when verifying complete user flows end-to-end with Playwright, recording video evidence, and asserting state at each step. For product verification with real browser automation."
|
|
4
|
+
user-invocable: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# E2E Flow Verifier
|
|
8
|
+
|
|
9
|
+
Product verification skill that drives user flows with Playwright, asserts state at each step, and records video evidence.
|
|
10
|
+
|
|
11
|
+
## Activation
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
/e2e-flow-verifier [flow-name]
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Flow Verification Pattern
|
|
18
|
+
|
|
19
|
+
```typescript
|
|
20
|
+
import { test, expect } from '@playwright/test';
|
|
21
|
+
|
|
22
|
+
test.describe('{{Flow Name}}', () => {
|
|
23
|
+
// Record video for evidence
|
|
24
|
+
test.use({
|
|
25
|
+
video: 'on',
|
|
26
|
+
screenshot: 'on',
|
|
27
|
+
trace: 'on',
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
test('complete user journey', async ({ page }) => {
|
|
31
|
+
// Step 1: Navigate
|
|
32
|
+
await page.goto('{{base_url}}');
|
|
33
|
+
await expect(page).toHaveTitle(/{{expected_title}}/);
|
|
34
|
+
|
|
35
|
+
// Step 2: Authenticate (if needed)
|
|
36
|
+
await page.fill('[data-testid="email"]', '{{test_user}}');
|
|
37
|
+
await page.fill('[data-testid="password"]', '{{test_password}}');
|
|
38
|
+
await page.click('[data-testid="login-btn"]');
|
|
39
|
+
await expect(page.locator('[data-testid="dashboard"]')).toBeVisible();
|
|
40
|
+
|
|
41
|
+
// Step 3: Perform action
|
|
42
|
+
await page.click('[data-testid="{{action_element}}"]');
|
|
43
|
+
await expect(page.locator('[data-testid="{{result_element}}"]')).toContainText('{{expected_text}}');
|
|
44
|
+
|
|
45
|
+
// Step 4: Verify state change
|
|
46
|
+
// Assert both UI state AND backend state
|
|
47
|
+
const apiResponse = await page.request.get('/api/{{resource}}');
|
|
48
|
+
expect(apiResponse.status()).toBe(200);
|
|
49
|
+
const data = await apiResponse.json();
|
|
50
|
+
expect(data.{{field}}).toBe('{{expected_value}}');
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## Evidence Collection
|
|
56
|
+
|
|
57
|
+
After each flow verification:
|
|
58
|
+
1. **Video** — `test-results/{{flow-name}}/video.webm`
|
|
59
|
+
2. **Screenshots** — at each assertion point
|
|
60
|
+
3. **Trace** — `test-results/{{flow-name}}/trace.zip` (open with `npx playwright show-trace`)
|
|
61
|
+
4. **Network log** — HAR file with all API calls
|
|
62
|
+
|
|
63
|
+
## Common Flows to Verify
|
|
64
|
+
|
|
65
|
+
| Flow | Steps | Critical Assertions |
|
|
66
|
+
|------|-------|-------------------|
|
|
67
|
+
| Sign-up | Register → Verify email → Login | Account created, session valid |
|
|
68
|
+
| Purchase | Browse → Add to cart → Checkout → Pay | Order created, payment processed |
|
|
69
|
+
| Profile | Login → Edit profile → Save | Changes persisted, shown on reload |
|
|
70
|
+
| Search | Enter query → Filter → Select result | Results relevant, filters work |
|
|
71
|
+
|
|
72
|
+
## Gotchas
|
|
73
|
+
|
|
74
|
+
- Agent writes Playwright tests but doesn't run them — always execute and check video evidence
|
|
75
|
+
- Selectors break on deployment — use `data-testid` attributes, never CSS classes
|
|
76
|
+
- Tests pass locally but fail in CI — headless browser behavior differs, use `--headed` for debugging
|
|
77
|
+
- Auth tokens in E2E tests expire — use fresh login per test, not shared tokens
|
|
78
|
+
- Video evidence is large — clean up after verification, keep only failure videos
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: enterprise-integration-testing
|
|
3
|
-
description: "
|
|
3
|
+
description: "Use when testing enterprise integrations across SAP, middleware, WMS, or backend systems, validating E2E enterprise flows, testing SAP-specific patterns (RFC, BAPI, IDoc, OData, Fiori), or enforcing cross-system quality gates."
|
|
4
4
|
category: enterprise-integration
|
|
5
5
|
priority: high
|
|
6
6
|
tokenEstimate: 2000
|
|
@@ -201,3 +201,11 @@ const exploratoryFleet = await FleetManager.coordinate({
|
|
|
201
201
|
Not random clicking. Structured, skilled investigation guided by heuristics and oracles. Document discoveries in real-time. Pair testing amplifies findings.
|
|
202
202
|
|
|
203
203
|
**With Agents:** Agents generate variations, recognize patterns, and maintain session notes while humans apply judgment and intuition. Combine agent thoroughness with human insight.
|
|
204
|
+
|
|
205
|
+
## Gotchas
|
|
206
|
+
|
|
207
|
+
- Agent treats exploratory testing as scripted test execution — remind it: exploration means learning + adapting in real-time
|
|
208
|
+
- Session notes from agents lack the "why I tried this" reasoning — explicitly ask for decision rationale
|
|
209
|
+
- 90-minute sessions cause context overflow — cap at 45 minutes with explicit debrief
|
|
210
|
+
- Agent defaults to happy-path exploration — explicitly assign "Bad Neighborhood" or "Saboteur" tours for negative testing
|
|
211
|
+
- SFDIPOT heuristics are misapplied when agent doesn't understand the domain — provide domain context upfront
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# Exploratory Testing Heuristic Cheat Sheet
|
|
2
|
+
|
|
3
|
+
## SFDIPOT (What to Test)
|
|
4
|
+
| Factor | Questions to Ask |
|
|
5
|
+
|--------|-----------------|
|
|
6
|
+
| **Structure** | What is it made of? What are the components? |
|
|
7
|
+
| **Function** | What does it do? What are all the features? |
|
|
8
|
+
| **Data** | What data does it process? Boundary values? |
|
|
9
|
+
| **Interfaces** | How does it connect to other things? APIs? UI? |
|
|
10
|
+
| **Platform** | What does it depend on? OS? Browser? Network? |
|
|
11
|
+
| **Operations** | How will it be used? By whom? How often? |
|
|
12
|
+
| **Time** | What changes over time? Timeouts? Scheduling? |
|
|
13
|
+
|
|
14
|
+
## FEW HICCUPPS (How to Recognize Problems)
|
|
15
|
+
| Oracle | What to Compare Against |
|
|
16
|
+
|--------|----------------------|
|
|
17
|
+
| **Familiar** | Does it work like similar products I know? |
|
|
18
|
+
| **Explainable** | Can I explain what it does to someone? |
|
|
19
|
+
| **World** | Does it match how the real world works? |
|
|
20
|
+
| **History** | Is it consistent with previous versions? |
|
|
21
|
+
| **Image** | Does it match the organization's brand/values? |
|
|
22
|
+
| **Comparable** | How does it compare to competitors? |
|
|
23
|
+
| **Claims** | Does it match specs, docs, marketing? |
|
|
24
|
+
| **Users** | Does it serve the actual users' needs? |
|
|
25
|
+
| **Product** | Is it internally consistent? |
|
|
26
|
+
| **Purpose** | Does it fulfill its reason for existing? |
|
|
27
|
+
| **Standards** | Does it meet relevant standards (WCAG, RFC)? |
|
|
28
|
+
|
|
29
|
+
## Test Tours (How to Explore)
|
|
30
|
+
| Tour | Strategy |
|
|
31
|
+
|------|----------|
|
|
32
|
+
| **Guidebook** | Follow the documentation exactly |
|
|
33
|
+
| **Money** | Test the revenue-critical features |
|
|
34
|
+
| **Landmark** | Navigate between major features |
|
|
35
|
+
| **Bad Neighborhood** | Focus on historically buggy areas |
|
|
36
|
+
| **Intellectual** | Test the most complex features |
|
|
37
|
+
| **FedEx** | Follow data through the system |
|
|
38
|
+
| **Garbage Collector** | Navigate to least-used features |
|
|
39
|
+
| **Saboteur** | Try to break things intentionally |
|
|
40
|
+
|
|
41
|
+
## Session Charter Template
|
|
42
|
+
```
|
|
43
|
+
CHARTER: Explore [target area]
|
|
44
|
+
WITH: [resources/tools/heuristics]
|
|
45
|
+
TO DISCOVER: [what we're looking for]
|
|
46
|
+
TIME BOX: [45/60/90 minutes]
|
|
47
|
+
PRIORITY: [P0/P1/P2]
|
|
48
|
+
```
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: freeze-tests
|
|
3
|
+
description: "Use when refactoring production code and you want to ensure test files are not modified. Activate with /freeze-tests to block all edits to test files for safe refactoring."
|
|
4
|
+
user-invocable: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Freeze Tests Mode
|
|
8
|
+
|
|
9
|
+
When activated, blocks all modifications to test files. Use during refactoring to ensure behavior (as captured by tests) is preserved.
|
|
10
|
+
|
|
11
|
+
## What It Does
|
|
12
|
+
|
|
13
|
+
Blocks Write and Edit operations on any file matching test patterns:
|
|
14
|
+
- `**/*.test.{ts,js,tsx,jsx}`
|
|
15
|
+
- `**/*.spec.{ts,js,tsx,jsx}`
|
|
16
|
+
- `**/__tests__/**`
|
|
17
|
+
- `**/tests/**`
|
|
18
|
+
|
|
19
|
+
## Activation
|
|
20
|
+
|
|
21
|
+
```
|
|
22
|
+
/freeze-tests
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Deactivate with `/freeze-tests off`.
|
|
26
|
+
|
|
27
|
+
## Hook Configuration
|
|
28
|
+
|
|
29
|
+
```json
|
|
30
|
+
{
|
|
31
|
+
"hooks": {
|
|
32
|
+
"PreToolUse": [
|
|
33
|
+
{
|
|
34
|
+
"matcher": "Write|Edit",
|
|
35
|
+
"hook": ".claude/skills/freeze-tests/scripts/block-test-edits.sh",
|
|
36
|
+
"condition": "file matches **/*.test.* OR **/*.spec.* OR **/__tests__/** OR **/tests/**"
|
|
37
|
+
}
|
|
38
|
+
]
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Enforcement Logic
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
#!/bin/bash
|
|
47
|
+
# block-test-edits.sh
|
|
48
|
+
FILE="$1"
|
|
49
|
+
|
|
50
|
+
if echo "$FILE" | grep -qP '\.(test|spec)\.(ts|js|tsx|jsx)$|__tests__|/tests/'; then
|
|
51
|
+
echo "BLOCKED: Test files are frozen during refactoring."
|
|
52
|
+
echo "If tests need updating, deactivate with: /freeze-tests off"
|
|
53
|
+
exit 1
|
|
54
|
+
fi
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## When to Use
|
|
58
|
+
|
|
59
|
+
1. **Refactoring**: Changing code structure without changing behavior
|
|
60
|
+
2. **Performance optimization**: Making code faster without changing logic
|
|
61
|
+
3. **Dependency updates**: Upgrading libraries while preserving behavior
|
|
62
|
+
|
|
63
|
+
## Gotchas
|
|
64
|
+
|
|
65
|
+
- Frozen tests can't be fixed if they break during refactoring — that's the point (the refactoring broke behavior)
|
|
66
|
+
- If a refactoring requires test changes, it's not a pure refactoring — deactivate and treat as a feature change
|
|
67
|
+
- This doesn't prevent running tests — only modifying test files
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# block-test-edits.sh — Freeze Tests hook
|
|
3
|
+
# Blocks all modifications to test files during refactoring.
|
|
4
|
+
# Called by PreToolUse hook on Write/Edit targeting test files.
|
|
5
|
+
|
|
6
|
+
FILE="$1"
|
|
7
|
+
|
|
8
|
+
if [ -z "$FILE" ]; then
|
|
9
|
+
exit 0
|
|
10
|
+
fi
|
|
11
|
+
|
|
12
|
+
# Check if file matches test patterns
|
|
13
|
+
if echo "$FILE" | grep -qP '\.(test|spec)\.(ts|js|tsx|jsx)$' 2>/dev/null; then
|
|
14
|
+
echo "BLOCKED: Test files are frozen during refactoring."
|
|
15
|
+
echo "File: $FILE"
|
|
16
|
+
echo "Deactivate with: /freeze-tests off"
|
|
17
|
+
exit 1
|
|
18
|
+
fi
|
|
19
|
+
|
|
20
|
+
if echo "$FILE" | grep -qP '__tests__/|/tests/' 2>/dev/null; then
|
|
21
|
+
echo "BLOCKED: Test directories are frozen during refactoring."
|
|
22
|
+
echo "File: $FILE"
|
|
23
|
+
echo "Deactivate with: /freeze-tests off"
|
|
24
|
+
exit 1
|
|
25
|
+
fi
|
|
26
|
+
|
|
27
|
+
exit 0
|
|
@@ -49,19 +49,6 @@ When testing multi-language/region support:
|
|
|
49
49
|
- Before international releases
|
|
50
50
|
- After UI changes
|
|
51
51
|
|
|
52
|
-
### i18n vs l10n
|
|
53
|
-
| Term | Full Name | Focus |
|
|
54
|
-
|------|-----------|-------|
|
|
55
|
-
| **i18n** | Internationalization | Building for localization |
|
|
56
|
-
| **l10n** | Localization | Adapting for specific locale |
|
|
57
|
-
|
|
58
|
-
### Common Locale Formats
|
|
59
|
-
| Type | US (en-US) | UK (en-GB) | Japan (ja-JP) |
|
|
60
|
-
|------|------------|------------|---------------|
|
|
61
|
-
| **Date** | 10/24/2025 | 24/10/2025 | 2025/10/24 |
|
|
62
|
-
| **Currency** | $1,234.56 | £1,234.56 | ¥1,235 |
|
|
63
|
-
| **Number** | 1,234.56 | 1,234.56 | 1,234.56 |
|
|
64
|
-
|
|
65
52
|
---
|
|
66
53
|
|
|
67
54
|
## Translation Coverage Testing
|
|
@@ -219,8 +206,4 @@ const l10nFleet = await FleetManager.coordinate({
|
|
|
219
206
|
|
|
220
207
|
## Remember
|
|
221
208
|
|
|
222
|
-
**Don't hardcode. Externalize all user-facing strings.** Every string visible to users must come from translation files, not code.
|
|
223
|
-
|
|
224
|
-
**Test with native speakers, not just translation files.** Machine translations and translation files can have context issues that only native speakers catch.
|
|
225
|
-
|
|
226
209
|
**With Agents:** Agents validate translation coverage, detect hardcoded strings, test locale-specific formatting, and verify RTL layouts automatically across all supported languages.
|