Refresh Project Scaffolding
Refresh the current repository's existing scaffolding against the latest templates and best practices from the agent-harness-plugins ecosystem. Detect which tools have been used, compare existing files against current standards, present a plan of what's out of date, confirm with the user, and apply targeted updates.
This is the maintenance companion to bootstrap-project: bootstrap sets things up, this keeps them current.
Scope: This skill audits tools already in use and updates their files to match current templates. For tools that are partially configured, it can restore missing expected files. It does not set up tools that were never used; for initial setup, use the bootstrap-project skill or the individual tool.
Workflow
1. Detect Project Type
Scan for language and framework markers using Glob. Exclude node_modules/, .yarn/, vendor/, and other dependency directories from all searches.
| Marker(s) |
Project type |
go.mod + (main.go or cmd/) |
Go CLI |
go.mod without main.go or cmd/ |
Go library |
package.json + JS/TS source files |
JavaScript/TypeScript |
pyproject.toml, setup.py, requirements.txt |
Python |
Cargo.toml |
Rust |
Gemfile, *.gemspec |
Ruby |
Package.swift |
Swift |
*.sh, bin/*, scripts/* |
Shell |
If multiple types are detected (monorepo), note all of them.
2. Detect Which Tools Have Been Used
For each tool in the ecosystem, check for its signature artifacts. Only tools whose artifacts are found will be audited.
| Tool |
Signature artifacts |
scaffold-new-repo |
LICENSE + README.md + .gitignore |
scaffold-go-cli |
go.mod + cmd/ + .goreleaser.yml + .github/workflows/release.yml |
scaffold-go-library |
go.mod (no cmd/) + .golangci.yml + .github/workflows/ci.yml |
set-up-ci |
.github/workflows/ci.yml |
set-up-linters |
.editorconfig or .prettierrc.json or .golangci.yml |
set-up-secret-scanning |
.github/workflows/gitleaks.yml or .github/workflows/trufflehog.yml |
add-goreleaser-homebrew |
.goreleaser.yml with brews: section + .github/workflows/release.yml |
add-community-files |
CONTRIBUTING.md + CODE_OF_CONDUCT.md |
add-scrut-cli-tests |
tests/scrut/ directory |
set-up-installers |
Formula/ |
optimize-runner-usage |
concurrency: key in any .github/workflows/*.yml |
clean-up-agent-config |
AGENTS.md or (CLAUDE.md + .claude/settings.json) |
For each detected tool, record which artifacts were found and which expected artifacts are missing (for "Partially set up" status).
3. Compare Against Latest Templates
For each detected tool, run through its checklist from the Reference sections at the bottom of this file. Read the target repo's files and check for the specified patterns.
For each failed check, record:
- The file path
- What's wrong (concise description)
- The recommended fix
Use Grep and Read to check file contents. Check action versions against the Reference: Action Versions table.
4. Build and Present the Update Plan
Present a table with all detected tools and their status:
| # | Tool | Status | Issues Found | Action |
|---|-------------------------|----------------|-------------------------------------------------|-----------------|
| 1 | set-up-ci | Needs update | actions/checkout@v4 (target: v6), no timeout | Update workflow |
| 2 | set-up-linters | Up to date | | None |
| 3 | set-up-secret-scanning | Partially set | TruffleHog workflow missing | Add workflow |
| 4 | add-community-files | Needs update | CoC is v2.1 (current: v3.0) | Update CoC |
| 5 | clean-up-agent-config | Needs update | CLAUDE.md is regular file, not symlink | Convert to symlink |
| 6 | optimize-runner-usage | Up to date | | None |
| 7 | scaffold-new-repo | Needs update | .gitignore missing .claude/settings.local.json | Update file |
| 8 | add-goreleaser-homebrew | Up to date | | None |
Status values:
| Status |
Meaning |
| Up to date |
All checks pass; nothing to do |
| Needs update |
Files exist but fail some checks |
| Partially set up |
Some expected files from a detected tool are missing entirely |
| Not detected |
Tool was never used (run bootstrap-project or the individual skill) |
| Not applicable |
Tool does not apply to this project type |
Items with status "Not detected" and "Not applicable" are informational only and are not actionable in this command.
5. User Confirmation
Ask the user which items to update. Only items with status "Needs update" or "Partially set up" are actionable. Present them as a numbered list and let the user:
- Confirm all actionable items
- Select specific items by number
- Skip specific items
If no items need updating (everything is up to date), congratulate the user and stop.
6. Execute Updates
For each confirmed update item, choose a strategy based on scope:
| Scenario |
Strategy |
| Action version outdated |
Targeted: find and replace the version string in the workflow file |
| Missing config entry (e.g., .gitignore line) |
Targeted: add the missing entry to the appropriate section |
Missing workflow key (e.g., timeout-minutes) |
Targeted: add the key to each job in the workflow file |
Missing concurrency: group |
Targeted: add the concurrency block below the on: trigger block |
Missing permissions: block |
Targeted: add the permissions block at the workflow level |
| CLAUDE.md is regular file, not symlink |
Full re-run: invoke clean-up-agent-config to reconcile CLAUDE.md and AGENTS.md |
| Community file outdated (e.g., CoC version) |
Full re-run: invoke the add-community-files skill via the Skill tool |
| Missing file from a detected tool |
Full re-run: invoke the original skill via the Skill tool |
For full tool re-runs, all detected tools are skills. Invoke them via the Skill tool. Relevant skills include add-community-files, set-up-linters, set-up-ci, set-up-secret-scanning, add-goreleaser-homebrew, set-up-installers, add-scrut-cli-tests, scaffold-new-repo, and optimize-runner-usage.
Process updates in this order (matching the bootstrap-project execution order):
scaffold-new-repo (foundation files)
scaffold-go-cli / scaffold-go-library (language scaffold)
set-up-ci (CI workflow)
set-up-linters (linter configs)
set-up-secret-scanning (secret scanning)
add-goreleaser-homebrew (release config)
add-community-files (community files)
set-up-installers (distribution)
add-scrut-cli-tests (testing)
optimize-runner-usage (CI optimization)
clean-up-agent-config (agent config)
After each update, verify the change was applied correctly. If an update fails, report the error and ask whether to continue with remaining items or stop.
7. Summary
Print a summary grouped by outcome:
- Updated: list each change made, grouped by tool
- Skipped: items the user chose not to update
- Already up to date: tools that passed all checks
- Errors: any issues encountered during updates
Suggest next steps:
- Run
/lint-and-fix to check formatting of updated files
- Commit the changes
- Push and verify CI passes
Reference: Action Versions
The target versions for GitHub Actions that repositories should be updated to. When auditing workflow files, check uses: lines against this table. Actions not listed in this table are outside the scope of this audit and should be skipped without flagging.
| Action |
Target version |
actions/checkout |
v6 |
actions/download-artifact |
v8 |
actions/setup-go |
v6 |
actions/setup-node |
v6 |
actions/upload-artifact |
v7 |
astral-sh/setup-uv |
v8 |
dtolnay/rust-toolchain |
stable |
gitleaks/gitleaks-action |
v2 |
golangci/golangci-lint-action |
v9 |
goreleaser/goreleaser-action |
v7 |
ludeeus/action-shellcheck |
2.0.0 |
mfinelli/setup-shfmt |
v4 |
oven-sh/setup-bun |
v2 |
ruby/setup-ruby |
v1 |
Swatinem/rust-cache |
v2 |
trufflesecurity/trufflehog |
v3 |
When auditing, treat SHA-pinned references (e.g., actions/checkout@a5ac7e5...) as compliant if the pinned commit corresponds to the listed version or newer. Do not downgrade SHA pins to mutable version tags.
Reference: CI Workflow Checks (set-up-ci)
Files
.github/workflows/ci.yml
Makefile
Checks for ci.yml
- All
uses: references match the Action Versions table above
- Has a top-level
permissions: block (typically contents: read)
- Has a
concurrency: block with group: ${{ github.workflow }}-${{ github.ref }} and cancel-in-progress: true
- Every job has
timeout-minutes: set (typically 15 for test/lint, 10 for format/vuln)
- Has
paths-ignore: on push and pull_request triggers with the standard list (see Reference: Standard paths-ignore)
- Go projects: uses
go-version-file: go.mod instead of a pinned Go version
- Go libraries: has a multi-version test matrix (minimum + stable)
- JS/TS projects: detects package manager from lockfile and uses the correct install command
Checks for Makefile
- Has
.PHONY: declarations
- Has a
help target
- Go CLI targets: build, test, lint, vet, fmt, vuln, clean, cover, tidy
- Go library targets: all, build, test, lint, vet, fmt, vuln, clean, coverage, tools
- JS/TS targets: test, lint, fmt (or format)
- Python targets: test, lint, fmt
- Rust targets: test, lint, fmt, build, clean
- Ruby targets: test, lint
- Shell targets: lint, fmt
Reference: Secret Scanning Checks (set-up-secret-scanning)
Files
.github/workflows/gitleaks.yml
.github/workflows/trufflehog.yml
.gitleaks.toml
Checks for gitleaks.yml
- Uses
cboone/gh-actions/.github/workflows/scan-for-secrets.yml with a refreshed SHA-pinned ref and current version comment
- Sets
tool: gitleaks
- Has
permissions: block with contents: read
- Has
concurrency: group with group: ${{ github.workflow }}-${{ github.ref }} and cancel-in-progress: true
- Triggers on
push: branches: [main]
- Has
pull_request: trigger
- Has
workflow_dispatch: trigger
- The reusable workflow handles checkout with
fetch-depth: 0 and tool installation internally
Checks for trufflehog.yml
- Uses
cboone/gh-actions/.github/workflows/scan-for-secrets.yml with a refreshed SHA-pinned ref and current version comment
- Sets
tool: trufflehog
- Has
permissions: block with contents: read
- Triggers on
push: branches: [main]
- Has
pull_request: trigger
- Has
workflow_dispatch: trigger
- Has
concurrency: group with group: ${{ github.workflow }}-${{ github.ref }} and cancel-in-progress: true
- The reusable workflow handles checkout with
fetch-depth: 0, TruffleHog version pinning, and tool execution internally
Checks for .gitleaks.toml
- Has
[allowlist] section
- Includes lockfile patterns relevant to the detected project type (
go.sum for Go, package-lock.json for JS, etc.)
Reference: Foundation File Checks (scaffold-new-repo)
Files
LICENSE
README.md
CHANGELOG.md
.gitignore
AGENTS.md
CLAUDE.md
.claude/settings.json
.github/copilot-instructions.md
Checks for LICENSE
- Contains "MIT License" text
- Copyright year includes the current year (or is a range ending in the current year)
Checks for .gitignore
Must include these universal entries:
.DS_Store
.claude/settings.local.json
.env
.env.*
!.env.example
!.env.sample
*.pem
*.key
*.p12
credentials.json
token.json
Must include language-specific entries appropriate for the detected project type:
- Go:
*.exe, *.test, *.out, coverage.*, go.work, go.work.sum, bin/, dist/
- JavaScript:
node_modules/, coverage/, dist/, *.log
- Python:
__pycache__/, *.pyc, .venv/, dist/, build/
- Rust:
target/
- Ruby:
*.gem, .bundle/, vendor/bundle, pkg/
Checks for agent config
CLAUDE.md is a symlink pointing to AGENTS.md (run readlink CLAUDE.md to verify)
.claude/settings.json exists
.github/copilot-instructions.md exists and references AGENTS.md
.claude/settings.local.json is listed in .gitignore
Reference: Linter Config Checks (set-up-linters)
Files
.editorconfig
.prettierrc.json
.prettierignore
.markdownlint-cli2.jsonc (or .markdownlint-cli2.yaml, .markdownlint.json, .markdownlint.jsonc, .markdownlint.yaml)
- Language-specific linter configs (
.golangci.yml, .shellcheckrc, etc.)
Checks for .editorconfig
- Has
root = true at the top
- Has base settings:
charset = utf-8, end_of_line = lf, insert_final_newline = true, trim_trailing_whitespace = true
- Go projects: has
[*.go] section with indent_style = tab
- Python/Rust projects: has language section with
indent_size = 4
- Has
[Makefile] section with indent_style = tab (if Makefile exists)
- Has
[*.md] section with trim_trailing_whitespace = false
- Shell projects: has shfmt properties (
binary_next_line, space_redirects, switch_case_indent)
Checks for .prettierrc.json
- Has
printWidth set to 10000 (not the default 80)
- Has
proseWrap set to "preserve"
- Has
tabWidth set to 2
- JS projects: has
semi: false, singleQuote: true, trailingComma: "all"
Checks for .prettierignore
- Exists (if
.prettierrc.json exists)
- Includes
node_modules/ and build output directories
Checks for markdownlint config
- Config file exists (any supported name)
MD013 is set to false (Prettier handles line length)
MD033 is set to false (allow inline HTML)
MD034 is set to false (allow bare URLs)
- Ignores list includes
CHANGELOG.md
- Scrut projects:
MD014 is set to false (allow dollar signs before commands)
Reference: Community File Checks (add-community-files)
Files
CONTRIBUTING.md
CODE_OF_CONDUCT.md
.github/SECURITY.md
.github/PULL_REQUEST_TEMPLATE.md
Checks for CODE_OF_CONDUCT.md
- Contains "Contributor Covenant" attribution
- References version 3.0 (check for
version/3/0 in the URL or "version 3.0" in text)
- If it references an older version (1.4, 2.0, 2.1), flag as outdated
- Has 4-tier enforcement ladder (Warning, Temporarily Limited Activities, Temporary Suspension, Permanent Ban)
Checks for CONTRIBUTING.md
- Has a Development Setup section with build/test/lint commands
- Commands match the project's actual build system (check against Makefile targets or package.json scripts)
- Has a Commit Messages section referencing Conventional Commits
- Has a Pull Request Process section with branch naming conventions
Checks for .github/SECURITY.md
- Instructs users to use GitHub private vulnerability reporting (not public issues)
- Has response timeline (24h acknowledgment, 48h assessment)
Checks for .github/PULL_REQUEST_TEMPLATE.md
- Exists
- Has a checklist with at least: tests pass, style followed, documentation updated
Reference: GoReleaser Checks (add-goreleaser-homebrew)
Files
.goreleaser.yml
.github/workflows/release.yml
Checks for release.yml
- Uses
cboone/gh-actions/.github/workflows/release-go-binaries.yml with a refreshed SHA-pinned ref and current version comment
- Go CLI releases pass
go-version-file: go.mod
- Triggers on
push: tags: ["v*"]
- Has
permissions: contents: write
- Has
concurrency: group with group: ${{ github.repository }}-${{ github.workflow }} and cancel-in-progress: false (never interrupt releases)
- The reusable workflow handles checkout with
fetch-depth: 0, Go setup, GoReleaser installation, and release execution internally
Checks for .goreleaser.yml
- Has
version: 2 (GoReleaser v2 config format)
- Has
changelog: section with use: github or grouped categories
Reference: Runner Optimization Checks (optimize-runner-usage)
Files
- All
.github/workflows/*.yml files
Checks for each workflow
- Has
concurrency: block (pattern depends on workflow type, see below)
- Every job has
timeout-minutes: set
- CI workflows: has
paths-ignore: on push/pull_request triggers
Concurrency patterns by workflow type
| Workflow type |
Concurrency group pattern |
cancel-in-progress |
| CI |
${{ github.workflow }}-${{ github.ref }} |
true |
| Release |
${{ github.repository }}-${{ github.workflow }} |
false |
| Secret scanning |
${{ github.workflow }}-${{ github.ref }} |
true |
| Scheduled |
${{ github.workflow }}-${{ github.ref }} |
true |
| Mixed (branches + tags) |
${{ github.workflow }}-${{ github.ref }} |
false |
Timeout guidelines
| Job type |
Recommended timeout |
| Release/publish |
30 minutes |
| Rust builds |
20 minutes |
| Test/lint (general) |
15 minutes |
| Format/vuln check |
10 minutes |
Do NOT apply paths-ignore to
- Release workflows
- Mixed-trigger workflows (branches + tags)
- Scheduled workflows
- Secret scanning workflows
- Workflows with existing
paths: positive filters
- Reusable workflows
Reference: Agent Config Checks (clean-up-agent-config)
Files
AGENTS.md
CLAUDE.md
.claude/settings.json
.claude/settings.local.json
.claude/rules/*.md
.github/copilot-instructions.md
.github/instructions/*.instructions.md
Checks
AGENTS.md exists and is the canonical instruction file (not a symlink)
CLAUDE.md is a symlink pointing to AGENTS.md (verify with readlink)
- If
CLAUDE.md is a regular file and AGENTS.md also exists, flag the duplication
.claude/settings.json exists and contains only team-shared settings (permissions, hooks, env vars for conventions)
.claude/settings.local.json is gitignored (check .gitignore for the entry)
.github/copilot-instructions.md cross-references AGENTS.md
.github/instructions/*.instructions.md files have applyTo: frontmatter
Reference: Scrut Test Checks (add-scrut-cli-tests)
Files
tests/scrut/ directory
Makefile (for scrut targets)
.github/workflows/ci.yml (for scrut CI job)
Checks
tests/scrut/ directory exists and contains .md test files
Makefile has test-scrut and test-scrut-update targets
Makefile has test-all target that depends on both test and test-scrut
- CI workflow has a job or step that installs and runs scrut
- If markdownlint config exists:
MD014 is set to false
Reference: Installer Checks (set-up-installers)
Files
Checks for Formula/*.rb
- Has
desc field
- Has
homepage field
- Has platform-specific blocks (
on_macos/on_linux or depends_on :macos)
Reference: Standard paths-ignore
The standard paths-ignore list for CI workflow push and pull_request triggers:
paths-ignore:
- "*.md"
- "docs/**"
- "LICENSE"
- ".editorconfig"
- ".claude/**"
- "**/CLAUDE.md"
- "**/AGENTS.md"
Note: tests/scrut/*.md files are source code and should NOT be ignored. If the project uses scrut tests, verify that the paths-ignore pattern does not exclude nested .md files (the "*.md" pattern only matches root-level files).
1---2name: refresh-project-scaffolding3description: Refresh existing project scaffolding against the latest agent-harness-plugins templates. Use when the user says "refresh project scaffolding", "update everything", "audit my repo", "audit the repo", "refresh templates", "bring this repo up to date", "check what's outdated", or wants the maintenance companion to bootstrap-project. Detects which scaffolds, CI workflows, linters, and installers are in use, diffs them against current templates, and applies confirmed updates. Does not set up tools that were never used; use bootstrap-project for initial setup.4---56# Refresh Project Scaffolding78Refresh the current repository's existing scaffolding against the latest templates and best practices from the agent-harness-plugins ecosystem. Detect which tools have been used, compare existing files against current standards, present a plan of what's out of date, confirm with the user, and apply targeted updates.910This is the maintenance companion to `bootstrap-project`: bootstrap sets things up, this keeps them current.1112**Scope**: This skill audits tools already in use and updates their files to match current templates. For tools that are partially configured, it can restore missing expected files. It does not set up tools that were never used; for initial setup, use the bootstrap-project skill or the individual tool.1314## Workflow1516### 1. Detect Project Type1718Scan for language and framework markers using Glob. Exclude `node_modules/`, `.yarn/`, `vendor/`, and other dependency directories from all searches.1920| Marker(s) | Project type |21| ------------------------------------------------ | --------------------- |22| `go.mod` + (`main.go` or `cmd/`) | Go CLI |23| `go.mod` without `main.go` or `cmd/` | Go library |24| `package.json` + JS/TS source files | JavaScript/TypeScript |25| `pyproject.toml`, `setup.py`, `requirements.txt` | Python |26| `Cargo.toml` | Rust |27| `Gemfile`, `*.gemspec` | Ruby |28| `Package.swift` | Swift |29| `*.sh`, `bin/*`, `scripts/*` | Shell |3031If multiple types are detected (monorepo), note all of them.3233### 2. Detect Which Tools Have Been Used3435For each tool in the ecosystem, check for its signature artifacts. Only tools whose artifacts are found will be audited.3637| Tool | Signature artifacts |38| ------------------------- | ------------------------------------------------------------------------- |39| `scaffold-new-repo` | `LICENSE` + `README.md` + `.gitignore` |40| `scaffold-go-cli` | `go.mod` + `cmd/` + `.goreleaser.yml` + `.github/workflows/release.yml` |41| `scaffold-go-library` | `go.mod` (no `cmd/`) + `.golangci.yml` + `.github/workflows/ci.yml` |42| `set-up-ci` | `.github/workflows/ci.yml` |43| `set-up-linters` | `.editorconfig` or `.prettierrc.json` or `.golangci.yml` |44| `set-up-secret-scanning` | `.github/workflows/gitleaks.yml` or `.github/workflows/trufflehog.yml` |45| `add-goreleaser-homebrew` | `.goreleaser.yml` with `brews:` section + `.github/workflows/release.yml` |46| `add-community-files` | `CONTRIBUTING.md` + `CODE_OF_CONDUCT.md` |47| `add-scrut-cli-tests` | `tests/scrut/` directory |48| `set-up-installers` | `Formula/` |49| `optimize-runner-usage` | `concurrency:` key in any `.github/workflows/*.yml` |50| `clean-up-agent-config` | `AGENTS.md` or (`CLAUDE.md` + `.claude/settings.json`) |5152For each detected tool, record which artifacts were found and which expected artifacts are missing (for "Partially set up" status).5354### 3. Compare Against Latest Templates5556For each detected tool, run through its checklist from the Reference sections at the bottom of this file. Read the target repo's files and check for the specified patterns.5758For each failed check, record:5960- The file path61- What's wrong (concise description)62- The recommended fix6364Use Grep and Read to check file contents. Check action versions against the **Reference: Action Versions** table.6566### 4. Build and Present the Update Plan6768Present a table with all detected tools and their status:6970```text71| # | Tool | Status | Issues Found | Action |72|---|-------------------------|----------------|-------------------------------------------------|-----------------|73| 1 | set-up-ci | Needs update | actions/checkout@v4 (target: v6), no timeout | Update workflow |74| 2 | set-up-linters | Up to date | | None |75| 3 | set-up-secret-scanning | Partially set | TruffleHog workflow missing | Add workflow |76| 4 | add-community-files | Needs update | CoC is v2.1 (current: v3.0) | Update CoC |77| 5 | clean-up-agent-config | Needs update | CLAUDE.md is regular file, not symlink | Convert to symlink |78| 6 | optimize-runner-usage | Up to date | | None |79| 7 | scaffold-new-repo | Needs update | .gitignore missing .claude/settings.local.json | Update file |80| 8 | add-goreleaser-homebrew | Up to date | | None |81```8283Status values:8485| Status | Meaning |86| ---------------- | ------------------------------------------------------------------- |87| Up to date | All checks pass; nothing to do |88| Needs update | Files exist but fail some checks |89| Partially set up | Some expected files from a detected tool are missing entirely |90| Not detected | Tool was never used (run bootstrap-project or the individual skill) |91| Not applicable | Tool does not apply to this project type |9293Items with status "Not detected" and "Not applicable" are informational only and are not actionable in this command.9495### 5. User Confirmation9697Ask the user which items to update. Only items with status "Needs update" or "Partially set up" are actionable. Present them as a numbered list and let the user:9899- Confirm all actionable items100- Select specific items by number101- Skip specific items102103If no items need updating (everything is up to date), congratulate the user and stop.104105### 6. Execute Updates106107For each confirmed update item, choose a strategy based on scope:108109| Scenario | Strategy |110| ---------------------------------------------- | ------------------------------------------------------------------------------------ |111| Action version outdated | **Targeted**: find and replace the version string in the workflow file |112| Missing config entry (e.g., .gitignore line) | **Targeted**: add the missing entry to the appropriate section |113| Missing workflow key (e.g., `timeout-minutes`) | **Targeted**: add the key to each job in the workflow file |114| Missing `concurrency:` group | **Targeted**: add the concurrency block below the `on:` trigger block |115| Missing `permissions:` block | **Targeted**: add the permissions block at the workflow level |116| CLAUDE.md is regular file, not symlink | **Full re-run**: invoke `clean-up-agent-config` to reconcile CLAUDE.md and AGENTS.md |117| Community file outdated (e.g., CoC version) | **Full re-run**: invoke the `add-community-files` skill via the Skill tool |118| Missing file from a detected tool | **Full re-run**: invoke the original skill via the Skill tool |119120For full tool re-runs, all detected tools are skills. Invoke them via the Skill tool. Relevant skills include `add-community-files`, `set-up-linters`, `set-up-ci`, `set-up-secret-scanning`, `add-goreleaser-homebrew`, `set-up-installers`, `add-scrut-cli-tests`, `scaffold-new-repo`, and `optimize-runner-usage`.121122Process updates in this order (matching the bootstrap-project execution order):1231241. `scaffold-new-repo` (foundation files)1251. `scaffold-go-cli` / `scaffold-go-library` (language scaffold)1261. `set-up-ci` (CI workflow)1271. `set-up-linters` (linter configs)1281. `set-up-secret-scanning` (secret scanning)1291. `add-goreleaser-homebrew` (release config)1301. `add-community-files` (community files)1311. `set-up-installers` (distribution)1321. `add-scrut-cli-tests` (testing)1331. `optimize-runner-usage` (CI optimization)1341. `clean-up-agent-config` (agent config)135136After each update, verify the change was applied correctly. If an update fails, report the error and ask whether to continue with remaining items or stop.137138### 7. Summary139140Print a summary grouped by outcome:141142- **Updated**: list each change made, grouped by tool143- **Skipped**: items the user chose not to update144- **Already up to date**: tools that passed all checks145- **Errors**: any issues encountered during updates146147Suggest next steps:148149- Run `/lint-and-fix` to check formatting of updated files150- Commit the changes151- Push and verify CI passes152153---154155## Reference: Action Versions156157The target versions for GitHub Actions that repositories should be updated to. When auditing workflow files, check `uses:` lines against this table. Actions not listed in this table are outside the scope of this audit and should be skipped without flagging.158159| Action | Target version |160| ------------------------------- | -------------- |161| `actions/checkout` | `v6` |162| `actions/download-artifact` | `v8` |163| `actions/setup-go` | `v6` |164| `actions/setup-node` | `v6` |165| `actions/upload-artifact` | `v7` |166| `astral-sh/setup-uv` | `v8` |167| `dtolnay/rust-toolchain` | `stable` |168| `gitleaks/gitleaks-action` | `v2` |169| `golangci/golangci-lint-action` | `v9` |170| `goreleaser/goreleaser-action` | `v7` |171| `ludeeus/action-shellcheck` | `2.0.0` |172| `mfinelli/setup-shfmt` | `v4` |173| `oven-sh/setup-bun` | `v2` |174| `ruby/setup-ruby` | `v1` |175| `Swatinem/rust-cache` | `v2` |176| `trufflesecurity/trufflehog` | `v3` |177178When auditing, treat SHA-pinned references (e.g., `actions/checkout@a5ac7e5...`) as compliant if the pinned commit corresponds to the listed version or newer. Do not downgrade SHA pins to mutable version tags.179180<!-- Maintenance: update this table when any command template changes its action versions. -->181182## Reference: CI Workflow Checks (set-up-ci)183184### Files185186- `.github/workflows/ci.yml`187- `Makefile`188189### Checks for ci.yml190191- All `uses:` references match the Action Versions table above192- Has a top-level `permissions:` block (typically `contents: read`)193- Has a `concurrency:` block with `group: ${{ github.workflow }}-${{ github.ref }}` and `cancel-in-progress: true`194- Every job has `timeout-minutes:` set (typically 15 for test/lint, 10 for format/vuln)195- Has `paths-ignore:` on push and pull_request triggers with the standard list (see Reference: Standard paths-ignore)196- Go projects: uses `go-version-file: go.mod` instead of a pinned Go version197- Go libraries: has a multi-version test matrix (minimum + stable)198- JS/TS projects: detects package manager from lockfile and uses the correct install command199200### Checks for Makefile201202- Has `.PHONY:` declarations203- Has a `help` target204- Go CLI targets: build, test, lint, vet, fmt, vuln, clean, cover, tidy205- Go library targets: all, build, test, lint, vet, fmt, vuln, clean, coverage, tools206- JS/TS targets: test, lint, fmt (or format)207- Python targets: test, lint, fmt208- Rust targets: test, lint, fmt, build, clean209- Ruby targets: test, lint210- Shell targets: lint, fmt211212## Reference: Secret Scanning Checks (set-up-secret-scanning)213214### Files215216- `.github/workflows/gitleaks.yml`217- `.github/workflows/trufflehog.yml`218- `.gitleaks.toml`219220### Checks for gitleaks.yml221222- Uses `cboone/gh-actions/.github/workflows/scan-for-secrets.yml` with a refreshed SHA-pinned ref and current version comment223- Sets `tool: gitleaks`224- Has `permissions:` block with `contents: read`225- Has `concurrency:` group with `group: ${{ github.workflow }}-${{ github.ref }}` and `cancel-in-progress: true`226- Triggers on `push: branches: [main]`227- Has `pull_request:` trigger228- Has `workflow_dispatch:` trigger229- The reusable workflow handles checkout with `fetch-depth: 0` and tool installation internally230231### Checks for trufflehog.yml232233- Uses `cboone/gh-actions/.github/workflows/scan-for-secrets.yml` with a refreshed SHA-pinned ref and current version comment234- Sets `tool: trufflehog`235- Has `permissions:` block with `contents: read`236- Triggers on `push: branches: [main]`237- Has `pull_request:` trigger238- Has `workflow_dispatch:` trigger239- Has `concurrency:` group with `group: ${{ github.workflow }}-${{ github.ref }}` and `cancel-in-progress: true`240- The reusable workflow handles checkout with `fetch-depth: 0`, TruffleHog version pinning, and tool execution internally241242### Checks for .gitleaks.toml243244- Has `[allowlist]` section245- Includes lockfile patterns relevant to the detected project type (`go.sum` for Go, `package-lock.json` for JS, etc.)246247## Reference: Foundation File Checks (scaffold-new-repo)248249### Files250251- `LICENSE`252- `README.md`253- `CHANGELOG.md`254- `.gitignore`255- `AGENTS.md`256- `CLAUDE.md`257- `.claude/settings.json`258- `.github/copilot-instructions.md`259260### Checks for LICENSE261262- Contains "MIT License" text263- Copyright year includes the current year (or is a range ending in the current year)264265### Checks for .gitignore266267Must include these universal entries:268269```text270.DS_Store271.claude/settings.local.json272.env273.env.*274!.env.example275!.env.sample276*.pem277*.key278*.p12279credentials.json280token.json281```282283Must include language-specific entries appropriate for the detected project type:284285- **Go**: `*.exe`, `*.test`, `*.out`, `coverage.*`, `go.work`, `go.work.sum`, `bin/`, `dist/`286- **JavaScript**: `node_modules/`, `coverage/`, `dist/`, `*.log`287- **Python**: `__pycache__/`, `*.pyc`, `.venv/`, `dist/`, `build/`288- **Rust**: `target/`289- **Ruby**: `*.gem`, `.bundle/`, `vendor/bundle`, `pkg/`290291### Checks for agent config292293- `CLAUDE.md` is a symlink pointing to `AGENTS.md` (run `readlink CLAUDE.md` to verify)294- `.claude/settings.json` exists295- `.github/copilot-instructions.md` exists and references `AGENTS.md`296- `.claude/settings.local.json` is listed in `.gitignore`297298## Reference: Linter Config Checks (set-up-linters)299300### Files301302- `.editorconfig`303- `.prettierrc.json`304- `.prettierignore`305- `.markdownlint-cli2.jsonc` (or `.markdownlint-cli2.yaml`, `.markdownlint.json`, `.markdownlint.jsonc`, `.markdownlint.yaml`)306- Language-specific linter configs (`.golangci.yml`, `.shellcheckrc`, etc.)307308### Checks for .editorconfig309310- Has `root = true` at the top311- Has base settings: `charset = utf-8`, `end_of_line = lf`, `insert_final_newline = true`, `trim_trailing_whitespace = true`312- Go projects: has `[*.go]` section with `indent_style = tab`313- Python/Rust projects: has language section with `indent_size = 4`314- Has `[Makefile]` section with `indent_style = tab` (if Makefile exists)315- Has `[*.md]` section with `trim_trailing_whitespace = false`316- Shell projects: has shfmt properties (`binary_next_line`, `space_redirects`, `switch_case_indent`)317318### Checks for .prettierrc.json319320- Has `printWidth` set to `10000` (not the default 80)321- Has `proseWrap` set to `"preserve"`322- Has `tabWidth` set to `2`323- JS projects: has `semi: false`, `singleQuote: true`, `trailingComma: "all"`324325### Checks for .prettierignore326327- Exists (if `.prettierrc.json` exists)328- Includes `node_modules/` and build output directories329330### Checks for markdownlint config331332- Config file exists (any supported name)333- `MD013` is set to `false` (Prettier handles line length)334- `MD033` is set to `false` (allow inline HTML)335- `MD034` is set to `false` (allow bare URLs)336- Ignores list includes `CHANGELOG.md`337- Scrut projects: `MD014` is set to `false` (allow dollar signs before commands)338339## Reference: Community File Checks (add-community-files)340341### Files342343- `CONTRIBUTING.md`344- `CODE_OF_CONDUCT.md`345- `.github/SECURITY.md`346- `.github/PULL_REQUEST_TEMPLATE.md`347348### Checks for CODE_OF_CONDUCT.md349350- Contains "Contributor Covenant" attribution351- References version 3.0 (check for `version/3/0` in the URL or "version 3.0" in text)352- If it references an older version (1.4, 2.0, 2.1), flag as outdated353- Has 4-tier enforcement ladder (Warning, Temporarily Limited Activities, Temporary Suspension, Permanent Ban)354355### Checks for CONTRIBUTING.md356357- Has a Development Setup section with build/test/lint commands358- Commands match the project's actual build system (check against Makefile targets or package.json scripts)359- Has a Commit Messages section referencing Conventional Commits360- Has a Pull Request Process section with branch naming conventions361362### Checks for .github/SECURITY.md363364- Instructs users to use GitHub private vulnerability reporting (not public issues)365- Has response timeline (24h acknowledgment, 48h assessment)366367### Checks for .github/PULL_REQUEST_TEMPLATE.md368369- Exists370- Has a checklist with at least: tests pass, style followed, documentation updated371372## Reference: GoReleaser Checks (add-goreleaser-homebrew)373374### Files375376- `.goreleaser.yml`377- `.github/workflows/release.yml`378379### Checks for release.yml380381- Uses `cboone/gh-actions/.github/workflows/release-go-binaries.yml` with a refreshed SHA-pinned ref and current version comment382- Go CLI releases pass `go-version-file: go.mod`383- Triggers on `push: tags: ["v*"]`384- Has `permissions: contents: write`385- Has `concurrency:` group with `group: ${{ github.repository }}-${{ github.workflow }}` and `cancel-in-progress: false` (never interrupt releases)386- The reusable workflow handles checkout with `fetch-depth: 0`, Go setup, GoReleaser installation, and release execution internally387388### Checks for .goreleaser.yml389390- Has `version: 2` (GoReleaser v2 config format)391- Has `changelog:` section with `use: github` or grouped categories392393## Reference: Runner Optimization Checks (optimize-runner-usage)394395### Files396397- All `.github/workflows/*.yml` files398399### Checks for each workflow400401- Has `concurrency:` block (pattern depends on workflow type, see below)402- Every job has `timeout-minutes:` set403- CI workflows: has `paths-ignore:` on push/pull_request triggers404405### Concurrency patterns by workflow type406407| Workflow type | Concurrency group pattern | cancel-in-progress |408| ----------------------- | ------------------------------------------------- | ------------------ |409| CI | `${{ github.workflow }}-${{ github.ref }}` | `true` |410| Release | `${{ github.repository }}-${{ github.workflow }}` | `false` |411| Secret scanning | `${{ github.workflow }}-${{ github.ref }}` | `true` |412| Scheduled | `${{ github.workflow }}-${{ github.ref }}` | `true` |413| Mixed (branches + tags) | `${{ github.workflow }}-${{ github.ref }}` | `false` |414415### Timeout guidelines416417| Job type | Recommended timeout |418| ------------------- | ------------------- |419| Release/publish | 30 minutes |420| Rust builds | 20 minutes |421| Test/lint (general) | 15 minutes |422| Format/vuln check | 10 minutes |423424### Do NOT apply paths-ignore to425426- Release workflows427- Mixed-trigger workflows (branches + tags)428- Scheduled workflows429- Secret scanning workflows430- Workflows with existing `paths:` positive filters431- Reusable workflows432433## Reference: Agent Config Checks (clean-up-agent-config)434435### Files436437- `AGENTS.md`438- `CLAUDE.md`439- `.claude/settings.json`440- `.claude/settings.local.json`441- `.claude/rules/*.md`442- `.github/copilot-instructions.md`443- `.github/instructions/*.instructions.md`444445### Checks446447- `AGENTS.md` exists and is the canonical instruction file (not a symlink)448- `CLAUDE.md` is a symlink pointing to `AGENTS.md` (verify with `readlink`)449- If `CLAUDE.md` is a regular file and `AGENTS.md` also exists, flag the duplication450- `.claude/settings.json` exists and contains only team-shared settings (permissions, hooks, env vars for conventions)451- `.claude/settings.local.json` is gitignored (check `.gitignore` for the entry)452- `.github/copilot-instructions.md` cross-references `AGENTS.md`453- `.github/instructions/*.instructions.md` files have `applyTo:` frontmatter454455## Reference: Scrut Test Checks (add-scrut-cli-tests)456457### Files458459- `tests/scrut/` directory460- `Makefile` (for scrut targets)461- `.github/workflows/ci.yml` (for scrut CI job)462463### Checks464465- `tests/scrut/` directory exists and contains `.md` test files466- `Makefile` has `test-scrut` and `test-scrut-update` targets467- `Makefile` has `test-all` target that depends on both `test` and `test-scrut`468- CI workflow has a job or step that installs and runs scrut469- If markdownlint config exists: `MD014` is set to `false`470471## Reference: Installer Checks (set-up-installers)472473### Files474475- `Formula/*.rb`476477### Checks for Formula/\*.rb478479- Has `desc` field480- Has `homepage` field481- Has platform-specific blocks (`on_macos`/`on_linux` or `depends_on :macos`)482483## Reference: Standard paths-ignore484485The standard `paths-ignore` list for CI workflow push and pull_request triggers:486487```yaml488paths-ignore:489 - "*.md"490 - "docs/**"491 - "LICENSE"492 - ".editorconfig"493 - ".claude/**"494 - "**/CLAUDE.md"495 - "**/AGENTS.md"496```497498Note: `tests/scrut/*.md` files are source code and should NOT be ignored. If the project uses scrut tests, verify that the paths-ignore pattern does not exclude nested `.md` files (the `"*.md"` pattern only matches root-level files).499500<!-- Maintenance: when any plugin template changes, update the corresponding Reference section above. -->