agent-gauntlet 0.12.0 → 0.13.1

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.
@@ -346,11 +346,60 @@ entry_points:
346
346
  - docs-review
347
347
  ```
348
348
 
349
+ ### Wildcard Entry Points (Monorepos)
350
+
351
+ Use a single-level wildcard (`*`) to expand one entry point into one job per changed subdirectory. This is ideal for monorepos where each package has the same toolchain:
352
+
353
+ ```yaml
354
+ entry_points:
355
+ # Root: project-wide checks
356
+ - path: "."
357
+ checks:
358
+ - security-deps
359
+ reviews:
360
+ - code-quality
361
+
362
+ # Per-package: expands to one job per changed package
363
+ - path: "packages/*"
364
+ checks:
365
+ - build
366
+ - lint
367
+ - typecheck
368
+ - test
369
+ ```
370
+
371
+ Check commands run with the working directory set to the matched package (e.g., `packages/api`), so a single `test.yml` works for all packages sharing the same test runner.
372
+
373
+ ### Split Project Entry Points
374
+
375
+ For projects with distinct parts (e.g., frontend + backend) that may use different toolchains:
376
+
377
+ ```yaml
378
+ entry_points:
379
+ - path: "frontend"
380
+ checks:
381
+ - build
382
+ - lint-frontend
383
+ - test-frontend
384
+ reviews:
385
+ - code-quality
386
+
387
+ - path: "backend"
388
+ checks:
389
+ - build-backend
390
+ - lint-backend
391
+ - test-backend
392
+ reviews:
393
+ - code-quality
394
+ ```
395
+
396
+ When parts share the same command for a category (e.g., both run `npm test`), use one shared check file — the working directory is set per entry point at runtime. When they use different commands, create separate check files with a suffix (e.g., `test-frontend.yml`, `test-backend.yml`).
397
+
349
398
  ### Fields
350
399
 
351
400
  | Field | Type | Required | Description |
352
401
  |-------|------|----------|-------------|
353
- | `path` | string | Yes | Directory path to monitor. Relative to project root. |
402
+ | `path` | string | Yes | Directory path to monitor. Relative to project root. Supports single-level wildcards (e.g., `packages/*`). |
354
403
  | `checks` | string[] | No | List of check names matching `.gauntlet/checks/<name>.yml` files. |
355
404
  | `reviews` | string[] | No | List of review names matching `.gauntlet/reviews/<name>.yml` or `.md` files. |
356
405
  | `exclude` | string[] | No | Glob patterns for files to exclude from change detection within this path. |
@@ -0,0 +1,153 @@
1
+ # Multi-Project Entry Point Guide
2
+
3
+ Reference for configuring entry points in monorepos and split projects. Only read this file if the project was classified as **monorepo** or **split project** in Step 3 of the setup skill.
4
+
5
+ ---
6
+
7
+ ## Entry Point Proposals
8
+
9
+ ### Monorepo
10
+
11
+ Use a wildcard entry point for packages plus a root entry point for project-wide checks:
12
+
13
+ ```yaml
14
+ entry_points:
15
+ # Root: project-wide checks (security audits, etc.)
16
+ - path: "."
17
+ checks:
18
+ - security-deps
19
+ reviews:
20
+ - code-quality
21
+
22
+ # Per-package: expands to one job per changed package
23
+ - path: "packages/*" # or apps/*, services/*
24
+ checks:
25
+ - build
26
+ - lint
27
+ - typecheck
28
+ - test
29
+ ```
30
+
31
+ **How wildcards work:** `packages/*` automatically expands at runtime to one job per changed package. Check commands run with the working directory set to the matched package (e.g., `packages/api`), so `npm test` runs inside that specific package. A single `test.yml` check file works for all packages sharing the same test runner.
32
+
33
+ ### Split project — different toolchains (e.g., frontend + backend)
34
+
35
+ Separate entry point for each logical part:
36
+
37
+ ```yaml
38
+ entry_points:
39
+ - path: "frontend"
40
+ checks:
41
+ - build
42
+ - lint
43
+ - test
44
+ reviews:
45
+ - code-quality
46
+
47
+ - path: "backend"
48
+ checks:
49
+ - build
50
+ - lint
51
+ - test
52
+ reviews:
53
+ - code-quality
54
+ ```
55
+
56
+ Each entry point runs checks from within its own directory. If both parts use the same toolchain, they can share check files. If they use different toolchains, create separate check files (see "Check file naming" below).
57
+
58
+ ### Split project — same language (e.g., multiple apps or libs)
59
+
60
+ When multiple apps or libraries share the same language and toolchain under a common parent, use a wildcard entry point:
61
+
62
+ ```yaml
63
+ entry_points:
64
+ - path: "apps/*"
65
+ checks:
66
+ - build
67
+ - lint
68
+ - test
69
+ reviews:
70
+ - code-quality
71
+ ```
72
+
73
+ This works the same as monorepo wildcards — each changed subdirectory gets its own job with the working directory set accordingly. Combine with a root entry point if there are project-wide checks (security, etc.).
74
+
75
+ ---
76
+
77
+ ## Proposing entry points
78
+
79
+ Present the proposed layout and ask the user to confirm or adjust. They may want to:
80
+ - Change directory paths
81
+ - Add or remove entry points
82
+ - Split a wildcard into individual entry points (or vice versa)
83
+ - Add exclusion patterns
84
+
85
+ ---
86
+
87
+ ## Scanning for tooling
88
+
89
+ **Split project:** Scan within each entry point's directory independently — different parts may use different tools.
90
+
91
+ **Monorepo with wildcard:** Scan one representative package (the first found, or ask the user which). Also scan the project root for root-level tools (security auditing, etc.).
92
+
93
+ ---
94
+
95
+ ## Presenting findings
96
+
97
+ Group findings by entry point:
98
+
99
+ **Split project (different toolchains):**
100
+
101
+ ```
102
+ Entry point: frontend/
103
+ Category | Tool | Command | Confidence
104
+ -----------|------------|--------------------|----------
105
+ Build | Vite | npm run build | High
106
+ Lint | ESLint | npx eslint . | High
107
+ Test | Vitest | npx vitest run | High
108
+
109
+ Entry point: backend/
110
+ Category | Tool | Command | Confidence
111
+ -----------|------------|--------------------|----------
112
+ Build | Go | go build ./... | High
113
+ Lint | golangci | golangci-lint run | High
114
+ Test | Go | go test ./... | High
115
+ ```
116
+
117
+ **Monorepo (shared toolchain):**
118
+
119
+ ```
120
+ Entry point: . (root)
121
+ Category | Tool | Command | Confidence
122
+ ----------------|------------|----------------------------------|-----------
123
+ Security (deps) | npm audit | npm audit --audit-level=moderate | Medium
124
+
125
+ Entry point: packages/* (scanned: packages/core)
126
+ Category | Tool | Command | Confidence
127
+ -----------|------------|-------------------|----------
128
+ Build | TypeScript | npm run build | High
129
+ Lint | Biome | npx biome check . | High
130
+ Test | Vitest | npx vitest run | High
131
+ ```
132
+
133
+ When confirming, also ask the user whether the entry point assignments look correct.
134
+
135
+ ---
136
+
137
+ ## Check file naming
138
+
139
+ **Shared** — Multiple entry points use the same command for a category (e.g., both run `npm test`). Create one check file (`test.yml`). The working directory is set per entry point at runtime.
140
+
141
+ **Separate** — Entry points use different commands (e.g., frontend runs `npx vitest run`, backend runs `go test ./...`). Create suffixed files:
142
+ - `test-frontend.yml` — `npx vitest run`
143
+ - `test-backend.yml` — `go test ./...`
144
+
145
+ Monorepo wildcard entry points typically use shared check files since all packages share the same toolchain.
146
+
147
+ ---
148
+
149
+ ## Updating entry_points
150
+
151
+ For multi-entry-point fresh setups, attach `code-quality` review to the entry point covering primary source code (the wildcard or main project entry point, not the root).
152
+
153
+ When adding checks/reviews to an existing multi-entry-point config, ask the user which entry point(s) to attach to.
@@ -8,7 +8,7 @@ allowed-tools: Bash, Read, Glob, Grep, Write, Edit
8
8
 
9
9
  Scan the project to discover tooling and configure checks and reviews for agent-gauntlet.
10
10
 
11
- Before starting, read the `references/check-catalog.md` file for check category details, YAML schemas, and example configurations.
11
+ Before starting, read `references/check-catalog.md` for check category details, YAML schemas, and example configurations.
12
12
 
13
13
  ## Step 1: Check config exists
14
14
 
@@ -18,14 +18,14 @@ Read `.gauntlet/config.yml`. If the file does not exist, tell the user to run `a
18
18
 
19
19
  Read the `entry_points` field from `.gauntlet/config.yml`.
20
20
 
21
- **If `entry_points` is empty (`[]`):** This is a fresh setup. Proceed to Step 3 (full scan).
21
+ **If `entry_points` is empty (`[]`):** This is a fresh setup. Proceed to Step 3 (detect project structure).
22
22
 
23
23
  **If `entry_points` is populated:** Show the user a summary of the current configuration:
24
24
  - List each entry point with its `path`, `checks`, and `reviews`
25
25
  - Then ask the user which action to take:
26
26
 
27
27
  1. **Add checks** — Scan for tools not already configured. Proceed to Step 3, but filter out any checks that already appear in `entry_points`.
28
- 2. **Add custom** — User describes what they want to add. Skip to Step 6.
28
+ 2. **Add custom** — User describes what they want to add. Skip to Step 7.
29
29
  3. **Reconfigure** — Start fresh. Back up existing files first:
30
30
  - Rename each `.gauntlet/checks/*.yml` file to `.yml.bak` (overwrite any previous `.bak` files)
31
31
  - Rename each custom `.gauntlet/reviews/*.md` file to `.md.bak` (overwrite any previous `.bak` files)
@@ -33,58 +33,62 @@ Read the `entry_points` field from `.gauntlet/config.yml`.
33
33
  - Clear `entry_points` to `[]` in `config.yml`
34
34
  - Proceed to Step 3
35
35
 
36
- ## Step 3: Scan the project
36
+ ## Step 3: Detect project structure
37
37
 
38
- Scan the project for tooling signals across 6 check categories:
38
+ Scan for signals to classify the project as **monorepo**, **split project**, or **single project**.
39
39
 
40
- ### Categories to scan
40
+ ### Monorepo signals
41
41
 
42
- 1. **Build** Build scripts, compiled languages (npm run build, cargo build, go build, make, gradle build, mvn package, etc.)
43
- 2. **Lint** — Linters, formatters (eslint, biome, prettier, ruff, golangci-lint, clippy, checkstyle, etc.)
44
- 3. **Typecheck** — Static type checkers (tsc --noEmit, mypy, pyright, etc.)
45
- 4. **Test** Test runners, test directories (jest, vitest, pytest, go test, cargo test, mvn test, etc.)
46
- 5. **Security (deps)** Dependency audit tools (npm audit, pip-audit, cargo audit, etc.)
47
- 6. **Security (code)** — Static analysis / SAST tools (semgrep, bandit, gosec, etc.)
42
+ - `package.json` with a `workspaces` field
43
+ - `pnpm-workspace.yaml`
44
+ - `lerna.json`, `nx.json`, `turbo.json`
45
+ - `Cargo.toml` with a `[workspace]` section
46
+ - Multiple subdirectories under `packages/`, `apps/`, or `services/` each containing their own project manifest (`package.json`, `go.mod`, `Cargo.toml`, `pyproject.toml`)
48
47
 
49
- ### Signals to look for
48
+ ### Split project signals
50
49
 
51
- Scan these files for tooling evidence:
52
- - `package.json` Check `scripts` (build, lint, test, typecheck, format, etc.) and `devDependencies` (eslint, biome, jest, vitest, typescript, prettier, semgrep, etc.)
53
- - `Makefile`, `Taskfile.yml`, `justfile` — Look for targets matching check categories
54
- - `Cargo.toml` — Rust project (cargo build, cargo test, cargo clippy, cargo audit)
55
- - `pyproject.toml`, `setup.py`, `setup.cfg` — Python project; check for tool configs (ruff, mypy, pytest, bandit, pip-audit)
56
- - `go.mod` — Go project (go build, go test, golangci-lint, gosec)
57
- - `build.gradle`, `build.gradle.kts`, `pom.xml` — Java/Kotlin project (gradle build, mvn package)
58
- - Config files that confirm tool presence:
59
- - `.eslintrc`, `.eslintrc.js`, `.eslintrc.json`, `.eslintrc.yml`, `eslint.config.js`, `eslint.config.mjs` — ESLint
60
- - `biome.json`, `biome.jsonc` — Biome
61
- - `ruff.toml`, `.ruff.toml` — Ruff
62
- - `.golangci.yml`, `.golangci.yaml` — golangci-lint
63
- - `tsconfig.json` — TypeScript (typecheck)
64
- - `.prettierrc`, `.prettierrc.js`, `.prettierrc.json`, `.prettierrc.yml`, `prettier.config.js` — Prettier
65
- - `jest.config.js`, `jest.config.ts`, `jest.config.mjs` — Jest
66
- - `vitest.config.js`, `vitest.config.ts`, `vitest.config.mjs` — Vitest
67
- - `pytest.ini`, `conftest.py` — Pytest
68
- - `.semgrep.yml`, `.semgrep.yaml` — Semgrep
69
- - `.github/workflows/*.yml` — CI workflow files often reveal exact commands for build, lint, test, etc.
50
+ - `frontend/` + `backend/` (or `client/` + `server/`, `web/` + `api/`) directories each containing source code and/or their own project manifest
51
+ - Multiple apps or libraries of the same language under a common parent directory (e.g., `apps/web/`, `apps/api/`, `apps/worker/` each with their own source and config) — suggests a wildcard entry point like `apps/*`
70
52
 
71
- **For the "add checks" path:** After scanning, filter out any checks that are already configured in the current `entry_points`.
53
+ ### Single project signals
72
54
 
73
- **If no tools are discovered:** Inform the user that no tools were automatically detected and offer the custom addition flow (skip to Step 6). Still include `code-quality` review in `entry_points`.
55
+ - `src/` or `lib/` as sole source directory, or source files at project root
56
+ - No monorepo or split project signals found
74
57
 
75
- ## Step 4: Present findings
58
+ **If monorepo or split project:** Read `references/project-structure.md` for detailed multi-project entry point guidance, then follow it for Steps 4 through 8. The rest of this file covers the single-project flow.
59
+
60
+ **If single project:** Tell the user what you detected and continue below.
61
+
62
+ ## Step 4: Determine entry point path
63
+
64
+ Infer the source directory:
65
+ - If `src/` exists and contains source code, suggest `src`
66
+ - If `lib/` exists and contains source code, suggest `lib`
67
+ - Otherwise suggest `.` (project root — safer default since it captures all changes)
68
+
69
+ **Skip this step** if adding checks to an existing entry point that already has a path.
70
+
71
+ ## Step 5: Scan for tooling
72
+
73
+ Scan the project for tooling signals across the 6 check categories listed in `references/check-catalog.md`.
74
+
75
+ **For the "add checks" path:** Filter out checks already configured in `entry_points`.
76
+
77
+ **If no tools discovered:** Offer the custom flow (skip to Step 7). Still include `code-quality` review.
78
+
79
+ ## Step 6: Present findings and confirm
76
80
 
77
81
  Show a table of discovered checks:
78
82
 
79
83
  ```
80
- Category | Tool | Command | Confidence
81
- ----------------|-----------------|---------------------------------|-----------
82
- Build | npm | npm run build | High
83
- Lint | ESLint | npx eslint . | High
84
- Typecheck | TypeScript | npx tsc --noEmit | High
85
- Test | Jest | npx jest | High
86
- Security (deps) | npm audit | npm audit --audit-level=moderate| Medium
87
- Security (code) | Semgrep | semgrep scan --config auto --error .| Medium
84
+ Category | Tool | Command | Confidence
85
+ ----------------|-----------------|--------------------------------------|-----------
86
+ Build | npm | npm run build | High
87
+ Lint | ESLint | npx eslint . | High
88
+ Typecheck | TypeScript | npx tsc --noEmit | High
89
+ Test | Jest | npx jest | High
90
+ Security (deps) | npm audit | npm audit --audit-level=moderate | Medium
91
+ Security (code) | Semgrep | semgrep scan --config auto --error . | Medium
88
92
  ```
89
93
 
90
94
  **Confidence levels:**
@@ -94,78 +98,32 @@ Security (code) | Semgrep | semgrep scan --config auto --error .| Medium
94
98
 
95
99
  If a category has no discovered tool, show `(not found)` with `—` for command and confidence.
96
100
 
97
- ## Step 5: Ask user to confirm
98
-
99
101
  Ask the user:
100
- 1. Which of the discovered checks to enable (default: all)
101
- 2. Whether any commands need adjustment (e.g., different flags, different paths)
102
+ 1. Which checks to enable (default: all)
103
+ 2. Whether any commands need adjustment
102
104
 
103
- If the user declines ALL discovered checks, still include the `code-quality` review in `entry_points` and offer the custom addition flow (proceed to Step 6).
105
+ If the user declines ALL checks, still include `code-quality` review and offer the custom flow (Step 7).
104
106
 
105
107
  After confirmation, proceed to Step 8 (create files).
106
108
 
107
- ## Step 6: Add custom
109
+ ## Step 7: Add custom
108
110
 
109
- Ask the user:
110
- - Is it a **check** (shell command that passes/fails) or a **review** (AI code review)?
111
+ Ask the user: **check** (shell command) or **review** (AI code review)?
111
112
 
112
- **For checks:**
113
- - Ask: What command should be run?
114
- - Ask: What name for this check? (used as the filename, e.g., `my-check` creates `.gauntlet/checks/my-check.yml`)
115
- - Ask: Which entry point path should it be attached to?
116
- - Ask: Any special settings? (timeout, parallel, run_in_ci, run_locally — explain defaults)
113
+ **For checks:** Ask for command, name, and optional settings (timeout, parallel, run_in_ci, run_locally).
117
114
 
118
- **For reviews:**
119
- - Ask: Use the built-in `code-quality` review or write a custom review prompt?
120
- - If built-in: What name? (creates `.gauntlet/reviews/<name>.yml` with `builtin: code-quality`)
121
- - If custom: What name? What should the review focus on? Write the review prompt.
122
- - Creates `.gauntlet/reviews/<name>.md` with YAML frontmatter (`num_reviews: 1`) and the review prompt as Markdown content.
115
+ **For reviews:** Built-in (`code-quality`) or custom prompt? Ask for name and write the review content.
123
116
 
124
- ## Step 7: Determine source directory
117
+ ## Step 8: Create files and update config
125
118
 
126
- Ask the user for the source directory for the entry point `path` field (e.g., `src/`, `.`, `lib/`), or infer it from project structure:
127
- - If `src/` directory exists and contains source code, suggest `src`
128
- - If `lib/` directory exists and contains source code, suggest `lib`
129
- - Otherwise suggest `.` (project root)
119
+ **Checks** Create `.gauntlet/checks/<name>.yml` with `command`, `parallel: true`, `run_in_ci: true`, `run_locally: true`. Add optional fields only when specified. See `references/check-catalog.md` for schema.
130
120
 
131
- **Skip this step** if adding checks to an existing entry point that already has a path (the "add checks" or "add custom" paths with a pre-existing entry point).
121
+ **Custom reviews** Create `.gauntlet/reviews/<name>.md` with YAML frontmatter (`num_reviews: 1`) and review prompt.
132
122
 
133
- ## Step 8: Create check/review files
123
+ **Built-in reviews** Create `.gauntlet/reviews/<name>.yml` with `builtin: code-quality` and `num_reviews: 1`.
134
124
 
135
- For each confirmed item, create the appropriate file:
125
+ **Update entry_points** in `.gauntlet/config.yml`:
136
126
 
137
- **Checks** — Create `.gauntlet/checks/<name>.yml`:
138
- ```yaml
139
- command: <the command>
140
- parallel: true
141
- run_in_ci: true
142
- run_locally: true
143
- ```
144
-
145
- Add optional fields only when the user specified them (timeout, working_directory, rerun_command, etc.). Refer to `references/check-catalog.md` for the full schema.
146
-
147
- **Custom reviews** — Create `.gauntlet/reviews/<name>.md`:
148
- ```markdown
149
- ---
150
- num_reviews: 1
151
- ---
152
-
153
- # <Review Name>
154
-
155
- <The review prompt content>
156
- ```
157
-
158
- **Built-in reviews** — Create `.gauntlet/reviews/<name>.yml`:
159
- ```yaml
160
- builtin: code-quality
161
- num_reviews: 1
162
- ```
163
-
164
- ## Step 9: Update entry_points
165
-
166
- Edit `.gauntlet/config.yml` to update the `entry_points` section:
167
-
168
- **Fresh setup (was `entry_points: []`):**
169
127
  ```yaml
170
128
  entry_points:
171
129
  - path: "<source_dir>"
@@ -176,34 +134,16 @@ entry_points:
176
134
  - code-quality
177
135
  ```
178
136
 
179
- Always include `code-quality` in the `reviews` list for fresh setups, regardless of what checks the user selected.
180
-
181
- **Add checks / Add custom (existing entry points):**
182
- - Append new check names to the appropriate entry point's `checks` list
183
- - Append new review names to the appropriate entry point's `reviews` list
184
- - If the check/review should go on a new entry point (different path), add a new entry point
185
-
186
- ## Step 10: "Add something else?"
187
-
188
- Ask the user: "Would you like to add another check or review?"
189
- - If **yes**: loop back to Step 6 (add custom)
190
- - If **no**: proceed to Step 11
137
+ Always include `code-quality` in `reviews` for fresh setups. For "add checks" / "add custom": append to the appropriate entry point's lists, or add a new entry point if needed.
191
138
 
192
- ## Step 11: Validate
139
+ ## Step 9: "Add something else?"
193
140
 
194
- Run `agent-gauntlet validate` to verify the configuration is valid.
141
+ Ask the user. If yes, loop to Step 7. If no, proceed.
195
142
 
196
- **If validation passes:** proceed to Step 12.
143
+ ## Step 10: Validate
197
144
 
198
- **If validation fails:**
199
- 1. Display the validation errors to the user
200
- 2. Apply one corrective attempt — fix the issue based on the error message (e.g., fix a typo in a YAML file, correct a missing field, fix an entry_points reference to a non-existent check)
201
- 3. Run `agent-gauntlet validate` again
202
- 4. If it still fails: **STOP** and ask the user for guidance. Do not attempt further automatic fixes.
145
+ Run `agent-gauntlet validate`. If it fails, apply one corrective attempt and re-validate. If it still fails, **STOP** and ask the user.
203
146
 
204
- ## Step 12: Suggest next steps
147
+ ## Step 11: Suggest next steps
205
148
 
206
- Tell the user:
207
- - Configuration is complete and validated
208
- - They can now run `/gauntlet-run` to execute the full verification suite
209
- - They can run `/gauntlet-setup` again at any time to add more checks or reconfigure
149
+ Tell the user: configuration is complete. Run `/gauntlet-run` to execute, or `/gauntlet-setup` again to add more.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-gauntlet",
3
- "version": "0.12.0",
3
+ "version": "0.13.1",
4
4
  "description": "A CLI tool for testing AI coding agents",
5
5
  "license": "Apache-2.0",
6
6
  "author": "Paul Caplan",