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.
- package/.claude/commands/explain.md +114 -0
- package/.claude/commands/idea.md +398 -0
- package/.claude/commands/my-dna.md +122 -0
- package/.claude/commands/prd.md +286 -0
- package/.claude/commands/review.md +167 -0
- package/.claude/commands/sign.md +32 -0
- package/.claude/commands/styleguide.md +450 -0
- package/.claude/commands/tour.md +301 -0
- package/.claude/commands/vibe-check.md +116 -0
- package/.claude/commands/vibe-help.md +47 -0
- package/.claude/commands/vibe-list.md +203 -0
- package/.pre-commit-hooks.yaml +102 -0
- package/LICENSE +21 -0
- package/README.md +238 -0
- package/bin/agentic-loop.sh +24 -0
- package/bin/postinstall.sh +29 -0
- package/bin/ralph.sh +171 -0
- package/bin/vibe-check.js +19 -0
- package/dist/checks/check-any-types.d.ts +6 -0
- package/dist/checks/check-any-types.d.ts.map +1 -0
- package/dist/checks/check-any-types.js +73 -0
- package/dist/checks/check-any-types.js.map +1 -0
- package/dist/checks/check-commented-code.d.ts +6 -0
- package/dist/checks/check-commented-code.d.ts.map +1 -0
- package/dist/checks/check-commented-code.js +81 -0
- package/dist/checks/check-commented-code.js.map +1 -0
- package/dist/checks/check-console-error.d.ts +6 -0
- package/dist/checks/check-console-error.d.ts.map +1 -0
- package/dist/checks/check-console-error.js +41 -0
- package/dist/checks/check-console-error.js.map +1 -0
- package/dist/checks/check-debug-statements.d.ts +6 -0
- package/dist/checks/check-debug-statements.d.ts.map +1 -0
- package/dist/checks/check-debug-statements.js +120 -0
- package/dist/checks/check-debug-statements.js.map +1 -0
- package/dist/checks/check-deep-nesting.d.ts +6 -0
- package/dist/checks/check-deep-nesting.d.ts.map +1 -0
- package/dist/checks/check-deep-nesting.js +116 -0
- package/dist/checks/check-deep-nesting.js.map +1 -0
- package/dist/checks/check-docker-platform.d.ts +6 -0
- package/dist/checks/check-docker-platform.d.ts.map +1 -0
- package/dist/checks/check-docker-platform.js +42 -0
- package/dist/checks/check-docker-platform.js.map +1 -0
- package/dist/checks/check-dry-violations.d.ts +6 -0
- package/dist/checks/check-dry-violations.d.ts.map +1 -0
- package/dist/checks/check-dry-violations.js +124 -0
- package/dist/checks/check-dry-violations.js.map +1 -0
- package/dist/checks/check-empty-catch.d.ts +6 -0
- package/dist/checks/check-empty-catch.d.ts.map +1 -0
- package/dist/checks/check-empty-catch.js +111 -0
- package/dist/checks/check-empty-catch.js.map +1 -0
- package/dist/checks/check-function-length.d.ts +6 -0
- package/dist/checks/check-function-length.d.ts.map +1 -0
- package/dist/checks/check-function-length.js +152 -0
- package/dist/checks/check-function-length.js.map +1 -0
- package/dist/checks/check-hardcoded-ai-models.d.ts +10 -0
- package/dist/checks/check-hardcoded-ai-models.d.ts.map +1 -0
- package/dist/checks/check-hardcoded-ai-models.js +102 -0
- package/dist/checks/check-hardcoded-ai-models.js.map +1 -0
- package/dist/checks/check-hardcoded-urls.d.ts +6 -0
- package/dist/checks/check-hardcoded-urls.d.ts.map +1 -0
- package/dist/checks/check-hardcoded-urls.js +124 -0
- package/dist/checks/check-hardcoded-urls.js.map +1 -0
- package/dist/checks/check-magic-numbers.d.ts +6 -0
- package/dist/checks/check-magic-numbers.d.ts.map +1 -0
- package/dist/checks/check-magic-numbers.js +116 -0
- package/dist/checks/check-magic-numbers.js.map +1 -0
- package/dist/checks/check-secrets.d.ts +6 -0
- package/dist/checks/check-secrets.d.ts.map +1 -0
- package/dist/checks/check-secrets.js +138 -0
- package/dist/checks/check-secrets.js.map +1 -0
- package/dist/checks/check-snake-case-ts.d.ts +6 -0
- package/dist/checks/check-snake-case-ts.d.ts.map +1 -0
- package/dist/checks/check-snake-case-ts.js +78 -0
- package/dist/checks/check-snake-case-ts.js.map +1 -0
- package/dist/checks/check-todo-fixme.d.ts +6 -0
- package/dist/checks/check-todo-fixme.d.ts.map +1 -0
- package/dist/checks/check-todo-fixme.js +41 -0
- package/dist/checks/check-todo-fixme.js.map +1 -0
- package/dist/checks/check-unsafe-html.d.ts +6 -0
- package/dist/checks/check-unsafe-html.d.ts.map +1 -0
- package/dist/checks/check-unsafe-html.js +101 -0
- package/dist/checks/check-unsafe-html.js.map +1 -0
- package/dist/checks/index.d.ts +30 -0
- package/dist/checks/index.d.ts.map +1 -0
- package/dist/checks/index.js +57 -0
- package/dist/checks/index.js.map +1 -0
- package/dist/cli.d.ts +13 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +208 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/file-reader.d.ts +24 -0
- package/dist/utils/file-reader.d.ts.map +1 -0
- package/dist/utils/file-reader.js +146 -0
- package/dist/utils/file-reader.js.map +1 -0
- package/dist/utils/patterns.d.ts +27 -0
- package/dist/utils/patterns.d.ts.map +1 -0
- package/dist/utils/patterns.js +84 -0
- package/dist/utils/patterns.js.map +1 -0
- package/dist/utils/reporters.d.ts +21 -0
- package/dist/utils/reporters.d.ts.map +1 -0
- package/dist/utils/reporters.js +115 -0
- package/dist/utils/reporters.js.map +1 -0
- package/dist/utils/types.d.ts +71 -0
- package/dist/utils/types.d.ts.map +1 -0
- package/dist/utils/types.js +5 -0
- package/dist/utils/types.js.map +1 -0
- package/package.json +83 -0
- package/ralph/api.sh +216 -0
- package/ralph/backup.sh +838 -0
- package/ralph/browser-verify/README.md +135 -0
- package/ralph/browser-verify/verify.ts +450 -0
- package/ralph/checks/check-fastapi-responses.py +155 -0
- package/ralph/hooks/hooks-config.json +72 -0
- package/ralph/hooks/inject-context.sh +44 -0
- package/ralph/hooks/install.sh +207 -0
- package/ralph/hooks/log-tools.sh +45 -0
- package/ralph/hooks/protect-prd.sh +27 -0
- package/ralph/hooks/save-learnings.sh +36 -0
- package/ralph/hooks/warn-debug.sh +54 -0
- package/ralph/hooks/warn-empty-catch.sh +63 -0
- package/ralph/hooks/warn-secrets.sh +89 -0
- package/ralph/hooks/warn-urls.sh +77 -0
- package/ralph/init.sh +515 -0
- package/ralph/loop.sh +730 -0
- package/ralph/playwright.sh +238 -0
- package/ralph/prd.sh +295 -0
- package/ralph/setup/feature-tour.sh +155 -0
- package/ralph/setup/quick-setup.sh +239 -0
- package/ralph/setup/tutorial.sh +159 -0
- package/ralph/setup/ui.sh +136 -0
- package/ralph/setup.sh +401 -0
- package/ralph/signs.sh +150 -0
- package/ralph/utils.sh +682 -0
- package/ralph/verify/browser.sh +324 -0
- package/ralph/verify/lint.sh +363 -0
- package/ralph/verify/review.sh +152 -0
- package/ralph/verify/tests.sh +81 -0
- package/ralph/verify.sh +268 -0
- package/templates/PROMPT.md +235 -0
- package/templates/config/fullstack.json +86 -0
- package/templates/config/go.json +81 -0
- package/templates/config/minimal.json +76 -0
- package/templates/config/node.json +81 -0
- package/templates/config/python.json +81 -0
- package/templates/config/rust.json +81 -0
- package/templates/examples/CLAUDE-django.md +174 -0
- package/templates/examples/CLAUDE-fastapi.md +270 -0
- package/templates/examples/CLAUDE-fastmcp.md +352 -0
- package/templates/examples/CLAUDE-fullstack.md +256 -0
- package/templates/examples/CLAUDE-node.md +246 -0
- package/templates/examples/CLAUDE-react.md +138 -0
- package/templates/optional/cursorrules.template +147 -0
- package/templates/optional/eslint.config.js +34 -0
- package/templates/optional/lint-staged.config.js +34 -0
- package/templates/optional/ruff.toml +125 -0
- package/templates/optional/vibe-check.yml +116 -0
- package/templates/optional/vscode-settings.json +127 -0
- 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
|
+
}
|