sc-git — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited sc-git (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Use when user wants to stop GitHub Actions cloud minutes burn, audit workflow files across rahmanef63 repos, migrate CI/CD to pre-push hooks + VPS, or do generic repo/workflow CRUD via gh API.
gh CLI authed with repo + workflow + admin:repo_hook scopes/home/rahman/projects/<repo> (some repos remote-only — skill handles both)srv614914 accessible via SSH for runner/cron subcommands.github/workflows/*.yml, copy to *.yml.bak. Never delete .bak files.chore/reduce-github-actions-usage. PR is user's call.on:), concurrency:, paths:. Leaves env:, secrets:, runs-on:, job steps alone unless explicitly told.isPrivate === false.gh auth + scopes. Fall back to gh api for endpoints without dedicated subcommands.disable on already-disabled workflow is a no-op (detect existing workflow_dispatch: only + no push:/pull_request:/schedule:).audit.js — Sweep + reportScans all rahmanef63 repos, lists workflows, recent run volume, identifies burn risks.
node scripts/audit.js # markdown report stdout
node scripts/audit.js --json # machine-readable
node scripts/audit.js --since 2026-04-15 # custom window
node scripts/audit.js --repo <name> # single repoOutput: per-repo trigger map, run count since window, risk tags (cron, push-no-paths, pr-fanout, matrix-heavy, failing-burn).
disable.js — Strip auto-triggersPatches workflow YAML so it only fires on workflow_dispatch:. Backs up to .bak. Creates branch chore/reduce-github-actions-usage, commits, leaves push to user.
node scripts/disable.js --repo <name> # all workflows in repo
node scripts/disable.js --repo <name> --workflow <file> # one specific
node scripts/disable.js --repo <name> --dry-run # diff onlynuke.js — Disable Actions on repo (API)Settings → Actions → "Disable actions". Use only for dormant repos.
node scripts/nuke.js --repo <name> # disable
node scripts/nuke.js --repo <name> --revert # re-enableci.js — Local CI runnerDetects package manager (pnpm/npm/yarn) + scripts, runs typecheck + lint + test + build in order. Equivalent to most repo ci.yml. Aborts on first failure.
node scripts/ci.js # current dir
node scripts/ci.js --repo <name> # cd into ~/projects/<name>
node scripts/ci.js --skip lint,test # skip steps
node scripts/ci.js --quiet # only show fail outputhook.js — Pre-push husky setupInstalls husky + .husky/pre-push that runs node ~/.claude/skills/sc-git/scripts/ci.js. Aborts push on fail.
node scripts/hook.js install --repo <name>
node scripts/hook.js uninstall --repo <name>runner.js — Self-hosted GH Actions runnerRegisters a runner at VPS srv614914. Multi-repo via labels [self-hosted, linux, x64]. Free minutes forever.
node scripts/runner.js setup # bootstrap runner host
node scripts/runner.js register --repo <name> # join repo
node scripts/runner.js list --repo <name> # registered runners + their ids
node scripts/runner.js remove --repo <name> --id <id> # --id from `runner.js list --repo <name>`status.js — Commit status APIPOST repos/:o/:r/statuses/:sha to mark a commit pass/fail without Actions. Useful for webhook-based CI.
node scripts/status.js --repo <name> --sha <sha> --state success --context ci
node scripts/status.js --repo <name> --sha <sha> --state failure --description "lint failed"cron.js — VPS crontab CRUDRegisters a cron entry on VPS that calls a skill or shell command. Replaces schedule: triggers.
node scripts/cron.js add --name notion-sync --schedule "0 19 * * 0" --cmd "..."
node scripts/cron.js list
node scripts/cron.js remove --name notion-syncwebhook.js — GitHub webhook → VPS endpointCreates a push webhook pointing at VPS endpoint, so CI/deploy fires without Actions.
node scripts/webhook.js create --repo <name> --url <https://...>
node scripts/webhook.js list --repo <name>
node scripts/webhook.js delete --repo <name> --id <hookId>Standard order to move a repo off cloud Actions:
node scripts/audit.js --repo <name> — confirm what's burning.node scripts/hook.js install --repo <name> — pre-push local CI.node scripts/disable.js --repo <name> — strip auto-triggers (backup retained).node scripts/runner.js register --repo <name> then revert YAML runs-on: → [self-hosted].cron.js add.gh api repos/rahmanef63/<name>/actions/runs?per_page=5 --jq '.workflow_runs[].name' — should be empty for new pushes.| Repo type | Strategy |
|---|---|
| Solo dev, frontend (Next.js) | hook.js install + disable.js all + Dokploy webhook redeploy |
| Deploy-only YAML (SSH) | disable.js + replace with Dokploy auto-deploy webhook |
| Convex deploy | /sc-convex push di pre-push hook + disable.js |
| Cron sync (second-brain) | cron.js add (VPS) + disable.js |
| Multi-collaborator + branch protect | runner.js register + keep YAML runs-on: [self-hosted] |
| Dormant | nuke.js |
How the subcommands compose to move a repo off GitHub Actions cloud minutes:
flowchart TD
A["audit.js<br/>measure burn rate<br/>(runs, risk tags)"] --> B["disable.js<br/>strip on: triggers →<br/>workflow_dispatch-only<br/>(.bak backup)"]
B --> C{Replacement<br/>for each trigger?}
C -->|push / pull_request CI| D["Local CI<br/>ci.js + hook.js<br/>(pre-push husky)"]
C -->|PR gate / branch protect| E["runner.js<br/>self-hosted runner @ VPS<br/>(runs-on: [self-hosted])"]
C -->|schedule: cron| F["cron.js<br/>VPS crontab entry"]
C -->|push → deploy| G["webhook.js<br/>push webhook → VPS endpoint"]
D --> H["status.js<br/>POST commit status<br/>(pass/fail, no Actions)"]
E --> H
G --> H
A -.dormant repo.-> N["nuke.js<br/>disable Actions entirely"]
H --> Z(["$0 cloud minutes<br/>web stays current"])
F --> Z
N --> ZThese env vars change script behavior; each has a sensible default, so set only what you need to override.
| Variable | Default | Read by | Purpose |
|---|---|---|---|
GH_OWNER | rahmanef63 | _shared.js (all subcommands) | GitHub owner/org for every gh api call. |
PROJECTS_DIR | ~/projects | _shared.js (all subcommands) | Root dir scanned for local repo clones (workflowFiles, localRepoPath). |
SC_GIT_WEBHOOK_SECRET | _(empty)_ | webhook.js (create) | HMAC secret for the created webhook. Read from env (or stdin) so it never lands on argv / shell history. |
SC_GIT_VPS_HOST | srv614914 | runner.js | SSH host where the self-hosted runner is bootstrapped/registered. |
SC_GIT_RUNNER_HOME | ~/actions-runner | runner.js | Install path of the runner on the VPS. |
SC_GIT_RUNNER_VERSION | 2.319.1 | runner.js | actions-runner release version to download during setup. |
cron.js reads no env vars — it edits the local crontab directly.
gh api repos/{owner}/{repo}/actions/workflows — list workflowsgh api repos/{owner}/{repo}/actions/runs — list runsgh api -X PUT repos/{owner}/{repo}/actions/permissions -f enabled=false — disable Actionsgh api repos/{owner}/{repo}/actions/runners/registration-token — runner tokengh api -X POST repos/{owner}/{repo}/statuses/{sha} — commit statusgh api -X POST repos/{owner}/{repo}/hooks — create webhook[[sc-dokploy]] — Dokploy redeploy trigger (replaces deploy.yml)[[sc-convex]] — Convex self-hosted push (replaces convex-deploy.yml)[[audit-bp]] — local audit run (replaces audit-bp.yml)~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.