@su-record/vibe 2.7.14 → 2.7.15
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/.env.example +37 -37
- package/CLAUDE.md +134 -126
- package/LICENSE +21 -21
- package/README.md +449 -449
- package/agents/architect-low.md +41 -41
- package/agents/architect-medium.md +59 -59
- package/agents/architect.md +80 -80
- package/agents/build-error-resolver.md +115 -115
- package/agents/compounder.md +261 -261
- package/agents/diagrammer.md +178 -178
- package/agents/docs/api-documenter.md +99 -99
- package/agents/docs/changelog-writer.md +93 -93
- package/agents/e2e-tester.md +294 -294
- package/agents/explorer-low.md +42 -42
- package/agents/explorer-medium.md +59 -59
- package/agents/explorer.md +48 -48
- package/agents/implementer-low.md +43 -43
- package/agents/implementer-medium.md +52 -52
- package/agents/implementer.md +54 -54
- package/agents/junior-mentor.md +141 -141
- package/agents/planning/requirements-analyst.md +84 -84
- package/agents/planning/ux-advisor.md +83 -83
- package/agents/qa/acceptance-tester.md +86 -86
- package/agents/qa/edge-case-finder.md +93 -93
- package/agents/refactor-cleaner.md +143 -143
- package/agents/research/best-practices-agent.md +199 -199
- package/agents/research/codebase-patterns-agent.md +157 -157
- package/agents/research/framework-docs-agent.md +188 -188
- package/agents/research/security-advisory-agent.md +213 -213
- package/agents/review/architecture-reviewer.md +107 -107
- package/agents/review/complexity-reviewer.md +116 -116
- package/agents/review/data-integrity-reviewer.md +88 -88
- package/agents/review/git-history-reviewer.md +103 -103
- package/agents/review/performance-reviewer.md +86 -86
- package/agents/review/python-reviewer.md +150 -150
- package/agents/review/rails-reviewer.md +139 -139
- package/agents/review/react-reviewer.md +144 -144
- package/agents/review/security-reviewer.md +80 -80
- package/agents/review/simplicity-reviewer.md +140 -140
- package/agents/review/test-coverage-reviewer.md +116 -116
- package/agents/review/typescript-reviewer.md +127 -127
- package/agents/searcher.md +54 -54
- package/agents/simplifier.md +120 -120
- package/agents/tester.md +49 -49
- package/agents/ui/ui-a11y-auditor.md +93 -93
- package/agents/ui/ui-antipattern-detector.md +94 -94
- package/agents/ui/ui-dataviz-advisor.md +69 -69
- package/agents/ui/ui-design-system-gen.md +57 -57
- package/agents/ui/ui-industry-analyzer.md +49 -49
- package/agents/ui/ui-layout-architect.md +65 -65
- package/agents/ui/ui-stack-implementer.md +68 -68
- package/agents/ui/ux-compliance-reviewer.md +81 -81
- package/agents/ui-previewer.md +258 -258
- package/commands/vibe.analyze.md +11 -13
- package/commands/vibe.review.md +43 -1
- package/commands/vibe.run.md +2124 -2078
- package/commands/vibe.spec.md +9 -4
- package/commands/vibe.spec.review.md +569 -565
- package/commands/vibe.utils.md +413 -413
- package/commands/vibe.verify.md +33 -8
- package/dist/cli/collaborator.js +52 -52
- package/dist/cli/commands/evolution.js +12 -12
- package/dist/cli/commands/info.js +54 -54
- package/dist/cli/commands/init.js +5 -5
- package/dist/cli/commands/remove.js +14 -14
- package/dist/cli/commands/sentinel.js +27 -27
- package/dist/cli/commands/skills.js +5 -5
- package/dist/cli/commands/slack.js +10 -10
- package/dist/cli/commands/telegram.js +12 -12
- package/dist/cli/detect.js +32 -32
- package/dist/cli/index.js +51 -51
- package/dist/cli/llm/claude-commands.js +16 -16
- package/dist/cli/llm/config.js +18 -18
- package/dist/cli/llm/gemini-commands.js +16 -16
- package/dist/cli/llm/gpt-commands.js +19 -19
- package/dist/cli/llm/help.js +21 -21
- package/dist/cli/postinstall/cursor-agents.js +32 -32
- package/dist/cli/postinstall/cursor-rules.js +83 -83
- package/dist/cli/postinstall/cursor-skills.js +743 -743
- package/dist/cli/setup/Provisioner.js +42 -42
- package/dist/infra/lib/DeepInit.js +24 -24
- package/dist/infra/lib/IterationTracker.js +11 -11
- package/dist/infra/lib/PythonParser.js +108 -108
- package/dist/infra/lib/ReviewRace.js +96 -96
- package/dist/infra/lib/SkillFrontmatter.js +28 -28
- package/dist/infra/lib/SkillQualityGate.js +9 -9
- package/dist/infra/lib/SkillRepository.js +159 -159
- package/dist/infra/lib/UltraQA.js +99 -99
- package/dist/infra/lib/autonomy/AuditStore.js +41 -41
- package/dist/infra/lib/autonomy/ConfirmationStore.js +30 -30
- package/dist/infra/lib/autonomy/EventOutbox.js +38 -38
- package/dist/infra/lib/autonomy/PolicyEngine.js +18 -18
- package/dist/infra/lib/autonomy/SecuritySentinel.js +1 -1
- package/dist/infra/lib/autonomy/SuggestionStore.js +33 -33
- package/dist/infra/lib/embedding/VectorStore.js +22 -22
- package/dist/infra/lib/evolution/AgentAnalyzer.js +10 -10
- package/dist/infra/lib/evolution/DescriptionOptimizer.js +21 -21
- package/dist/infra/lib/evolution/GenerationRegistry.js +36 -36
- package/dist/infra/lib/evolution/InsightStore.js +90 -90
- package/dist/infra/lib/evolution/RollbackManager.js +5 -5
- package/dist/infra/lib/evolution/SkillBenchmark.js +23 -23
- package/dist/infra/lib/evolution/SkillEvalRunner.js +50 -50
- package/dist/infra/lib/evolution/SkillGapDetector.js +10 -10
- package/dist/infra/lib/evolution/UsageTracker.js +28 -28
- package/dist/infra/lib/gemini/orchestration.js +5 -5
- package/dist/infra/lib/gpt/orchestration.js +4 -4
- package/dist/infra/lib/memory/KnowledgeGraph.js +4 -4
- package/dist/infra/lib/memory/MemorySearch.js +57 -57
- package/dist/infra/lib/memory/MemoryStorage.js +181 -181
- package/dist/infra/lib/memory/ObservationStore.js +28 -28
- package/dist/infra/lib/memory/ReflectionStore.js +30 -30
- package/dist/infra/lib/memory/SessionRAGRetriever.js +7 -7
- package/dist/infra/lib/memory/SessionRAGStore.js +225 -225
- package/dist/infra/lib/memory/SessionSummarizer.js +9 -9
- package/dist/infra/orchestrator/AgentManager.js +12 -12
- package/dist/infra/orchestrator/AgentRegistry.js +65 -65
- package/dist/infra/orchestrator/MultiLlmResearch.js +8 -8
- package/dist/infra/orchestrator/SwarmOrchestrator.test.js +16 -16
- package/dist/infra/orchestrator/parallelResearch.js +24 -24
- package/dist/tools/convention/analyzeComplexity.test.js +115 -115
- package/dist/tools/convention/validateCodeQuality.test.js +104 -104
- package/dist/tools/memory/createMemoryTimeline.js +10 -10
- package/dist/tools/memory/getMemoryGraph.js +12 -12
- package/dist/tools/memory/getSessionContext.js +9 -9
- package/dist/tools/memory/linkMemories.js +14 -14
- package/dist/tools/memory/listMemories.js +4 -4
- package/dist/tools/memory/recallMemory.js +4 -4
- package/dist/tools/memory/saveMemory.js +4 -4
- package/dist/tools/memory/searchMemoriesAdvanced.js +23 -23
- package/dist/tools/semantic/analyzeDependencyGraph.js +12 -12
- package/dist/tools/semantic/astGrep.test.js +6 -6
- package/dist/tools/spec/prdParser.test.js +171 -171
- package/dist/tools/spec/specGenerator.js +169 -169
- package/dist/tools/spec/traceabilityMatrix.js +64 -64
- package/dist/tools/spec/traceabilityMatrix.test.js +28 -28
- package/hooks/gemini-hooks.json +73 -73
- package/hooks/hooks.json +137 -137
- package/hooks/scripts/code-check.js +77 -70
- package/hooks/scripts/context-save.js +212 -212
- package/hooks/scripts/hud-status.js +291 -291
- package/hooks/scripts/keyword-detector.js +214 -214
- package/hooks/scripts/llm-orchestrate.js +475 -475
- package/hooks/scripts/post-edit.js +32 -32
- package/hooks/scripts/pre-tool-guard.js +125 -125
- package/hooks/scripts/prompt-dispatcher.js +185 -185
- package/hooks/scripts/sentinel-guard.js +104 -104
- package/hooks/scripts/session-start.js +106 -106
- package/hooks/scripts/stop-notify.js +209 -209
- package/hooks/scripts/utils.js +100 -100
- package/languages/csharp-unity.md +515 -515
- package/languages/gdscript-godot.md +470 -470
- package/languages/ruby-rails.md +489 -489
- package/languages/typescript-angular.md +433 -433
- package/languages/typescript-astro.md +416 -416
- package/languages/typescript-electron.md +406 -406
- package/languages/typescript-nestjs.md +524 -524
- package/languages/typescript-svelte.md +407 -407
- package/languages/typescript-tauri.md +365 -365
- package/package.json +121 -121
- package/skills/agents-md/SKILL.md +120 -120
- package/skills/arch-guard/SKILL.md +180 -180
- package/skills/brand-assets/SKILL.md +146 -146
- package/skills/capability-loop/SKILL.md +167 -167
- package/skills/characterization-test/SKILL.md +206 -206
- package/skills/commerce-patterns/SKILL.md +59 -59
- package/skills/commit-push-pr/SKILL.md +75 -75
- package/skills/context7-usage/SKILL.md +105 -105
- package/skills/core-capabilities/SKILL.md +48 -48
- package/skills/e2e-commerce/SKILL.md +57 -57
- package/skills/exec-plan/SKILL.md +147 -147
- package/skills/frontend-design/SKILL.md +73 -73
- package/skills/git-worktree/SKILL.md +72 -72
- package/skills/handoff/SKILL.md +109 -109
- package/skills/parallel-research/SKILL.md +87 -87
- package/skills/priority-todos/SKILL.md +63 -63
- package/skills/seo-checklist/SKILL.md +57 -57
- package/skills/techdebt/SKILL.md +122 -122
- package/skills/tool-fallback/SKILL.md +103 -103
- package/skills/typescript-advanced-types/SKILL.md +66 -66
- package/skills/ui-ux-pro-max/SKILL.md +206 -206
- package/skills/vercel-react-best-practices/SKILL.md +59 -59
- package/skills/video-production/SKILL.md +51 -51
- package/vibe/config.json +29 -29
- package/vibe/constitution.md +227 -227
- package/vibe/rules/principles/communication-guide.md +98 -98
- package/vibe/rules/principles/development-philosophy.md +52 -52
- package/vibe/rules/principles/quick-start.md +102 -102
- package/vibe/rules/quality/bdd-contract-testing.md +393 -393
- package/vibe/rules/quality/checklist.md +276 -276
- package/vibe/rules/quality/performance.md +236 -236
- package/vibe/rules/quality/testing-strategy.md +440 -440
- package/vibe/rules/standards/anti-patterns.md +541 -541
- package/vibe/rules/standards/code-structure.md +291 -291
- package/vibe/rules/standards/complexity-metrics.md +313 -313
- package/vibe/rules/standards/git-workflow.md +237 -237
- package/vibe/rules/standards/naming-conventions.md +198 -198
- package/vibe/rules/standards/security.md +305 -305
- package/vibe/rules/writing/document-style.md +74 -74
- package/vibe/setup.sh +31 -31
- package/vibe/templates/constitution-template.md +252 -252
- package/vibe/templates/contract-backend-template.md +526 -526
- package/vibe/templates/contract-frontend-template.md +599 -599
- package/vibe/templates/feature-template.md +96 -96
- package/vibe/templates/spec-template.md +221 -221
- package/vibe/ui-ux-data/charts.csv +26 -26
- package/vibe/ui-ux-data/colors.csv +97 -97
- package/vibe/ui-ux-data/icons.csv +101 -101
- package/vibe/ui-ux-data/landing.csv +31 -31
- package/vibe/ui-ux-data/products.csv +96 -96
- package/vibe/ui-ux-data/react-performance.csv +45 -45
- package/vibe/ui-ux-data/stacks/astro.csv +54 -54
- package/vibe/ui-ux-data/stacks/flutter.csv +53 -53
- package/vibe/ui-ux-data/stacks/html-tailwind.csv +56 -56
- package/vibe/ui-ux-data/stacks/jetpack-compose.csv +53 -53
- package/vibe/ui-ux-data/stacks/nextjs.csv +53 -53
- package/vibe/ui-ux-data/stacks/nuxt-ui.csv +51 -51
- package/vibe/ui-ux-data/stacks/nuxtjs.csv +59 -59
- package/vibe/ui-ux-data/stacks/react-native.csv +52 -52
- package/vibe/ui-ux-data/stacks/react.csv +54 -54
- package/vibe/ui-ux-data/stacks/shadcn.csv +61 -61
- package/vibe/ui-ux-data/stacks/svelte.csv +54 -54
- package/vibe/ui-ux-data/stacks/swiftui.csv +51 -51
- package/vibe/ui-ux-data/stacks/vue.csv +50 -50
- package/vibe/ui-ux-data/styles.csv +68 -68
- package/vibe/ui-ux-data/typography.csv +57 -57
- package/vibe/ui-ux-data/ui-reasoning.csv +101 -101
- package/vibe/ui-ux-data/ux-guidelines.csv +99 -99
- package/vibe/ui-ux-data/version.json +31 -31
- package/vibe/ui-ux-data/web-interface.csv +31 -31
|
@@ -1,393 +1,393 @@
|
|
|
1
|
-
# BDD + Contract Testing Guide
|
|
2
|
-
|
|
3
|
-
**Testing strategy optimized for AI-driven development**
|
|
4
|
-
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
## Overview
|
|
8
|
-
|
|
9
|
-
BDD (Behavior-Driven Development) and Contract Testing are essential for **AI agents to accurately understand requirements and generate verifiable code**.
|
|
10
|
-
|
|
11
|
-
### Why is it useful for AI-driven development?
|
|
12
|
-
|
|
13
|
-
1. **Clear input/output contracts** → AI can implement accurately
|
|
14
|
-
2. **Automated verification** → Immediately verify AI-generated code quality
|
|
15
|
-
3. **Regression prevention** → AI modifications don't break existing functionality
|
|
16
|
-
4. **Automated documentation** → Tests serve as executable specifications
|
|
17
|
-
|
|
18
|
-
---
|
|
19
|
-
|
|
20
|
-
## Workflow
|
|
21
|
-
|
|
22
|
-
```
|
|
23
|
-
Write SPEC (Requirements)
|
|
24
|
-
↓
|
|
25
|
-
Generate Feature file (Gherkin)
|
|
26
|
-
↓
|
|
27
|
-
Generate Contract tests (API schema)
|
|
28
|
-
↓
|
|
29
|
-
Run tests (Red)
|
|
30
|
-
↓
|
|
31
|
-
AI agent implementation
|
|
32
|
-
↓
|
|
33
|
-
Run tests (Green)
|
|
34
|
-
↓
|
|
35
|
-
Refactoring
|
|
36
|
-
↓
|
|
37
|
-
Run tests again (Stay Green)
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
---
|
|
41
|
-
|
|
42
|
-
## 1. BDD (Behavior-Driven Development)
|
|
43
|
-
|
|
44
|
-
### Gherkin Syntax
|
|
45
|
-
|
|
46
|
-
```gherkin
|
|
47
|
-
Feature: User Login
|
|
48
|
-
As a user
|
|
49
|
-
I want to login
|
|
50
|
-
So that I can access personalized services
|
|
51
|
-
|
|
52
|
-
Scenario: Successful login with valid credentials
|
|
53
|
-
Given user is registered with "test@example.com" and "password123"
|
|
54
|
-
When login is attempted with "test@example.com" and "password123"
|
|
55
|
-
Then login succeeds
|
|
56
|
-
And receives JWT token
|
|
57
|
-
And redirected to home screen
|
|
58
|
-
|
|
59
|
-
Scenario: Failed login with wrong password
|
|
60
|
-
Given user is registered with "test@example.com"
|
|
61
|
-
When login is attempted with "test@example.com" and "wrong-password"
|
|
62
|
-
Then login fails
|
|
63
|
-
And receives "Invalid credentials" error message
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
### Step Definitions (Python)
|
|
67
|
-
|
|
68
|
-
```python
|
|
69
|
-
from pytest_bdd import scenarios, given, when, then, parsers
|
|
70
|
-
|
|
71
|
-
scenarios('features/login.feature')
|
|
72
|
-
|
|
73
|
-
@given(parsers.parse('user is registered with "{email}" and "{password}"'))
|
|
74
|
-
def user_exists(context, email, password):
|
|
75
|
-
context.user = create_user(email=email, password=password)
|
|
76
|
-
|
|
77
|
-
@when(parsers.parse('login is attempted with "{email}" and "{password}"'))
|
|
78
|
-
def attempt_login(context, email, password):
|
|
79
|
-
context.response = login(email=email, password=password)
|
|
80
|
-
|
|
81
|
-
@then('login succeeds')
|
|
82
|
-
def login_succeeds(context):
|
|
83
|
-
assert context.response.status_code == 200
|
|
84
|
-
|
|
85
|
-
@then('receives JWT token')
|
|
86
|
-
def receives_token(context):
|
|
87
|
-
assert 'access_token' in context.response.json()
|
|
88
|
-
```
|
|
89
|
-
|
|
90
|
-
---
|
|
91
|
-
|
|
92
|
-
## 2. Contract Testing
|
|
93
|
-
|
|
94
|
-
### API Contract Definition
|
|
95
|
-
|
|
96
|
-
```json
|
|
97
|
-
{
|
|
98
|
-
"request": {
|
|
99
|
-
"method": "POST",
|
|
100
|
-
"path": "/api/auth/login",
|
|
101
|
-
"body": {
|
|
102
|
-
"email": "string (email format)",
|
|
103
|
-
"password": "string (min 8 chars)"
|
|
104
|
-
}
|
|
105
|
-
},
|
|
106
|
-
"response": {
|
|
107
|
-
"status": 200,
|
|
108
|
-
"body": {
|
|
109
|
-
"access_token": "string (JWT)",
|
|
110
|
-
"refresh_token": "string (JWT)",
|
|
111
|
-
"user": {
|
|
112
|
-
"id": "uuid",
|
|
113
|
-
"email": "string",
|
|
114
|
-
"name": "string"
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
```
|
|
120
|
-
|
|
121
|
-
### Contract Test (Python)
|
|
122
|
-
|
|
123
|
-
```python
|
|
124
|
-
import pytest
|
|
125
|
-
from jsonschema import validate
|
|
126
|
-
|
|
127
|
-
RESPONSE_SCHEMA = {
|
|
128
|
-
"type": "object",
|
|
129
|
-
"required": ["access_token", "refresh_token", "user"],
|
|
130
|
-
"properties": {
|
|
131
|
-
"access_token": {"type": "string", "pattern": "^[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]+$"},
|
|
132
|
-
"refresh_token": {"type": "string"},
|
|
133
|
-
"user": {
|
|
134
|
-
"type": "object",
|
|
135
|
-
"required": ["id", "email", "name"],
|
|
136
|
-
"properties": {
|
|
137
|
-
"id": {"type": "string", "format": "uuid"},
|
|
138
|
-
"email": {"type": "string", "format": "email"},
|
|
139
|
-
"name": {"type": "string"}
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
def test_login_response_contract():
|
|
146
|
-
"""Verify login response adheres to contract"""
|
|
147
|
-
response = client.post("/api/auth/login", json={
|
|
148
|
-
"email": "test@example.com",
|
|
149
|
-
"password": "password123"
|
|
150
|
-
})
|
|
151
|
-
|
|
152
|
-
assert response.status_code == 200
|
|
153
|
-
|
|
154
|
-
# Validate response schema
|
|
155
|
-
validate(instance=response.json(), schema=RESPONSE_SCHEMA)
|
|
156
|
-
|
|
157
|
-
# Validate JWT token format
|
|
158
|
-
token = response.json()["access_token"]
|
|
159
|
-
assert len(token.split('.')) == 3 # JWT has 3 parts
|
|
160
|
-
```
|
|
161
|
-
|
|
162
|
-
---
|
|
163
|
-
|
|
164
|
-
## 3. AI Agent Utilization
|
|
165
|
-
|
|
166
|
-
### SPEC → Feature Auto-generation
|
|
167
|
-
|
|
168
|
-
AI agent automatically converts SPEC Acceptance Criteria to Gherkin Scenarios:
|
|
169
|
-
|
|
170
|
-
**SPEC**:
|
|
171
|
-
|
|
172
|
-
```markdown
|
|
173
|
-
### REQ-001: User Login
|
|
174
|
-
**WHEN** login with valid credentials
|
|
175
|
-
**THEN** receive JWT token
|
|
176
|
-
|
|
177
|
-
#### Acceptance Criteria
|
|
178
|
-
- [ ] Login with email and password
|
|
179
|
-
- [ ] Return access_token and refresh_token
|
|
180
|
-
- [ ] Invalid credentials return 400 error
|
|
181
|
-
```
|
|
182
|
-
|
|
183
|
-
**Generated Feature**:
|
|
184
|
-
|
|
185
|
-
```gherkin
|
|
186
|
-
Scenario: Successful login with valid credentials
|
|
187
|
-
Given user is registered
|
|
188
|
-
When login with valid email and password
|
|
189
|
-
Then receive JWT access_token
|
|
190
|
-
And receive JWT refresh_token
|
|
191
|
-
```
|
|
192
|
-
|
|
193
|
-
### API Schema → Contract Auto-generation
|
|
194
|
-
|
|
195
|
-
AI agent automatically converts SPEC API contracts to Contract tests:
|
|
196
|
-
|
|
197
|
-
**SPEC**:
|
|
198
|
-
|
|
199
|
-
```markdown
|
|
200
|
-
### Endpoint: Login
|
|
201
|
-
POST /api/auth/login
|
|
202
|
-
Request: { email, password }
|
|
203
|
-
Response: { access_token, refresh_token, user }
|
|
204
|
-
```
|
|
205
|
-
|
|
206
|
-
**Generated Contract Test**:
|
|
207
|
-
|
|
208
|
-
```python
|
|
209
|
-
def test_login_contract():
|
|
210
|
-
response = client.post("/api/auth/login", json=valid_credentials)
|
|
211
|
-
assert response.status_code == 200
|
|
212
|
-
validate(response.json(), LOGIN_RESPONSE_SCHEMA)
|
|
213
|
-
```
|
|
214
|
-
|
|
215
|
-
---
|
|
216
|
-
|
|
217
|
-
## 4. Core Commands
|
|
218
|
-
|
|
219
|
-
### Generate Feature File
|
|
220
|
-
|
|
221
|
-
```bash
|
|
222
|
-
core feature "user login"
|
|
223
|
-
# → Creates .claude/vibe/features/user-login.feature
|
|
224
|
-
```
|
|
225
|
-
|
|
226
|
-
### Generate Contract Test
|
|
227
|
-
|
|
228
|
-
```bash
|
|
229
|
-
core contract "user login"
|
|
230
|
-
# → Creates tests/contract/test_user_login_contract.py
|
|
231
|
-
```
|
|
232
|
-
|
|
233
|
-
### Run Tests
|
|
234
|
-
|
|
235
|
-
```bash
|
|
236
|
-
core test "user login"
|
|
237
|
-
# → Runs BDD + Contract tests
|
|
238
|
-
```
|
|
239
|
-
|
|
240
|
-
### Verify
|
|
241
|
-
|
|
242
|
-
```bash
|
|
243
|
-
core verify "user login"
|
|
244
|
-
# → Confirms 100% SPEC Acceptance Criteria met
|
|
245
|
-
```
|
|
246
|
-
|
|
247
|
-
---
|
|
248
|
-
|
|
249
|
-
## 5. Best Practices
|
|
250
|
-
|
|
251
|
-
### ✅ DO
|
|
252
|
-
|
|
253
|
-
1. **Write SPEC first** → Feature → Contract → Implementation
|
|
254
|
-
2. **Clearly separate Given-When-Then**
|
|
255
|
-
3. **Be specific with contracts** (specify types, formats, constraints)
|
|
256
|
-
4. **Independent scenarios** (can run in any order)
|
|
257
|
-
5. **Include error cases** (Happy path + Sad path)
|
|
258
|
-
|
|
259
|
-
### ❌ DON'T
|
|
260
|
-
|
|
261
|
-
1. **Don't expose implementation details** (keep in Step Definitions only)
|
|
262
|
-
2. **Don't confuse with UI testing** (BDD is for business logic)
|
|
263
|
-
3. **Don't overuse Background** (only for deduplication)
|
|
264
|
-
4. **Don't allow contract violations** (version up on schema changes)
|
|
265
|
-
|
|
266
|
-
---
|
|
267
|
-
|
|
268
|
-
## 6. Coverage Mapping
|
|
269
|
-
|
|
270
|
-
| SPEC REQ | Feature Scenario | Contract Test | Implementation | Status |
|
|
271
|
-
|----------|------------------|---------------|----------------|--------|
|
|
272
|
-
| REQ-001 | ✅ Scenario 1, 2 | ✅ test_login_contract | ✅ POST /api/auth/login | ✅ |
|
|
273
|
-
| REQ-002 | ✅ Scenario 3 | ✅ test_refresh_contract | ⬜ POST /api/auth/refresh | ⬜ |
|
|
274
|
-
|
|
275
|
-
**Coverage**: 1 / 2 (50%)
|
|
276
|
-
|
|
277
|
-
---
|
|
278
|
-
|
|
279
|
-
## 7. CI/CD Integration
|
|
280
|
-
|
|
281
|
-
```yaml
|
|
282
|
-
# .github/workflows/test.yml
|
|
283
|
-
name: BDD + Contract Tests
|
|
284
|
-
|
|
285
|
-
on: [pull_request]
|
|
286
|
-
|
|
287
|
-
jobs:
|
|
288
|
-
test:
|
|
289
|
-
runs-on: ubuntu-latest
|
|
290
|
-
steps:
|
|
291
|
-
- uses: actions/checkout@v2
|
|
292
|
-
|
|
293
|
-
- name: Run BDD tests
|
|
294
|
-
run: pytest tests/features/ -v --gherkin-terminal-reporter
|
|
295
|
-
|
|
296
|
-
- name: Run Contract tests
|
|
297
|
-
run: pytest tests/contract/ -v
|
|
298
|
-
|
|
299
|
-
- name: Upload coverage
|
|
300
|
-
run: |
|
|
301
|
-
pytest --cov=app --cov-report=xml
|
|
302
|
-
codecov -f coverage.xml
|
|
303
|
-
```
|
|
304
|
-
|
|
305
|
-
---
|
|
306
|
-
|
|
307
|
-
## 8. Examples
|
|
308
|
-
|
|
309
|
-
### Python (FastAPI)
|
|
310
|
-
|
|
311
|
-
```bash
|
|
312
|
-
# Project structure
|
|
313
|
-
project/
|
|
314
|
-
├── tests/
|
|
315
|
-
│ ├── features/ # Gherkin feature files
|
|
316
|
-
│ │ └── login.feature
|
|
317
|
-
│ ├── step_defs/ # Step definitions
|
|
318
|
-
│ │ └── test_login.py
|
|
319
|
-
│ └── contract/ # Contract tests
|
|
320
|
-
│ └── test_login_contract.py
|
|
321
|
-
```
|
|
322
|
-
|
|
323
|
-
### Flutter (Dart)
|
|
324
|
-
|
|
325
|
-
```bash
|
|
326
|
-
# Project structure
|
|
327
|
-
project/
|
|
328
|
-
├── integration_test/
|
|
329
|
-
│ ├── features/ # Gherkin feature files
|
|
330
|
-
│ │ └── login.feature
|
|
331
|
-
│ └── step_definitions/ # Step definitions
|
|
332
|
-
│ └── login_test.dart
|
|
333
|
-
└── test/
|
|
334
|
-
└── contract/ # Contract tests
|
|
335
|
-
└── login_contract_test.dart
|
|
336
|
-
```
|
|
337
|
-
|
|
338
|
-
### React (TypeScript)
|
|
339
|
-
|
|
340
|
-
```bash
|
|
341
|
-
# Project structure
|
|
342
|
-
project/
|
|
343
|
-
├── tests/
|
|
344
|
-
│ ├── features/ # Gherkin feature files
|
|
345
|
-
│ │ └── login.feature
|
|
346
|
-
│ ├── steps/ # Step definitions
|
|
347
|
-
│ │ └── login.steps.ts
|
|
348
|
-
│ └── contract/ # Contract tests
|
|
349
|
-
│ └── login.contract.test.ts
|
|
350
|
-
```
|
|
351
|
-
|
|
352
|
-
---
|
|
353
|
-
|
|
354
|
-
## 9. Tools & Frameworks
|
|
355
|
-
|
|
356
|
-
### BDD
|
|
357
|
-
|
|
358
|
-
| Language | Framework |
|
|
359
|
-
|----------|-----------|
|
|
360
|
-
| Python | pytest-bdd, behave |
|
|
361
|
-
| JavaScript | Cucumber.js, Jest-Cucumber |
|
|
362
|
-
| TypeScript | Cucumber.js, Playwright |
|
|
363
|
-
| Dart | flutter_gherkin |
|
|
364
|
-
| Java | Cucumber-JVM |
|
|
365
|
-
| Ruby | Cucumber |
|
|
366
|
-
|
|
367
|
-
### Contract Testing
|
|
368
|
-
|
|
369
|
-
| Type | Framework |
|
|
370
|
-
|------|-----------|
|
|
371
|
-
| Consumer-Driven | Pact, Spring Cloud Contract |
|
|
372
|
-
| Provider | Postman, Dredd |
|
|
373
|
-
| Schema Validation | JSON Schema, Zod, Ajv |
|
|
374
|
-
| Mock Server | MSW, WireMock, http-mock-adapter |
|
|
375
|
-
|
|
376
|
-
---
|
|
377
|
-
|
|
378
|
-
## Summary
|
|
379
|
-
|
|
380
|
-
BDD + Contract Testing enables **AI agents to accurately implement SPECs and automatically verify**:
|
|
381
|
-
|
|
382
|
-
1. **Clear requirements** → Express business language with Gherkin
|
|
383
|
-
2. **Contract-based development** → Independent Frontend/Backend development with API schema
|
|
384
|
-
3. **Automated verification** → Immediately verify AI-generated code quality
|
|
385
|
-
4. **Regression prevention** → Protect existing functionality
|
|
386
|
-
|
|
387
|
-
**Usage in Vibe**:
|
|
388
|
-
|
|
389
|
-
```bash
|
|
390
|
-
core spec "feature" → core feature "feature" → core contract "feature" → core run
|
|
391
|
-
```
|
|
392
|
-
|
|
393
|
-
**Test-First → AI Implementation → Verify → Done** 🎉
|
|
1
|
+
# BDD + Contract Testing Guide
|
|
2
|
+
|
|
3
|
+
**Testing strategy optimized for AI-driven development**
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Overview
|
|
8
|
+
|
|
9
|
+
BDD (Behavior-Driven Development) and Contract Testing are essential for **AI agents to accurately understand requirements and generate verifiable code**.
|
|
10
|
+
|
|
11
|
+
### Why is it useful for AI-driven development?
|
|
12
|
+
|
|
13
|
+
1. **Clear input/output contracts** → AI can implement accurately
|
|
14
|
+
2. **Automated verification** → Immediately verify AI-generated code quality
|
|
15
|
+
3. **Regression prevention** → AI modifications don't break existing functionality
|
|
16
|
+
4. **Automated documentation** → Tests serve as executable specifications
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## Workflow
|
|
21
|
+
|
|
22
|
+
```
|
|
23
|
+
Write SPEC (Requirements)
|
|
24
|
+
↓
|
|
25
|
+
Generate Feature file (Gherkin)
|
|
26
|
+
↓
|
|
27
|
+
Generate Contract tests (API schema)
|
|
28
|
+
↓
|
|
29
|
+
Run tests (Red)
|
|
30
|
+
↓
|
|
31
|
+
AI agent implementation
|
|
32
|
+
↓
|
|
33
|
+
Run tests (Green)
|
|
34
|
+
↓
|
|
35
|
+
Refactoring
|
|
36
|
+
↓
|
|
37
|
+
Run tests again (Stay Green)
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## 1. BDD (Behavior-Driven Development)
|
|
43
|
+
|
|
44
|
+
### Gherkin Syntax
|
|
45
|
+
|
|
46
|
+
```gherkin
|
|
47
|
+
Feature: User Login
|
|
48
|
+
As a user
|
|
49
|
+
I want to login
|
|
50
|
+
So that I can access personalized services
|
|
51
|
+
|
|
52
|
+
Scenario: Successful login with valid credentials
|
|
53
|
+
Given user is registered with "test@example.com" and "password123"
|
|
54
|
+
When login is attempted with "test@example.com" and "password123"
|
|
55
|
+
Then login succeeds
|
|
56
|
+
And receives JWT token
|
|
57
|
+
And redirected to home screen
|
|
58
|
+
|
|
59
|
+
Scenario: Failed login with wrong password
|
|
60
|
+
Given user is registered with "test@example.com"
|
|
61
|
+
When login is attempted with "test@example.com" and "wrong-password"
|
|
62
|
+
Then login fails
|
|
63
|
+
And receives "Invalid credentials" error message
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### Step Definitions (Python)
|
|
67
|
+
|
|
68
|
+
```python
|
|
69
|
+
from pytest_bdd import scenarios, given, when, then, parsers
|
|
70
|
+
|
|
71
|
+
scenarios('features/login.feature')
|
|
72
|
+
|
|
73
|
+
@given(parsers.parse('user is registered with "{email}" and "{password}"'))
|
|
74
|
+
def user_exists(context, email, password):
|
|
75
|
+
context.user = create_user(email=email, password=password)
|
|
76
|
+
|
|
77
|
+
@when(parsers.parse('login is attempted with "{email}" and "{password}"'))
|
|
78
|
+
def attempt_login(context, email, password):
|
|
79
|
+
context.response = login(email=email, password=password)
|
|
80
|
+
|
|
81
|
+
@then('login succeeds')
|
|
82
|
+
def login_succeeds(context):
|
|
83
|
+
assert context.response.status_code == 200
|
|
84
|
+
|
|
85
|
+
@then('receives JWT token')
|
|
86
|
+
def receives_token(context):
|
|
87
|
+
assert 'access_token' in context.response.json()
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
## 2. Contract Testing
|
|
93
|
+
|
|
94
|
+
### API Contract Definition
|
|
95
|
+
|
|
96
|
+
```json
|
|
97
|
+
{
|
|
98
|
+
"request": {
|
|
99
|
+
"method": "POST",
|
|
100
|
+
"path": "/api/auth/login",
|
|
101
|
+
"body": {
|
|
102
|
+
"email": "string (email format)",
|
|
103
|
+
"password": "string (min 8 chars)"
|
|
104
|
+
}
|
|
105
|
+
},
|
|
106
|
+
"response": {
|
|
107
|
+
"status": 200,
|
|
108
|
+
"body": {
|
|
109
|
+
"access_token": "string (JWT)",
|
|
110
|
+
"refresh_token": "string (JWT)",
|
|
111
|
+
"user": {
|
|
112
|
+
"id": "uuid",
|
|
113
|
+
"email": "string",
|
|
114
|
+
"name": "string"
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### Contract Test (Python)
|
|
122
|
+
|
|
123
|
+
```python
|
|
124
|
+
import pytest
|
|
125
|
+
from jsonschema import validate
|
|
126
|
+
|
|
127
|
+
RESPONSE_SCHEMA = {
|
|
128
|
+
"type": "object",
|
|
129
|
+
"required": ["access_token", "refresh_token", "user"],
|
|
130
|
+
"properties": {
|
|
131
|
+
"access_token": {"type": "string", "pattern": "^[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]+$"},
|
|
132
|
+
"refresh_token": {"type": "string"},
|
|
133
|
+
"user": {
|
|
134
|
+
"type": "object",
|
|
135
|
+
"required": ["id", "email", "name"],
|
|
136
|
+
"properties": {
|
|
137
|
+
"id": {"type": "string", "format": "uuid"},
|
|
138
|
+
"email": {"type": "string", "format": "email"},
|
|
139
|
+
"name": {"type": "string"}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
def test_login_response_contract():
|
|
146
|
+
"""Verify login response adheres to contract"""
|
|
147
|
+
response = client.post("/api/auth/login", json={
|
|
148
|
+
"email": "test@example.com",
|
|
149
|
+
"password": "password123"
|
|
150
|
+
})
|
|
151
|
+
|
|
152
|
+
assert response.status_code == 200
|
|
153
|
+
|
|
154
|
+
# Validate response schema
|
|
155
|
+
validate(instance=response.json(), schema=RESPONSE_SCHEMA)
|
|
156
|
+
|
|
157
|
+
# Validate JWT token format
|
|
158
|
+
token = response.json()["access_token"]
|
|
159
|
+
assert len(token.split('.')) == 3 # JWT has 3 parts
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
---
|
|
163
|
+
|
|
164
|
+
## 3. AI Agent Utilization
|
|
165
|
+
|
|
166
|
+
### SPEC → Feature Auto-generation
|
|
167
|
+
|
|
168
|
+
AI agent automatically converts SPEC Acceptance Criteria to Gherkin Scenarios:
|
|
169
|
+
|
|
170
|
+
**SPEC**:
|
|
171
|
+
|
|
172
|
+
```markdown
|
|
173
|
+
### REQ-001: User Login
|
|
174
|
+
**WHEN** login with valid credentials
|
|
175
|
+
**THEN** receive JWT token
|
|
176
|
+
|
|
177
|
+
#### Acceptance Criteria
|
|
178
|
+
- [ ] Login with email and password
|
|
179
|
+
- [ ] Return access_token and refresh_token
|
|
180
|
+
- [ ] Invalid credentials return 400 error
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
**Generated Feature**:
|
|
184
|
+
|
|
185
|
+
```gherkin
|
|
186
|
+
Scenario: Successful login with valid credentials
|
|
187
|
+
Given user is registered
|
|
188
|
+
When login with valid email and password
|
|
189
|
+
Then receive JWT access_token
|
|
190
|
+
And receive JWT refresh_token
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
### API Schema → Contract Auto-generation
|
|
194
|
+
|
|
195
|
+
AI agent automatically converts SPEC API contracts to Contract tests:
|
|
196
|
+
|
|
197
|
+
**SPEC**:
|
|
198
|
+
|
|
199
|
+
```markdown
|
|
200
|
+
### Endpoint: Login
|
|
201
|
+
POST /api/auth/login
|
|
202
|
+
Request: { email, password }
|
|
203
|
+
Response: { access_token, refresh_token, user }
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
**Generated Contract Test**:
|
|
207
|
+
|
|
208
|
+
```python
|
|
209
|
+
def test_login_contract():
|
|
210
|
+
response = client.post("/api/auth/login", json=valid_credentials)
|
|
211
|
+
assert response.status_code == 200
|
|
212
|
+
validate(response.json(), LOGIN_RESPONSE_SCHEMA)
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
---
|
|
216
|
+
|
|
217
|
+
## 4. Core Commands
|
|
218
|
+
|
|
219
|
+
### Generate Feature File
|
|
220
|
+
|
|
221
|
+
```bash
|
|
222
|
+
core feature "user login"
|
|
223
|
+
# → Creates .claude/vibe/features/user-login.feature
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
### Generate Contract Test
|
|
227
|
+
|
|
228
|
+
```bash
|
|
229
|
+
core contract "user login"
|
|
230
|
+
# → Creates tests/contract/test_user_login_contract.py
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
### Run Tests
|
|
234
|
+
|
|
235
|
+
```bash
|
|
236
|
+
core test "user login"
|
|
237
|
+
# → Runs BDD + Contract tests
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
### Verify
|
|
241
|
+
|
|
242
|
+
```bash
|
|
243
|
+
core verify "user login"
|
|
244
|
+
# → Confirms 100% SPEC Acceptance Criteria met
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
---
|
|
248
|
+
|
|
249
|
+
## 5. Best Practices
|
|
250
|
+
|
|
251
|
+
### ✅ DO
|
|
252
|
+
|
|
253
|
+
1. **Write SPEC first** → Feature → Contract → Implementation
|
|
254
|
+
2. **Clearly separate Given-When-Then**
|
|
255
|
+
3. **Be specific with contracts** (specify types, formats, constraints)
|
|
256
|
+
4. **Independent scenarios** (can run in any order)
|
|
257
|
+
5. **Include error cases** (Happy path + Sad path)
|
|
258
|
+
|
|
259
|
+
### ❌ DON'T
|
|
260
|
+
|
|
261
|
+
1. **Don't expose implementation details** (keep in Step Definitions only)
|
|
262
|
+
2. **Don't confuse with UI testing** (BDD is for business logic)
|
|
263
|
+
3. **Don't overuse Background** (only for deduplication)
|
|
264
|
+
4. **Don't allow contract violations** (version up on schema changes)
|
|
265
|
+
|
|
266
|
+
---
|
|
267
|
+
|
|
268
|
+
## 6. Coverage Mapping
|
|
269
|
+
|
|
270
|
+
| SPEC REQ | Feature Scenario | Contract Test | Implementation | Status |
|
|
271
|
+
|----------|------------------|---------------|----------------|--------|
|
|
272
|
+
| REQ-001 | ✅ Scenario 1, 2 | ✅ test_login_contract | ✅ POST /api/auth/login | ✅ |
|
|
273
|
+
| REQ-002 | ✅ Scenario 3 | ✅ test_refresh_contract | ⬜ POST /api/auth/refresh | ⬜ |
|
|
274
|
+
|
|
275
|
+
**Coverage**: 1 / 2 (50%)
|
|
276
|
+
|
|
277
|
+
---
|
|
278
|
+
|
|
279
|
+
## 7. CI/CD Integration
|
|
280
|
+
|
|
281
|
+
```yaml
|
|
282
|
+
# .github/workflows/test.yml
|
|
283
|
+
name: BDD + Contract Tests
|
|
284
|
+
|
|
285
|
+
on: [pull_request]
|
|
286
|
+
|
|
287
|
+
jobs:
|
|
288
|
+
test:
|
|
289
|
+
runs-on: ubuntu-latest
|
|
290
|
+
steps:
|
|
291
|
+
- uses: actions/checkout@v2
|
|
292
|
+
|
|
293
|
+
- name: Run BDD tests
|
|
294
|
+
run: pytest tests/features/ -v --gherkin-terminal-reporter
|
|
295
|
+
|
|
296
|
+
- name: Run Contract tests
|
|
297
|
+
run: pytest tests/contract/ -v
|
|
298
|
+
|
|
299
|
+
- name: Upload coverage
|
|
300
|
+
run: |
|
|
301
|
+
pytest --cov=app --cov-report=xml
|
|
302
|
+
codecov -f coverage.xml
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
---
|
|
306
|
+
|
|
307
|
+
## 8. Examples
|
|
308
|
+
|
|
309
|
+
### Python (FastAPI)
|
|
310
|
+
|
|
311
|
+
```bash
|
|
312
|
+
# Project structure
|
|
313
|
+
project/
|
|
314
|
+
├── tests/
|
|
315
|
+
│ ├── features/ # Gherkin feature files
|
|
316
|
+
│ │ └── login.feature
|
|
317
|
+
│ ├── step_defs/ # Step definitions
|
|
318
|
+
│ │ └── test_login.py
|
|
319
|
+
│ └── contract/ # Contract tests
|
|
320
|
+
│ └── test_login_contract.py
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
### Flutter (Dart)
|
|
324
|
+
|
|
325
|
+
```bash
|
|
326
|
+
# Project structure
|
|
327
|
+
project/
|
|
328
|
+
├── integration_test/
|
|
329
|
+
│ ├── features/ # Gherkin feature files
|
|
330
|
+
│ │ └── login.feature
|
|
331
|
+
│ └── step_definitions/ # Step definitions
|
|
332
|
+
│ └── login_test.dart
|
|
333
|
+
└── test/
|
|
334
|
+
└── contract/ # Contract tests
|
|
335
|
+
└── login_contract_test.dart
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
### React (TypeScript)
|
|
339
|
+
|
|
340
|
+
```bash
|
|
341
|
+
# Project structure
|
|
342
|
+
project/
|
|
343
|
+
├── tests/
|
|
344
|
+
│ ├── features/ # Gherkin feature files
|
|
345
|
+
│ │ └── login.feature
|
|
346
|
+
│ ├── steps/ # Step definitions
|
|
347
|
+
│ │ └── login.steps.ts
|
|
348
|
+
│ └── contract/ # Contract tests
|
|
349
|
+
│ └── login.contract.test.ts
|
|
350
|
+
```
|
|
351
|
+
|
|
352
|
+
---
|
|
353
|
+
|
|
354
|
+
## 9. Tools & Frameworks
|
|
355
|
+
|
|
356
|
+
### BDD
|
|
357
|
+
|
|
358
|
+
| Language | Framework |
|
|
359
|
+
|----------|-----------|
|
|
360
|
+
| Python | pytest-bdd, behave |
|
|
361
|
+
| JavaScript | Cucumber.js, Jest-Cucumber |
|
|
362
|
+
| TypeScript | Cucumber.js, Playwright |
|
|
363
|
+
| Dart | flutter_gherkin |
|
|
364
|
+
| Java | Cucumber-JVM |
|
|
365
|
+
| Ruby | Cucumber |
|
|
366
|
+
|
|
367
|
+
### Contract Testing
|
|
368
|
+
|
|
369
|
+
| Type | Framework |
|
|
370
|
+
|------|-----------|
|
|
371
|
+
| Consumer-Driven | Pact, Spring Cloud Contract |
|
|
372
|
+
| Provider | Postman, Dredd |
|
|
373
|
+
| Schema Validation | JSON Schema, Zod, Ajv |
|
|
374
|
+
| Mock Server | MSW, WireMock, http-mock-adapter |
|
|
375
|
+
|
|
376
|
+
---
|
|
377
|
+
|
|
378
|
+
## Summary
|
|
379
|
+
|
|
380
|
+
BDD + Contract Testing enables **AI agents to accurately implement SPECs and automatically verify**:
|
|
381
|
+
|
|
382
|
+
1. **Clear requirements** → Express business language with Gherkin
|
|
383
|
+
2. **Contract-based development** → Independent Frontend/Backend development with API schema
|
|
384
|
+
3. **Automated verification** → Immediately verify AI-generated code quality
|
|
385
|
+
4. **Regression prevention** → Protect existing functionality
|
|
386
|
+
|
|
387
|
+
**Usage in Vibe**:
|
|
388
|
+
|
|
389
|
+
```bash
|
|
390
|
+
core spec "feature" → core feature "feature" → core contract "feature" → core run
|
|
391
|
+
```
|
|
392
|
+
|
|
393
|
+
**Test-First → AI Implementation → Verify → Done** 🎉
|