agentic-loop 3.7.1 → 3.7.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/commands/prd.md +2 -0
- package/.pre-commit-hooks.yaml +1 -1
- package/README.md +1 -1
- package/package.json +1 -1
- package/templates/prd-example.json +134 -0
package/.claude/commands/prd.md
CHANGED
package/.pre-commit-hooks.yaml
CHANGED
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
# Security checks (blocking - these will fail the commit)
|
|
23
23
|
- id: check-env-files
|
|
24
24
|
name: Block .env files from commit
|
|
25
|
-
entry: bash -c 'echo
|
|
25
|
+
entry: "bash -c 'echo ERROR: .env files should not be committed && exit 1'"
|
|
26
26
|
language: system
|
|
27
27
|
files: '\.env($|\.)'
|
|
28
28
|
pass_filenames: false
|
package/README.md
CHANGED
|
@@ -71,7 +71,7 @@ npx agentic-loop run # Execute PRDs autonomously
|
|
|
71
71
|
```
|
|
72
72
|
|
|
73
73
|
**What's a PRD?**
|
|
74
|
-
A JSON file (`.ralph/prd.json`) containing your feature broken into small stories. Each story has acceptance criteria, test steps, and a test URL. Ralph implements them one by one.
|
|
74
|
+
A JSON file (`.ralph/prd.json`) containing your feature broken into small stories. Each story has acceptance criteria, test steps, and a test URL. Ralph implements them one by one. See [`templates/prd-example.json`](templates/prd-example.json) for a complete example.
|
|
75
75
|
|
|
76
76
|
**What are Signs?**
|
|
77
77
|
Patterns Ralph learns from failures. If Ralph keeps making the same mistake, add a sign: `npx agentic-loop sign "Always use camelCase for API fields" backend`. Future stories will see this guidance.
|
package/package.json
CHANGED
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
{
|
|
2
|
+
"feature": {
|
|
3
|
+
"name": "User Authentication",
|
|
4
|
+
"ideaFile": "docs/ideas/auth.md",
|
|
5
|
+
"branch": "feature/auth",
|
|
6
|
+
"status": "pending"
|
|
7
|
+
},
|
|
8
|
+
|
|
9
|
+
"originalContext": "docs/ideas/auth.md",
|
|
10
|
+
|
|
11
|
+
"techStack": {
|
|
12
|
+
"frontend": "React",
|
|
13
|
+
"backend": "Node.js",
|
|
14
|
+
"database": "PostgreSQL"
|
|
15
|
+
},
|
|
16
|
+
|
|
17
|
+
"testing": {
|
|
18
|
+
"approach": "TDD",
|
|
19
|
+
"unit": {
|
|
20
|
+
"frontend": "vitest",
|
|
21
|
+
"backend": "jest"
|
|
22
|
+
},
|
|
23
|
+
"integration": "playwright",
|
|
24
|
+
"e2e": "playwright"
|
|
25
|
+
},
|
|
26
|
+
|
|
27
|
+
"globalConstraints": [
|
|
28
|
+
"All API calls must have error handling",
|
|
29
|
+
"Use existing UI components from src/components/ui"
|
|
30
|
+
],
|
|
31
|
+
|
|
32
|
+
"metadata": {
|
|
33
|
+
"createdAt": "2026-01-27T10:00:00Z",
|
|
34
|
+
"estimatedStories": 2,
|
|
35
|
+
"complexity": "medium"
|
|
36
|
+
},
|
|
37
|
+
|
|
38
|
+
"stories": [
|
|
39
|
+
{
|
|
40
|
+
"id": "TASK-001",
|
|
41
|
+
"type": "backend",
|
|
42
|
+
"title": "Create user registration endpoint",
|
|
43
|
+
"priority": 1,
|
|
44
|
+
"passes": false,
|
|
45
|
+
|
|
46
|
+
"files": {
|
|
47
|
+
"create": ["src/api/users.ts", "src/api/users.test.ts"],
|
|
48
|
+
"modify": ["src/api/index.ts"],
|
|
49
|
+
"reuse": ["src/db/client.ts"]
|
|
50
|
+
},
|
|
51
|
+
|
|
52
|
+
"acceptanceCriteria": [
|
|
53
|
+
"POST /api/users creates a new user with email and password",
|
|
54
|
+
"Returns 201 with user id and email (no password in response)",
|
|
55
|
+
"Returns 400 if email already exists"
|
|
56
|
+
],
|
|
57
|
+
|
|
58
|
+
"errorHandling": [
|
|
59
|
+
"Duplicate email returns {error: 'Email already registered'}",
|
|
60
|
+
"Invalid email returns {error: 'Invalid email format'}"
|
|
61
|
+
],
|
|
62
|
+
|
|
63
|
+
"testing": {
|
|
64
|
+
"types": ["unit", "integration"],
|
|
65
|
+
"approach": "TDD",
|
|
66
|
+
"files": {
|
|
67
|
+
"unit": ["src/api/users.test.ts"]
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
|
|
71
|
+
"testSteps": [
|
|
72
|
+
"curl -s -X POST {config.urls.backend}/api/users -H 'Content-Type: application/json' -d '{\"email\":\"test@example.com\",\"password\":\"secret123\"}' | jq -e '.id and .email'",
|
|
73
|
+
"curl -s -X POST {config.urls.backend}/api/users -H 'Content-Type: application/json' -d '{\"email\":\"test@example.com\",\"password\":\"secret123\"}' | jq -e '.error'",
|
|
74
|
+
"npm test -- --testPathPattern=users"
|
|
75
|
+
],
|
|
76
|
+
|
|
77
|
+
"apiContract": {
|
|
78
|
+
"endpoint": "POST /api/users",
|
|
79
|
+
"request": {"email": "string", "password": "string"},
|
|
80
|
+
"response": {"id": "string", "email": "string"}
|
|
81
|
+
},
|
|
82
|
+
|
|
83
|
+
"notes": "Hash passwords with bcrypt before storing.",
|
|
84
|
+
"dependsOn": []
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
"id": "TASK-002",
|
|
88
|
+
"type": "frontend",
|
|
89
|
+
"title": "Create registration form",
|
|
90
|
+
"priority": 2,
|
|
91
|
+
"passes": false,
|
|
92
|
+
|
|
93
|
+
"files": {
|
|
94
|
+
"create": ["src/components/RegisterForm.tsx", "src/components/RegisterForm.test.tsx"],
|
|
95
|
+
"modify": ["src/pages/index.tsx"],
|
|
96
|
+
"reuse": ["src/components/ui/Button.tsx", "src/components/ui/Input.tsx"]
|
|
97
|
+
},
|
|
98
|
+
|
|
99
|
+
"acceptanceCriteria": [
|
|
100
|
+
"Form has email and password fields",
|
|
101
|
+
"Submit button calls POST /api/users",
|
|
102
|
+
"Shows success message on 201 response",
|
|
103
|
+
"Shows error message on 400 response"
|
|
104
|
+
],
|
|
105
|
+
|
|
106
|
+
"errorHandling": [
|
|
107
|
+
"Network error shows 'Unable to connect' message",
|
|
108
|
+
"Validation errors display inline"
|
|
109
|
+
],
|
|
110
|
+
|
|
111
|
+
"testing": {
|
|
112
|
+
"types": ["unit", "e2e"],
|
|
113
|
+
"approach": "TDD",
|
|
114
|
+
"files": {
|
|
115
|
+
"unit": ["src/components/RegisterForm.test.tsx"],
|
|
116
|
+
"e2e": ["tests/e2e/register.spec.ts"]
|
|
117
|
+
}
|
|
118
|
+
},
|
|
119
|
+
|
|
120
|
+
"testSteps": [
|
|
121
|
+
"npx tsc --noEmit",
|
|
122
|
+
"npm test -- --testPathPattern=RegisterForm",
|
|
123
|
+
"npx playwright test tests/e2e/register.spec.ts"
|
|
124
|
+
],
|
|
125
|
+
|
|
126
|
+
"testUrl": "{config.urls.frontend}/register",
|
|
127
|
+
|
|
128
|
+
"mcp": ["playwright", "devtools"],
|
|
129
|
+
|
|
130
|
+
"notes": "Use existing Button and Input components from ui folder.",
|
|
131
|
+
"dependsOn": ["TASK-001"]
|
|
132
|
+
}
|
|
133
|
+
]
|
|
134
|
+
}
|