agentic-loop 3.19.0 → 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.
Files changed (51) hide show
  1. package/.claude/commands/tour.md +11 -7
  2. package/.claude/commands/vibe-help.md +5 -2
  3. package/.claude/commands/vibe-list.md +17 -2
  4. package/.claude/skills/prd/SKILL.md +21 -6
  5. package/.claude/skills/setup-review/SKILL.md +56 -0
  6. package/.claude/skills/tour/SKILL.md +11 -7
  7. package/.claude/skills/vibe-help/SKILL.md +2 -1
  8. package/.claude/skills/vibe-list/SKILL.md +5 -2
  9. package/.pre-commit-hooks.yaml +8 -0
  10. package/README.md +4 -0
  11. package/bin/agentic-loop.sh +7 -0
  12. package/bin/ralph.sh +29 -0
  13. package/dist/checks/check-signs-secrets.d.ts +9 -0
  14. package/dist/checks/check-signs-secrets.d.ts.map +1 -0
  15. package/dist/checks/check-signs-secrets.js +57 -0
  16. package/dist/checks/check-signs-secrets.js.map +1 -0
  17. package/dist/checks/index.d.ts +2 -5
  18. package/dist/checks/index.d.ts.map +1 -1
  19. package/dist/checks/index.js +4 -9
  20. package/dist/checks/index.js.map +1 -1
  21. package/dist/index.d.ts +1 -1
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +1 -1
  24. package/dist/index.js.map +1 -1
  25. package/package.json +2 -1
  26. package/ralph/hooks/common.sh +47 -0
  27. package/ralph/hooks/warn-debug.sh +12 -26
  28. package/ralph/hooks/warn-empty-catch.sh +21 -34
  29. package/ralph/hooks/warn-secrets.sh +39 -52
  30. package/ralph/hooks/warn-urls.sh +25 -45
  31. package/ralph/init.sh +58 -82
  32. package/ralph/loop.sh +506 -53
  33. package/ralph/prd-check.sh +177 -236
  34. package/ralph/prd.sh +5 -2
  35. package/ralph/setup/quick-setup.sh +2 -16
  36. package/ralph/setup.sh +68 -80
  37. package/ralph/signs.sh +8 -0
  38. package/ralph/uat.sh +2015 -0
  39. package/ralph/utils.sh +198 -69
  40. package/ralph/verify/tests.sh +65 -10
  41. package/templates/PROMPT.md +10 -4
  42. package/templates/UAT-PROMPT.md +197 -0
  43. package/templates/config/elixir.json +0 -2
  44. package/templates/config/fastmcp.json +0 -2
  45. package/templates/config/fullstack.json +2 -4
  46. package/templates/config/go.json +0 -2
  47. package/templates/config/minimal.json +0 -2
  48. package/templates/config/node.json +0 -2
  49. package/templates/config/python.json +0 -2
  50. package/templates/config/rust.json +0 -2
  51. package/templates/prd-example.json +6 -8
@@ -271,26 +271,30 @@ Edit `.ralph/config.json` if anything needs adjusting."
271
271
  ### 2g. Test Credentials (Optional)
272
272
 
273
273
  ```bash
274
- cat .ralph/config.json | jq -r '.auth.testUser // empty'
274
+ grep -q "^RALPH_TEST_USER=" .env 2>/dev/null && echo "configured" || echo "not set"
275
275
  ```
276
276
 
277
- **If empty**, use AskUserQuestion:
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** - "Edit .ralph/config.json later"
282
+ - **Skip** - "Add to .env later"
283
283
 
284
284
  If "Yes":
285
285
  - Ask for email, then password
286
- - Update config:
286
+ - Save to `.env` (gitignored — never committed):
287
287
  ```bash
288
- jq --arg u "$EMAIL" --arg p "$PASSWORD" '.auth.testUser = $u | .auth.testPassword = $p' .ralph/config.json > .ralph/config.tmp && mv .ralph/config.tmp .ralph/config.json
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: " Test credentials saved"
294
+ - Say: "Credentials saved to .env (gitignored — never committed to git)"
291
295
 
292
296
  If "Skip":
293
- - Say: "No problem! Add credentials to `.ralph/config.json` when needed."
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
- "testUrlBase": "http://localhost:3000",
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` | No | Test accounts (only for auth stories that need them) |
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
- cat .ralph/config.json | jq -r '.auth.testUser // empty'
274
+ grep -q "^RALPH_TEST_USER=" .env 2>/dev/null && echo "configured" || echo "not set"
275
275
  ```
276
276
 
277
- **If empty**, use AskUserQuestion:
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** - "Edit .ralph/config.json later"
282
+ - **Skip** - "Add to .env later"
283
283
 
284
284
  If "Yes":
285
285
  - Ask for email, then password
286
- - Update config:
286
+ - Save to `.env` (gitignored — never committed):
287
287
  ```bash
288
- jq --arg u "$EMAIL" --arg p "$PASSWORD" '.auth.testUser = $u | .auth.testPassword = $p' .ralph/config.json > .ralph/config.tmp && mv .ralph/config.tmp .ralph/config.json
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: " Test credentials saved"
294
+ - Say: "Credentials saved to .env (gitignored — never committed to git)"
291
295
 
292
296
  If "Skip":
293
- - Say: "No problem! Add credentials to `.ralph/config.json` when needed."
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
- "testUrlBase": "http://localhost:3000",
174
+ "urls": {
175
+ "frontend": "http://localhost:3000"
176
+ },
174
177
  "maxSessionSeconds": 600
175
178
  }
176
179
  ```
@@ -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
@@ -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 "$@"
@@ -173,6 +194,14 @@ main() {
173
194
  ci)
174
195
  ralph_ci "$@"
175
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
+ ;;
176
205
  sign)
177
206
  ralph_sign "$@"
178
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"}
@@ -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
- /** Get all hook IDs */
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;AAExE,0BAA0B;AAC1B,eAAO,MAAM,KAAK,EAAE,IAAI,EAwBvB,CAAC;AAEF,2BAA2B;AAC3B,wBAAgB,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAEpD;AAED,2CAA2C;AAC3C,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,EAAE,CAEzD;AAED,uBAAuB;AACvB,wBAAgB,UAAU,IAAI,MAAM,EAAE,CAErC;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,GACvB,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"}
@@ -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
- /** Get all hook IDs */
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
@@ -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;AAExE,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;CACvB,CAAC;AAEF,2BAA2B;AAC3B,MAAM,UAAU,OAAO,CAAC,EAAU;IAChC,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;AAC9C,CAAC;AAED,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,uBAAuB;AACvB,MAAM,UAAU,UAAU;IACxB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACtC,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,GACvB,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, getHook, getHooksForFile, getHookIds, } from './checks/index.js';
7
+ export { hooks, getHooksForFile, } from './checks/index.js';
8
8
  export { vibeCheck } from './cli.js';
9
9
  //# sourceMappingURL=index.d.ts.map
@@ -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,OAAO,EACP,eAAe,EACf,UAAU,GACX,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC"}
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, getHook, getHooksForFile, getHookIds, } from './checks/index.js';
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,OAAO,EACP,eAAe,EACf,UAAU,GACX,MAAM,mBAAmB,CAAC;AAE3B,6BAA6B;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC"}
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.19.0",
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
  },