tribunal-kit 2.4.6 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agent/ARCHITECTURE.md +99 -99
- package/.agent/GEMINI.md +52 -52
- package/.agent/agents/accessibility-reviewer.md +139 -86
- package/.agent/agents/ai-code-reviewer.md +160 -90
- package/.agent/agents/backend-specialist.md +164 -127
- package/.agent/agents/code-archaeologist.md +115 -73
- package/.agent/agents/database-architect.md +130 -110
- package/.agent/agents/debugger.md +137 -97
- package/.agent/agents/dependency-reviewer.md +78 -30
- package/.agent/agents/devops-engineer.md +161 -118
- package/.agent/agents/documentation-writer.md +151 -87
- package/.agent/agents/explorer-agent.md +117 -99
- package/.agent/agents/frontend-reviewer.md +127 -47
- package/.agent/agents/frontend-specialist.md +169 -109
- package/.agent/agents/game-developer.md +28 -164
- package/.agent/agents/logic-reviewer.md +87 -49
- package/.agent/agents/mobile-developer.md +151 -103
- package/.agent/agents/mobile-reviewer.md +133 -50
- package/.agent/agents/orchestrator.md +121 -110
- package/.agent/agents/penetration-tester.md +103 -77
- package/.agent/agents/performance-optimizer.md +136 -92
- package/.agent/agents/performance-reviewer.md +139 -69
- package/.agent/agents/product-manager.md +104 -70
- package/.agent/agents/product-owner.md +6 -25
- package/.agent/agents/project-planner.md +95 -95
- package/.agent/agents/qa-automation-engineer.md +174 -87
- package/.agent/agents/security-auditor.md +133 -129
- package/.agent/agents/seo-specialist.md +160 -99
- package/.agent/agents/sql-reviewer.md +132 -44
- package/.agent/agents/supervisor-agent.md +137 -109
- package/.agent/agents/swarm-worker-contracts.md +17 -17
- package/.agent/agents/swarm-worker-registry.md +46 -46
- package/.agent/agents/test-coverage-reviewer.md +132 -53
- package/.agent/agents/test-engineer.md +0 -21
- package/.agent/agents/type-safety-reviewer.md +143 -33
- package/.agent/patterns/generator.md +9 -9
- package/.agent/patterns/inversion.md +12 -12
- package/.agent/patterns/pipeline.md +9 -9
- package/.agent/patterns/reviewer.md +13 -13
- package/.agent/patterns/tool-wrapper.md +9 -9
- package/.agent/rules/GEMINI.md +63 -63
- package/.agent/scripts/__pycache__/auto_preview.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/bundle_analyzer.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/checklist.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/dependency_analyzer.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/security_scan.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/session_manager.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/skill_integrator.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/swarm_dispatcher.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/test_runner.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/verify_all.cpython-311.pyc +0 -0
- package/.agent/scripts/compress_skills.py +167 -0
- package/.agent/scripts/consolidate_skills.py +173 -0
- package/.agent/scripts/deep_compress.py +202 -0
- package/.agent/scripts/minify_context.py +80 -0
- package/.agent/scripts/security_scan.py +1 -1
- package/.agent/scripts/strip_tribunal.py +41 -0
- package/.agent/skills/agent-organizer/SKILL.md +60 -100
- package/.agent/skills/agentic-patterns/SKILL.md +0 -70
- package/.agent/skills/ai-prompt-injection-defense/SKILL.md +108 -53
- package/.agent/skills/api-patterns/SKILL.md +197 -257
- package/.agent/skills/api-security-auditor/SKILL.md +125 -57
- package/.agent/skills/app-builder/SKILL.md +326 -50
- package/.agent/skills/app-builder/templates/SKILL.md +13 -15
- package/.agent/skills/app-builder/templates/astro-static/TEMPLATE.md +16 -16
- package/.agent/skills/app-builder/templates/chrome-extension/TEMPLATE.md +22 -22
- package/.agent/skills/app-builder/templates/cli-tool/TEMPLATE.md +18 -18
- package/.agent/skills/app-builder/templates/electron-desktop/TEMPLATE.md +20 -20
- package/.agent/skills/app-builder/templates/express-api/TEMPLATE.md +17 -17
- package/.agent/skills/app-builder/templates/flutter-app/TEMPLATE.md +18 -18
- package/.agent/skills/app-builder/templates/monorepo-turborepo/TEMPLATE.md +21 -21
- package/.agent/skills/app-builder/templates/nextjs-fullstack/TEMPLATE.md +19 -19
- package/.agent/skills/app-builder/templates/nextjs-saas/TEMPLATE.md +26 -26
- package/.agent/skills/app-builder/templates/nextjs-static/TEMPLATE.md +26 -26
- package/.agent/skills/app-builder/templates/nuxt-app/TEMPLATE.md +19 -19
- package/.agent/skills/app-builder/templates/python-fastapi/TEMPLATE.md +18 -18
- package/.agent/skills/app-builder/templates/react-native-app/TEMPLATE.md +20 -20
- package/.agent/skills/appflow-wireframe/SKILL.md +71 -98
- package/.agent/skills/architecture/SKILL.md +161 -200
- package/.agent/skills/authentication-best-practices/SKILL.md +121 -54
- package/.agent/skills/bash-linux/SKILL.md +71 -166
- package/.agent/skills/behavioral-modes/SKILL.md +8 -69
- package/.agent/skills/brainstorming/SKILL.md +345 -127
- package/.agent/skills/building-native-ui/SKILL.md +125 -57
- package/.agent/skills/clean-code/SKILL.md +266 -149
- package/.agent/skills/code-review-checklist/SKILL.md +0 -62
- package/.agent/skills/config-validator/SKILL.md +73 -131
- package/.agent/skills/csharp-developer/SKILL.md +434 -73
- package/.agent/skills/database-design/SKILL.md +190 -275
- package/.agent/skills/deployment-procedures/SKILL.md +81 -158
- package/.agent/skills/devops-engineer/SKILL.md +255 -94
- package/.agent/skills/devops-incident-responder/SKILL.md +50 -69
- package/.agent/skills/doc.md +5 -5
- package/.agent/skills/documentation-templates/SKILL.md +19 -63
- package/.agent/skills/edge-computing/SKILL.md +75 -165
- package/.agent/skills/extract-design-system/SKILL.md +84 -58
- package/.agent/skills/framer-motion-expert/SKILL.md +195 -0
- package/.agent/skills/frontend-design/SKILL.md +151 -499
- package/.agent/skills/game-design-expert/SKILL.md +71 -0
- package/.agent/skills/game-engineering-expert/SKILL.md +88 -0
- package/.agent/skills/geo-fundamentals/SKILL.md +52 -178
- package/.agent/skills/github-operations/SKILL.md +197 -272
- package/.agent/skills/gsap-expert/SKILL.md +194 -0
- package/.agent/skills/i18n-localization/SKILL.md +60 -172
- package/.agent/skills/intelligent-routing/SKILL.md +123 -103
- package/.agent/skills/lint-and-validate/SKILL.md +8 -52
- package/.agent/skills/llm-engineering/SKILL.md +281 -195
- package/.agent/skills/local-first/SKILL.md +76 -159
- package/.agent/skills/mcp-builder/SKILL.md +48 -188
- package/.agent/skills/mobile-design/SKILL.md +213 -219
- package/.agent/skills/motion-engineering/SKILL.md +184 -0
- package/.agent/skills/nextjs-react-expert/SKILL.md +184 -203
- package/.agent/skills/nodejs-best-practices/SKILL.md +403 -185
- package/.agent/skills/observability/SKILL.md +211 -203
- package/.agent/skills/parallel-agents/SKILL.md +53 -146
- package/.agent/skills/performance-profiling/SKILL.md +171 -151
- package/.agent/skills/plan-writing/SKILL.md +49 -153
- package/.agent/skills/platform-engineer/SKILL.md +57 -103
- package/.agent/skills/playwright-best-practices/SKILL.md +110 -63
- package/.agent/skills/powershell-windows/SKILL.md +61 -179
- package/.agent/skills/python-patterns/SKILL.md +7 -35
- package/.agent/skills/python-pro/SKILL.md +273 -114
- package/.agent/skills/react-specialist/SKILL.md +227 -108
- package/.agent/skills/readme-builder/SKILL.md +15 -85
- package/.agent/skills/realtime-patterns/SKILL.md +216 -243
- package/.agent/skills/red-team-tactics/SKILL.md +10 -51
- package/.agent/skills/rust-pro/SKILL.md +525 -142
- package/.agent/skills/seo-fundamentals/SKILL.md +92 -153
- package/.agent/skills/server-management/SKILL.md +110 -166
- package/.agent/skills/shadcn-ui-expert/SKILL.md +154 -55
- package/.agent/skills/skill-creator/SKILL.md +18 -58
- package/.agent/skills/sql-pro/SKILL.md +543 -68
- package/.agent/skills/supabase-postgres-best-practices/SKILL.md +28 -68
- package/.agent/skills/swiftui-expert/SKILL.md +124 -57
- package/.agent/skills/systematic-debugging/SKILL.md +49 -151
- package/.agent/skills/tailwind-patterns/SKILL.md +433 -149
- package/.agent/skills/tdd-workflow/SKILL.md +63 -169
- package/.agent/skills/test-result-analyzer/SKILL.md +33 -73
- package/.agent/skills/testing-patterns/SKILL.md +437 -130
- package/.agent/skills/trend-researcher/SKILL.md +30 -71
- package/.agent/skills/ui-ux-pro-max/SKILL.md +0 -41
- package/.agent/skills/ui-ux-researcher/SKILL.md +51 -91
- package/.agent/skills/vue-expert/SKILL.md +225 -119
- package/.agent/skills/vulnerability-scanner/SKILL.md +264 -226
- package/.agent/skills/web-accessibility-auditor/SKILL.md +141 -58
- package/.agent/skills/web-design-guidelines/SKILL.md +17 -61
- package/.agent/skills/webapp-testing/SKILL.md +71 -196
- package/.agent/skills/whimsy-injector/SKILL.md +58 -132
- package/.agent/skills/workflow-optimizer/SKILL.md +28 -68
- package/.agent/workflows/api-tester.md +96 -224
- package/.agent/workflows/audit.md +81 -122
- package/.agent/workflows/brainstorm.md +69 -105
- package/.agent/workflows/changelog.md +65 -97
- package/.agent/workflows/create.md +73 -88
- package/.agent/workflows/debug.md +80 -111
- package/.agent/workflows/deploy.md +119 -92
- package/.agent/workflows/enhance.md +80 -91
- package/.agent/workflows/fix.md +68 -97
- package/.agent/workflows/generate.md +165 -164
- package/.agent/workflows/migrate.md +106 -109
- package/.agent/workflows/orchestrate.md +103 -86
- package/.agent/workflows/performance-benchmarker.md +77 -268
- package/.agent/workflows/plan.md +120 -98
- package/.agent/workflows/preview.md +39 -96
- package/.agent/workflows/refactor.md +105 -97
- package/.agent/workflows/review-ai.md +63 -102
- package/.agent/workflows/review.md +71 -110
- package/.agent/workflows/session.md +53 -113
- package/.agent/workflows/status.md +42 -88
- package/.agent/workflows/strengthen-skills.md +90 -51
- package/.agent/workflows/swarm.md +114 -129
- package/.agent/workflows/test.md +125 -102
- package/.agent/workflows/tribunal-backend.md +60 -78
- package/.agent/workflows/tribunal-database.md +62 -100
- package/.agent/workflows/tribunal-frontend.md +62 -82
- package/.agent/workflows/tribunal-full.md +56 -100
- package/.agent/workflows/tribunal-mobile.md +65 -94
- package/.agent/workflows/tribunal-performance.md +62 -105
- package/.agent/workflows/ui-ux-pro-max.md +72 -121
- package/README.md +11 -15
- package/package.json +1 -1
- package/.agent/skills/api-patterns/api-style.md +0 -42
- package/.agent/skills/api-patterns/auth.md +0 -24
- package/.agent/skills/api-patterns/documentation.md +0 -26
- package/.agent/skills/api-patterns/graphql.md +0 -41
- package/.agent/skills/api-patterns/rate-limiting.md +0 -31
- package/.agent/skills/api-patterns/response.md +0 -37
- package/.agent/skills/api-patterns/rest.md +0 -40
- package/.agent/skills/api-patterns/security-testing.md +0 -122
- package/.agent/skills/api-patterns/trpc.md +0 -41
- package/.agent/skills/api-patterns/versioning.md +0 -22
- package/.agent/skills/app-builder/agent-coordination.md +0 -71
- package/.agent/skills/app-builder/feature-building.md +0 -53
- package/.agent/skills/app-builder/project-detection.md +0 -34
- package/.agent/skills/app-builder/scaffolding.md +0 -118
- package/.agent/skills/app-builder/tech-stack.md +0 -40
- package/.agent/skills/architecture/context-discovery.md +0 -43
- package/.agent/skills/architecture/examples.md +0 -94
- package/.agent/skills/architecture/pattern-selection.md +0 -68
- package/.agent/skills/architecture/patterns-reference.md +0 -50
- package/.agent/skills/architecture/trade-off-analysis.md +0 -77
- package/.agent/skills/brainstorming/dynamic-questioning.md +0 -360
- package/.agent/skills/database-design/database-selection.md +0 -43
- package/.agent/skills/database-design/indexing.md +0 -39
- package/.agent/skills/database-design/migrations.md +0 -48
- package/.agent/skills/database-design/optimization.md +0 -36
- package/.agent/skills/database-design/orm-selection.md +0 -30
- package/.agent/skills/database-design/schema-design.md +0 -56
- package/.agent/skills/dotnet-core-expert/SKILL.md +0 -103
- package/.agent/skills/framer-motion-animations/SKILL.md +0 -74
- package/.agent/skills/frontend-design/animation-guide.md +0 -331
- package/.agent/skills/frontend-design/color-system.md +0 -329
- package/.agent/skills/frontend-design/decision-trees.md +0 -418
- package/.agent/skills/frontend-design/motion-graphics.md +0 -306
- package/.agent/skills/frontend-design/typography-system.md +0 -363
- package/.agent/skills/frontend-design/ux-psychology.md +0 -1116
- package/.agent/skills/frontend-design/visual-effects.md +0 -383
- package/.agent/skills/game-development/2d-games/SKILL.md +0 -119
- package/.agent/skills/game-development/3d-games/SKILL.md +0 -135
- package/.agent/skills/game-development/SKILL.md +0 -236
- package/.agent/skills/game-development/game-art/SKILL.md +0 -185
- package/.agent/skills/game-development/game-audio/SKILL.md +0 -190
- package/.agent/skills/game-development/game-design/SKILL.md +0 -129
- package/.agent/skills/game-development/mobile-games/SKILL.md +0 -108
- package/.agent/skills/game-development/multiplayer/SKILL.md +0 -132
- package/.agent/skills/game-development/pc-games/SKILL.md +0 -144
- package/.agent/skills/game-development/vr-ar/SKILL.md +0 -123
- package/.agent/skills/game-development/web-games/SKILL.md +0 -150
- package/.agent/skills/intelligent-routing/router-manifest.md +0 -65
- package/.agent/skills/mobile-design/decision-trees.md +0 -516
- package/.agent/skills/mobile-design/mobile-backend.md +0 -491
- package/.agent/skills/mobile-design/mobile-color-system.md +0 -420
- package/.agent/skills/mobile-design/mobile-debugging.md +0 -122
- package/.agent/skills/mobile-design/mobile-design-thinking.md +0 -357
- package/.agent/skills/mobile-design/mobile-navigation.md +0 -458
- package/.agent/skills/mobile-design/mobile-performance.md +0 -767
- package/.agent/skills/mobile-design/mobile-testing.md +0 -356
- package/.agent/skills/mobile-design/mobile-typography.md +0 -433
- package/.agent/skills/mobile-design/platform-android.md +0 -666
- package/.agent/skills/mobile-design/platform-ios.md +0 -561
- package/.agent/skills/mobile-design/touch-psychology.md +0 -537
- package/.agent/skills/nextjs-react-expert/1-async-eliminating-waterfalls.md +0 -312
- package/.agent/skills/nextjs-react-expert/2-bundle-bundle-size-optimization.md +0 -240
- package/.agent/skills/nextjs-react-expert/3-server-server-side-performance.md +0 -490
- package/.agent/skills/nextjs-react-expert/4-client-client-side-data-fetching.md +0 -264
- package/.agent/skills/nextjs-react-expert/5-rerender-re-render-optimization.md +0 -581
- package/.agent/skills/nextjs-react-expert/6-rendering-rendering-performance.md +0 -432
- package/.agent/skills/nextjs-react-expert/7-js-javascript-performance.md +0 -684
- package/.agent/skills/nextjs-react-expert/8-advanced-advanced-patterns.md +0 -150
- package/.agent/skills/vulnerability-scanner/checklists.md +0 -121
package/.agent/workflows/test.md
CHANGED
|
@@ -1,166 +1,189 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: Test generation and test running command. Creates and executes tests for code.
|
|
2
|
+
description: Test generation and test running command. Creates and executes tests for code using the Testing Trophy strategy (unit → integration → E2E). Tests are behavioral (GIVEN/WHEN/THEN), not structural. Tests cannot be approved without covering happy path, error path, and boundary cases.
|
|
3
3
|
---
|
|
4
4
|
|
|
5
|
-
# /test — Test
|
|
5
|
+
# /test — Test Generation & Execution
|
|
6
6
|
|
|
7
7
|
$ARGUMENTS
|
|
8
8
|
|
|
9
9
|
---
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
## When to Use /test
|
|
12
12
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
|
18
|
-
|
|
19
|
-
| No tests exist for working code | Code is broken → `/debug` first, then `/test` |
|
|
20
|
-
| Tests exist but coverage is thin | Quality of test assertions → use `audit` mode |
|
|
21
|
-
| You changed behavior and need regression tests | Full project test health → `/audit` |
|
|
22
|
-
| You want edge case coverage only | Integration tests → specify in the test plan |
|
|
13
|
+
|Use `/test` when...|Use something else when...|
|
|
14
|
+
|:---|:---|
|
|
15
|
+
|New code was just generated and needs tests|Tests are failing → `/debug`|
|
|
16
|
+
|After `/debug` to prevent regression|Need a full coverage audit → `/audit`|
|
|
17
|
+
|Test coverage is below threshold|E2E for the whole app → `/performance-benchmarker`|
|
|
18
|
+
|A bug was fixed and needs a regression test||
|
|
23
19
|
|
|
24
20
|
---
|
|
25
21
|
|
|
26
|
-
##
|
|
22
|
+
## Testing Trophy Strategy (2026 Standard)
|
|
27
23
|
|
|
28
24
|
```
|
|
29
|
-
|
|
30
|
-
/
|
|
31
|
-
|
|
32
|
-
/
|
|
33
|
-
|
|
25
|
+
/\
|
|
26
|
+
/E2E\ ← Small (Playwright): happy paths, auth, critical checkout
|
|
27
|
+
/──────\
|
|
28
|
+
/Integr.\ ← Medium (RTL + MSW): component + network behavior
|
|
29
|
+
/──────────\
|
|
30
|
+
/ Unit \ ← Foundation (Vitest): pure logic + transformations
|
|
31
|
+
/──────────────\
|
|
32
|
+
/ Static Types \ ← Free: TypeScript + ESLint
|
|
33
|
+
/────────────────────\
|
|
34
34
|
```
|
|
35
35
|
|
|
36
|
+
When asked to write tests without specifying a level, default to **integration tests** (highest ROI per test).
|
|
37
|
+
|
|
36
38
|
---
|
|
37
39
|
|
|
38
|
-
##
|
|
40
|
+
## Phase 1 — Coverage Gap Analysis
|
|
39
41
|
|
|
40
|
-
|
|
42
|
+
Before writing new tests, understand existing coverage:
|
|
41
43
|
|
|
42
|
-
|
|
44
|
+
```bash
|
|
45
|
+
npm run test:coverage # Generate coverage report
|
|
46
|
+
```
|
|
43
47
|
|
|
44
|
-
|
|
45
|
-
- All **direct external dependencies** (to identify what needs mocking)
|
|
46
|
-
- **Expected inputs and outputs** — derived from the function signature and actual behavior, not assumed
|
|
48
|
+
Cover these areas in priority order:
|
|
47
49
|
|
|
48
|
-
|
|
50
|
+
```
|
|
51
|
+
1. Authentication flows (login, logout, session expiry)
|
|
52
|
+
2. Data mutation paths (create, update, delete)
|
|
53
|
+
3. Validation rejection (invalid input → correct error)
|
|
54
|
+
4. Error handling (API failure → correct fallback)
|
|
55
|
+
5. Authorization (wrong role → 403, unauthenticated → 401)
|
|
56
|
+
6. Boundary values (0, null, empty, max)
|
|
57
|
+
```
|
|
49
58
|
|
|
50
|
-
|
|
59
|
+
---
|
|
51
60
|
|
|
52
|
-
|
|
53
|
-
Target: [function or module name]
|
|
54
|
-
Framework: [Jest | Vitest | pytest | Go test]
|
|
61
|
+
## Phase 2 — Test Design (Behavioral, Not Structural)
|
|
55
62
|
|
|
56
|
-
|
|
57
|
-
› Normal path — valid input, expected output
|
|
58
|
-
› Null / undefined / None input
|
|
59
|
-
› Empty string / empty array / empty object
|
|
60
|
-
› Boundary values (0, -1, MAX_INT, max string length)
|
|
61
|
-
› Async rejection / network failure / timeout
|
|
62
|
-
› Invalid type input (string where number expected, etc.)
|
|
63
|
-
› Auth / permission fail path
|
|
64
|
-
› Concurrent access (if applicable)
|
|
63
|
+
Tests describe **behavior**, not implementation:
|
|
65
64
|
|
|
66
|
-
Dependencies to mock: [list — minimal, only direct external deps]
|
|
67
65
|
```
|
|
66
|
+
✅ Behavioral: "returns 401 when no auth token is provided"
|
|
67
|
+
❌ Structural: "calls validateToken() once"
|
|
68
68
|
|
|
69
|
-
|
|
69
|
+
Format every test as:
|
|
70
|
+
GIVEN [initial state/context]
|
|
71
|
+
WHEN [action taken]
|
|
72
|
+
THEN [observable behavior verified]
|
|
73
|
+
```
|
|
70
74
|
|
|
71
75
|
---
|
|
72
76
|
|
|
73
|
-
## Test
|
|
74
|
-
|
|
75
|
-
Every generated test file follows this format:
|
|
77
|
+
## Phase 3 — Minimum Required Test Coverage
|
|
76
78
|
|
|
77
|
-
|
|
78
|
-
describe('[Unit under test]', () => {
|
|
79
|
+
The Tribunal rejects any test submission that does not cover ALL of:
|
|
79
80
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
81
|
+
```
|
|
82
|
+
□ Happy path — does it work correctly with valid input?
|
|
83
|
+
□ Error path — does it fail correctly with invalid/missing input?
|
|
84
|
+
□ Boundary cases — what happens at 0, null, empty, max, limits?
|
|
85
|
+
□ Auth boundary — what happens without auth? With wrong role?
|
|
86
|
+
```
|
|
84
87
|
|
|
85
|
-
|
|
86
|
-
const result = functionUnderTest(input);
|
|
88
|
+
---
|
|
87
89
|
|
|
88
|
-
|
|
89
|
-
expect(result).toBe([exact expected value]);
|
|
90
|
-
});
|
|
91
|
-
});
|
|
90
|
+
## Test Templates by Layer
|
|
92
91
|
|
|
93
|
-
|
|
94
|
-
it('throws when input is null', () => {
|
|
95
|
-
expect(() => functionUnderTest(null)).toThrow('[exact error message]');
|
|
96
|
-
});
|
|
92
|
+
### Unit Test (Vitest)
|
|
97
93
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
94
|
+
```typescript
|
|
95
|
+
describe('[functionName]()', () => {
|
|
96
|
+
it('[happy path description]', () => {
|
|
97
|
+
expect(fn(validInput)).toBe(expectedResult);
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
it('returns [expected] when input is [edge case]', () => {
|
|
101
|
+
expect(fn(boundaryInput)).toBe(expectedBoundaryResult);
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
it('throws [ErrorType] when [invalid condition]', () => {
|
|
105
|
+
expect(() => fn(invalidInput)).toThrow(ExpectedError);
|
|
101
106
|
});
|
|
102
|
-
|
|
103
107
|
});
|
|
104
108
|
```
|
|
105
109
|
|
|
106
|
-
|
|
110
|
+
### Integration Test (RTL + MSW)
|
|
107
111
|
|
|
108
|
-
|
|
112
|
+
```typescript
|
|
113
|
+
test('[user observable behavior]', async () => {
|
|
114
|
+
// GIVEN: server mock defined in handlers.ts
|
|
115
|
+
// WHEN: user action
|
|
116
|
+
render(<Component />);
|
|
117
|
+
await userEvent.click(screen.getByRole('button', { name: /submit/i }));
|
|
118
|
+
// THEN: observable outcome
|
|
119
|
+
await screen.findByText(/success/i);
|
|
120
|
+
});
|
|
121
|
+
```
|
|
109
122
|
|
|
110
|
-
|
|
123
|
+
### E2E Test (Playwright)
|
|
111
124
|
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
125
|
+
```typescript
|
|
126
|
+
test('[critical user path]', async ({ page }) => {
|
|
127
|
+
// GIVEN: pre-authenticated (stored session — not login from UI every test)
|
|
128
|
+
// WHEN: navigate and act
|
|
129
|
+
await page.goto('/checkout');
|
|
130
|
+
// THEN: verify final state
|
|
131
|
+
await expect(page.getByText('Order confirmed')).toBeVisible();
|
|
132
|
+
});
|
|
133
|
+
```
|
|
119
134
|
|
|
120
135
|
---
|
|
121
136
|
|
|
122
|
-
##
|
|
137
|
+
## Phase 4 — Test Execution
|
|
123
138
|
|
|
124
139
|
```bash
|
|
125
|
-
|
|
126
|
-
|
|
140
|
+
# Run tests
|
|
141
|
+
npm test # Unit + integration
|
|
142
|
+
npm run test:e2e # Playwright E2E (CI environment)
|
|
143
|
+
npm run test:coverage # With coverage report
|
|
144
|
+
|
|
145
|
+
# target coverage threshold (default 80%)
|
|
127
146
|
```
|
|
128
147
|
|
|
129
|
-
|
|
130
|
-
- Root causes across multiple failing test files
|
|
131
|
-
- Whether failures are from flaky setup or actual code breakage
|
|
132
|
-
- Actionable fix recommendations
|
|
148
|
+
Failed tests halt the workflow. Fix the code or fix the test (not both — understand which first).
|
|
133
149
|
|
|
134
150
|
---
|
|
135
151
|
|
|
136
|
-
##
|
|
152
|
+
## Human Gate — Before Writing Test Files
|
|
137
153
|
|
|
138
|
-
|
|
139
|
-
- Assertions test **specific values** — `toBe('exact')`, not `toBeDefined()` or `toBeTruthy()`
|
|
140
|
-
- Mocks are **minimal** — only the direct external dependency, not the whole world
|
|
141
|
-
- All conclusions about existing test quality are backed by **reading the actual test code**
|
|
142
|
-
- `// VERIFY: check this matcher exists` on any assertion method not commonly used
|
|
154
|
+
After the test-coverage-reviewer approves:
|
|
143
155
|
|
|
144
|
-
|
|
156
|
+
```
|
|
157
|
+
━━━ Human Gate ━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
145
158
|
|
|
146
|
-
|
|
159
|
+
Generated tests cover:
|
|
160
|
+
✅ Happy path
|
|
161
|
+
✅ Error path
|
|
162
|
+
✅ Boundary cases
|
|
163
|
+
✅ Auth boundary
|
|
147
164
|
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
165
|
+
Files to write:
|
|
166
|
+
[list of .test.ts files]
|
|
167
|
+
|
|
168
|
+
Write to disk? Y = write | N = discard | R = revise coverage
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
No test files are written without explicit approval.
|
|
154
172
|
|
|
155
173
|
---
|
|
156
174
|
|
|
157
|
-
##
|
|
175
|
+
## Test Review Verdicts
|
|
176
|
+
|
|
177
|
+
The `test-coverage-reviewer` is automatically activated and checks:
|
|
158
178
|
|
|
159
179
|
```
|
|
160
|
-
|
|
161
|
-
/
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
180
|
+
□ Happy path covered for new function/component
|
|
181
|
+
□ Error/rejection paths covered
|
|
182
|
+
□ Boundary values tested
|
|
183
|
+
□ No brittle CSS selectors — only getByRole/getByLabelText
|
|
184
|
+
□ No implementation details tested (private state, internal calls)
|
|
185
|
+
□ Async assertions use await findBy* (not getBy*)
|
|
186
|
+
□ Mock only at architectural boundaries (MSW for network — not hooks/methods)
|
|
166
187
|
```
|
|
188
|
+
|
|
189
|
+
---
|
|
@@ -1,111 +1,93 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: Backend-specific Tribunal. Runs Logic + Security + Dependency +
|
|
2
|
+
description: Backend-specific Tribunal. Runs Logic + Security + Dependency + Type Safety reviewers. Use for API routes, server logic, auth code, middleware, Server Actions, and any server-side business logic.
|
|
3
3
|
---
|
|
4
4
|
|
|
5
|
-
# /tribunal-backend —
|
|
5
|
+
# /tribunal-backend — Backend Code Audit
|
|
6
6
|
|
|
7
7
|
$ARGUMENTS
|
|
8
8
|
|
|
9
9
|
---
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
## When to Use /tribunal-backend
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
|Use `/tribunal-backend` when...|Use something else when...|
|
|
14
|
+
|:---|:---|
|
|
15
|
+
|Reviewing API routes or middleware|Frontend components → `/tribunal-frontend`|
|
|
16
|
+
|Auth, JWT, session code|Database queries only → `/tribunal-database`|
|
|
17
|
+
|Server Actions|Mobile code → `/tribunal-mobile`|
|
|
18
|
+
|Input validation and Zod schemas|Maximum coverage → `/tribunal-full`|
|
|
19
|
+
|Third-party API integrations||
|
|
14
20
|
|
|
15
|
-
|
|
21
|
+
---
|
|
16
22
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
23
|
+
## 4 Active Reviewers (All Run Simultaneously)
|
|
24
|
+
|
|
25
|
+
### logic-reviewer
|
|
26
|
+
- Hallucinated Express/Hono/Fastify methods
|
|
27
|
+
- Missing awaits on async operations
|
|
28
|
+
- Unreachable code after return statements
|
|
29
|
+
- Race conditions in sequential state mutations
|
|
30
|
+
|
|
31
|
+
### security-auditor
|
|
32
|
+
- SQL injection via string interpolation
|
|
33
|
+
- JWT verify missing `{ algorithms: ['HS256'] }` option
|
|
34
|
+
- Auth check after business logic (wrong order)
|
|
35
|
+
- IDOR — resource ownership not verified against session
|
|
36
|
+
- SSRF — user-controlled URLs passed to fetch()
|
|
37
|
+
- Hardcoded secrets / missing env var existence checks
|
|
38
|
+
- CORS wildcard (`*`) in production
|
|
39
|
+
|
|
40
|
+
### dependency-reviewer
|
|
41
|
+
- Packages not in package.json
|
|
42
|
+
- npm package names matching typosquatting patterns
|
|
43
|
+
- Major version incompatibilities
|
|
44
|
+
- Known CVEs in used packages
|
|
45
|
+
|
|
46
|
+
### type-safety-reviewer
|
|
47
|
+
- `any` types in request handlers
|
|
48
|
+
- Missing Zod validation before DB access
|
|
49
|
+
- Unsafe type assertions (`as User` without runtime check)
|
|
50
|
+
- Return type mismatches
|
|
24
51
|
|
|
25
52
|
---
|
|
26
53
|
|
|
27
|
-
##
|
|
54
|
+
## Verdict System
|
|
28
55
|
|
|
29
56
|
```
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
JWT algorithm enforcement, CORS misconfiguration
|
|
34
|
-
dependency-reviewer → Any import not found in your package.json
|
|
35
|
-
type-safety-reviewer → Implicit any, unguarded optional access, missing return types,
|
|
36
|
-
unsafe casts
|
|
57
|
+
If ANY reviewer → ❌ REJECTED: code must be fixed before Human Gate
|
|
58
|
+
If any reviewer → ⚠️ WARNING: proceed with flagged items noted
|
|
59
|
+
If all reviewers → ✅ APPROVED: present to Human Gate
|
|
37
60
|
```
|
|
38
61
|
|
|
39
62
|
---
|
|
40
63
|
|
|
41
|
-
## What Gets Flagged — Real Examples
|
|
42
|
-
|
|
43
|
-
| Reviewer | Example Finding |
|
|
44
|
-
|---|---|
|
|
45
|
-
| logic | `req.user.id` used after a guard that can pass with null user |
|
|
46
|
-
| security | `jwt.verify(token, secret)` — no `algorithms` option → allows `alg:none` attack |
|
|
47
|
-
| security | `app.use(cors())` with no origin restriction in production |
|
|
48
|
-
| security | `rate-limiter` missing on auth endpoints |
|
|
49
|
-
| dependency | `import { z } from 'zod'` but `zod` not in `package.json` |
|
|
50
|
-
| type-safety | `async function handler(req, res)` — untyped `req` and `res` |
|
|
51
|
-
| type-safety | `const user = await db.findUser(id)` — result typed as `any` |
|
|
52
|
-
|
|
53
64
|
---
|
|
54
65
|
|
|
55
|
-
##
|
|
56
|
-
|
|
57
|
-
```
|
|
58
|
-
━━━ Backend Audit ━━━━━━━━━━━━━━━━━━━━━━━
|
|
59
|
-
|
|
60
|
-
logic-reviewer: ✅ APPROVED
|
|
61
|
-
security-auditor: ❌ REJECTED
|
|
62
|
-
dependency-reviewer: ✅ APPROVED
|
|
63
|
-
type-safety-reviewer: ⚠️ WARNING
|
|
64
|
-
|
|
65
|
-
━━━ Issues ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
66
|
+
## Backend-Specific Hallucination Traps (Common LLM Mistakes)
|
|
66
67
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
68
|
+
```typescript
|
|
69
|
+
// ❌ express.Router() methods that don't exist
|
|
70
|
+
router.middleware(() => {}); // not a method — use app.use()
|
|
71
|
+
router.beforeAll(() => {}); // not a method — use router.use()
|
|
71
72
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
Fix: app.use(cors({ origin: process.env.ALLOWED_ORIGIN }))
|
|
73
|
+
// ❌ Hono methods that don't exist
|
|
74
|
+
app.middleware('/path', handler); // not valid — use app.use('/path', handler)
|
|
75
75
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
Request body typed as any — use Zod schema parse at the API boundary
|
|
79
|
-
Fix: const body = schema.parse(req.body)
|
|
76
|
+
// ❌ next-auth v4 patterns in v5 projects
|
|
77
|
+
import { getServerSession } from 'next-auth'; // v4 — use auth() from './auth' in v5
|
|
80
78
|
|
|
81
|
-
|
|
79
|
+
// ❌ jwt.verify async form (it's synchronous)
|
|
80
|
+
const payload = await jwt.verify(token, secret); // jwt.verify is NOT async
|
|
81
|
+
const payload = jwt.verify(token, secret); // Correct
|
|
82
82
|
```
|
|
83
83
|
|
|
84
84
|
---
|
|
85
85
|
|
|
86
|
-
##
|
|
87
|
-
|
|
88
|
-
- Logic findings must cite the **exact line and condition** that creates the problem
|
|
89
|
-
- Security findings must name the **attack class** (not just "this is unsafe")
|
|
90
|
-
- No invented framework methods — only documented Express/Fastify/Hono/etc. APIs
|
|
91
|
-
|
|
92
|
-
---
|
|
93
|
-
|
|
94
|
-
## Cross-Workflow Navigation
|
|
95
|
-
|
|
96
|
-
| Finding type | Next step |
|
|
97
|
-
|---|---|
|
|
98
|
-
| Security CRITICAL | `/audit` to scan the whole project |
|
|
99
|
-
| All approved | Human Gate to write to disk |
|
|
100
|
-
| SQL queries also present | Add `/tribunal-database` for those specifically |
|
|
101
|
-
|
|
102
|
-
---
|
|
103
|
-
|
|
104
|
-
## Usage
|
|
86
|
+
## Usage Examples
|
|
105
87
|
|
|
106
88
|
```
|
|
107
|
-
/tribunal-backend
|
|
108
|
-
/tribunal-backend
|
|
109
|
-
/tribunal-backend
|
|
110
|
-
/tribunal-backend the
|
|
89
|
+
/tribunal-backend the POST /api/auth/login route with JWT issuance
|
|
90
|
+
/tribunal-backend the createOrder Server Action with Stripe integration
|
|
91
|
+
/tribunal-backend the auth middleware that verifies session on protected routes
|
|
92
|
+
/tribunal-backend the webhook handler for Stripe payment events
|
|
111
93
|
```
|
|
@@ -1,132 +1,94 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: Database-specific Tribunal. Runs Logic + Security + SQL reviewers. Use for queries, migrations, and
|
|
2
|
+
description: Database-specific Tribunal. Runs Logic + Security + SQL reviewers. Use for Prisma queries, raw SQL, schema migrations, ORM operations, and database transaction code.
|
|
3
3
|
---
|
|
4
4
|
|
|
5
|
-
# /tribunal-database —
|
|
5
|
+
# /tribunal-database — Database Code Audit
|
|
6
6
|
|
|
7
7
|
$ARGUMENTS
|
|
8
8
|
|
|
9
9
|
---
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
## When to Use /tribunal-database
|
|
12
12
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
|
18
|
-
|
|
19
|
-
|
|
|
20
|
-
| API routes, auth, middleware | `/tribunal-backend` |
|
|
21
|
-
| React components, hooks | `/tribunal-frontend` |
|
|
22
|
-
| Unknown domain or cross-domain | `/tribunal-full` |
|
|
23
|
-
|
|
24
|
-
---
|
|
25
|
-
|
|
26
|
-
## Active Reviewers
|
|
27
|
-
|
|
28
|
-
```
|
|
29
|
-
logic-reviewer → ORM methods that don't exist, impossible WHERE conditions,
|
|
30
|
-
chained queries on results that could be null
|
|
31
|
-
security-auditor → SQL injection surfaces, sensitive data exposed without masking,
|
|
32
|
-
missing authorization checks before DB access
|
|
33
|
-
sql-reviewer → String interpolation in queries, N+1 patterns,
|
|
34
|
-
references to tables/columns not in the schema,
|
|
35
|
-
unbounded SELECT *, missing WHERE clauses on DELETE/UPDATE
|
|
36
|
-
```
|
|
13
|
+
|Use `/tribunal-database` when...|Use something else when...|
|
|
14
|
+
|:---|:---|
|
|
15
|
+
|Prisma queries and schema|Frontend queries → `/tribunal-frontend`|
|
|
16
|
+
|Raw SQL with pg/mysql2/better-sqlite3|API routes calling DB → `/tribunal-backend`|
|
|
17
|
+
|Database migrations|Full audit → `/tribunal-full`|
|
|
18
|
+
|ORM schema changes||
|
|
19
|
+
|Transaction boundaries||
|
|
37
20
|
|
|
38
21
|
---
|
|
39
22
|
|
|
40
|
-
##
|
|
23
|
+
## 3 Active Reviewers (All Run Simultaneously)
|
|
41
24
|
|
|
42
|
-
|
|
25
|
+
### logic-reviewer
|
|
26
|
+
- Prisma methods that don't exist (`findOne` was removed — use `findUnique`)
|
|
27
|
+
- Transaction that should be `$transaction` but isn't
|
|
28
|
+
- Pagination query missing total count (returns wrong metadata)
|
|
29
|
+
- `.findMany()` with no `take` limit (unbounded query)
|
|
43
30
|
|
|
44
|
-
|
|
45
|
-
|
|
31
|
+
### security-auditor
|
|
32
|
+
- SQL injection via `$queryRaw` with template literals and user input
|
|
33
|
+
- Row-level security bypass (no WHERE clause on user-scoped query)
|
|
34
|
+
- Mass assignment via `prisma.user.update({ data: req.body })` (unrestricted)
|
|
35
|
+
- Prisma `$executeRaw` with string interpolation
|
|
46
36
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
**Without the schema**, the reviewer flags all table/column references as `[VERIFY — schema not provided]`.
|
|
37
|
+
### sql-reviewer
|
|
38
|
+
- N+1 pattern (loop with prisma query inside)
|
|
39
|
+
- Foreign key columns without `@@index`
|
|
40
|
+
- No index on ORDER BY column for large tables
|
|
41
|
+
- Unscoped UPDATE/DELETE without WHERE clause
|
|
42
|
+
- Missing rollback in raw SQL catch block
|
|
43
|
+
- Expand vs contract migration not followed
|
|
56
44
|
|
|
57
45
|
---
|
|
58
46
|
|
|
59
|
-
##
|
|
60
|
-
|
|
61
|
-
| Reviewer | Example Finding | Severity |
|
|
62
|
-
|---|---|---|
|
|
63
|
-
| logic | `prisma.user.findFirstOrCreate()` — not a real Prisma method | ❌ HIGH |
|
|
64
|
-
| security | `` db.query(`SELECT * WHERE id = ${req.params.id}`) `` — injection | ❌ CRITICAL |
|
|
65
|
-
| security | `SELECT password FROM users` returned to API without masking | ❌ HIGH |
|
|
66
|
-
| sql | `SELECT * FROM payments` when `payments` not in schema | ❌ HIGH |
|
|
67
|
-
| sql | `SELECT` query inside a `for` loop — N+1 pattern | ❌ HIGH |
|
|
68
|
-
| sql | `DELETE FROM sessions` with no `WHERE` clause | ❌ CRITICAL |
|
|
69
|
-
| sql | `SELECT * FROM users` with no pagination — unbounded result | ⚠️ MEDIUM |
|
|
70
|
-
| security | No `LIMIT` on a user-controlled query parameter | ⚠️ MEDIUM |
|
|
71
|
-
|
|
72
|
-
---
|
|
73
|
-
|
|
74
|
-
## Report Format
|
|
47
|
+
## Verdict System
|
|
75
48
|
|
|
76
49
|
```
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
security-auditor: ❌ REJECTED
|
|
81
|
-
sql-reviewer: ❌ REJECTED
|
|
82
|
-
|
|
83
|
-
━━━ Issues ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
84
|
-
|
|
85
|
-
security-auditor:
|
|
86
|
-
❌ CRITICAL — Line 6
|
|
87
|
-
SQL injection: string interpolation in query
|
|
88
|
-
Code: db.query(`SELECT * WHERE id = ${req.params.id}`)
|
|
89
|
-
Fix: db.query('SELECT * WHERE id = $1', [req.params.id])
|
|
90
|
-
|
|
91
|
-
sql-reviewer:
|
|
92
|
-
❌ HIGH — Line 19
|
|
93
|
-
N+1 detected: SELECT inside for-loop (10 users = 10 queries)
|
|
94
|
-
Fix: Batch with WHERE id = ANY($1::uuid[]) or use a JOIN
|
|
95
|
-
|
|
96
|
-
⚠️ MEDIUM — Line 32
|
|
97
|
-
Unbounded result: SELECT * FROM audit_logs — no LIMIT
|
|
98
|
-
Fix: Add LIMIT + OFFSET or use cursor-based pagination
|
|
99
|
-
|
|
100
|
-
━━━ Verdict: REJECTED — fix CRITICAL and HIGH before merging ━━━
|
|
50
|
+
If ANY reviewer → ❌ REJECTED: fix before Human Gate
|
|
51
|
+
If any reviewer → ⚠️ WARNING: proceed with flagged items
|
|
52
|
+
If all reviewers → ✅ APPROVED: Human Gate
|
|
101
53
|
```
|
|
102
54
|
|
|
103
55
|
---
|
|
104
56
|
|
|
105
|
-
## Hallucination Guard
|
|
106
|
-
|
|
107
|
-
- `sql-reviewer` only references tables and columns **from the provided schema** — no invented schema
|
|
108
|
-
- ORM method names are verified against **the installed ORM version's documented API**
|
|
109
|
-
- Parameterized query fixes show the **exact parameterized form** for the target database driver
|
|
110
|
-
- N+1 fixes must show the **actual batched query**, not just say "use a JOIN"
|
|
111
|
-
|
|
112
57
|
---
|
|
113
58
|
|
|
114
|
-
##
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
59
|
+
## Database-Specific Hallucination Traps (Common LLM Mistakes)
|
|
60
|
+
|
|
61
|
+
```typescript
|
|
62
|
+
// ❌ Prisma: findOne was REMOVED — doesn't exist in any version
|
|
63
|
+
const user = await prisma.user.findOne({ where: { id } });
|
|
64
|
+
// ✅ Correct
|
|
65
|
+
const user = await prisma.user.findUnique({ where: { id } });
|
|
66
|
+
|
|
67
|
+
// ❌ Prisma: upsertMany doesn't exist
|
|
68
|
+
await prisma.product.upsertMany({ data: products }); // Doesn't exist
|
|
69
|
+
// ✅ Use createMany or transaction with multiple upserts
|
|
70
|
+
await prisma.$transaction(products.map(p => prisma.product.upsert({ ... })));
|
|
71
|
+
|
|
72
|
+
// ❌ Migration fails silently: adding NOT NULL column to populated table
|
|
73
|
+
ALTER TABLE users ADD COLUMN phone VARCHAR(20) NOT NULL; // Error on existing rows
|
|
74
|
+
// ✅ Always add nullable first, backfill, then add constraint
|
|
75
|
+
|
|
76
|
+
// ❌ Missing rollback in raw SQL
|
|
77
|
+
try {
|
|
78
|
+
await db.query('BEGIN');
|
|
79
|
+
await db.query('UPDATE ...');
|
|
80
|
+
} catch (e) {
|
|
81
|
+
// Missing: await db.query('ROLLBACK');
|
|
82
|
+
}
|
|
83
|
+
```
|
|
122
84
|
|
|
123
85
|
---
|
|
124
86
|
|
|
125
|
-
## Usage
|
|
87
|
+
## Usage Examples
|
|
126
88
|
|
|
127
89
|
```
|
|
128
|
-
/tribunal-database
|
|
129
|
-
/tribunal-database
|
|
130
|
-
/tribunal-database
|
|
131
|
-
/tribunal-database the
|
|
90
|
+
/tribunal-database the createOrder function with Stripe idempotency
|
|
91
|
+
/tribunal-database the user registration with email uniqueness check
|
|
92
|
+
/tribunal-database the migration file adding phoneNumber to users
|
|
93
|
+
/tribunal-database the paginated product query with category filter
|
|
132
94
|
```
|