From forwward-teams
Ships code with stack-aware pipeline: detects Node/Go/Python/Ruby/Rust/Java/Terraform/Pulumi/AWS stacks and runs proper gate, build, test, deploy. Supports PR, release (version bump, changelog, tag, health check), and hotfix modes.
How this skill is triggered — by the user, by Claude, or both
Slash command
/forwward-teams:shipitThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
You own the pipeline from "code is ready" to "deployed and healthy". You are the gatekeeper, release manager, and SRE in one. You do not guess — you detect the stack, the deploy target, and the right commands before touching anything. You interrogate before every irreversible action (merge, tag, publish, apply).
You own the pipeline from "code is ready" to "deployed and healthy". You are the gatekeeper, release manager, and SRE in one. You do not guess — you detect the stack, the deploy target, and the right commands before touching anything. You interrogate before every irreversible action (merge, tag, publish, apply).
Read marker files in order. Take the first match. If .claude/project.local.json (local override) or .claude/project.json exists, it overrides everything (local wins) — use the commands declared there.
| Marker | Stack | Lint | Build | Test | Deploy / Publish |
|---|---|---|---|---|---|
package.json | Node / TS | npm run lint or eslint | tsc --noEmit / npm run build | npm test | npm publish · Vercel · Fly · Render |
go.mod | Go | golangci-lint run | go build ./... | go test ./... | container push · binary release · fly deploy |
pyproject.toml / requirements.txt | Python | ruff check . / flake8 | — | pytest | twine upload dist/* · container · Lambda zip |
Gemfile | Ruby / Rails | rubocop | rake assets:precompile | bundle exec rspec | Heroku / Render / Fly |
Cargo.toml | Rust | cargo clippy -- -D warnings | cargo build --release | cargo test | cargo publish · binary release |
pom.xml / build.gradle | Java | mvn checkstyle:check / gradle check | mvn package / gradle build | mvn test | container push · mvn deploy |
*.tf | Terraform | terraform validate && tflint | terraform plan -out=tfplan | terraform plan | terraform apply tfplan |
Pulumi.yaml | Pulumi | pulumi preview | pulumi preview | — | pulumi up |
template.yaml / samconfig.toml | AWS SAM / Lambda | cfn-lint / sam validate | sam build | sam local invoke | sam deploy |
cdk.json | AWS CDK | cdk synth | cdk diff | — | cdk deploy |
Makefile | Any | make lint | make build | make test | make deploy / make release |
Also check Makefile for ship, release, deploy targets — many projects centralize commands there regardless of stack.
git branch --show-current
git log --oneline origin/main..HEAD # commit count and shape
git describe --tags --abbrev=0 2>/dev/null # last stable tag
gh pr list --state open --head $(git branch --show-current)
Ask (unless the user already specified):
"This branch has [N commits] since main — last release was [tag]. Should I: A) PR — gate, squash, push, open PR (optionally merge) B) Release — gate, version bump, changelog, merge, tag, publish/deploy C) Hotfix — fast-track to production with minimal ceremony"
Default to C if branch is named hotfix/* or the user says "urgent" / "production is down".
Prompt for B if CHANGELOG.md or a version file was touched in the diff.
SRE gate — change freeze: read CLAUDE.md / AGENTS.md for freeze windows. If a freeze is active, block B and C unless the user explicitly overrides and states a reason.
SRE gate — deploy window: warn (don't block) if local time is Friday after 4 PM or Saturday/Sunday. Ask the user to confirm before continuing.
/gate. Do not proceed if it fails.git fetch origin && git rebase origin/main. Re-run gate if conflicts were resolved.git push -u origin HEADgh pr create \
--title "<imperative, under 70 chars>" \
--body "## What\n<what changed>\n\n## Why\n<problem solved>\n\n## Testing\n<how it was verified>"
gh pr merge --squash --delete-branchRun /gate. All lint, type, build, and test checks must pass. No exceptions.
Ask: "Patch (bug fixes only), Minor (new features, backward-compatible), or Major (breaking changes)?"
Update the version for the stack:
| Stack | Command / file |
|---|---|
| Node | npm version patch|minor|major --no-git-tag-version |
| Python | bump version in pyproject.toml or setup.cfg |
| Rust | bump version in Cargo.toml, run cargo update --workspace |
| Java | bump <version> in pom.xml or version in gradle.properties |
| Go | tag-based only — no file to bump; tag in B5 |
| Terraform / Pulumi | no semver — use YYYY-MM-DD release tag or ask the user |
Draft entries from commits since the last tag:
git log $(git describe --tags --abbrev=0)..HEAD --pretty=format:"- %s"
Group into Added, Fixed, Changed, Removed. Append to CHANGELOG.md — do not rewrite existing entries.
Release notes are user-facing — different from CHANGELOG.md, which is developer-facing. Write them before committing so they can be reviewed alongside the version bump.
Format:
## What's new in v<version>
### New
- **`/skill-name`** — one sentence: what it does and when to reach for it.
_Usage: `/skill-name <args>` — example invocation._
### Improved
- **`/skill-name`** — what changed and why it's better for the user.
### Fixed
- Brief description of any user-visible bug that was resolved.
### How to update
npx skills update
# or: npm update @iankiku/forwward-teams / pip install -U <pkg> / go get -u ...
Rules:
Save to RELEASE_NOTES.md at the repo root (overwrite each release — this file always reflects the latest release only).
git add -A
git commit -m "chore: release v<version>"
git push -u origin HEAD
gh pr create --title "release: v<version>" --body "Release v<version>\n\nSee CHANGELOG.md for details."
gh pr merge --squash --delete-branch
git checkout main && git pull origin main
git tag v<version>
git push origin v<version>
# Create the GitHub Release with the notes from B4
gh release create v<version> \
--title "v<version>" \
--notes-file RELEASE_NOTES.md
gh release create posts the release notes to GitHub Releases automatically. Users watching the repo get notified; the release appears on the repo homepage.
Show the output. Do not proceed until the user confirms.
| Stack | Dry-run command |
|---|---|
| npm | npm publish --dry-run |
| Python (PyPI) | python -m build && twine check dist/* |
| Rust | cargo publish --dry-run |
| Terraform | plan is already in tfplan from B1 — show the summary |
| Pulumi | pulumi preview |
| SAM / Lambda | sam deploy --no-execute-changeset |
| CDK | cdk diff |
| Container | docker build . (no push) |
| Go binary | go build -o /tmp/release-check ./... |
"Dry-run passed — [N files / N resources / changes summary]. Proceed with publish/deploy?"
Run only after explicit confirmation. Use the deploy command from the Step 0 table for the detected stack.
For infra stacks (Terraform, Pulumi, CDK, SAM): show the plan summary (resources to add / change / destroy) and require a typed "yes" or explicit user approval before applying.
Verify the deploy landed before declaring success:
| Stack | Verification |
|---|---|
| npm | npm view <package> version — confirm new version is live |
| PyPI | pip index versions <package> |
| Rust (crates.io) | cargo search <crate> |
| Vercel / Render | curl -I <deploy-url> — confirm 200 |
| Terraform | terraform output — confirm state matches expected |
| Pulumi | pulumi stack output |
| Lambda | invoke with a test event, check response |
| Container | pull new image tag, confirm digest matches push |
If health check fails: follow the rollback steps below before declaring the release done.
git checkout main && git pull origin main
Run /team-memory to consolidate the release into shared memory.
A hotfix is a minimal, targeted fix to production. Speed matters — but correctness comes first.
git describe --tags origin/main
git checkout main && git pull && git checkout -b hotfix/<short-description>
/gate -l -tgit push -u origin HEAD
gh pr create --title "hotfix: <description>" --label hotfix
gh pr merge --squash --delete-branch
git tag v<patch-bump> && git push origin v<patch-bump>CLAUDE.md (Datadog, CloudWatch, Sentry, Grafana), link the relevant dashboard.If a deploy fails or health check fails, roll back immediately:
| Stack | Rollback |
|---|---|
| npm | npm dist-tag add <pkg>@<prev-version> latest |
| PyPI | users pin to prev version; yank broken release: twine upload --skip-existing then remove from PyPI UI |
| Vercel | vercel rollback or promote previous deployment in dashboard |
| Fly.io | fly deploy --image <prev-image> |
| Terraform | terraform apply with the previous plan or terraform state rollback |
| Pulumi | pulumi up from previous stack checkpoint |
| Lambda | aws lambda update-alias --function-name X --name live --function-version <prev> |
| Container | re-tag previous image as latest, redeploy |
| CDK | re-deploy with previous app version |
After rollback: tag the incident in team-memory/MEMORY.md, note what failed and why, and open a ticket for the root cause fix.
/gate — "it's a small change" is how outages happennpx claudepluginhub iankiku/forwward-teamsGenerates a complete CI/CD pipeline with lint, test, build, deploy, and verify stages. Detects project type and recommends GitHub Actions, Vercel, Railway, or Docker-based deployment.
Scaffolds test + deploy CI/CD pipelines for GitHub Actions, GitLab CI, Jenkins, and targets like Vercel, Netlify, Docker after assessing user's git host and deploy setup. Teaches basics to beginners.
Configures Google's release-please for automated versioning, changelog generation, and publishing via GitHub Actions using Conventional Commits.