# taskbounty-check **A local check for GitHub Actions and CI maintenance hygiene** (third-party action pinning, workflow token permissions, and update automation), built for apps shipped with Lovable, Bolt, Replit, Cursor, or v0. **Local by default. No uploads. No telemetry.** It reads only your workflow files, on your machine. The default code path makes no outbound network requests, writes its report locally, and sends nothing anywhere. There is no analytics or phone-home of any kind. Only the opt-in `--gh-org` mode uses the network (through your own `gh` session). **Works with Cursor, Claude Code, and Codex** (local MCP server, below). ## Three ways to use it **1. GitHub Action** — add a maintenance check to CI that writes a summary to the run (no PR comments, no source upload): ```yaml permissions: contents: read steps: - uses: actions/checkout@v4 - run: npx taskbounty-check@0.1.6 . --github-summary --no-network ``` Want a human to interpret or fix what the Action surfaces? [Request a free launch-safety review](https://www.task-bounty.com/ai-app-security-check/review?utm_source=github&utm_medium=marketplace&utm_campaign=agent_distribution). TaskBounty gets no access to your repo, source, or workflows unless you submit that form. **2. Agent / MCP** — a local stdio server for Cursor, Claude Code, and Codex: ```bash npx -y taskbounty-check@0.1.6 mcp ``` **3. One-off CLI** — scan the current repo locally and write a report: ```bash npx -y taskbounty-check@0.1.6 . ``` > Pin a version (`@0.1.6`) in committed config and CI for reproducibility. `@latest` is convenient > for a quick one-off, but a pinned version is the reproducible choice. ### The GitHub job summary The Action writes a counts-only maintenance summary to the workflow run (categories and next steps, no filenames, line numbers, or repo source). Below is that exact summary, rendered from this repo's own CI output: ![TaskBounty check: GitHub Actions maintenance summary](docs/job-summary.png) See it produced live by the **self-check** job in [this repository's Actions runs](https://github.com/eliottreich/taskbounty-check/actions). Prefer a guided walkthrough? Follow the [five-minute real-repository quickstart](docs/real-repo-quickstart.md). ### Learn more - [Methodology](https://www.task-bounty.com/github-actions-security-check/methodology) — exactly what it reviews and how findings are labeled. - [Privacy and scope](https://www.task-bounty.com/ai-app-security-check) — local-by-default data handling. - [Limitations](#supported-checks-and-honest-limitations) — what it does NOT check (below). ## Supported checks (and honest limitations) **Checks (GitHub Actions + CI maintenance hygiene):** - Third-party actions pinned to a movable tag/branch instead of a commit SHA - Broad (write-all) workflow token permissions - Missing explicit `permissions:` block - Update automation (Dependabot/Renovate) presence - Context-dependent workflow patterns flagged for private review (e.g. `pull_request_target`, script injection) **Does NOT check** (these need a manual review): exposed secrets, auth/authorization, payments, webhooks, runtime behavior. It is a maintenance/hygiene check, **not** a full security audit or a penetration test. ## What it does - Reads only your GitHub Actions workflow files and update-automation config, scans them in-process with a deterministic ruleset (the same rules as the public checker), and writes a local HTML + JSON report. It does **not** execute workflows, install dependencies, or run any repository code. ## Modes | Mode | Command | Network | |------|---------|---------| | Single repo | `npx taskbounty-check .` | none | | Directory of repos | `npx taskbounty-check ./all-repos` | none | | Explicit paths | `npx taskbounty-check --manifest repos.json` | none | | GitHub org (your `gh` session) | `npx taskbounty-check --gh-org ` | **yes, opt-in** | `--gh-org` uses your existing `gh` CLI session to fetch each repo's workflow files **to this machine** (read-only). Your GitHub token is never read by this tool and never sent to TaskBounty. ## What is read, written, transmitted Run `--explain-data` to print this at any time. - **Reads (allowlist — nothing else is opened):** `/.github/workflows/*.yml|*.yaml` and update-automation config (`dependabot.yml`/`renovate.json*`). Never source files, `.env`, secrets, SSH keys, credential stores, or anything outside the selected repository roots. Symlinks that escape a root are skipped, never followed. - **Writes (local only):** `.json` (full detail) and `.html`. - **Transmits:** nothing by default. **`--share` uploads nothing** — it writes a *sanitized, counts-only* file (scan id, label, candidate counts by category, private-review **count**, scanner version, timestamps; repo names only with `--include-repo-names`) for you to submit **manually**. Network stays off under `--share`. Only `--gh-org` intentionally uses the network. ## Flags `--share` · `--gh-org ` · `--manifest ` · `--org-label