agentic-loop 1.0.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.
Files changed (162) hide show
  1. package/.claude/commands/explain.md +114 -0
  2. package/.claude/commands/idea.md +398 -0
  3. package/.claude/commands/my-dna.md +122 -0
  4. package/.claude/commands/prd.md +286 -0
  5. package/.claude/commands/review.md +167 -0
  6. package/.claude/commands/sign.md +32 -0
  7. package/.claude/commands/styleguide.md +450 -0
  8. package/.claude/commands/tour.md +301 -0
  9. package/.claude/commands/vibe-check.md +116 -0
  10. package/.claude/commands/vibe-help.md +47 -0
  11. package/.claude/commands/vibe-list.md +203 -0
  12. package/.pre-commit-hooks.yaml +102 -0
  13. package/LICENSE +21 -0
  14. package/README.md +238 -0
  15. package/bin/agentic-loop.sh +24 -0
  16. package/bin/postinstall.sh +29 -0
  17. package/bin/ralph.sh +171 -0
  18. package/bin/vibe-check.js +19 -0
  19. package/dist/checks/check-any-types.d.ts +6 -0
  20. package/dist/checks/check-any-types.d.ts.map +1 -0
  21. package/dist/checks/check-any-types.js +73 -0
  22. package/dist/checks/check-any-types.js.map +1 -0
  23. package/dist/checks/check-commented-code.d.ts +6 -0
  24. package/dist/checks/check-commented-code.d.ts.map +1 -0
  25. package/dist/checks/check-commented-code.js +81 -0
  26. package/dist/checks/check-commented-code.js.map +1 -0
  27. package/dist/checks/check-console-error.d.ts +6 -0
  28. package/dist/checks/check-console-error.d.ts.map +1 -0
  29. package/dist/checks/check-console-error.js +41 -0
  30. package/dist/checks/check-console-error.js.map +1 -0
  31. package/dist/checks/check-debug-statements.d.ts +6 -0
  32. package/dist/checks/check-debug-statements.d.ts.map +1 -0
  33. package/dist/checks/check-debug-statements.js +120 -0
  34. package/dist/checks/check-debug-statements.js.map +1 -0
  35. package/dist/checks/check-deep-nesting.d.ts +6 -0
  36. package/dist/checks/check-deep-nesting.d.ts.map +1 -0
  37. package/dist/checks/check-deep-nesting.js +116 -0
  38. package/dist/checks/check-deep-nesting.js.map +1 -0
  39. package/dist/checks/check-docker-platform.d.ts +6 -0
  40. package/dist/checks/check-docker-platform.d.ts.map +1 -0
  41. package/dist/checks/check-docker-platform.js +42 -0
  42. package/dist/checks/check-docker-platform.js.map +1 -0
  43. package/dist/checks/check-dry-violations.d.ts +6 -0
  44. package/dist/checks/check-dry-violations.d.ts.map +1 -0
  45. package/dist/checks/check-dry-violations.js +124 -0
  46. package/dist/checks/check-dry-violations.js.map +1 -0
  47. package/dist/checks/check-empty-catch.d.ts +6 -0
  48. package/dist/checks/check-empty-catch.d.ts.map +1 -0
  49. package/dist/checks/check-empty-catch.js +111 -0
  50. package/dist/checks/check-empty-catch.js.map +1 -0
  51. package/dist/checks/check-function-length.d.ts +6 -0
  52. package/dist/checks/check-function-length.d.ts.map +1 -0
  53. package/dist/checks/check-function-length.js +152 -0
  54. package/dist/checks/check-function-length.js.map +1 -0
  55. package/dist/checks/check-hardcoded-ai-models.d.ts +10 -0
  56. package/dist/checks/check-hardcoded-ai-models.d.ts.map +1 -0
  57. package/dist/checks/check-hardcoded-ai-models.js +102 -0
  58. package/dist/checks/check-hardcoded-ai-models.js.map +1 -0
  59. package/dist/checks/check-hardcoded-urls.d.ts +6 -0
  60. package/dist/checks/check-hardcoded-urls.d.ts.map +1 -0
  61. package/dist/checks/check-hardcoded-urls.js +124 -0
  62. package/dist/checks/check-hardcoded-urls.js.map +1 -0
  63. package/dist/checks/check-magic-numbers.d.ts +6 -0
  64. package/dist/checks/check-magic-numbers.d.ts.map +1 -0
  65. package/dist/checks/check-magic-numbers.js +116 -0
  66. package/dist/checks/check-magic-numbers.js.map +1 -0
  67. package/dist/checks/check-secrets.d.ts +6 -0
  68. package/dist/checks/check-secrets.d.ts.map +1 -0
  69. package/dist/checks/check-secrets.js +138 -0
  70. package/dist/checks/check-secrets.js.map +1 -0
  71. package/dist/checks/check-snake-case-ts.d.ts +6 -0
  72. package/dist/checks/check-snake-case-ts.d.ts.map +1 -0
  73. package/dist/checks/check-snake-case-ts.js +78 -0
  74. package/dist/checks/check-snake-case-ts.js.map +1 -0
  75. package/dist/checks/check-todo-fixme.d.ts +6 -0
  76. package/dist/checks/check-todo-fixme.d.ts.map +1 -0
  77. package/dist/checks/check-todo-fixme.js +41 -0
  78. package/dist/checks/check-todo-fixme.js.map +1 -0
  79. package/dist/checks/check-unsafe-html.d.ts +6 -0
  80. package/dist/checks/check-unsafe-html.d.ts.map +1 -0
  81. package/dist/checks/check-unsafe-html.js +101 -0
  82. package/dist/checks/check-unsafe-html.js.map +1 -0
  83. package/dist/checks/index.d.ts +30 -0
  84. package/dist/checks/index.d.ts.map +1 -0
  85. package/dist/checks/index.js +57 -0
  86. package/dist/checks/index.js.map +1 -0
  87. package/dist/cli.d.ts +13 -0
  88. package/dist/cli.d.ts.map +1 -0
  89. package/dist/cli.js +208 -0
  90. package/dist/cli.js.map +1 -0
  91. package/dist/index.d.ts +9 -0
  92. package/dist/index.d.ts.map +1 -0
  93. package/dist/index.js +10 -0
  94. package/dist/index.js.map +1 -0
  95. package/dist/utils/file-reader.d.ts +24 -0
  96. package/dist/utils/file-reader.d.ts.map +1 -0
  97. package/dist/utils/file-reader.js +146 -0
  98. package/dist/utils/file-reader.js.map +1 -0
  99. package/dist/utils/patterns.d.ts +27 -0
  100. package/dist/utils/patterns.d.ts.map +1 -0
  101. package/dist/utils/patterns.js +84 -0
  102. package/dist/utils/patterns.js.map +1 -0
  103. package/dist/utils/reporters.d.ts +21 -0
  104. package/dist/utils/reporters.d.ts.map +1 -0
  105. package/dist/utils/reporters.js +115 -0
  106. package/dist/utils/reporters.js.map +1 -0
  107. package/dist/utils/types.d.ts +71 -0
  108. package/dist/utils/types.d.ts.map +1 -0
  109. package/dist/utils/types.js +5 -0
  110. package/dist/utils/types.js.map +1 -0
  111. package/package.json +83 -0
  112. package/ralph/api.sh +216 -0
  113. package/ralph/backup.sh +838 -0
  114. package/ralph/browser-verify/README.md +135 -0
  115. package/ralph/browser-verify/verify.ts +450 -0
  116. package/ralph/checks/check-fastapi-responses.py +155 -0
  117. package/ralph/hooks/hooks-config.json +72 -0
  118. package/ralph/hooks/inject-context.sh +44 -0
  119. package/ralph/hooks/install.sh +207 -0
  120. package/ralph/hooks/log-tools.sh +45 -0
  121. package/ralph/hooks/protect-prd.sh +27 -0
  122. package/ralph/hooks/save-learnings.sh +36 -0
  123. package/ralph/hooks/warn-debug.sh +54 -0
  124. package/ralph/hooks/warn-empty-catch.sh +63 -0
  125. package/ralph/hooks/warn-secrets.sh +89 -0
  126. package/ralph/hooks/warn-urls.sh +77 -0
  127. package/ralph/init.sh +515 -0
  128. package/ralph/loop.sh +730 -0
  129. package/ralph/playwright.sh +238 -0
  130. package/ralph/prd.sh +295 -0
  131. package/ralph/setup/feature-tour.sh +155 -0
  132. package/ralph/setup/quick-setup.sh +239 -0
  133. package/ralph/setup/tutorial.sh +159 -0
  134. package/ralph/setup/ui.sh +136 -0
  135. package/ralph/setup.sh +401 -0
  136. package/ralph/signs.sh +150 -0
  137. package/ralph/utils.sh +682 -0
  138. package/ralph/verify/browser.sh +324 -0
  139. package/ralph/verify/lint.sh +363 -0
  140. package/ralph/verify/review.sh +152 -0
  141. package/ralph/verify/tests.sh +81 -0
  142. package/ralph/verify.sh +268 -0
  143. package/templates/PROMPT.md +235 -0
  144. package/templates/config/fullstack.json +86 -0
  145. package/templates/config/go.json +81 -0
  146. package/templates/config/minimal.json +76 -0
  147. package/templates/config/node.json +81 -0
  148. package/templates/config/python.json +81 -0
  149. package/templates/config/rust.json +81 -0
  150. package/templates/examples/CLAUDE-django.md +174 -0
  151. package/templates/examples/CLAUDE-fastapi.md +270 -0
  152. package/templates/examples/CLAUDE-fastmcp.md +352 -0
  153. package/templates/examples/CLAUDE-fullstack.md +256 -0
  154. package/templates/examples/CLAUDE-node.md +246 -0
  155. package/templates/examples/CLAUDE-react.md +138 -0
  156. package/templates/optional/cursorrules.template +147 -0
  157. package/templates/optional/eslint.config.js +34 -0
  158. package/templates/optional/lint-staged.config.js +34 -0
  159. package/templates/optional/ruff.toml +125 -0
  160. package/templates/optional/vibe-check.yml +116 -0
  161. package/templates/optional/vscode-settings.json +127 -0
  162. package/templates/signs.json +46 -0
@@ -0,0 +1,235 @@
1
+ # Development Session
2
+
3
+ You are an autonomous coding agent working on a feature using the Ralph workflow.
4
+
5
+ ## Session Startup Checklist
6
+
7
+ Before writing any code, verify:
8
+ 1. Run `pwd` to confirm you're in the correct directory
9
+ 2. Read `.ralph/progress.txt` for recent session history
10
+ 3. Run `git status` to check for uncommitted work
11
+ 4. Review the current story details below
12
+
13
+ ## Your Task
14
+
15
+ For each story, you must:
16
+
17
+ ### 1. Write Tests First
18
+
19
+ **For frontend stories:**
20
+ - Write a Playwright test that validates the acceptance criteria
21
+ - Include tests for error handling (API fails, validation errors)
22
+ - Include tests for empty/loading states
23
+ - Include accessibility checks (axe-core)
24
+ - Include mobile viewport test (375px)
25
+
26
+ **For backend stories:**
27
+ - Write unit tests for the business logic
28
+ - Write API tests that validate all endpoints
29
+ - Test error responses (400, 401, 500)
30
+ - Test validation rules
31
+
32
+ ### 2. Implement the Feature
33
+
34
+ - Write code to make all tests pass
35
+ - Follow existing patterns in the codebase
36
+ - Handle ALL error cases defined in the story
37
+ - Implement loading states for async operations
38
+
39
+ ### 3. Verify It Actually Works
40
+
41
+ **Do NOT say you're done until:**
42
+ - All unit tests pass
43
+ - All Playwright tests pass
44
+ - You've opened the browser via MCP and visually verified
45
+ - Console has no errors
46
+ - It works on mobile (375px viewport)
47
+ - Error states are handled gracefully
48
+
49
+ ## Rules
50
+
51
+ 1. **Focus**: Implement ONLY the current story. Do not work on other stories.
52
+ 2. **Test first**: Write failing tests before implementation when possible.
53
+ 3. **Test frequently**: Run tests after each significant change.
54
+ 4. **Error handling is required**: Every story defines error cases - implement them all.
55
+ 5. **Verification**: Never complete until browser validation passes.
56
+ 6. **NEVER edit prd.json**: Do NOT modify `.ralph/prd.json`. Ralph handles story completion automatically after verification. You only write code and tests.
57
+ 7. **Update notes**: After completing work, log what you did in `.ralph/progress.txt` including files created/modified and key decisions made. This helps the next session.
58
+
59
+ ## Verification Checklist
60
+
61
+ Before considering any story complete:
62
+
63
+ ### Code
64
+ - [ ] All acceptance criteria are met
65
+ - [ ] All error handling from story is implemented
66
+ - [ ] Loading states implemented (if frontend)
67
+ - [ ] Validation implemented (if backend)
68
+ - [ ] TypeScript compiles without errors
69
+
70
+ ### Tests
71
+ - [ ] Unit tests written and passing
72
+ - [ ] Playwright test written and passing (frontend)
73
+ - [ ] API tests written and passing (backend)
74
+ - [ ] Error cases tested
75
+ - [ ] Edge cases tested (empty state, etc.)
76
+
77
+ ### Browser/API Validation
78
+ - [ ] Browser check passes (frontend) - no console errors
79
+ - [ ] Mobile viewport works (375px)
80
+ - [ ] Accessibility passes (can Tab through, focus visible)
81
+ - [ ] API returns correct responses (backend)
82
+
83
+ ### Documentation
84
+ - [ ] Updated `.ralph/progress.txt` with files created/modified
85
+ - [ ] Noted any key decisions or context for next story
86
+
87
+ ### Quality
88
+ - [ ] Linting passes
89
+ - [ ] Existing tests still pass
90
+
91
+ ## If Verification Fails
92
+
93
+ If any check fails:
94
+ 1. Read the error message carefully
95
+ 2. Fix the issue
96
+ 3. Re-run verification
97
+ 4. Iterate until ALL checks pass
98
+
99
+ Do NOT give up. Keep iterating until it works.
100
+
101
+ ## If Blocked
102
+
103
+ If you encounter a blocker you cannot resolve:
104
+ 1. Document the issue in `.ralph/progress.txt`
105
+ 2. Note what you tried and why it didn't work
106
+ 3. Suggest potential solutions for the next session
107
+ 4. Do NOT mark the story as passing
108
+
109
+ ## Code Quality Standards
110
+
111
+ ### Core Principles
112
+ - **Readability First**: Code is read more than written. Prioritize clarity.
113
+ - **KISS**: Keep it simple. Avoid over-engineering.
114
+ - **DRY**: Don't repeat yourself. Extract reusable logic.
115
+ - **YAGNI**: Don't build features you don't need yet.
116
+
117
+ ### Naming Conventions
118
+ - Variables: descriptive camelCase (`userProfile`, `isLoading`, `marketSearchQuery`)
119
+ - Functions: verb-noun pattern (`fetchUserData`, `validateInput`, `handleSubmit`)
120
+ - Components: PascalCase (`UserProfile`, `MarketCard`)
121
+ - Constants: SCREAMING_SNAKE_CASE (`MAX_RETRIES`, `API_BASE_URL`)
122
+
123
+ ### Immutability (CRITICAL)
124
+ Always use spread operators. Never mutate directly:
125
+ ```typescript
126
+ // ❌ Bad - mutation
127
+ user.name = 'new name';
128
+ items.push(newItem);
129
+
130
+ // ✅ Good - immutable
131
+ const updatedUser = { ...user, name: 'new name' };
132
+ const updatedItems = [...items, newItem];
133
+ ```
134
+
135
+ ### Error Handling
136
+ Every async operation needs proper error handling:
137
+ ```typescript
138
+ // ✅ Good
139
+ try {
140
+ const data = await fetchData();
141
+ return { success: true, data };
142
+ } catch (error) {
143
+ console.error('Failed to fetch data:', error);
144
+ return { success: false, error: error.message };
145
+ }
146
+ ```
147
+
148
+ ### Type Safety
149
+ - Use TypeScript interfaces for all data shapes
150
+ - Never use `any` - use `unknown` if type is truly unknown
151
+ - Define return types for functions
152
+
153
+ ### Functions
154
+ - Max 50 lines per function (split if longer)
155
+ - Single responsibility - one function does one thing
156
+ - Early returns for guard clauses
157
+
158
+ ### React Specific
159
+ - Functional components with typed props
160
+ - Custom hooks for reusable stateful logic
161
+ - Use `prev =>` for state updates that depend on previous state
162
+ - Avoid excessive ternaries - extract to variables or early returns
163
+
164
+ ### General
165
+ - Follow existing code patterns in the codebase
166
+ - Handle ALL error cases defined in the story
167
+ - Implement loading states for async operations
168
+ - Use meaningful variable and function names
169
+ - Add data-testid attributes for Playwright
170
+
171
+ ## Architecture Rules
172
+
173
+ - **Put files in the right place**: Follow the directories specified in the PRD
174
+ - **Reuse existing code**: Check for existing components/utils before creating new ones
175
+ - **Don't duplicate**: If something exists, import and use it
176
+ - **Max 300 lines per file**: Split large files into smaller, focused modules
177
+ - **Scripts in scripts/**: Shell scripts and CLI tools go in scripts/ or bin/
178
+ - **Docs in docs/**: Documentation files go in docs/
179
+ - **Single responsibility**: Each file/function does one thing well
180
+
181
+ ## Scalability Rules
182
+
183
+ For list/query endpoints:
184
+ - **Always paginate**: Never return unbounded arrays
185
+ - **Use cursor-based pagination**: When specified in the PRD
186
+ - **Add database indexes**: For frequently queried fields
187
+ - **Implement caching**: As specified in the PRD (TTL, invalidation)
188
+ - **Eager load relationships**: To avoid N+1 queries
189
+
190
+ For all endpoints:
191
+ - **Rate limit public endpoints**: As specified in the PRD
192
+ - **Set sensible limits**: Max page size, max request body size
193
+ - **Batch operations**: Use bulk inserts when creating many records
194
+
195
+ ## AI/LLM Configuration
196
+
197
+ **NEVER hardcode AI model names, API keys, or endpoints.** Always use environment variables or settings.
198
+
199
+ ```python
200
+ # ❌ Bad - hardcoded model
201
+ model = "gpt-4"
202
+ client = OpenAI(api_key="sk-...")
203
+
204
+ # ✅ Good - from environment/settings
205
+ model = os.environ.get("OPENAI_MODEL", "gpt-4")
206
+ client = OpenAI() # Uses OPENAI_API_KEY env var
207
+ ```
208
+
209
+ ```python
210
+ # ❌ Bad - hardcoded in code
211
+ response = openai.chat.completions.create(
212
+ model="gpt-4-turbo",
213
+ max_tokens=4096,
214
+ )
215
+
216
+ # ✅ Good - from settings/config
217
+ from django.conf import settings
218
+ response = openai.chat.completions.create(
219
+ model=settings.AI_MODEL,
220
+ max_tokens=settings.AI_MAX_TOKENS,
221
+ )
222
+ ```
223
+
224
+ If the project has an AI gateway or wrapper, use it:
225
+ ```python
226
+ # ✅ Best - use project's AI abstraction
227
+ from myapp.ai import get_completion
228
+ response = get_completion(prompt)
229
+ ```
230
+
231
+ ---
232
+
233
+ ## Current Story
234
+
235
+ (Story details will be injected below by ralph.sh)
@@ -0,0 +1,86 @@
1
+ {
2
+ "auth": {
3
+ "testUser": "",
4
+ "testPassword": "",
5
+ "loginEndpoint": "/api/auth/login",
6
+ "loginMethod": "POST",
7
+ "tokenType": "session",
8
+ "tokenHeader": "Authorization",
9
+ "tokenPrefix": "Bearer"
10
+ },
11
+
12
+ "docker": {
13
+ "enabled": false,
14
+ "composeFile": "docker-compose.yml",
15
+ "serviceName": "web",
16
+ "execPrefix": "docker compose exec -T"
17
+ },
18
+
19
+ "paths": {
20
+ "frontend": "frontend",
21
+ "backend": ".",
22
+ "tests": "tests",
23
+ "e2e": "frontend/tests/e2e"
24
+ },
25
+
26
+ "commands": {
27
+ "devFrontend": "cd frontend && npm run dev",
28
+ "devBackend": "python manage.py runserver",
29
+ "install": "npm install && pip install -r requirements.txt",
30
+ "seed": "",
31
+ "resetDb": ""
32
+ },
33
+
34
+ "migrations": {
35
+ "command": "python manage.py migrate",
36
+ "pattern": "migrations/.*\\.py$"
37
+ },
38
+
39
+ "checks": {
40
+ "typescript": "cd frontend && npx tsc --noEmit",
41
+ "lint": "ruff check .",
42
+ "lintFrontend": "cd frontend && npm run lint",
43
+ "test": "python manage.py test --keepdb --parallel",
44
+ "testFrontend": "cd frontend && npm test"
45
+ },
46
+
47
+ "api": {
48
+ "baseUrl": "http://localhost:8000",
49
+ "healthEndpoint": "/api/health",
50
+ "timeout": 30
51
+ },
52
+
53
+ "playwright": {
54
+ "enabled": true,
55
+ "testDir": "frontend/tests/e2e",
56
+ "projects": ["chromium", "mobile"],
57
+ "baseUrl": "http://localhost:3000"
58
+ },
59
+
60
+ "verification": {
61
+ "codeReviewEnabled": true,
62
+ "browserEnabled": true,
63
+ "a11yEnabled": true,
64
+ "mobileViewport": 375,
65
+ "screenshotOnFailure": true
66
+ },
67
+
68
+ "urls": {
69
+ "frontend": "http://localhost:3000",
70
+ "backend": "http://localhost:8000",
71
+ "docs": "http://localhost:8000/api/docs"
72
+ },
73
+
74
+ "env": {
75
+ "required": ["DATABASE_URL", "SECRET_KEY"],
76
+ "optional": ["REDIS_URL", "SENTRY_DSN"]
77
+ },
78
+
79
+ "maxIterations": 20,
80
+ "maxSessionSeconds": 600,
81
+
82
+ "contextRotThreshold": {
83
+ "maxStories": 10,
84
+ "maxFilesChanged": 20
85
+ }
86
+ }
@@ -0,0 +1,81 @@
1
+ {
2
+ "auth": {
3
+ "testUser": "",
4
+ "testPassword": "",
5
+ "loginEndpoint": "/api/auth/login",
6
+ "loginMethod": "POST",
7
+ "tokenType": "jwt",
8
+ "tokenHeader": "Authorization",
9
+ "tokenPrefix": "Bearer"
10
+ },
11
+
12
+ "docker": {
13
+ "enabled": false,
14
+ "composeFile": "docker-compose.yml",
15
+ "serviceName": "app",
16
+ "execPrefix": "docker compose exec -T"
17
+ },
18
+
19
+ "paths": {
20
+ "src": ".",
21
+ "tests": ".",
22
+ "e2e": "tests/e2e"
23
+ },
24
+
25
+ "commands": {
26
+ "dev": "go run .",
27
+ "install": "go mod download",
28
+ "seed": "",
29
+ "resetDb": ""
30
+ },
31
+
32
+ "migrations": {
33
+ "command": "migrate -path migrations -database $DATABASE_URL up",
34
+ "pattern": "migrations/.*\\.sql$"
35
+ },
36
+
37
+ "checks": {
38
+ "build": "go build ./...",
39
+ "lint": "golangci-lint run",
40
+ "test": "go test ./..."
41
+ },
42
+
43
+ "api": {
44
+ "baseUrl": "http://localhost:8080",
45
+ "healthEndpoint": "/health",
46
+ "timeout": 30
47
+ },
48
+
49
+ "playwright": {
50
+ "enabled": false,
51
+ "testDir": "tests/e2e",
52
+ "projects": ["chromium"],
53
+ "baseUrl": "http://localhost:8080"
54
+ },
55
+
56
+ "verification": {
57
+ "codeReviewEnabled": true,
58
+ "browserEnabled": true,
59
+ "a11yEnabled": false,
60
+ "mobileViewport": 375,
61
+ "screenshotOnFailure": true
62
+ },
63
+
64
+ "urls": {
65
+ "app": "http://localhost:8080",
66
+ "docs": "http://localhost:8080/swagger"
67
+ },
68
+
69
+ "env": {
70
+ "required": ["DATABASE_URL"],
71
+ "optional": ["REDIS_URL"]
72
+ },
73
+
74
+ "maxIterations": 20,
75
+ "maxSessionSeconds": 600,
76
+
77
+ "contextRotThreshold": {
78
+ "maxStories": 10,
79
+ "maxFilesChanged": 20
80
+ }
81
+ }
@@ -0,0 +1,76 @@
1
+ {
2
+ "auth": {
3
+ "testUser": "",
4
+ "testPassword": "",
5
+ "loginEndpoint": "/api/auth/login",
6
+ "loginMethod": "POST",
7
+ "tokenType": "session",
8
+ "tokenHeader": "Authorization",
9
+ "tokenPrefix": "Bearer"
10
+ },
11
+
12
+ "docker": {
13
+ "enabled": false,
14
+ "composeFile": "docker-compose.yml",
15
+ "serviceName": "app",
16
+ "execPrefix": "docker compose exec -T"
17
+ },
18
+
19
+ "paths": {
20
+ "src": "src",
21
+ "tests": "tests",
22
+ "e2e": "tests/e2e"
23
+ },
24
+
25
+ "commands": {
26
+ "dev": "",
27
+ "install": "",
28
+ "seed": "",
29
+ "resetDb": ""
30
+ },
31
+
32
+ "migrations": {
33
+ "command": "",
34
+ "pattern": ""
35
+ },
36
+
37
+ "checks": {},
38
+
39
+ "api": {
40
+ "baseUrl": "http://localhost:3000",
41
+ "healthEndpoint": "/health",
42
+ "timeout": 30
43
+ },
44
+
45
+ "playwright": {
46
+ "enabled": false,
47
+ "testDir": "tests/e2e",
48
+ "projects": ["chromium"],
49
+ "baseUrl": "http://localhost:3000"
50
+ },
51
+
52
+ "verification": {
53
+ "codeReviewEnabled": false,
54
+ "browserEnabled": false,
55
+ "a11yEnabled": false,
56
+ "mobileViewport": 375,
57
+ "screenshotOnFailure": false
58
+ },
59
+
60
+ "urls": {
61
+ "app": "http://localhost:3000"
62
+ },
63
+
64
+ "env": {
65
+ "required": [],
66
+ "optional": []
67
+ },
68
+
69
+ "maxIterations": 20,
70
+ "maxSessionSeconds": 600,
71
+
72
+ "contextRotThreshold": {
73
+ "maxStories": 10,
74
+ "maxFilesChanged": 20
75
+ }
76
+ }
@@ -0,0 +1,81 @@
1
+ {
2
+ "auth": {
3
+ "testUser": "",
4
+ "testPassword": "",
5
+ "loginEndpoint": "/api/auth/login",
6
+ "loginMethod": "POST",
7
+ "tokenType": "jwt",
8
+ "tokenHeader": "Authorization",
9
+ "tokenPrefix": "Bearer"
10
+ },
11
+
12
+ "docker": {
13
+ "enabled": false,
14
+ "composeFile": "docker-compose.yml",
15
+ "serviceName": "app",
16
+ "execPrefix": "docker compose exec -T"
17
+ },
18
+
19
+ "paths": {
20
+ "src": "src",
21
+ "tests": "tests",
22
+ "e2e": "tests/e2e"
23
+ },
24
+
25
+ "commands": {
26
+ "dev": "npm run dev",
27
+ "install": "npm install",
28
+ "seed": "",
29
+ "resetDb": ""
30
+ },
31
+
32
+ "migrations": {
33
+ "command": "npx prisma migrate deploy",
34
+ "pattern": "prisma/migrations/.*"
35
+ },
36
+
37
+ "checks": {
38
+ "typescript": "npx tsc --noEmit",
39
+ "lint": "npm run lint",
40
+ "test": "npm test"
41
+ },
42
+
43
+ "api": {
44
+ "baseUrl": "http://localhost:3000",
45
+ "healthEndpoint": "/api/health",
46
+ "timeout": 30
47
+ },
48
+
49
+ "playwright": {
50
+ "enabled": true,
51
+ "testDir": "tests/e2e",
52
+ "projects": ["chromium", "mobile"],
53
+ "baseUrl": "http://localhost:3000"
54
+ },
55
+
56
+ "verification": {
57
+ "codeReviewEnabled": true,
58
+ "browserEnabled": true,
59
+ "a11yEnabled": true,
60
+ "mobileViewport": 375,
61
+ "screenshotOnFailure": true
62
+ },
63
+
64
+ "urls": {
65
+ "app": "http://localhost:3000",
66
+ "docs": "http://localhost:3000/api/docs"
67
+ },
68
+
69
+ "env": {
70
+ "required": ["DATABASE_URL"],
71
+ "optional": ["REDIS_URL", "SENTRY_DSN"]
72
+ },
73
+
74
+ "maxIterations": 20,
75
+ "maxSessionSeconds": 600,
76
+
77
+ "contextRotThreshold": {
78
+ "maxStories": 10,
79
+ "maxFilesChanged": 20
80
+ }
81
+ }
@@ -0,0 +1,81 @@
1
+ {
2
+ "auth": {
3
+ "testUser": "",
4
+ "testPassword": "",
5
+ "loginEndpoint": "/api/auth/login",
6
+ "loginMethod": "POST",
7
+ "tokenType": "jwt",
8
+ "tokenHeader": "Authorization",
9
+ "tokenPrefix": "Bearer"
10
+ },
11
+
12
+ "docker": {
13
+ "enabled": false,
14
+ "composeFile": "docker-compose.yml",
15
+ "serviceName": "app",
16
+ "execPrefix": "docker compose exec -T"
17
+ },
18
+
19
+ "paths": {
20
+ "src": "src",
21
+ "tests": "tests",
22
+ "e2e": "tests/e2e"
23
+ },
24
+
25
+ "commands": {
26
+ "dev": "uvicorn main:app --reload",
27
+ "install": "pip install -r requirements.txt",
28
+ "seed": "",
29
+ "resetDb": ""
30
+ },
31
+
32
+ "migrations": {
33
+ "command": "alembic upgrade head",
34
+ "pattern": "alembic/versions/.*\\.py$"
35
+ },
36
+
37
+ "checks": {
38
+ "lint": "ruff check .",
39
+ "typecheck": "mypy .",
40
+ "test": "pytest"
41
+ },
42
+
43
+ "api": {
44
+ "baseUrl": "http://localhost:8000",
45
+ "healthEndpoint": "/api/health",
46
+ "timeout": 30
47
+ },
48
+
49
+ "playwright": {
50
+ "enabled": false,
51
+ "testDir": "tests/e2e",
52
+ "projects": ["chromium"],
53
+ "baseUrl": "http://localhost:8000"
54
+ },
55
+
56
+ "verification": {
57
+ "codeReviewEnabled": true,
58
+ "browserEnabled": true,
59
+ "a11yEnabled": false,
60
+ "mobileViewport": 375,
61
+ "screenshotOnFailure": true
62
+ },
63
+
64
+ "urls": {
65
+ "app": "http://localhost:8000",
66
+ "docs": "http://localhost:8000/docs"
67
+ },
68
+
69
+ "env": {
70
+ "required": ["DATABASE_URL"],
71
+ "optional": ["REDIS_URL", "SENTRY_DSN"]
72
+ },
73
+
74
+ "maxIterations": 20,
75
+ "maxSessionSeconds": 600,
76
+
77
+ "contextRotThreshold": {
78
+ "maxStories": 10,
79
+ "maxFilesChanged": 20
80
+ }
81
+ }