preflight-agent 1.0.1__tar.gz

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.
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Jasveer Singh
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,426 @@
1
+ Metadata-Version: 2.4
2
+ Name: preflight-agent
3
+ Version: 1.0.1
4
+ Summary: Scan your AI-agent setup before it runs: auto-run surfaces, inline secrets, dead hooks, agent collisions, skill sprawl — five auditors, one receipt.
5
+ Author: Jasveer Singh
6
+ License-Expression: MIT
7
+ Project-URL: Homepage, https://github.com/jasveerai88/preflight-agent
8
+ Project-URL: Repository, https://github.com/jasveerai88/preflight-agent
9
+ Project-URL: Issues, https://github.com/jasveerai88/preflight-agent/issues
10
+ Project-URL: Changelog, https://github.com/jasveerai88/preflight-agent/blob/main/CHANGELOG.md
11
+ Keywords: ai-agents,claude-code,agent-skills,mcp,security,static-analysis,cli
12
+ Classifier: Development Status :: 5 - Production/Stable
13
+ Classifier: Environment :: Console
14
+ Classifier: Intended Audience :: Developers
15
+ Classifier: Operating System :: OS Independent
16
+ Classifier: Programming Language :: Python :: 3
17
+ Classifier: Programming Language :: Python :: 3.10
18
+ Classifier: Programming Language :: Python :: 3.11
19
+ Classifier: Programming Language :: Python :: 3.12
20
+ Classifier: Topic :: Security
21
+ Classifier: Topic :: Software Development :: Quality Assurance
22
+ Requires-Python: >=3.10
23
+ Description-Content-Type: text/markdown
24
+ License-File: LICENSE
25
+ Dynamic: license-file
26
+
27
+ <h1 align="center">preflight-agent</h1>
28
+
29
+ <p align="center"><strong>Five checks your AI-agent setup needs before it runs — one command.</strong></p>
30
+
31
+ <p align="center">
32
+ <img alt="tests: 300 passing" src="https://img.shields.io/badge/tests-300%20passing-brightgreen">
33
+ <img alt="python 3.10 | 3.11 | 3.12" src="https://img.shields.io/badge/python-3.10%20%7C%203.11%20%7C%203.12-blue">
34
+ <img alt="version 1.0.1" src="https://img.shields.io/badge/version-1.0.1-orange">
35
+ <img alt="dependencies: none" src="https://img.shields.io/badge/dependencies-0-brightgreen">
36
+ <img alt="license: MIT" src="https://img.shields.io/badge/license-MIT-blue">
37
+ </p>
38
+
39
+ <p align="center"><img alt="preflight-agent demo: one scan of a planted-problem fixture — an auto-run .envrc, a literal key in .mcp.json, a hook pointing at a script that does not exist, a duplicated agent name and a duplicated skill name, all in one receipt" src="demo.gif" width="880"></p>
40
+
41
+ Five things quietly go wrong in an AI-agent setup before
42
+ anyone notices: a folder that executes code the moment it
43
+ is opened, a live API key sitting in a config file, a
44
+ safety hook that was never going to fire, two agents a
45
+ router cannot tell apart, a skill collection too sprawled
46
+ to discover anything in. Each used to need its own tool —
47
+ five of mine, all published separately, all sitting quiet.
48
+ Now one command runs all five audits and prints a single
49
+ combined receipt:
50
+
51
+ ```bash
52
+ preflight-agent scan ~/my-project
53
+ ```
54
+
55
+ **Static and read-only — a scan executes nothing.** No
56
+ module runs, imports, or installs anything in the target;
57
+ the reports cite what they found instead of judging
58
+ intent. And the verdicts are honest about their edges: a
59
+ module with nothing to audit reports **skipped with its
60
+ reason**, never clean, and every module prints its own
61
+ limits in its own section of the receipt.
62
+
63
+ ## The receipt family
64
+
65
+ preflight-agent is the *before it runs* member of a
66
+ family built on one grammar — *document = claims, code =
67
+ evidence, every verdict cited*:
68
+
69
+ - **preflight-agent — is this setup safe to open?**
70
+ The five preflight checks below, in one receipt.
71
+ - **[skill-vet](https://github.com/jasveerai88/skill-vet)
72
+ — is this skill pack dangerous?** Stealing, spying,
73
+ hidden sending, each proven as a combination of
74
+ evidence before you install.
75
+ - **[permission-audit](https://github.com/jasveerai88/permission-audit)
76
+ — do these permissions grant more than intended?**
77
+ Audits a Claude Code allowlist chain: wildcard grants,
78
+ dangerous modes, rules that can never fire.
79
+ - **[done-claim-auditor](https://github.com/jasveerai88/done-claim-auditor)
80
+ — did the agent do what it claimed?** Claim-vs-evidence
81
+ logic pointed at session transcripts.
82
+ - **[skill-claims](https://github.com/jasveerai88/skill-claims)
83
+ — does a skill do what it claims?** Audits a skill's
84
+ prose promises against its static behaviour.
85
+ - **[spec-receipt](https://github.com/jasveerai88/spec-receipt)
86
+ — does the code still match the spec?** Audits a repo's
87
+ engineering spec against its declared implementation
88
+ surfaces.
89
+
90
+ ## Quick start
91
+
92
+ ```bash
93
+ pipx install preflight-agent # or: pip install preflight-agent
94
+ preflight-agent scan path/to/setup
95
+ ```
96
+
97
+ *(The PyPI name goes live when v1.0.1 is published; until
98
+ then use the git form —
99
+ `pipx install git+https://github.com/jasveerai88/preflight-agent` —
100
+ or a source checkout: `python3 src/preflight_agent.py scan <dir>`.)*
101
+
102
+ One command, one receipt, an exit code you can gate on —
103
+ **1** = at least one module has findings, **0** = every
104
+ module that ran is clean, **2** = usage/input error. Add
105
+ `--json` for a machine-readable receipt. Python 3.10+,
106
+ standard library only, no dependencies, no network.
107
+
108
+ ## The five modules
109
+
110
+ Every module is also runnable on its own, with exactly
111
+ the interface its standalone tool had:
112
+
113
+ | Command | What it catches | Its verdict words |
114
+ |---|---|---|
115
+ | `preflight-agent clone-guard DIR` | What executes when this folder is opened, installed, or committed to: Claude / VS Code / devcontainer configs, npm install scripts, direnv, git and husky hooks — every command shown verbatim | AUTO-RUN / INSTALL-TIME / PRESENT / UNPARSEABLE |
116
+ | `preflight-agent secret-guard scan FILE...` | Inline secrets in agent/MCP config files — findings by key path and fingerprint; values are never printed | INLINE-SECRET / ENV-LITERAL / UNPARSEABLE |
117
+ | `preflight-agent secret-guard fix FILE... [--apply]` | Rewrites those literals as `${ENV_VAR}` references. Dry run unless `--apply`; a timestamped backup is kept beside each changed file, and the rewrite is re-scanned before it is reported | — (the suite's one writing command; see the exception below) |
118
+ | `preflight-agent hook-doctor audit SETTINGS [--home DIR]` | Claude Code hooks that can never fire, can never block, or point at files that do not exist | ERROR / WARNING / INFO |
119
+ | `preflight-agent fleet-audit audit FOLDER` | In a folder of agent definitions: description collisions, duplicate names, tool grants that contradict the promised job, unreadable files | ERROR / WARNING / INFO |
120
+ | `preflight-agent skill-sprawl audit FOLDER` | In a tree of skills: cross-scope duplicate names, discovery collisions, oversized bodies, and a discovery-budget truncation forecast | ERROR / WARNING / INFO |
121
+
122
+ ## The combined scan
123
+
124
+ ```bash
125
+ preflight-agent scan DIR [--home DIR] [--json]
126
+ ```
127
+
128
+ `scan` points each module at the part of DIR it audits:
129
+
130
+ - **clone-guard** — DIR itself.
131
+ - **secret-guard** — every discovered config file:
132
+ `settings.json`, `settings.local.json`, `.mcp.json`,
133
+ `mcp.json` anywhere under DIR, plus any JSON inside a
134
+ `.claude`, `.vscode` or `.cursor` folder. Scan only —
135
+ the combined scan **never** calls fix.
136
+ - **hook-doctor** — the first of `.claude/settings.json`,
137
+ `settings.json`, `.claude/settings.local.json`.
138
+ `--home` defaults to DIR itself, so a self-contained
139
+ setup is audited as its own home.
140
+ - **fleet-audit** — `.claude/agents`, else `agents`, else
141
+ DIR itself.
142
+ - **skill-sprawl** — `.claude/skills`, else `skills`,
143
+ else DIR itself.
144
+
145
+ ### The fixture — one planted problem per module
146
+
147
+ `examples/make_fixture.py` builds a fake setup with
148
+ exactly one planted problem per module — an `.envrc`
149
+ that runs on `cd`, a literal service key in `.mcp.json`,
150
+ a PreToolUse guard pointing at a script that does not
151
+ exist, the agent name `reviewer` defined twice, the
152
+ skill name `notes-writer` defined in two scopes — and
153
+ everything else deliberately clean. Verbatim output of
154
+ the real run (build it yourself and diff):
155
+
156
+ ```
157
+ $ python3 examples/make_fixture.py pf-fixture
158
+ fixture built at pf-fixture
159
+ $ preflight-agent scan pf-fixture
160
+ preflight-agent v1.0.1 — scan · folder pf-fixture
161
+ 5 module(s) run · 0 clean · 5 with findings · 0 skipped
162
+
163
+ ===== clone-guard — what runs when this folder is opened =====
164
+ clone-guard v0.1.0 — scan · folder pf-fixture
165
+ pf-fixture · 3 finding(s) — 3 AUTO-RUN · 0 INSTALL-TIME · 0 PRESENT · 0 UNPARSEABLE
166
+
167
+ AUTO-RUN — executes on open, session start or cd, with no install step (3):
168
+ .claude/settings.json — Claude Code PreToolUse hook — runs automatically when Claude Code works in this folder
169
+ command: python3 "$HOME/.claude/hooks/guard-rm.sh"
170
+ .claude/settings.json — Claude Code SessionStart hook — runs automatically when Claude Code works in this folder
171
+ command: echo session started
172
+ .envrc — direnv file — direnv executes it automatically when you cd into this folder (when direnv is installed and the folder is allowed)
173
+ 1 line(s) of shell — direnv sources the whole file; open it to inspect
174
+
175
+ VERDICT: FINDINGS — read every command above before opening this folder in an editor or with an agent.
176
+ clone-guard only reads files: it never executes, installs or modifies anything in the scanned folder. Findings are auto-execution surfaces, not proof of malice — legitimate projects use hooks and install scripts too. The command text is the evidence; judge it.
177
+
178
+ ===== secret-guard — inline secrets in agent/MCP configs =====
179
+ secret-guard v0.1.0 — scan · 2 file(s)
180
+ 1 finding(s) — 0 INLINE-SECRET · 1 ENV-LITERAL · 0 UNPARSEABLE
181
+
182
+ ENV-LITERAL — a secret-shaped literal in an env block, whatever the key is named (1):
183
+ pf-fixture/.mcp.json — mcpServers.notes.env.SERVICE_KEY
184
+ key "SERVICE_KEY" holds a literal secret: Q7…(24 chars). Fix rewrites it as the SERVICE_KEY environment variable.
185
+
186
+ VERDICT: FINDINGS — move each value into the named environment variable (run the fix command to rewrite the files), and rotate any secret that was ever committed or shared: moving it does not un-leak it.
187
+ secret-guard never prints a secret's value: reports show the key path and a fingerprint (first characters + length) only.
188
+
189
+ ===== hook-doctor — dead hooks and guards that cannot block =====
190
+ hook-doctor v0.1.0 — audit · settings settings.json
191
+ 2 hook handlers across 2 events · home for ~ and $HOME paths: pf-fixture
192
+ Read-only: it edits nothing and never runs a hook command. It reads the settings file, plus the scripts that file itself names.
193
+
194
+ ERRORS — hooks that can never work as configured (1):
195
+ [COMMAND_PATH] PreToolUse · matcher "Bash" · python3 "$HOME/.claude/hooks/guard-rm.sh"
196
+ the command path $HOME/.claude/hooks/guard-rm.sh does not exist (resolved against the settings folder and the home folder) — this hook can never run
197
+ fix: create the script at that path, or point the command at a script that exists
198
+
199
+ WARNINGS — hooks that probably do not do what you intend (1):
200
+ [EXIT_CODE_TRAP] PreToolUse · matcher "Bash" · python3 "$HOME/.claude/hooks/guard-rm.sh"
201
+ guard-intent hook on PreToolUse shows no way to block: no exit 2 and no JSON decision in the command or the script it runs — exit 1 (and every other code) is a non-blocking error and the action proceeds. Heuristic: the intent was read from guard words (guard / block / deny / prevent / forbid / protect) in the command or script
202
+ fix: exit 2 with the reason on stderr, or print a JSON decision (permissionDecision: deny on PreToolUse) when the guard should stop the action
203
+
204
+ Summary: 2 findings · 1 errors · 1 warnings · 0 info
205
+ Verdict: FAIL — 1 error(s): at least one hook is dead as configured. Fix the errors before relying on these hooks.
206
+
207
+ ===== fleet-audit — agent-definition collisions and grants =====
208
+ fleet-audit v0.1.0 — audit · folder agents
209
+ 2 agent files · 2 agents parsed · 0 unrecognized · walk: recursive (subfolders included)
210
+ Read-only: it edits nothing and runs nothing. It reads the agent definition files in the folder you point it at — every .md file in the tree is expected to be an agent file in the supported shape.
211
+ Similarity: the Jaccard index over each description's set of lowercase alphanumeric word tokens. Collision at 0.50, near-identical at 0.90; the short-description floor is 40 characters. Thresholds and intent words are heuristics — see SKILL.md.
212
+
213
+ INVENTORY (2):
214
+ reviewer — 112 chars · tools: Read, Grep, Glob · model: (default) · extra/reviewer.md
215
+ reviewer — 112 chars · tools: Read, Grep, Glob · model: (default) · reviewer.md
216
+
217
+ ERRORS — agents that cannot be routed to, collide head-on, or cannot be read (2):
218
+ [DESCRIPTION_IDENTICAL] "reviewer" + "reviewer" · extra/reviewer.md, reviewer.md
219
+ the descriptions of "reviewer" and "reviewer" are near-identical (token-set similarity 1.000, at or above the 0.90 line) — a router choosing between them has nothing to choose on, so delegation between them is a coin flip
220
+ fix: differentiate the descriptions until each names work the other does not claim — or merge the two agents
221
+ [DUPLICATE_NAME] "reviewer" · extra/reviewer.md, reviewer.md
222
+ the name "reviewer" is defined by 2 files (extra/reviewer.md, reviewer.md) — which definition loads depends on scope order, so the fleet does not reliably contain the agent you think it does
223
+ fix: keep one definition per name in the fleet, or rename until names are unique
224
+
225
+ Summary: 2 findings · 2 errors · 0 warnings · 0 info
226
+ Verdict: FAIL — 2 error(s): the fleet has agents that cannot be routed to, collide head-on, or cannot be read at all. Fix the errors before trusting delegation to this fleet.
227
+
228
+ ===== skill-sprawl — skill duplicates, collisions, bloat =====
229
+ skill-sprawl v0.1.0 — audit · folder skills
230
+ 2 markdown files seen · 2 skill candidates · 2 skills parsed · 0 unrecognized · 0 ignored (supporting docs) · walk: recursive (subfolders included)
231
+ Read-only: it edits nothing and runs nothing. It reads the skill definition files in the tree you point it at — files named SKILL.md, plus loose .md files that open with a frontmatter block; other .md files are counted as supporting docs and ignored.
232
+ Similarity: the Jaccard index over each description's set of lowercase alphanumeric word tokens. Collision at 0.50, near-identical at 0.90; the short-description floor is 40 characters; the oversized-body line is 500 lines; the discovery budget is 16000 listing characters (a reported figure). Token counts are estimates at chars/4. Thresholds are heuristics — see SKILL.md.
233
+
234
+ INVENTORY (2):
235
+ notes-writer — 104 desc chars · body 2 lines · ~19 tokens est. · archive/notes-writer/SKILL.md
236
+ notes-writer — 104 desc chars · body 2 lines · ~19 tokens est. · notes-writer/SKILL.md
237
+ COLLECTION TOTALS: 2 skills · 4 body lines · ~38 tokens of body text (est., chars/4) · discovery listing 232 of 16000 budget chars
238
+
239
+ ERRORS — skills that cannot be discovered, collide head-on, are defined more than once, or cannot be read (2):
240
+ [DESCRIPTION_IDENTICAL] "notes-writer" + "notes-writer" · archive/notes-writer/SKILL.md, notes-writer/SKILL.md
241
+ the descriptions of "notes-writer" and "notes-writer" are near-identical (token-set similarity 1.000, at or above the 0.90 line) — a router choosing between them has nothing to choose on, so discovery between them is a coin flip
242
+ fix: differentiate the descriptions until each names work the other does not claim — or merge the two skills
243
+ [DUPLICATE_NAME] "notes-writer" · archive/notes-writer/SKILL.md, notes-writer/SKILL.md
244
+ the name "notes-writer" is defined by 2 files (archive/notes-writer/SKILL.md, notes-writer/SKILL.md) — which definition loads depends on scope order, so the collection does not reliably contain the skill you think it does
245
+ fix: keep one definition per name across the whole tree, or rename until names are unique
246
+
247
+ Summary: 2 findings · 2 errors · 0 warnings · 0 info
248
+ Verdict: FAIL — 2 error(s): the collection has skills that cannot be discovered, collide head-on, are defined more than once, or cannot be read at all. Fix the errors before trusting discovery in this collection.
249
+
250
+ VERDICT: FINDINGS in clone-guard, secret-guard, hook-doctor, fleet-audit, skill-sprawl — read each module's section above before this setup runs.
251
+ (exit code 1)
252
+ ```
253
+
254
+ ### The other direction — a clean setup
255
+
256
+ The same scan over a minimal tidy setup (one agent, one
257
+ skill, an empty settings file) — head and verdict lines
258
+ verbatim, module sections elided:
259
+
260
+ ```
261
+ $ preflight-agent scan pf-control
262
+ preflight-agent v1.0.1 — scan · folder pf-control
263
+ 5 module(s) run · 5 clean · 0 with findings · 0 skipped
264
+ ...
265
+ VERDICT: CLEAN — every module that ran reported clean. CLEAN covers only what the five modules check; it is not a guarantee the setup is safe. Each module's limits are in its own section above.
266
+ (exit code 0)
267
+ ```
268
+
269
+ ## Contracts
270
+
271
+ - **One JSON object** per command with `--json`;
272
+ argument and input errors are `{"error": ...}` with
273
+ exit 2, including argparse errors in `--json` mode.
274
+ No tracebacks. A module command's JSON is exactly the
275
+ object that module printed standalone; `scan`'s JSON
276
+ nests those objects per module, plus a combined
277
+ `summary` and `clean` verdict.
278
+ - **Exit codes:** 0 clean · 1 findings · 2 error,
279
+ identically for every module and for `scan`.
280
+ - **Read-only scanning.** No scan writes to, executes,
281
+ or installs anything in the target.
282
+ - **The one disclosed exception:** `secret-guard fix
283
+ --apply` writes — that is its job. It writes only the
284
+ files you name, after a dry run by default, keeps a
285
+ timestamped backup beside each changed file, and
286
+ re-scans the rewrite before reporting it. It was
287
+ ported intact from the standalone tool, and `scan`
288
+ never invokes it.
289
+ - **Deterministic.** The same folder produces a
290
+ byte-identical report on every run.
291
+ - **Each module's limits stand.** Static checks prove
292
+ what they cite and no more — every module prints its
293
+ own honesty limits in its report, and SKILL.md
294
+ collects them. A CLEAN verdict means "none of the
295
+ checked problems were found", never "this setup is
296
+ safe".
297
+
298
+ ## Why this suite exists — the merge
299
+
300
+ This pack is the merged flagship ordered by a fleet
301
+ audit (FLEET-AUDIT-2026-11-04): 43 published tools were
302
+ audited, and 18 of the quiet ones were ordered merged
303
+ into 4 flagships so the fleet would be a few strong
304
+ tools instead of dozens of shelf orphans. clone-guard,
305
+ secret-guard, hook-doctor, fleet-audit and skill-sprawl
306
+ — five standalone auditors, each already shipped and
307
+ tested — became the modules of this suite.
308
+
309
+ The merge changed no engine: each module's code is
310
+ **byte-identical** to its source tool's, its CLI shape
311
+ and verdict vocabulary are unchanged, and it still
312
+ reports its own source version (v0.1.0) inside its
313
+ sections. The suite's own work is the dispatcher, the
314
+ combined `scan`, and 24 new tests on top of the 276 the
315
+ five source suites carried over — 300 in total.
316
+
317
+ Known note: the five engines are installed as top-level
318
+ Python modules (`clone_guard`, `secret_guard`,
319
+ `hook_doctor`, `fleet_audit`, `skill_sprawl`) alongside
320
+ the `preflight_agent` dispatcher. If you also installed
321
+ one of the original standalone tools, both installs
322
+ provide the same module file with identical content —
323
+ either copy behaves the same.
324
+
325
+ ### For agents
326
+
327
+ [SKILL.md](SKILL.md) states the full command surface,
328
+ the verdict vocabularies, the JSON contract and the
329
+ limits — and makes preflight-agent itself installable
330
+ as a skill: point your agent at this repo's SKILL.md
331
+ and it will preflight setups before trusting them.
332
+
333
+ ## Tests
334
+
335
+ ```bash
336
+ python3 -m unittest discover -s tests
337
+ ```
338
+
339
+ 300 tests: the five source suites ported unchanged
340
+ (56 + 57 + 44 + 58 + 61 = 276 — the only edit is each
341
+ suite's EXAMPLES path, since examples now live
342
+ per-module under `examples/<module>/`) plus 24
343
+ dispatcher/scan tests covering target discovery,
344
+ skipped-with-reason reporting, the combined JSON
345
+ shape, exit-code aggregation, and the proof that
346
+ `scan` never invokes fix. Fixtures are fictional; the
347
+ secrets in them are fake.
348
+
349
+ ## Honest limits
350
+
351
+ - **Static evidence only.** clone-guard reports
352
+ surfaces that *would* execute, not what the code does
353
+ once running; a CLEAN scan is never a safety
354
+ guarantee.
355
+ - **secret-guard's scope is JSON configs it can parse.**
356
+ Values under ordinary key names outside env blocks,
357
+ and TOML/YAML configs, are out of scope — and a secret
358
+ that was ever committed stays leaked after moving it:
359
+ rotate it.
360
+ - **hook-doctor judges hooks against a static rule
361
+ table.** It never runs a hook, so runtime behaviour
362
+ (a script that exists but misbehaves) is invisible to
363
+ it.
364
+ - **fleet-audit / skill-sprawl similarity is a
365
+ heuristic** — a token-set Jaccard index at stated
366
+ thresholds (collision 0.50, near-identical 0.90,
367
+ short-description floor 40 chars, discovery budget
368
+ 16,000 listing chars): a reported figure, not a
369
+ platform guarantee.
370
+ - **`scan`'s discovery is a convention**, stated above:
371
+ it audits the settings/config/agents/skills locations
372
+ it looks for. A setup that keeps those elsewhere
373
+ needs the module commands pointed at the real paths.
374
+ - **Python-only implementation, terminal-text reports.**
375
+ No daemon, no watcher, no auto-remediation beyond
376
+ `secret-guard fix`, no score — a receipt, not a
377
+ rating.
378
+
379
+ ## Contributing
380
+
381
+ See [CONTRIBUTING.md](CONTRIBUTING.md). The evidence
382
+ discipline is the product: a finding is issued only on
383
+ what the files show, and contributions are held to
384
+ that. Found a setup preflight-agent misjudges — a
385
+ surface it misses, a verdict the evidence doesn't
386
+ support? Open an issue with the folder (or a minimal
387
+ fixture); that is exactly the feedback that improves
388
+ the checks.
389
+
390
+ ## Security
391
+
392
+ preflight-agent is itself an audit tool, so its own
393
+ posture is simple: it has no network code, no
394
+ dependencies, and its scans never execute what they
395
+ read. See [SECURITY.md](SECURITY.md) for how to report
396
+ a problem.
397
+
398
+ ## License
399
+
400
+ MIT — see [LICENSE](LICENSE). The five engines keep
401
+ their original authorship; this merged pack's own
402
+ history starts at the merge (see
403
+ [CHANGELOG.md](CHANGELOG.md)).
404
+
405
+ ## Related
406
+
407
+ - [skill-vet](https://github.com/jasveerai88/skill-vet)
408
+ — the pre-install danger gate for agent-skill packs.
409
+ - [permission-audit](https://github.com/jasveerai88/permission-audit)
410
+ — audits a Claude Code permission allowlist for
411
+ wildcard grants and dangerous modes.
412
+ - [done-claim-auditor](https://github.com/jasveerai88/done-claim-auditor)
413
+ — audits a coding agent's completion claims against
414
+ its own transcript.
415
+ - [skill-claims](https://github.com/jasveerai88/skill-claims)
416
+ — does a skill package do what its description
417
+ claims?
418
+ - [spec-receipt](https://github.com/jasveerai88/spec-receipt)
419
+ — a drift receipt for spec'd repos: spec vs code,
420
+ verdict per item.
421
+
422
+ ## Support
423
+
424
+ If preflight-agent catches something in your setup
425
+ before it runs, consider
426
+ [sponsoring](https://github.com/sponsors/jasveerai88).