agentsclimarketplace

Ci scaffold

Skill KeiSeiLab/KeiSeiKit/skills/ci-scaffold

Hub-and-spoke pipeline that produces a production-grade CI/CD plan and scaffolds the workflow files for a new or existing repo — platform choice (GitHub Actions vs Forgejo Actions), build matrix, OIDC-vs-token secrets posture, release automation, and a security gate — via pure-click decisions across five phases. Emits `.github/workflows/*.yml` or `.forgejo/workflows/*.yml`, a secrets-env scaffold (RULE 0.8), and runs `kei-ci-lint` before handing off. Never writes secret values.From its SKILL.md

Install
npx -y skills add KeiSeiLab/KeiSeiKit --skill ci-scaffold

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

One thing to look at

  • 7 stars7 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

SKILL.md

6.0 KB, as published. Nobody here has run it

CI-Scaffold — CI/CD Pipeline Generator (index)

When to use

  • Setting up CI/CD for a new or existing repo (GitHub Actions or Forgejo Actions).
  • Choosing a release automation strategy, security gate, and OIDC vs token secrets posture.
  • Scaffolding .github/workflows/*.yml or .forgejo/workflows/*.yml from scratch.

See _blocks/pipeline-5phase-template.md for the 5-phase wizard contract and _blocks/rule-pure-click-contract.md for the AskUserQuestion rule. Skill-specific phase tables are inline below.

You are converting "I need CI for repo X" into a reviewable, concrete plan plus generated workflow files: which platform (GH Actions vs Forgejo), what build matrix, how secrets flow (OIDC vs PAT), which release tool, and which security scanners block merge. Every decision is a click; the only typed input is the Phase 1 intake paragraph.

This skill scaffolds workflow YAML. It does NOT commit on the user's behalf and NEVER writes secret values. After Phase 5 it runs _primitives/kei-ci-lint.sh and walks the user through any violations via AskUserQuestion (fix / skip / abort).

The skill reads four companion blocks heavily — every phase references at least one:

  • _blocks/ci-github-actions.md — GH Actions: OIDC, matrix, cache, reusable, least-privilege token.
  • _blocks/ci-forgejo-actions.md — Forgejo (GH-compat) self-hosted runner, Tailscale-only admin.
  • _blocks/ci-release-automation.md — release-please / changesets / cargo-release / goreleaser.
  • _blocks/ci-security-gate.md — gitleaks, cargo-audit, npm/pip-audit, syft SBOM, semgrep, licenses.

Pipeline overview (5 phases, ≥5 AskUserQuestion calls)

PhaseFilePurposeAskUserQuestion
1phase-1-intake.mdPlatform / languages / deploy target / release strategy4×
2phase-2-matrix.mdBuild matrix: OS × version × target1×
3phase-3-workflows.mdGenerate .github/workflows/*.yml or .forgejo/workflows/*.yml1×
4phase-4-secrets.mdOIDC vs PAT; RULE 0.8 env-var scaffold1×
5phase-5-verify.mdRun kei-ci-lint; fix/skip/abort on each finding1× per finding (≥0)

Minimum AskUserQuestion count across a full session: 8 (4 Phase 1 + 1 each Phases 2–5). Exceeds the ≥5 hub-and-spoke contract. Phase 5 adds one AskUserQuestion PER lint finding — typically 0–3.


Variables the pipeline produces

NameSet inMeaning
REPOPhase 1Free-text one-liner: stack + deploy target
PLATFORMPhase 1github-actions / forgejo-actions / both
LANGSPhase 1subset of {rust, node, python, go, flutter, swift}
DEPLOYPhase 1none / aws-oidc / gcp-oidc / cloudflare / modal / docker-registry / custom
RELEASEPhase 1release-please / changesets / cargo-release / goreleaser / none
MATRIXPhase 2{os, lang-version, target} tuple list
WORKFLOWSPhase 3list of generated YAML filenames
SECRETSPhase 4env var NAMES + storage path; NEVER values
LINTPhase 5pass / warn-with-overrides / fail

Final report (emit after Phase 5)

=== CI-SCAFFOLD REPORT ===
Repo:       <REPO one-liner>
Platform:   <PLATFORM>
Languages:  <LANGS>
Deploy:     <DEPLOY>
Release:    <RELEASE tool>
Matrix:     <os count> × <version count> × <target count> = N cells
Workflows:  <list of generated file paths>
Secrets:    <N> env VAR names written to secrets/ci.env scaffold (RULE 0.8)
Lint:       <kei-ci-lint status> (<N findings, M fixed, K skipped>)
Next:       review diff → commit → push to feat/<name>-ci branch

Rules (apply throughout)

  • Pure-click contract. Only Phase 1 intake is typed. Every other decision is AskUserQuestion.
  • RULE 0.8 Secrets SSoT. Emit env VARIABLE NAMES only (AWS_ROLE_ARN, CARGO_REGISTRY_TOKEN, ...). NEVER echo a token value. Storage path is <repo>/secrets/ci.env per _blocks/domain-has-secrets.md.
  • RULE 0.4 NO HALLUCINATION. Every uses: value cites a real repo — tags used are those actually published on the action's release page at scaffold time (actions/checkout@v4, actions/cache@v4, Swatinem/rust-cache@v2, etc.). If unsure, prefer pin-by-SHA with a comment; never invent a version.
  • ** NO GITHUB PUSH.** If PLATFORM=forgejo-actions the skill REFUSES to also emit .github/workflows/ files. Mixed posture allowed only with explicit user confirmation.
  • NO DOWNGRADE. If a Phase-5 finding blocks, the skill returns 2–3 constructive fixes (not "skip it").
  • Fail-closed default. Unknown stack → no matrix generated until user clicks; missing OIDC role → block deploy job scaffold with a typed TODO.
  • Surgical scope. Writes ONLY under .github/workflows/ or .forgejo/workflows/ and prints the secrets/ci.env scaffold to chat (never writes secrets/*.env itself).

References

  • _blocks/ci-github-actions.md, _blocks/ci-forgejo-actions.md, _blocks/ci-release-automation.md, _blocks/ci-security-gate.md.
  • _blocks/domain-has-secrets.md — storage path + loading convention.
  • _blocks/rule-pre-dev-gate.md — analogue check before inventing a new workflow.
  • _primitives/kei-ci-lint.sh — workflow YAML validator (R1–R7 rules).
  • Evidence grade [E2] — mirrors GitHub Actions security hardening guide + Forgejo Actions docs as of 2026-04-21.

Keep looking

Skills are one crate of 627,801. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.