agentic-loop 3.18.2 → 3.21.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/tour.md +11 -7
- package/.claude/commands/vibe-help.md +5 -2
- package/.claude/commands/vibe-list.md +17 -2
- package/.claude/skills/prd/SKILL.md +21 -6
- package/.claude/skills/setup-review/SKILL.md +56 -0
- package/.claude/skills/tour/SKILL.md +11 -7
- package/.claude/skills/vibe-help/SKILL.md +2 -1
- package/.claude/skills/vibe-list/SKILL.md +5 -2
- package/.pre-commit-hooks.yaml +8 -0
- package/README.md +4 -0
- package/bin/agentic-loop.sh +7 -0
- package/bin/ralph.sh +35 -0
- package/dist/checks/check-signs-secrets.d.ts +9 -0
- package/dist/checks/check-signs-secrets.d.ts.map +1 -0
- package/dist/checks/check-signs-secrets.js +57 -0
- package/dist/checks/check-signs-secrets.js.map +1 -0
- package/dist/checks/index.d.ts +2 -5
- package/dist/checks/index.d.ts.map +1 -1
- package/dist/checks/index.js +4 -9
- package/dist/checks/index.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +2 -1
- package/ralph/hooks/common.sh +47 -0
- package/ralph/hooks/warn-debug.sh +12 -26
- package/ralph/hooks/warn-empty-catch.sh +21 -34
- package/ralph/hooks/warn-secrets.sh +39 -52
- package/ralph/hooks/warn-urls.sh +25 -45
- package/ralph/init.sh +60 -82
- package/ralph/loop.sh +533 -53
- package/ralph/prd-check.sh +177 -236
- package/ralph/prd.sh +5 -2
- package/ralph/setup/quick-setup.sh +2 -16
- package/ralph/setup.sh +68 -80
- package/ralph/signs.sh +8 -0
- package/ralph/uat.sh +2015 -0
- package/ralph/utils.sh +198 -69
- package/ralph/verify/tests.sh +65 -10
- package/templates/PROMPT.md +10 -4
- package/templates/UAT-PROMPT.md +197 -0
- package/templates/config/elixir.json +0 -2
- package/templates/config/fastmcp.json +0 -2
- package/templates/config/fullstack.json +2 -4
- package/templates/config/go.json +0 -2
- package/templates/config/minimal.json +0 -2
- package/templates/config/node.json +0 -2
- package/templates/config/python.json +0 -2
- package/templates/config/rust.json +0 -2
- package/templates/prd-example.json +6 -8
package/.claude/commands/tour.md
CHANGED
|
@@ -271,26 +271,30 @@ Edit `.ralph/config.json` if anything needs adjusting."
|
|
|
271
271
|
### 2g. Test Credentials (Optional)
|
|
272
272
|
|
|
273
273
|
```bash
|
|
274
|
-
|
|
274
|
+
grep -q "^RALPH_TEST_USER=" .env 2>/dev/null && echo "configured" || echo "not set"
|
|
275
275
|
```
|
|
276
276
|
|
|
277
|
-
**If
|
|
277
|
+
**If not set**, use AskUserQuestion:
|
|
278
278
|
- **Question:** "Add test credentials? Ralph needs these for authenticated endpoints."
|
|
279
279
|
- **Header:** "Test auth"
|
|
280
280
|
- **Options:**
|
|
281
281
|
- **Yes** - "I'll ask for email and password"
|
|
282
|
-
- **Skip** - "
|
|
282
|
+
- **Skip** - "Add to .env later"
|
|
283
283
|
|
|
284
284
|
If "Yes":
|
|
285
285
|
- Ask for email, then password
|
|
286
|
-
-
|
|
286
|
+
- Save to `.env` (gitignored — never committed):
|
|
287
287
|
```bash
|
|
288
|
-
|
|
288
|
+
touch .env
|
|
289
|
+
echo "" >> .env
|
|
290
|
+
echo "# Test credentials for browser automation" >> .env
|
|
291
|
+
printf 'RALPH_TEST_USER=%s\n' "$EMAIL" >> .env
|
|
292
|
+
printf 'RALPH_TEST_PASSWORD=%s\n' "$PASSWORD" >> .env
|
|
289
293
|
```
|
|
290
|
-
- Say: "
|
|
294
|
+
- Say: "Credentials saved to .env (gitignored — never committed to git)"
|
|
291
295
|
|
|
292
296
|
If "Skip":
|
|
293
|
-
- Say: "No problem! Add
|
|
297
|
+
- Say: "No problem! Add `RALPH_TEST_USER` and `RALPH_TEST_PASSWORD` to `.env` when needed."
|
|
294
298
|
|
|
295
299
|
**If already set:**
|
|
296
300
|
- Say: "✓ Test credentials configured"
|
|
@@ -12,7 +12,8 @@ Print this cheatsheet for the user. Do not add any commentary or explanation.
|
|
|
12
12
|
|
|
13
13
|
```
|
|
14
14
|
/idea [feature] brainstorm & generate PRD
|
|
15
|
-
npx ralph run autonomous coding loop
|
|
15
|
+
npx ralph run autonomous coding loop (live activity feed)
|
|
16
|
+
npx ralph run --quiet same, but suppress activity feed
|
|
16
17
|
npx ralph status check progress
|
|
17
18
|
npx ralph stop stop after current story
|
|
18
19
|
```
|
|
@@ -23,12 +24,14 @@ Run `/vibe-list` to see all commands.
|
|
|
23
24
|
|
|
24
25
|
---
|
|
25
26
|
|
|
26
|
-
## Quality
|
|
27
|
+
## Quality & Testing
|
|
27
28
|
|
|
28
29
|
```
|
|
29
30
|
/vibe-check audit code quality
|
|
30
31
|
/review security-focused review
|
|
31
32
|
npx ralph check run verification only
|
|
33
|
+
npx ralph uat team acceptance testing
|
|
34
|
+
npx ralph chaos-agent adversarial red team testing
|
|
32
35
|
```
|
|
33
36
|
|
|
34
37
|
---
|
|
@@ -13,6 +13,7 @@ Print this complete reference for the user. Do not add any commentary.
|
|
|
13
13
|
| Command | Description |
|
|
14
14
|
|---------|-------------|
|
|
15
15
|
| `/idea [feature]` | Brainstorm in plan mode, generate PRD for Ralph |
|
|
16
|
+
| `/setup-review` | Review config against project, fix mismatches |
|
|
16
17
|
| `/sign` | Add a learned pattern for Ralph to remember |
|
|
17
18
|
| `/my-dna` | Set up your personal style preferences |
|
|
18
19
|
| `/vibe-check` | Audit code quality before shipping |
|
|
@@ -46,9 +47,10 @@ Print this complete reference for the user. Do not add any commentary.
|
|
|
46
47
|
### Autonomous Loop
|
|
47
48
|
| Command | Description |
|
|
48
49
|
|---------|-------------|
|
|
49
|
-
| `npx ralph run` | Run loop until all stories pass |
|
|
50
|
+
| `npx ralph run` | Run loop until all stories pass (shows live activity feed) |
|
|
50
51
|
| `npx ralph run --max 10` | Limit to N iterations (default: 20) |
|
|
51
52
|
| `npx ralph run --story TASK-001` | Run for specific task only |
|
|
53
|
+
| `npx ralph run --quiet` | Suppress the live activity feed |
|
|
52
54
|
| `npx ralph stop` | Stop after current story completes |
|
|
53
55
|
|
|
54
56
|
### Verification
|
|
@@ -57,6 +59,17 @@ Print this complete reference for the user. Do not add any commentary.
|
|
|
57
59
|
| `npx ralph check` | Run all configured checks |
|
|
58
60
|
| `npx ralph verify TASK-001` | Verify a specific task |
|
|
59
61
|
|
|
62
|
+
### UAT & Chaos Agent
|
|
63
|
+
| Command | Description |
|
|
64
|
+
|---------|-------------|
|
|
65
|
+
| `npx ralph uat` | Team acceptance testing (explore, test, fix) |
|
|
66
|
+
| `npx ralph uat --plan-only` | Generate test plan without executing |
|
|
67
|
+
| `npx ralph uat --focus <id\|cat>` | Run specific test case or category |
|
|
68
|
+
| `npx ralph uat --no-fix` | Write tests but don't fix app bugs |
|
|
69
|
+
| `npx ralph chaos-agent` | Chaos Agent adversarial red team testing |
|
|
70
|
+
| `npx ralph chaos-agent --plan-only` | Generate chaos plan without executing |
|
|
71
|
+
| `npx ralph chaos-agent --no-fix` | Find vulnerabilities without fixing |
|
|
72
|
+
|
|
60
73
|
### Signs (Learned Patterns)
|
|
61
74
|
| Command | Description |
|
|
62
75
|
|---------|-------------|
|
|
@@ -170,7 +183,9 @@ npx ralph unsign "camelCase"
|
|
|
170
183
|
"test": "npm test",
|
|
171
184
|
"build": "npm run build"
|
|
172
185
|
},
|
|
173
|
-
"
|
|
186
|
+
"urls": {
|
|
187
|
+
"frontend": "http://localhost:3000"
|
|
188
|
+
},
|
|
174
189
|
"maxSessionSeconds": 600
|
|
175
190
|
}
|
|
176
191
|
```
|
|
@@ -189,6 +189,23 @@ If validation found dependency issues, reorder stories:
|
|
|
189
189
|
|
|
190
190
|
**After reordering, re-run Step 6 validation to confirm the new order works.**
|
|
191
191
|
|
|
192
|
+
### Step 7b: Assign Batch Numbers
|
|
193
|
+
|
|
194
|
+
After reordering, assign a `batch` number to every story. Batches group independent stories that could theoretically run in parallel.
|
|
195
|
+
|
|
196
|
+
1. Stories with no `dependsOn` → **batch 1**
|
|
197
|
+
2. Stories whose deps are ALL in batch N → **batch N+1** (use the highest dep batch)
|
|
198
|
+
3. Within each batch level, check `files.create` and `files.modify` overlap — if two stories share any create/modify files, bump one to the next batch
|
|
199
|
+
4. Add `"batch": N` to every story
|
|
200
|
+
|
|
201
|
+
**Example:**
|
|
202
|
+
```
|
|
203
|
+
TASK-001: batch 1 (no deps)
|
|
204
|
+
TASK-002: batch 2 (depends on TASK-001, creates RegisterForm)
|
|
205
|
+
TASK-003: batch 2 (depends on TASK-001, modifies src/api/users.ts)
|
|
206
|
+
```
|
|
207
|
+
TASK-002 and TASK-003 are in the same batch because they don't depend on each other and don't share create/modify files.
|
|
208
|
+
|
|
192
209
|
### Step 8: Present Final PRD
|
|
193
210
|
|
|
194
211
|
Open the PRD for review:
|
|
@@ -312,10 +329,6 @@ Ralph will work through each story, running tests and committing as it goes."
|
|
|
312
329
|
"response": {"field": "type"}
|
|
313
330
|
},
|
|
314
331
|
|
|
315
|
-
"testUsers": {
|
|
316
|
-
"admin": {"email": "admin@test.com", "password": "test123"}
|
|
317
|
-
},
|
|
318
|
-
|
|
319
332
|
"prerequisites": [
|
|
320
333
|
"Backend server running",
|
|
321
334
|
"Database seeded"
|
|
@@ -330,7 +343,8 @@ Ralph will work through each story, running tests and committing as it goes."
|
|
|
330
343
|
"constraints": ["No Redux"]
|
|
331
344
|
},
|
|
332
345
|
|
|
333
|
-
"dependsOn": []
|
|
346
|
+
"dependsOn": [],
|
|
347
|
+
"batch": 1
|
|
334
348
|
}
|
|
335
349
|
]
|
|
336
350
|
}
|
|
@@ -372,12 +386,13 @@ Each story is **self-contained** with all the context it needs. No global defaul
|
|
|
372
386
|
| `contextFiles` | No | Files Claude should read (idea files, styleguides) |
|
|
373
387
|
| `skills` | No | Relevant skills with usage hints |
|
|
374
388
|
| `apiContract` | Backend | Expected request/response format |
|
|
375
|
-
| `testUsers` |
|
|
389
|
+
| `testUsers` | **Deprecated** | Use `RALPH_TEST_USER` / `RALPH_TEST_PASSWORD` env vars in `.env` instead |
|
|
376
390
|
| `prerequisites` | No | What must be running/ready |
|
|
377
391
|
| `notes` | No | Human guidance for Claude |
|
|
378
392
|
| `scale` | No | small, medium, large |
|
|
379
393
|
| `architecture` | No | Story-specific patterns/constraints |
|
|
380
394
|
| `dependsOn` | No | Story IDs that must complete first |
|
|
395
|
+
| `batch` | Yes | Batch number for parallel grouping (1 = no deps, higher = later) |
|
|
381
396
|
|
|
382
397
|
---
|
|
383
398
|
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Review .ralph/config.json against the actual project and fix mismatches.
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# Setup Review
|
|
6
|
+
|
|
7
|
+
Review `.ralph/config.json` and validate every setting against what actually exists in this project. Fix anything that's wrong.
|
|
8
|
+
|
|
9
|
+
## What to check
|
|
10
|
+
|
|
11
|
+
Read `.ralph/config.json`, then check each section against the real project files:
|
|
12
|
+
|
|
13
|
+
**1. commands.dev** — Does the dev command make sense?
|
|
14
|
+
- Check `package.json` scripts, `pyproject.toml`, `Makefile`, etc.
|
|
15
|
+
- Is the port in `urls.*` / `api.baseUrl` consistent with the dev command?
|
|
16
|
+
|
|
17
|
+
**2. commands.install** — Matches the actual package manager?
|
|
18
|
+
- `uv.lock` → `uv sync`, `poetry.lock` → `poetry install`, `pnpm-lock.yaml` → `pnpm install`, `yarn.lock` → `yarn install`, `package-lock.json` → `npm install`, `requirements.txt` → `pip install -r requirements.txt`
|
|
19
|
+
|
|
20
|
+
**3. checks.test / tests.\*** — Does the test runner exist?
|
|
21
|
+
- Check if `tests.directory` exists on disk
|
|
22
|
+
- Check if the test command actually works for this project (pytest, vitest, jest, go test, etc.)
|
|
23
|
+
|
|
24
|
+
**4. checks.lint** — Is the linter installed?
|
|
25
|
+
- Look for eslint, ruff, golangci-lint, clippy config files
|
|
26
|
+
|
|
27
|
+
**5. urls.\* / api.baseUrl** — Correct ports?
|
|
28
|
+
- Match ports to the dev command and any framework defaults
|
|
29
|
+
|
|
30
|
+
**6. paths.\* / tests.directory** — Do these directories exist?
|
|
31
|
+
- Check every path value against the filesystem
|
|
32
|
+
|
|
33
|
+
**7. playwright.\*** — Is Playwright actually set up?
|
|
34
|
+
- Check if `@playwright/test` is in package.json or playwright is pip-installed
|
|
35
|
+
- Does `playwright.testDir` exist?
|
|
36
|
+
- If Playwright isn't installed, set `playwright.enabled` to `false`
|
|
37
|
+
|
|
38
|
+
**8. migrations.\*** — Matches the actual migration tool?
|
|
39
|
+
- `prisma/` → prisma, `alembic/` or `alembic.ini` → alembic, `migrations/` + `manage.py` → Django, `priv/repo/migrations` → Ecto
|
|
40
|
+
|
|
41
|
+
**9. Python projects** — Correct package manager?
|
|
42
|
+
- `uv.lock` exists → commands should use `uv run`
|
|
43
|
+
- `poetry.lock` exists → commands should use `poetry run`
|
|
44
|
+
- Neither → plain `pip` / `python`
|
|
45
|
+
|
|
46
|
+
## How to fix
|
|
47
|
+
|
|
48
|
+
Edit `.ralph/config.json` directly to correct any mismatches.
|
|
49
|
+
|
|
50
|
+
## Output
|
|
51
|
+
|
|
52
|
+
Print a short summary. For each section, one line:
|
|
53
|
+
- What you checked
|
|
54
|
+
- Whether it was correct or what you changed
|
|
55
|
+
|
|
56
|
+
Keep it conversational — explain what each setting does in plain language so the user understands their config.
|
|
@@ -271,26 +271,30 @@ Edit `.ralph/config.json` if anything needs adjusting."
|
|
|
271
271
|
### 2g. Test Credentials (Optional)
|
|
272
272
|
|
|
273
273
|
```bash
|
|
274
|
-
|
|
274
|
+
grep -q "^RALPH_TEST_USER=" .env 2>/dev/null && echo "configured" || echo "not set"
|
|
275
275
|
```
|
|
276
276
|
|
|
277
|
-
**If
|
|
277
|
+
**If not set**, use AskUserQuestion:
|
|
278
278
|
- **Question:** "Add test credentials? Ralph needs these for authenticated endpoints."
|
|
279
279
|
- **Header:** "Test auth"
|
|
280
280
|
- **Options:**
|
|
281
281
|
- **Yes** - "I'll ask for email and password"
|
|
282
|
-
- **Skip** - "
|
|
282
|
+
- **Skip** - "Add to .env later"
|
|
283
283
|
|
|
284
284
|
If "Yes":
|
|
285
285
|
- Ask for email, then password
|
|
286
|
-
-
|
|
286
|
+
- Save to `.env` (gitignored — never committed):
|
|
287
287
|
```bash
|
|
288
|
-
|
|
288
|
+
touch .env
|
|
289
|
+
echo "" >> .env
|
|
290
|
+
echo "# Test credentials for browser automation" >> .env
|
|
291
|
+
printf 'RALPH_TEST_USER=%s\n' "$EMAIL" >> .env
|
|
292
|
+
printf 'RALPH_TEST_PASSWORD=%s\n' "$PASSWORD" >> .env
|
|
289
293
|
```
|
|
290
|
-
- Say: "
|
|
294
|
+
- Say: "Credentials saved to .env (gitignored — never committed to git)"
|
|
291
295
|
|
|
292
296
|
If "Skip":
|
|
293
|
-
- Say: "No problem! Add
|
|
297
|
+
- Say: "No problem! Add `RALPH_TEST_USER` and `RALPH_TEST_PASSWORD` to `.env` when needed."
|
|
294
298
|
|
|
295
299
|
**If already set:**
|
|
296
300
|
- Say: "✓ Test credentials configured"
|
|
@@ -12,7 +12,8 @@ Print this cheatsheet for the user. Do not add any commentary or explanation.
|
|
|
12
12
|
|
|
13
13
|
```
|
|
14
14
|
/idea [feature] brainstorm & generate PRD
|
|
15
|
-
npx ralph run autonomous coding loop
|
|
15
|
+
npx ralph run autonomous coding loop (live activity feed)
|
|
16
|
+
npx ralph run --quiet same, but suppress activity feed
|
|
16
17
|
npx ralph status check progress
|
|
17
18
|
npx ralph stop stop after current story
|
|
18
19
|
```
|
|
@@ -46,9 +46,10 @@ Print this complete reference for the user. Do not add any commentary.
|
|
|
46
46
|
### Autonomous Loop
|
|
47
47
|
| Command | Description |
|
|
48
48
|
|---------|-------------|
|
|
49
|
-
| `npx ralph run` | Run loop until all stories pass |
|
|
49
|
+
| `npx ralph run` | Run loop until all stories pass (shows live activity feed) |
|
|
50
50
|
| `npx ralph run --max 10` | Limit to N iterations (default: 20) |
|
|
51
51
|
| `npx ralph run --story TASK-001` | Run for specific task only |
|
|
52
|
+
| `npx ralph run --quiet` | Suppress the live activity feed |
|
|
52
53
|
| `npx ralph stop` | Stop after current story completes |
|
|
53
54
|
|
|
54
55
|
### Verification
|
|
@@ -170,7 +171,9 @@ npx ralph unsign "camelCase"
|
|
|
170
171
|
"test": "npm test",
|
|
171
172
|
"build": "npm run build"
|
|
172
173
|
},
|
|
173
|
-
"
|
|
174
|
+
"urls": {
|
|
175
|
+
"frontend": "http://localhost:3000"
|
|
176
|
+
},
|
|
174
177
|
"maxSessionSeconds": 600
|
|
175
178
|
}
|
|
176
179
|
```
|
package/.pre-commit-hooks.yaml
CHANGED
|
@@ -93,6 +93,14 @@
|
|
|
93
93
|
types_or: [python, javascript, ts, json, yaml]
|
|
94
94
|
pass_filenames: true
|
|
95
95
|
|
|
96
|
+
# Signs credential check (blocking - prevents committing credentials in learned patterns)
|
|
97
|
+
- id: check-signs-secrets
|
|
98
|
+
name: Check signs.json for credentials
|
|
99
|
+
entry: bash -c 'for f in "$@"; do if grep -qiE "([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}|password[[:space:]]*[:=]|[[:space:]][A-Za-z0-9_]*_?(pass|pwd|token|secret|key|api.?key)[[:space:]]*[:=]|sk-[a-zA-Z0-9]{20,}|ghp_[a-zA-Z0-9]{36})" "$f"; then echo "ERROR: $f contains credentials (email, password, token, etc.)"; echo " Signs are committed to git — use environment variables instead."; exit 1; fi; done' --
|
|
100
|
+
language: system
|
|
101
|
+
files: 'signs\.json$'
|
|
102
|
+
pass_filenames: true
|
|
103
|
+
|
|
96
104
|
# Quality-only check (non-blocking)
|
|
97
105
|
- id: vibe-check-quality
|
|
98
106
|
name: Vibe Check (quality only)
|
package/README.md
CHANGED
|
@@ -71,8 +71,11 @@ claude --dangerously-skip-permissions
|
|
|
71
71
|
**Terminal 2 - Ralph Loop:**
|
|
72
72
|
```bash
|
|
73
73
|
npx agentic-loop run # Execute PRDs autonomously
|
|
74
|
+
npx agentic-loop run --quiet # Same, but suppress activity feed
|
|
74
75
|
```
|
|
75
76
|
|
|
77
|
+
Ralph shows a live activity feed as it works — what files it's reading, what code it's writing, and why. Use `--quiet` to suppress it.
|
|
78
|
+
|
|
76
79
|
> **Tip:** Use two terminals. Plan with Claude in one, run Ralph in the other.
|
|
77
80
|
|
|
78
81
|
---
|
|
@@ -90,6 +93,7 @@ npx agentic-loop run # Execute PRDs autonomously
|
|
|
90
93
|
- [Code Check](docs/CODE-CHECK.md) - Verification pipeline after each story
|
|
91
94
|
- [Customization](docs/CUSTOMIZATION.md) - Personalization and guardrails
|
|
92
95
|
- [How Ralph Works](docs/RALPH.md) - Architecture, config, full reference
|
|
96
|
+
- [UAT & Chaos Agent](docs/UAT.md) - Autonomous acceptance testing and adversarial red teaming
|
|
93
97
|
- [Cheatsheet](docs/CHEATSHEET.md) - All commands at a glance
|
|
94
98
|
- [Hooks Reference](docs/HOOKS.md) - Pre-commit and Claude Code hooks
|
|
95
99
|
- [Loopgram](docs/LOOPGRAM.md) - Telegram bot for mobile idea capture and loop monitoring
|
package/bin/agentic-loop.sh
CHANGED
|
@@ -3,6 +3,13 @@
|
|
|
3
3
|
# agentic-loop - Tools to thrive with agentic coding
|
|
4
4
|
#
|
|
5
5
|
# Main CLI - wraps ralph.sh for the autonomous dev loop.
|
|
6
|
+
#
|
|
7
|
+
# Run options:
|
|
8
|
+
# run Run autonomous loop until all stories pass
|
|
9
|
+
# run --max <n> Run with max iterations (default: 20)
|
|
10
|
+
# run --fast Skip code review for faster iterations
|
|
11
|
+
# run --quiet Suppress the live activity feed
|
|
12
|
+
# run --story <id> Run a specific story only
|
|
6
13
|
|
|
7
14
|
set -euo pipefail
|
|
8
15
|
|
package/bin/ralph.sh
CHANGED
|
@@ -103,6 +103,9 @@ source "$RALPH_LIB/signs.sh"
|
|
|
103
103
|
source "$RALPH_LIB/test.sh"
|
|
104
104
|
source "$RALPH_LIB/ci.sh"
|
|
105
105
|
|
|
106
|
+
# Migrate deprecated config fields (e.g., testUrlBase -> urls.frontend)
|
|
107
|
+
_migrate_config
|
|
108
|
+
|
|
106
109
|
# Run auto-config if config.json was just created
|
|
107
110
|
if [[ "${_ralph_needs_autoconfig:-}" == "true" ]]; then
|
|
108
111
|
echo "Auto-detecting project configuration..." >&2
|
|
@@ -131,6 +134,24 @@ main() {
|
|
|
131
134
|
ralph_prd "$@"
|
|
132
135
|
;;
|
|
133
136
|
run)
|
|
137
|
+
# Check if setup has been run (progress.txt is created by setup/init)
|
|
138
|
+
if [[ ! -f "$RALPH_DIR/progress.txt" ]]; then
|
|
139
|
+
print_error "Setup hasn't been run yet."
|
|
140
|
+
echo ""
|
|
141
|
+
echo " You need to run setup once before your first loop:"
|
|
142
|
+
echo ""
|
|
143
|
+
echo " npx agentic-loop setup"
|
|
144
|
+
echo ""
|
|
145
|
+
echo " Then review your config with Claude — every project is"
|
|
146
|
+
echo " different, so Claude can fine-tune the setup to your needs:"
|
|
147
|
+
echo ""
|
|
148
|
+
echo " claude --dangerously-skip-permissions"
|
|
149
|
+
echo " > /setup-review"
|
|
150
|
+
echo ""
|
|
151
|
+
echo " Full walkthrough: docs/GETTING-STARTED.md"
|
|
152
|
+
echo ""
|
|
153
|
+
exit 1
|
|
154
|
+
fi
|
|
134
155
|
# Clear any previous stop signal
|
|
135
156
|
rm -f "$RALPH_DIR/.stop"
|
|
136
157
|
run_loop "$@"
|
|
@@ -142,6 +163,12 @@ main() {
|
|
|
142
163
|
echo "Stop signal sent. Ralph will stop after current story completes."
|
|
143
164
|
echo "(Use Ctrl+C to force stop immediately)"
|
|
144
165
|
;;
|
|
166
|
+
skip)
|
|
167
|
+
# Signal the loop to skip the current story and move to the next one
|
|
168
|
+
mkdir -p "$RALPH_DIR"
|
|
169
|
+
touch "$RALPH_DIR/.skip"
|
|
170
|
+
echo "Skip signal sent. Ralph will skip the current story when Claude finishes."
|
|
171
|
+
;;
|
|
145
172
|
status)
|
|
146
173
|
ralph_status "$@"
|
|
147
174
|
;;
|
|
@@ -167,6 +194,14 @@ main() {
|
|
|
167
194
|
ci)
|
|
168
195
|
ralph_ci "$@"
|
|
169
196
|
;;
|
|
197
|
+
uat)
|
|
198
|
+
source "$RALPH_LIB/uat.sh"
|
|
199
|
+
run_uat "$@"
|
|
200
|
+
;;
|
|
201
|
+
chaos-agent)
|
|
202
|
+
source "$RALPH_LIB/uat.sh"
|
|
203
|
+
run_chaos "$@"
|
|
204
|
+
;;
|
|
170
205
|
sign)
|
|
171
206
|
ralph_sign "$@"
|
|
172
207
|
;;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Check signs.json for credentials (emails, passwords, tokens, API keys)
|
|
3
|
+
*
|
|
4
|
+
* Signs are learned patterns saved to .ralph/signs.json and committed to git.
|
|
5
|
+
* They should never contain credentials — use environment variables instead.
|
|
6
|
+
*/
|
|
7
|
+
import type { Hook } from '../utils/types.js';
|
|
8
|
+
export declare const checkSignsSecrets: Hook;
|
|
9
|
+
//# sourceMappingURL=check-signs-secrets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-signs-secrets.d.ts","sourceRoot":"","sources":["../../src/checks/check-signs-secrets.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,IAAI,EAA2B,MAAM,mBAAmB,CAAC;AAoBvE,eAAO,MAAM,iBAAiB,EAAE,IAuC/B,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Check signs.json for credentials (emails, passwords, tokens, API keys)
|
|
3
|
+
*
|
|
4
|
+
* Signs are learned patterns saved to .ralph/signs.json and committed to git.
|
|
5
|
+
* They should never contain credentials — use environment variables instead.
|
|
6
|
+
*/
|
|
7
|
+
const EMAIL_PATTERN = /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/;
|
|
8
|
+
const PASSWORD_PATTERN = /password\s*[:=]/i;
|
|
9
|
+
const TOKEN_PATTERN = /\b[A-Za-z0-9_]*_?(pass|pwd|token|secret|key|api[_.]?key)\s*[:=]/i;
|
|
10
|
+
const AWS_KEY_PATTERN = /AKIA[0-9A-Z]{16}/;
|
|
11
|
+
const OPENAI_KEY_PATTERN = /sk-[a-zA-Z0-9]{20,}/;
|
|
12
|
+
const GITHUB_TOKEN_PATTERN = /ghp_[a-zA-Z0-9]{36}/;
|
|
13
|
+
const STRIPE_KEY_PATTERN = /sk_(live|test)_[0-9a-zA-Z]{24,}/;
|
|
14
|
+
const CREDENTIAL_CHECKS = [
|
|
15
|
+
{ pattern: EMAIL_PATTERN, message: 'Email address in sign — use environment variables', ruleId: 'signs-secrets/email' },
|
|
16
|
+
{ pattern: PASSWORD_PATTERN, message: 'Password reference in sign — use environment variables', ruleId: 'signs-secrets/password' },
|
|
17
|
+
{ pattern: TOKEN_PATTERN, message: 'Token/secret/key reference in sign — use environment variables', ruleId: 'signs-secrets/token' },
|
|
18
|
+
{ pattern: AWS_KEY_PATTERN, message: 'AWS access key in sign — use environment variables', ruleId: 'signs-secrets/aws-key' },
|
|
19
|
+
{ pattern: OPENAI_KEY_PATTERN, message: 'OpenAI API key in sign — use environment variables', ruleId: 'signs-secrets/openai-key' },
|
|
20
|
+
{ pattern: GITHUB_TOKEN_PATTERN, message: 'GitHub token in sign — use environment variables', ruleId: 'signs-secrets/github-token' },
|
|
21
|
+
{ pattern: STRIPE_KEY_PATTERN, message: 'Stripe key in sign — use environment variables', ruleId: 'signs-secrets/stripe-key' },
|
|
22
|
+
];
|
|
23
|
+
export const checkSignsSecrets = {
|
|
24
|
+
id: 'signs-secrets',
|
|
25
|
+
name: 'Check Signs for Credentials',
|
|
26
|
+
description: 'Detect credentials (emails, passwords, tokens) in signs.json',
|
|
27
|
+
severity: 'error',
|
|
28
|
+
fileTypes: ['json'],
|
|
29
|
+
check(context) {
|
|
30
|
+
// Only check signs.json files
|
|
31
|
+
if (!context.filePath.endsWith('signs.json')) {
|
|
32
|
+
return [];
|
|
33
|
+
}
|
|
34
|
+
const results = [];
|
|
35
|
+
const lines = context.content.split('\n');
|
|
36
|
+
for (let i = 0; i < lines.length; i++) {
|
|
37
|
+
const line = lines[i];
|
|
38
|
+
const lineNum = i + 1;
|
|
39
|
+
// Only check lines that contain pattern values (the actual sign text)
|
|
40
|
+
if (!/"pattern"/.test(line)) {
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
for (const { pattern, message, ruleId } of CREDENTIAL_CHECKS) {
|
|
44
|
+
if (pattern.test(line)) {
|
|
45
|
+
results.push({
|
|
46
|
+
line: lineNum,
|
|
47
|
+
message,
|
|
48
|
+
severity: 'error',
|
|
49
|
+
ruleId,
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return results;
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
//# sourceMappingURL=check-signs-secrets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-signs-secrets.js","sourceRoot":"","sources":["../../src/checks/check-signs-secrets.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,aAAa,GAAG,gDAAgD,CAAC;AACvE,MAAM,gBAAgB,GAAG,kBAAkB,CAAC;AAC5C,MAAM,aAAa,GAAG,kEAAkE,CAAC;AACzF,MAAM,eAAe,GAAG,kBAAkB,CAAC;AAC3C,MAAM,kBAAkB,GAAG,qBAAqB,CAAC;AACjD,MAAM,oBAAoB,GAAG,qBAAqB,CAAC;AACnD,MAAM,kBAAkB,GAAG,iCAAiC,CAAC;AAE7D,MAAM,iBAAiB,GAA2D;IAChF,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,mDAAmD,EAAE,MAAM,EAAE,qBAAqB,EAAE;IACvH,EAAE,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,wDAAwD,EAAE,MAAM,EAAE,wBAAwB,EAAE;IAClI,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,gEAAgE,EAAE,MAAM,EAAE,qBAAqB,EAAE;IACpI,EAAE,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,oDAAoD,EAAE,MAAM,EAAE,uBAAuB,EAAE;IAC5H,EAAE,OAAO,EAAE,kBAAkB,EAAE,OAAO,EAAE,oDAAoD,EAAE,MAAM,EAAE,0BAA0B,EAAE;IAClI,EAAE,OAAO,EAAE,oBAAoB,EAAE,OAAO,EAAE,kDAAkD,EAAE,MAAM,EAAE,4BAA4B,EAAE;IACpI,EAAE,OAAO,EAAE,kBAAkB,EAAE,OAAO,EAAE,gDAAgD,EAAE,MAAM,EAAE,0BAA0B,EAAE;CAC/H,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAS;IACrC,EAAE,EAAE,eAAe;IACnB,IAAI,EAAE,6BAA6B;IACnC,WAAW,EAAE,8DAA8D;IAC3E,QAAQ,EAAE,OAAO;IACjB,SAAS,EAAE,CAAC,MAAM,CAAC;IAEnB,KAAK,CAAC,OAAoB;QACxB,8BAA8B;QAC9B,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;YAC7C,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,OAAO,GAAiB,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAE1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACtB,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC;YAEtB,sEAAsE;YACtE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC5B,SAAS;YACX,CAAC;YAED,KAAK,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,iBAAiB,EAAE,CAAC;gBAC7D,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;oBACvB,OAAO,CAAC,IAAI,CAAC;wBACX,IAAI,EAAE,OAAO;wBACb,OAAO;wBACP,QAAQ,EAAE,OAAO;wBACjB,MAAM;qBACP,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;CACF,CAAC"}
|
package/dist/checks/index.d.ts
CHANGED
|
@@ -18,13 +18,10 @@ import { checkSnakeCaseTs } from './check-snake-case-ts.js';
|
|
|
18
18
|
import { checkUnsafeHtml } from './check-unsafe-html.js';
|
|
19
19
|
import { checkDockerPlatform } from './check-docker-platform.js';
|
|
20
20
|
import { checkHardcodedAiModels } from './check-hardcoded-ai-models.js';
|
|
21
|
+
import { checkSignsSecrets } from './check-signs-secrets.js';
|
|
21
22
|
/** All available hooks */
|
|
22
23
|
export declare const hooks: Hook[];
|
|
23
|
-
/** Get a hook by its ID */
|
|
24
|
-
export declare function getHook(id: string): Hook | undefined;
|
|
25
24
|
/** Get hooks filtered by file extension */
|
|
26
25
|
export declare function getHooksForFile(extension: string): Hook[];
|
|
27
|
-
|
|
28
|
-
export declare function getHookIds(): string[];
|
|
29
|
-
export { checkSecrets, checkHardcodedUrls, checkDebugStatements, checkTodoFixme, checkEmptyCatch, checkDryViolations, checkMagicNumbers, checkFunctionLength, checkCommentedCode, checkDeepNesting, checkConsoleError, checkAnyTypes, checkSnakeCaseTs, checkUnsafeHtml, checkDockerPlatform, checkHardcodedAiModels, };
|
|
26
|
+
export { checkSecrets, checkHardcodedUrls, checkDebugStatements, checkTodoFixme, checkEmptyCatch, checkDryViolations, checkMagicNumbers, checkFunctionLength, checkCommentedCode, checkDeepNesting, checkConsoleError, checkAnyTypes, checkSnakeCaseTs, checkUnsafeHtml, checkDockerPlatform, checkHardcodedAiModels, checkSignsSecrets, };
|
|
30
27
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/checks/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAG9C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/checks/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAG9C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D,0BAA0B;AAC1B,eAAO,MAAM,KAAK,EAAE,IAAI,EA2BvB,CAAC;AAEF,2CAA2C;AAC3C,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,EAAE,CAEzD;AAED,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,oBAAoB,EACpB,cAAc,EACd,eAAe,EACf,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EACjB,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,mBAAmB,EACnB,sBAAsB,EACtB,iBAAiB,GAClB,CAAC"}
|
package/dist/checks/index.js
CHANGED
|
@@ -18,6 +18,7 @@ import { checkSnakeCaseTs } from './check-snake-case-ts.js';
|
|
|
18
18
|
import { checkUnsafeHtml } from './check-unsafe-html.js';
|
|
19
19
|
import { checkDockerPlatform } from './check-docker-platform.js';
|
|
20
20
|
import { checkHardcodedAiModels } from './check-hardcoded-ai-models.js';
|
|
21
|
+
import { checkSignsSecrets } from './check-signs-secrets.js';
|
|
21
22
|
/** All available hooks */
|
|
22
23
|
export const hooks = [
|
|
23
24
|
// Security (blocking)
|
|
@@ -40,18 +41,12 @@ export const hooks = [
|
|
|
40
41
|
checkDockerPlatform,
|
|
41
42
|
// AI/LLM
|
|
42
43
|
checkHardcodedAiModels,
|
|
44
|
+
// Signs
|
|
45
|
+
checkSignsSecrets,
|
|
43
46
|
];
|
|
44
|
-
/** Get a hook by its ID */
|
|
45
|
-
export function getHook(id) {
|
|
46
|
-
return hooks.find((hook) => hook.id === id);
|
|
47
|
-
}
|
|
48
47
|
/** Get hooks filtered by file extension */
|
|
49
48
|
export function getHooksForFile(extension) {
|
|
50
49
|
return hooks.filter((hook) => hook.fileTypes.includes(extension));
|
|
51
50
|
}
|
|
52
|
-
|
|
53
|
-
export function getHookIds() {
|
|
54
|
-
return hooks.map((hook) => hook.id);
|
|
55
|
-
}
|
|
56
|
-
export { checkSecrets, checkHardcodedUrls, checkDebugStatements, checkTodoFixme, checkEmptyCatch, checkDryViolations, checkMagicNumbers, checkFunctionLength, checkCommentedCode, checkDeepNesting, checkConsoleError, checkAnyTypes, checkSnakeCaseTs, checkUnsafeHtml, checkDockerPlatform, checkHardcodedAiModels, };
|
|
51
|
+
export { checkSecrets, checkHardcodedUrls, checkDebugStatements, checkTodoFixme, checkEmptyCatch, checkDryViolations, checkMagicNumbers, checkFunctionLength, checkCommentedCode, checkDeepNesting, checkConsoleError, checkAnyTypes, checkSnakeCaseTs, checkUnsafeHtml, checkDockerPlatform, checkHardcodedAiModels, checkSignsSecrets, };
|
|
57
52
|
//# sourceMappingURL=index.js.map
|
package/dist/checks/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/checks/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,mBAAmB;AACnB,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/checks/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,mBAAmB;AACnB,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D,0BAA0B;AAC1B,MAAM,CAAC,MAAM,KAAK,GAAW;IAC3B,sBAAsB;IACtB,YAAY;IACZ,kBAAkB;IAClB,eAAe;IAEf,0BAA0B;IAC1B,oBAAoB;IACpB,cAAc;IACd,eAAe;IACf,kBAAkB;IAClB,iBAAiB;IACjB,mBAAmB;IACnB,kBAAkB;IAClB,gBAAgB;IAChB,iBAAiB;IACjB,aAAa;IACb,gBAAgB;IAEhB,iBAAiB;IACjB,mBAAmB;IAEnB,SAAS;IACT,sBAAsB;IAEtB,QAAQ;IACR,iBAAiB;CAClB,CAAC;AAEF,2CAA2C;AAC3C,MAAM,UAAU,eAAe,CAAC,SAAiB;IAC/C,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;AACpE,CAAC;AAED,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,oBAAoB,EACpB,cAAc,EACd,eAAe,EACf,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EACjB,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,mBAAmB,EACnB,sBAAsB,EACtB,iBAAiB,GAClB,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -4,6 +4,6 @@
|
|
|
4
4
|
* Catch common AI-generated code issues before they hit your codebase.
|
|
5
5
|
*/
|
|
6
6
|
export type { Hook, HookResult, FileContext, CheckOptions, CheckResult, SummaryResult, Severity, } from './utils/types.js';
|
|
7
|
-
export { hooks,
|
|
7
|
+
export { hooks, getHooksForFile, } from './checks/index.js';
|
|
8
8
|
export { vibeCheck } from './cli.js';
|
|
9
9
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,YAAY,EACV,IAAI,EACJ,UAAU,EACV,WAAW,EACX,YAAY,EACZ,WAAW,EACX,aAAa,EACb,QAAQ,GACT,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,KAAK,EACL,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,YAAY,EACV,IAAI,EACJ,UAAU,EACV,WAAW,EACX,YAAY,EACZ,WAAW,EACX,aAAa,EACb,QAAQ,GACT,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,KAAK,EACL,eAAe,GAChB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Catch common AI-generated code issues before they hit your codebase.
|
|
5
5
|
*/
|
|
6
6
|
// Export hooks
|
|
7
|
-
export { hooks,
|
|
7
|
+
export { hooks, getHooksForFile, } from './checks/index.js';
|
|
8
8
|
// Export main check function
|
|
9
9
|
export { vibeCheck } from './cli.js';
|
|
10
10
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAaH,eAAe;AACf,OAAO,EACL,KAAK,EACL,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAaH,eAAe;AACf,OAAO,EACL,KAAK,EACL,eAAe,GAChB,MAAM,mBAAmB,CAAC;AAE3B,6BAA6B;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agentic-loop",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.21.0",
|
|
4
4
|
"description": "Autonomous AI coding loop - PRD-driven development with Claude Code",
|
|
5
5
|
"author": "Allie Jones <allie@allthrive.ai>",
|
|
6
6
|
"license": "MIT",
|
|
@@ -75,6 +75,7 @@
|
|
|
75
75
|
},
|
|
76
76
|
"dependencies": {
|
|
77
77
|
"@anthropic-ai/sdk": "^0.32.0",
|
|
78
|
+
"agentic-loop": "^3.19.0",
|
|
78
79
|
"telegraf": "^4.16.0",
|
|
79
80
|
"tsx": "^4.0.0"
|
|
80
81
|
},
|