awguard 1.5.0 → 1.6.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/CHANGELOG.md +8 -0
- package/Dockerfile +8 -0
- package/README.md +57 -1
- package/action.yml +2 -2
- package/docs/assets/terminal-demo.svg +19 -0
- package/docs/comparison.md +23 -0
- package/docs/launch-plan.md +23 -15
- package/docs/market-analysis.md +3 -1
- package/docs/marketplace-listing.md +40 -0
- package/docs/roadmap.md +10 -6
- package/docs/site/index.html +251 -0
- package/examples/.gitlab-ci.yml +6 -0
- package/examples/.vscode/tasks.json +17 -0
- package/examples/README.md +4 -0
- package/examples/awguard.config.example.json +6 -0
- package/examples/lab/README.md +27 -0
- package/examples/lab/fixed/.github/workflows/ai-triage.yml +20 -0
- package/examples/lab/fixed/.mcp.json +12 -0
- package/examples/lab/fixed/AGENTS.md +5 -0
- package/examples/lab/unsafe/.github/workflows/ai-triage.yml +16 -0
- package/examples/lab/unsafe/.mcp.json +11 -0
- package/examples/lab/unsafe/AGENTS.md +4 -0
- package/examples/pre-commit-config.yaml +8 -0
- package/package.json +2 -1
- package/src/cli.js +36 -2
- package/src/compare.js +110 -0
- package/src/config.js +29 -2
- package/src/graph.js +6 -1
- package/src/init.js +81 -0
- package/src/inventory.js +11 -0
- package/src/migration.js +10 -0
- package/src/presets.js +2 -1
- package/src/remediation.js +19 -0
- package/src/reporters.js +6 -2
- package/src/scanner.js +91 -5
- package/src/score.js +3 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.6.0
|
|
4
|
+
|
|
5
|
+
- Add `awguard init` to print starter GitHub Action, strict config, baseline, report, and badge setup snippets.
|
|
6
|
+
- Add `--format inventory-json` for machine-readable agentic surface inventories.
|
|
7
|
+
- Add `--compare previous.json current.json` for introduced/resolved finding and file drift reports.
|
|
8
|
+
- Add policy allowlists with `AWG015` for unapproved files, MCP servers, packages, or commands.
|
|
9
|
+
- Add Docker, GitLab CI, pre-commit, VS Code task, Marketplace, comparison, demo, and vulnerable lab assets.
|
|
10
|
+
|
|
3
11
|
## 1.5.0
|
|
4
12
|
|
|
5
13
|
- Add `--format inventory` to map agentic repository surfaces by workflows, agent context files, and MCP configs.
|
package/Dockerfile
ADDED
package/README.md
CHANGED
|
@@ -5,8 +5,11 @@
|
|
|
5
5
|
[](https://github.com/Mughal-Baig/agentic-workflow-guard/releases)
|
|
6
6
|
[](https://www.npmjs.com/package/awguard)
|
|
7
7
|
[](docs/awguard-badge.json)
|
|
8
|
+
[](https://mughal-baig.github.io/agentic-workflow-guard/)
|
|
8
9
|
[](LICENSE)
|
|
9
10
|
|
|
11
|
+

|
|
12
|
+
|
|
10
13
|
`agentic-workflow-guard` is a small, zero-dependency scanner for GitHub Actions workflows, persistent agent instruction files, and MCP configs used by AI coding agents, LLMs, or automated review bots.
|
|
11
14
|
|
|
12
15
|
It looks for a new class of CI/CD risk: untrusted issue, pull request, comment, or branch text flowing into an AI agent prompt, then into write-capable tools, secrets, shell scripts, persistent instructions that weaken review boundaries, or MCP servers that expand agent authority.
|
|
@@ -42,6 +45,12 @@ Install from npm:
|
|
|
42
45
|
npx awguard .
|
|
43
46
|
```
|
|
44
47
|
|
|
48
|
+
Generate a starter config, GitHub Action, baseline command, and badge snippet:
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
npx awguard init
|
|
52
|
+
```
|
|
53
|
+
|
|
45
54
|
## Use In GitHub Actions
|
|
46
55
|
|
|
47
56
|
After you upload this repository to GitHub, users can add:
|
|
@@ -113,7 +122,9 @@ jobs:
|
|
|
113
122
|
## CLI
|
|
114
123
|
|
|
115
124
|
```bash
|
|
116
|
-
awguard [path] [--config file] [--preset name] [--format text|json|markdown|github|sarif|graph|html|migration|score|badge|inventory] [--output file] [--baseline file] [--write-baseline file] [--fix-dry-run] [--fail-on none|low|medium|high|critical]
|
|
125
|
+
awguard [path] [--config file] [--preset name] [--format text|json|markdown|github|sarif|graph|html|migration|score|badge|inventory|inventory-json] [--output file] [--baseline file] [--write-baseline file] [--fix-dry-run] [--fail-on none|low|medium|high|critical]
|
|
126
|
+
awguard init
|
|
127
|
+
awguard --compare previous.json current.json
|
|
117
128
|
```
|
|
118
129
|
|
|
119
130
|
Examples:
|
|
@@ -125,6 +136,7 @@ node ./bin/awguard.js . --preset strict --format graph
|
|
|
125
136
|
node ./bin/awguard.js . --format html --output awguard-report.html
|
|
126
137
|
node ./bin/awguard.js . --format migration --output awguard-migration.md
|
|
127
138
|
node ./bin/awguard.js . --format inventory
|
|
139
|
+
node ./bin/awguard.js . --format inventory-json --output awguard-inventory.json
|
|
128
140
|
node ./bin/awguard.js . --format score
|
|
129
141
|
node ./bin/awguard.js . --format badge --output awguard-badge.json
|
|
130
142
|
node ./bin/awguard.js . --fix-dry-run
|
|
@@ -132,6 +144,7 @@ node ./bin/awguard.js . --format markdown --fail-on medium
|
|
|
132
144
|
node ./bin/awguard.js . --format sarif --output awguard.sarif --fail-on none
|
|
133
145
|
node ./bin/awguard.js . --write-baseline awguard.baseline.json
|
|
134
146
|
node ./bin/awguard.js . --baseline awguard.baseline.json --fail-on high
|
|
147
|
+
node ./bin/awguard.js --compare old-awguard.json new-awguard.json
|
|
135
148
|
node ./bin/awguard.js . --format github --fail-on high
|
|
136
149
|
```
|
|
137
150
|
|
|
@@ -252,6 +265,40 @@ node ./bin/awguard.js . --format inventory
|
|
|
252
265
|
|
|
253
266
|
The inventory groups scanned files into GitHub Actions workflows, persistent agent context files, and MCP configs. It shows which surfaces exist, which rules fired, and what to review next. This is useful before a team enables new coding agents because it answers: "Where can agents read instructions, get tools, or act in CI?"
|
|
254
267
|
|
|
268
|
+
For dashboards, use JSON:
|
|
269
|
+
|
|
270
|
+
```bash
|
|
271
|
+
node ./bin/awguard.js . --format inventory-json --output awguard-inventory.json
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
## Compare Reports
|
|
275
|
+
|
|
276
|
+
Track newly introduced agentic risk across branches or releases:
|
|
277
|
+
|
|
278
|
+
```bash
|
|
279
|
+
node ./bin/awguard.js . --format json --output current-awguard.json
|
|
280
|
+
node ./bin/awguard.js --compare previous-awguard.json current-awguard.json
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
The comparison report shows introduced findings, resolved findings, added scanned files, and removed scanned files.
|
|
284
|
+
|
|
285
|
+
## Policy Mode
|
|
286
|
+
|
|
287
|
+
Policy mode makes new agent surfaces visible during review. Add allowlists to `awguard.config.json`:
|
|
288
|
+
|
|
289
|
+
```json
|
|
290
|
+
{
|
|
291
|
+
"policy": {
|
|
292
|
+
"approvedFiles": ["AGENTS.md", ".github/workflows/*"],
|
|
293
|
+
"approvedMcpServers": ["github"],
|
|
294
|
+
"approvedMcpPackages": ["@modelcontextprotocol/server-github@1.2.3"],
|
|
295
|
+
"approvedMcpCommands": ["npx", "node"]
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
Anything outside the policy is reported as `AWG015`.
|
|
301
|
+
|
|
255
302
|
## Agent Context Guard
|
|
256
303
|
|
|
257
304
|
AWGuard also scans persistent agent instruction files:
|
|
@@ -327,6 +374,11 @@ If you omit rule ids, the suppression applies to all findings on the target line
|
|
|
327
374
|
| AWG012 | High/Critical | Agent instruction files that weaken approval, permission, or secret boundaries |
|
|
328
375
|
| AWG013 | High | MCP configs that start mutable packages, unpinned containers, or shell wrappers |
|
|
329
376
|
| AWG014 | Critical | MCP configs that hardcode secrets, tokens, passwords, or auth headers |
|
|
377
|
+
| AWG015 | Medium | Agentic surfaces, MCP servers, packages, or commands not approved by policy |
|
|
378
|
+
|
|
379
|
+
## How It Compares
|
|
380
|
+
|
|
381
|
+
See [docs/comparison.md](docs/comparison.md) for how AWGuard fits beside `zizmor`, `actionlint`, OpenSSF Scorecard, secret scanners, and MCP runtime scanners.
|
|
330
382
|
|
|
331
383
|
## Example Finding
|
|
332
384
|
|
|
@@ -351,6 +403,10 @@ If you omit rule ids, the suppression applies to all findings on the target line
|
|
|
351
403
|
- Rule packs for Claude Code, Codex, Gemini, Copilot, Aider, and custom agents.
|
|
352
404
|
- Public vulnerable workflow lab with attack and fix walkthroughs.
|
|
353
405
|
|
|
406
|
+
## Contributing And Security
|
|
407
|
+
|
|
408
|
+
Contributions are welcome. Start with [CONTRIBUTING.md](CONTRIBUTING.md), and report sensitive security issues using [SECURITY.md](SECURITY.md).
|
|
409
|
+
|
|
354
410
|
## Research Backing
|
|
355
411
|
|
|
356
412
|
See [docs/market-analysis.md](docs/market-analysis.md) for the demand analysis, gap, audience, and launch plan.
|
package/action.yml
CHANGED
|
@@ -7,7 +7,7 @@ inputs:
|
|
|
7
7
|
required: false
|
|
8
8
|
default: .
|
|
9
9
|
format:
|
|
10
|
-
description: Output format: github, text, json, markdown, sarif, graph, html, migration, score, badge, or inventory.
|
|
10
|
+
description: Output format: github, text, json, markdown, sarif, graph, html, migration, score, badge, inventory, or inventory-json.
|
|
11
11
|
required: false
|
|
12
12
|
default: github
|
|
13
13
|
fail-on:
|
|
@@ -15,7 +15,7 @@ inputs:
|
|
|
15
15
|
required: false
|
|
16
16
|
default: high
|
|
17
17
|
output:
|
|
18
|
-
description: Optional file path for json, markdown, sarif, graph, html, migration, score, or
|
|
18
|
+
description: Optional file path for json, markdown, sarif, graph, html, migration, score, badge, inventory, or inventory-json output.
|
|
19
19
|
required: false
|
|
20
20
|
default: ''
|
|
21
21
|
baseline:
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="920" height="430" viewBox="0 0 920 430" role="img" aria-labelledby="title desc">
|
|
2
|
+
<title id="title">Agentic Workflow Guard terminal demo</title>
|
|
3
|
+
<desc id="desc">A terminal-style screenshot showing AWGuard inventory and MCP findings.</desc>
|
|
4
|
+
<rect width="920" height="430" rx="10" fill="#101820"/>
|
|
5
|
+
<rect x="0" y="0" width="920" height="42" rx="10" fill="#17242f"/>
|
|
6
|
+
<circle cx="24" cy="21" r="6" fill="#ff5f57"/>
|
|
7
|
+
<circle cx="44" cy="21" r="6" fill="#ffbd2e"/>
|
|
8
|
+
<circle cx="64" cy="21" r="6" fill="#28c840"/>
|
|
9
|
+
<text x="88" y="27" fill="#d8e6ee" font-family="Menlo, Consolas, monospace" font-size="14">awguard demo</text>
|
|
10
|
+
<text x="28" y="78" fill="#7dd3fc" font-family="Menlo, Consolas, monospace" font-size="16">$ npx awguard . --format inventory</text>
|
|
11
|
+
<text x="28" y="118" fill="#e7f4f2" font-family="Menlo, Consolas, monospace" font-size="16">Agentic Surface Inventory</text>
|
|
12
|
+
<text x="28" y="154" fill="#a7f3d0" font-family="Menlo, Consolas, monospace" font-size="14">✓ GitHub Actions workflows: 2 files, 0 findings</text>
|
|
13
|
+
<text x="28" y="184" fill="#fde68a" font-family="Menlo, Consolas, monospace" font-size="14">! Agent context files: 1 file, AWG012</text>
|
|
14
|
+
<text x="28" y="214" fill="#fca5a5" font-family="Menlo, Consolas, monospace" font-size="14">! MCP configs: 1 file, AWG013, AWG014</text>
|
|
15
|
+
<text x="28" y="260" fill="#7dd3fc" font-family="Menlo, Consolas, monospace" font-size="16">$ npx awguard examples/.mcp.json --fix-dry-run</text>
|
|
16
|
+
<text x="28" y="300" fill="#fca5a5" font-family="Menlo, Consolas, monospace" font-size="14">CRITICAL AWG014 MCP config hardcodes secrets or auth material</text>
|
|
17
|
+
<text x="28" y="330" fill="#fdba74" font-family="Menlo, Consolas, monospace" font-size="14">HIGH AWG013 MCP config starts mutable tool servers</text>
|
|
18
|
+
<text x="28" y="372" fill="#d8e6ee" font-family="Menlo, Consolas, monospace" font-size="14">Fix: pin tool packages, move credentials to prompts/env, and review policy drift.</text>
|
|
19
|
+
</svg>
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# Comparison
|
|
2
|
+
|
|
3
|
+
AWGuard is intentionally narrow. It should sit beside general CI/CD and AI security tools, not replace them.
|
|
4
|
+
|
|
5
|
+
| Tool | Main job | Where AWGuard differs |
|
|
6
|
+
| --- | --- | --- |
|
|
7
|
+
| `zizmor` | General GitHub Actions security analysis | AWGuard focuses on AI-agent prompt, tool, MCP, and repository instruction paths. |
|
|
8
|
+
| `actionlint` | GitHub Actions syntax and workflow linting | AWGuard looks for agentic trust-boundary risk, not YAML correctness. |
|
|
9
|
+
| OpenSSF Scorecard | Open-source project security posture | AWGuard gives an Agentic Workflow Injection score and agent surface inventory. |
|
|
10
|
+
| MCP runtime scanners | Inspect live MCP servers and tool descriptions | AWGuard scans repository MCP configs without executing server commands. |
|
|
11
|
+
| Secret scanners | Find committed secrets | AWGuard connects MCP/agent secret exposure to agent capabilities and remediation. |
|
|
12
|
+
|
|
13
|
+
## Best Stack
|
|
14
|
+
|
|
15
|
+
Use these together:
|
|
16
|
+
|
|
17
|
+
```text
|
|
18
|
+
actionlint -> workflow correctness
|
|
19
|
+
zizmor -> broad GitHub Actions hardening
|
|
20
|
+
OpenSSF Scorecard -> project posture
|
|
21
|
+
secret scanning -> committed credentials
|
|
22
|
+
AWGuard -> agentic workflow, context, and MCP trust boundaries
|
|
23
|
+
```
|
package/docs/launch-plan.md
CHANGED
|
@@ -10,56 +10,64 @@ Short pitch:
|
|
|
10
10
|
|
|
11
11
|
## Star-Worthy Demo
|
|
12
12
|
|
|
13
|
-
1. Show `
|
|
14
|
-
2.
|
|
13
|
+
1. Show the terminal demo image in `docs/assets/terminal-demo.svg`.
|
|
14
|
+
2. Show `examples/unsafe-agent.yml`.
|
|
15
|
+
3. Run:
|
|
15
16
|
|
|
16
17
|
```bash
|
|
17
18
|
node ./bin/awguard.js examples/unsafe-agent.yml --format graph
|
|
18
19
|
```
|
|
19
20
|
|
|
20
|
-
|
|
21
|
-
|
|
21
|
+
4. Show the generated Mermaid chain.
|
|
22
|
+
5. Run:
|
|
22
23
|
|
|
23
24
|
```bash
|
|
24
25
|
node ./bin/awguard.js examples/unsafe-agent.yml --fix-dry-run
|
|
25
26
|
```
|
|
26
27
|
|
|
27
|
-
|
|
28
|
-
|
|
28
|
+
6. Show the safe remediation steps.
|
|
29
|
+
7. Run:
|
|
29
30
|
|
|
30
31
|
```bash
|
|
31
32
|
node ./bin/awguard.js examples/unsafe-agent.yml --format migration
|
|
32
33
|
```
|
|
33
34
|
|
|
34
|
-
|
|
35
|
-
|
|
35
|
+
8. Show the migration from unsafe agent job to read-only proposal job plus safe outputs or an approved apply job.
|
|
36
|
+
9. Run:
|
|
36
37
|
|
|
37
38
|
```bash
|
|
38
39
|
node ./bin/awguard.js . --format score
|
|
39
40
|
```
|
|
40
41
|
|
|
41
|
-
|
|
42
|
-
|
|
42
|
+
10. Show the README badge and say: "Add an AWI risk badge to your repo before adding AI agents to CI."
|
|
43
|
+
11. Run:
|
|
43
44
|
|
|
44
45
|
```bash
|
|
45
46
|
node ./bin/awguard.js . --format inventory
|
|
46
47
|
```
|
|
47
48
|
|
|
48
|
-
|
|
49
|
-
|
|
49
|
+
12. Show the surface map and say: "Before you secure agent workflows, find every place the repository gives agents instructions or tools."
|
|
50
|
+
13. Run:
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
node ./bin/awguard.js init
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
14. Show the one-command setup guide.
|
|
57
|
+
15. Show an unsafe `AGENTS.md` or `.github/copilot-instructions.md` line and run:
|
|
50
58
|
|
|
51
59
|
```bash
|
|
52
60
|
node ./bin/awguard.js . --format text
|
|
53
61
|
```
|
|
54
62
|
|
|
55
|
-
|
|
56
|
-
|
|
63
|
+
16. Explain that AWGuard scans both the workflow and the persistent agent instructions that shape agent behavior.
|
|
64
|
+
17. Show an unsafe `.mcp.json` with `npx @modelcontextprotocol/server-github` and a committed token, then run:
|
|
57
65
|
|
|
58
66
|
```bash
|
|
59
67
|
node ./bin/awguard.js examples/.mcp.json --format text
|
|
60
68
|
```
|
|
61
69
|
|
|
62
|
-
|
|
70
|
+
18. Explain the new hook: "This scanner checks repo-provided MCP tool wiring without executing the MCP server."
|
|
63
71
|
|
|
64
72
|
## Release Checklist
|
|
65
73
|
|
package/docs/market-analysis.md
CHANGED
|
@@ -211,7 +211,9 @@ Agentic Workflow Guard now supports:
|
|
|
211
211
|
|
|
212
212
|
- `--format inventory` for a surface map grouped by workflows, agent context files, and MCP configs.
|
|
213
213
|
- scanning `.github/agents/*.md`, `.github/prompts/*.prompt.md`, and `.github/skills/**/SKILL.md` as persistent agent context.
|
|
214
|
-
-
|
|
214
|
+
- `awguard init` for adoption snippets, `--format inventory-json` for dashboards, and `--compare` for trend reports.
|
|
215
|
+
- first policy allowlists for approved files, MCP servers, MCP packages, and MCP commands.
|
|
216
|
+
- a roadmap that moves toward agent capability SBOMs, richer policy ownership, and hosted monitoring.
|
|
215
217
|
|
|
216
218
|
This widens the project while preserving its niche: AWGuard remains a zero-execution repository scanner for agentic risk, not a broad runtime agent firewall.
|
|
217
219
|
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# GitHub Marketplace Listing Draft
|
|
2
|
+
|
|
3
|
+
## Name
|
|
4
|
+
|
|
5
|
+
Agentic Workflow Guard
|
|
6
|
+
|
|
7
|
+
## Short Description
|
|
8
|
+
|
|
9
|
+
Scan GitHub Actions, agent instruction files, and MCP configs for AI-agent injection risk.
|
|
10
|
+
|
|
11
|
+
## Categories
|
|
12
|
+
|
|
13
|
+
- Security
|
|
14
|
+
- Code quality
|
|
15
|
+
- Utilities
|
|
16
|
+
|
|
17
|
+
## Full Description
|
|
18
|
+
|
|
19
|
+
Agentic Workflow Guard finds where untrusted GitHub issue, pull request, comment, branch, or artifact text can steer AI agents inside CI.
|
|
20
|
+
|
|
21
|
+
It scans:
|
|
22
|
+
|
|
23
|
+
- GitHub Actions workflows;
|
|
24
|
+
- persistent agent instruction files such as `AGENTS.md`, Copilot instructions, custom agents, prompts, and skills;
|
|
25
|
+
- MCP configs such as `.mcp.json`, `.vscode/mcp.json`, Cursor, Windsurf, Cline, and Roo config files.
|
|
26
|
+
|
|
27
|
+
Outputs include GitHub annotations, SARIF for code scanning, attack graphs, migration plans, AWI scorecards, badges, and agentic surface inventory reports.
|
|
28
|
+
|
|
29
|
+
## Example
|
|
30
|
+
|
|
31
|
+
```yaml
|
|
32
|
+
- uses: Mughal-Baig/agentic-workflow-guard@v0
|
|
33
|
+
with:
|
|
34
|
+
preset: strict
|
|
35
|
+
fail-on: high
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Suggested Release Note
|
|
39
|
+
|
|
40
|
+
Use this Action before adding AI agents, custom prompts, or MCP tools to a repository.
|
package/docs/roadmap.md
CHANGED
|
@@ -54,15 +54,19 @@ Current research points:
|
|
|
54
54
|
|
|
55
55
|
### Now
|
|
56
56
|
|
|
57
|
-
-
|
|
58
|
-
-
|
|
59
|
-
-
|
|
57
|
+
- Shipped `--format inventory`.
|
|
58
|
+
- Shipped `--format inventory-json`.
|
|
59
|
+
- Shipped `awguard init`.
|
|
60
|
+
- Shipped `--compare previous.json current.json`.
|
|
61
|
+
- Shipped first policy allowlists with `AWG015`.
|
|
62
|
+
- Expanded `AWG012` coverage to Copilot custom agents, prompts, and skills.
|
|
63
|
+
- Added Docker, GitLab CI, pre-commit, VS Code task, Marketplace, comparison, visual demo, and vulnerable lab assets.
|
|
60
64
|
|
|
61
65
|
### Next
|
|
62
66
|
|
|
63
|
-
- Add
|
|
64
|
-
- Add
|
|
65
|
-
- Add
|
|
67
|
+
- Add agent capability SBOM export for prompts, tools, MCP servers, permissions, and write paths.
|
|
68
|
+
- Add safer patch previews for common workflow permission fixes.
|
|
69
|
+
- Add richer policy ownership fields for approved file owners and review cadence.
|
|
66
70
|
|
|
67
71
|
### Later
|
|
68
72
|
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
6
|
+
<meta
|
|
7
|
+
name="description"
|
|
8
|
+
content="Agentic Workflow Guard maps AI-agent workflow, instruction, and MCP trust boundaries in repositories."
|
|
9
|
+
>
|
|
10
|
+
<title>Agentic Workflow Guard</title>
|
|
11
|
+
<style>
|
|
12
|
+
:root {
|
|
13
|
+
color-scheme: light;
|
|
14
|
+
--ink: #17212b;
|
|
15
|
+
--muted: #5f6e7b;
|
|
16
|
+
--line: #d9e1e8;
|
|
17
|
+
--paper: #f7fafc;
|
|
18
|
+
--panel: #ffffff;
|
|
19
|
+
--accent: #0f766e;
|
|
20
|
+
--accent-strong: #134e4a;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
* {
|
|
24
|
+
box-sizing: border-box;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
body {
|
|
28
|
+
margin: 0;
|
|
29
|
+
background: var(--paper);
|
|
30
|
+
color: var(--ink);
|
|
31
|
+
font-family:
|
|
32
|
+
Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
|
|
33
|
+
line-height: 1.55;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
a {
|
|
37
|
+
color: var(--accent-strong);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
.hero {
|
|
41
|
+
border-bottom: 1px solid var(--line);
|
|
42
|
+
background: var(--panel);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
.wrap {
|
|
46
|
+
width: min(1120px, calc(100% - 40px));
|
|
47
|
+
margin: 0 auto;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
.hero .wrap {
|
|
51
|
+
display: grid;
|
|
52
|
+
grid-template-columns: minmax(0, 1.05fr) minmax(320px, 0.95fr);
|
|
53
|
+
gap: 44px;
|
|
54
|
+
align-items: center;
|
|
55
|
+
min-height: 86vh;
|
|
56
|
+
padding: 64px 0 40px;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
.eyebrow {
|
|
60
|
+
margin: 0 0 14px;
|
|
61
|
+
color: var(--accent);
|
|
62
|
+
font-size: 0.78rem;
|
|
63
|
+
font-weight: 750;
|
|
64
|
+
letter-spacing: 0;
|
|
65
|
+
text-transform: uppercase;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
h1 {
|
|
69
|
+
margin: 0;
|
|
70
|
+
max-width: 820px;
|
|
71
|
+
font-size: clamp(2.45rem, 7vw, 5.6rem);
|
|
72
|
+
line-height: 0.96;
|
|
73
|
+
letter-spacing: 0;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
.lead {
|
|
77
|
+
max-width: 680px;
|
|
78
|
+
margin: 24px 0 0;
|
|
79
|
+
color: var(--muted);
|
|
80
|
+
font-size: 1.18rem;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
.actions {
|
|
84
|
+
display: flex;
|
|
85
|
+
flex-wrap: wrap;
|
|
86
|
+
gap: 12px;
|
|
87
|
+
margin-top: 30px;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
.button {
|
|
91
|
+
display: inline-flex;
|
|
92
|
+
min-height: 44px;
|
|
93
|
+
align-items: center;
|
|
94
|
+
justify-content: center;
|
|
95
|
+
border: 1px solid var(--line);
|
|
96
|
+
border-radius: 8px;
|
|
97
|
+
padding: 10px 15px;
|
|
98
|
+
background: var(--panel);
|
|
99
|
+
color: var(--ink);
|
|
100
|
+
font-weight: 720;
|
|
101
|
+
text-decoration: none;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
.button.primary {
|
|
105
|
+
border-color: var(--accent);
|
|
106
|
+
background: var(--accent);
|
|
107
|
+
color: #ffffff;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
.terminal {
|
|
111
|
+
width: 100%;
|
|
112
|
+
border: 1px solid var(--line);
|
|
113
|
+
border-radius: 8px;
|
|
114
|
+
background: #0c1117;
|
|
115
|
+
box-shadow: 0 18px 45px rgb(23 33 43 / 12%);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
section {
|
|
119
|
+
padding: 46px 0;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
h2 {
|
|
123
|
+
margin: 0 0 18px;
|
|
124
|
+
font-size: 1.35rem;
|
|
125
|
+
letter-spacing: 0;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
.grid {
|
|
129
|
+
display: grid;
|
|
130
|
+
grid-template-columns: repeat(3, minmax(0, 1fr));
|
|
131
|
+
gap: 16px;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
.item {
|
|
135
|
+
min-height: 144px;
|
|
136
|
+
border: 1px solid var(--line);
|
|
137
|
+
border-radius: 8px;
|
|
138
|
+
padding: 18px;
|
|
139
|
+
background: var(--panel);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
.item h3 {
|
|
143
|
+
margin: 0 0 8px;
|
|
144
|
+
font-size: 1rem;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
.item p {
|
|
148
|
+
margin: 0;
|
|
149
|
+
color: var(--muted);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
code {
|
|
153
|
+
border: 1px solid var(--line);
|
|
154
|
+
border-radius: 6px;
|
|
155
|
+
padding: 2px 5px;
|
|
156
|
+
background: #eef4f8;
|
|
157
|
+
font-size: 0.9em;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
footer {
|
|
161
|
+
border-top: 1px solid var(--line);
|
|
162
|
+
padding: 24px 0 34px;
|
|
163
|
+
color: var(--muted);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
@media (max-width: 850px) {
|
|
167
|
+
.hero .wrap {
|
|
168
|
+
grid-template-columns: 1fr;
|
|
169
|
+
gap: 30px;
|
|
170
|
+
min-height: auto;
|
|
171
|
+
padding-top: 46px;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
.grid {
|
|
175
|
+
grid-template-columns: 1fr;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
</style>
|
|
179
|
+
</head>
|
|
180
|
+
<body>
|
|
181
|
+
<main>
|
|
182
|
+
<header class="hero">
|
|
183
|
+
<div class="wrap">
|
|
184
|
+
<div>
|
|
185
|
+
<p class="eyebrow">AI workflow security scanner</p>
|
|
186
|
+
<h1>Agentic Workflow Guard</h1>
|
|
187
|
+
<p class="lead">
|
|
188
|
+
Map every place a repository gives AI agents instructions, tools, secrets, or write power,
|
|
189
|
+
then turn that map into findings, reports, and safer pull request checks.
|
|
190
|
+
</p>
|
|
191
|
+
<div class="actions">
|
|
192
|
+
<a class="button primary" href="https://github.com/Mughal-Baig/agentic-workflow-guard">GitHub</a>
|
|
193
|
+
<a class="button" href="https://www.npmjs.com/package/awguard">npm</a>
|
|
194
|
+
<a class="button" href="https://github.com/Mughal-Baig/agentic-workflow-guard/blob/main/docs/comparison.md">Comparison</a>
|
|
195
|
+
</div>
|
|
196
|
+
</div>
|
|
197
|
+
<img
|
|
198
|
+
class="terminal"
|
|
199
|
+
src="assets/terminal-demo.svg"
|
|
200
|
+
alt="AWGuard terminal demo showing inventory, score, migration, and graph reports"
|
|
201
|
+
>
|
|
202
|
+
</div>
|
|
203
|
+
</header>
|
|
204
|
+
|
|
205
|
+
<section>
|
|
206
|
+
<div class="wrap">
|
|
207
|
+
<h2>What It Scans</h2>
|
|
208
|
+
<div class="grid">
|
|
209
|
+
<article class="item">
|
|
210
|
+
<h3>Agent Instructions</h3>
|
|
211
|
+
<p>Finds AGENTS.md, Copilot instructions, custom agents, prompts, and reusable skills.</p>
|
|
212
|
+
</article>
|
|
213
|
+
<article class="item">
|
|
214
|
+
<h3>Automation Paths</h3>
|
|
215
|
+
<p>Reviews GitHub Actions and other workflow files for unsafe agent execution boundaries.</p>
|
|
216
|
+
</article>
|
|
217
|
+
<article class="item">
|
|
218
|
+
<h3>MCP Trust</h3>
|
|
219
|
+
<p>Flags unapproved MCP servers, package launches, command tools, and environment exposure.</p>
|
|
220
|
+
</article>
|
|
221
|
+
</div>
|
|
222
|
+
</div>
|
|
223
|
+
</section>
|
|
224
|
+
|
|
225
|
+
<section>
|
|
226
|
+
<div class="wrap">
|
|
227
|
+
<h2>Reports Built For Adoption</h2>
|
|
228
|
+
<div class="grid">
|
|
229
|
+
<article class="item">
|
|
230
|
+
<h3>Inventory</h3>
|
|
231
|
+
<p><code>--format inventory</code> and <code>inventory-json</code> explain the agentic surface.</p>
|
|
232
|
+
</article>
|
|
233
|
+
<article class="item">
|
|
234
|
+
<h3>Risk Score</h3>
|
|
235
|
+
<p><code>--format score</code> gives teams a compact AWI score they can track over time.</p>
|
|
236
|
+
</article>
|
|
237
|
+
<article class="item">
|
|
238
|
+
<h3>Compare</h3>
|
|
239
|
+
<p><code>--compare old.json new.json</code> shows introduced and resolved findings between scans.</p>
|
|
240
|
+
</article>
|
|
241
|
+
</div>
|
|
242
|
+
</div>
|
|
243
|
+
</section>
|
|
244
|
+
</main>
|
|
245
|
+
<footer>
|
|
246
|
+
<div class="wrap">
|
|
247
|
+
Released as open source. Start with <code>npx awguard@latest init</code>.
|
|
248
|
+
</div>
|
|
249
|
+
</footer>
|
|
250
|
+
</body>
|
|
251
|
+
</html>
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": "2.0.0",
|
|
3
|
+
"tasks": [
|
|
4
|
+
{
|
|
5
|
+
"label": "awguard inventory",
|
|
6
|
+
"type": "shell",
|
|
7
|
+
"command": "npx awguard@latest . --format inventory",
|
|
8
|
+
"problemMatcher": []
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
"label": "awguard scan",
|
|
12
|
+
"type": "shell",
|
|
13
|
+
"command": "npx awguard@latest . --fail-on high",
|
|
14
|
+
"problemMatcher": []
|
|
15
|
+
}
|
|
16
|
+
]
|
|
17
|
+
}
|
package/examples/README.md
CHANGED
|
@@ -7,6 +7,8 @@
|
|
|
7
7
|
- `.github/copilot-instructions.md`: demonstrates risky persistent agent instruction guidance.
|
|
8
8
|
- `.mcp.json`: demonstrates mutable MCP server packages and committed MCP credentials.
|
|
9
9
|
- `awguard.config.example.json`: sample config with a strict preset and overrides.
|
|
10
|
+
- `lab/`: vulnerable and fixed mini-repositories for demos.
|
|
11
|
+
- `.gitlab-ci.yml`, `pre-commit-config.yaml`, `.vscode/tasks.json`: adoption examples for other workflows.
|
|
10
12
|
|
|
11
13
|
Try:
|
|
12
14
|
|
|
@@ -15,9 +17,11 @@ node ../bin/awguard.js unsafe-agent.yml --format graph
|
|
|
15
17
|
node ../bin/awguard.js unsafe-agent.yml --format html --output awguard-report.html
|
|
16
18
|
node ../bin/awguard.js unsafe-agent.yml --format migration
|
|
17
19
|
node ../bin/awguard.js . --format inventory
|
|
20
|
+
node ../bin/awguard.js . --format inventory-json
|
|
18
21
|
node ../bin/awguard.js unsafe-agent.yml --format score
|
|
19
22
|
node ../bin/awguard.js safe-agent.yml --format badge
|
|
20
23
|
node ../bin/awguard.js .mcp.json --format text
|
|
21
24
|
node ../bin/awguard.js . --format text
|
|
25
|
+
node ../bin/awguard.js init
|
|
22
26
|
node ../bin/awguard.js unsafe-agent.yml --fix-dry-run
|
|
23
27
|
```
|
|
@@ -10,5 +10,11 @@
|
|
|
10
10
|
"suppressions": {
|
|
11
11
|
"allowedRules": ["AWG001", "AWG002"],
|
|
12
12
|
"minimumReasonLength": 20
|
|
13
|
+
},
|
|
14
|
+
"policy": {
|
|
15
|
+
"approvedFiles": ["AGENTS.md", ".github/workflows/*"],
|
|
16
|
+
"approvedMcpServers": ["github"],
|
|
17
|
+
"approvedMcpPackages": ["@modelcontextprotocol/server-github@1.2.3"],
|
|
18
|
+
"approvedMcpCommands": ["npx", "node"]
|
|
13
19
|
}
|
|
14
20
|
}
|