| name | yeet |
| description | Ship it — formats, builds, tests, commits, and pushes. Accepts --skip-tests flag to skip build+test when caller already verified them. Triggers on: ship it, yeet, push it, commit and push, deploy this, we're done, preflight, preflight check, quality check, pre-commit check, ready to commit.
|
| argument-hint | [--skip-tests] [--dry-run] |
Yeet Skill
Ship it. Quality gate + commit + push in one autonomous pass.
Modes
| Invocation | Behavior |
|---|
/yeet | Full: PII + format + build+test + commit + push |
/yeet --skip-tests | Fast path: PII + format only; skips build+test |
/yeet --dry-run | Quality gate only — no commit or push |
--dry-run replaces the retired /preflight skill.
Steps
0. Gather context (parallel batch)
Run all in a single parallel message:
A) scripts/status.sh --json (working-tree status)
B) scripts/branch.sh --json (branch info, ahead/behind counts)
Derive from status JSON:
- Classification: all
.md/.json/.yml/.yaml/.txt = docs-only; any .cs/.csproj = code; else mixed
- If
docs-only AND --skip-tests not explicit → auto-enable --skip-tests, log: "Docs/config-only change — skipping build+test"
- Cache:
cs_changed, ahead, has_changes, analyzers_or_scripts_changed
- Set
analyzers_or_scripts_changed = true if any changed file path starts with src/*Analyzers*/ or scripts/
1. Format + build + test
A) Format (unconditional — never skip):
scripts/format.sh
Run this on every yeet, regardless of classification (docs-only, code, mixed), flags (--skip-tests, --dry-run), or working tree state. Reaching step 1 without running scripts/format.sh is a bug.
Runs on the entire solution. This catches violations introduced by prior commits that local format missed (e.g., analyzer-backed style rules that require restore).
If format produces changes and the working tree was previously clean, those changes become the commit.
After format, re-check working tree state. If still no changes (format found nothing, and has_changes was false) → "Nothing to yeet — working tree is clean." Stop.
B) Build + test (conditional):
Skip if --skip-tests (explicit or auto-detected docs-only).
scripts/check.sh --no-format --all
If exit code is non-zero → stop and report failures.
C) Analyzer release files (conditional):
Only if the repo has a Roslyn analyzer project (a src/*Analyzers*/ project) AND any staged or unstaged .cs file changes under it. Resolve the analyzer project name from the changed path (or scripts/solution-inventory.sh --json); call it <AnalyzerProject> below. Skip this whole step if no analyzer project exists.
C.1) Version bump:
scripts/internal/version-bump.sh <AnalyzerProject>
This increments the <Version> in the analyzer csproj so the NuGet package ships with a new version. Skip with "Analyzer version bump skipped — no analyzer source changes" if no .cs files changed.
If the version was bumped, re-read the csproj before any subsequent edits.
C.2) Unshipped/Shipped validation:
scripts/internal/analyzer-release-check.sh --json
Parse the JSON output. If status is "issues":
missing array → add each ID to Unshipped.md with the correct Rule ID, Category, Severity, and Notes from the analyzer source
duplicates array → remove each from Unshipped (Shipped wins)
orphans array → remove each orphaned entry from Unshipped.md
- Verify table format consistency: aligned-column markdown, column order
Rule ID | Category | Severity | Notes
If any fixes are needed, apply them silently (auto-approval per project rules). Log what was fixed.
D) README freshness (conditional):
Only if any staged or unstaged changes touch analyzer source (src/*Analyzers*/) OR scripts/:
Spawn the readme-auditor agent:
Agent(subagent_type="readme-auditor",
prompt="Audit all README.md files for staleness and auto-fix drift.")
If the agent produces edits, they become part of this commit. No separate commit.
Skip with "README check skipped — no analyzer or script changes" if neither path is touched.
If --dry-run: report quality gate results and stop here. Do not continue to step 2.
2. Stage + commit + push
Rules
- All pending changes ship together — never unstage, cherry-pick, or exclude files from the commit. Everything in the working tree goes into one commit. Do not ask whether to include specific files.
- Fully autonomous — no user prompts during execution
- Stop on failure — PII fail, build fail, or test fail halts the pipeline
- No email addresses — never in a commit message, trailer, or PR body. The PII scan blocks real emails in the staged diff and
commit.sh rejects an email in the message; user@example.com placeholders are allowed
- Single commit per push — squash local commits when
ahead > 1
- Do NOT auto-commit or push again after completing these steps — one-time action
--dry-run stops after step 1 — quality check only, no side effects
- Format is unconditional —
scripts/format.sh runs on every yeet; no flag, classification, or condition skips it.
- Re-read gate — after format runs (step 1A), all
.cs file contents are stale. Do NOT Edit any .cs file after step 1 without re-reading first.
Troubleshooting
- PII scan finds home directory paths — replace with relative paths or env-var substitution
- Format changes files unexpectedly — expected after editorconfig updates; review diff, re-run build
- Build passes but tests fail — do not commit; fix tests first