build-getff-dist.sh — dist packaging (G9)
The release assembler behind npx getff: copies the payload into packages/getff laid out exactly like the repo root, tracks every file in a committed MANIFEST.sha256, and gates publication through --check drift detection on npm prepack.
build-getff-dist.sh — dist packaging (G9)
Status: shipped-beta (release engineering; runs at pack time, not install time) · Ships to: npm release channel — produces the tarball layout the published getff package (G1) ships · Fires at: npm publish (via the package's prepack) or when run by hand; --check also gates CI/release drift
What it is
A 123-line assembler script that builds packages/getff — the distribution package — from the repository root. Its core insight is the "WHY A COPY, NOT A MOVE" header: the installer reads everything PKG_ROOT-relative, and a tarball laid out exactly like the repo root makes PKG_ROOT land where the script already looks, so not one of those reads changes. The payload copy is gitignored; what is COMMITTED is MANIFEST.sha256, one <sha256> <path> line per assembled file (1078 lines at the working pin).
How it works
- The file list's source of truth is
git ls-files(tracked files only) — deliberately NOT a directory walk, which would ship whatever lies in the working tree: node_modules, a scratch file, a secret. The script's header names this hazard explicitly. - The payload roots are a fixed allowlist mirroring package.json's
filesarray (install.sh, setup, setup.d/, agents/, skills/, templates/, .claude/, packages/, scripts/ subset, .prettierrc.json, bin/);scripts/carries only the SHIPPED SUBSET the installer actually reads — factory-only scripts and the assembler itself stay out. --checkis the drift gate: it re-assembles into a temp dir, hashes, and diffs the fresh manifest against the committed one — a payload file edited without re-running the assembler is DRIFT, exit 1, with the differing paths listed. A missing manifest is drift too.- Publication is gate-ordered: the getff package's
prepackruns--checkFIRST and the assemble second, so an npm publish cannot proceed over a stale manifest. - The three-surface consistency rule is stated in the script: adding a payload root requires the same root in package.json
files, in packages/getff/.gitignore, and in this script's list —filescannot reach above a package's own directory, which is why the copy exists at all.
Satellites & companions
Produces the payload that bin/getff (G1) hands init args into, and the install.sh (A2) + setup (A1) pair consumers actually run. The committed manifest is what the host-side release verification hashes against; the six-file scripts/ subset includes the worktree cluster (A19) the installer reads from PKG_ROOT.
Anchors
At framework pin aa87d0a47a6d8502f983cc9fe7284bd5dcb3d650:
scripts/build-getff-dist.sh:2— «# build-getff-dist.sh — assemble thegetffdistribution package (packages/getff) from the repo root.»scripts/build-getff-dist.sh:9-11— «# its contents out exactly like the repository root makes PKG_ROOT land where the script already» «# looks, and not one of those reads changes.filescannot reach above a package's own directory,» «# so the payload is COPIED into packages/getff/ at pack time (npmprepack, and this script).»scripts/build-getff-dist.sh:14-16— «# WHAT IS COMMITTED. Not the payload (gitignored in packages/getff/.gitignore) — MANIFEST.sha256,» «# one<sha256> <path>line per assembled file.--checkre-assembles into a temp dir and diffs» «# the manifests: a shipped file edited without re-running this script is DRIFT, exit 1, the paths»scripts/build-getff-dist.sh:19-21— «# SOURCE OF TRUTH FOR THE FILE LIST:git ls-files(tracked files only). A directory walk would» «# ship whatever is lying in the working tree — node_modules, a scratch file, a secret»scripts/build-getff-dist.sh:97— «[ -f "$MANIFEST" ] || fail "DRIFT: $MANIFEST missing — run: scripts/build-getff-dist.sh"»packages/getff/package.json:39— «"prepack": "bash ../../scripts/build-getff-dist.sh --check && bash ../../scripts/build-getff-dist.sh"»packages/getff/MANIFEST.sha256:1— «fb86ebab759216770b3d618fa0c67e0d7b3e3bd0430bcbbaf60561c7e63fa7e9 .claude/hooks/adopt-orchestrator-prompts.sh» (1078 manifest lines at this pin)
@rules-as-tests/preset-react-native — react-native preset package (G7)
The workspace-private react-native preset: bare-RN and Expo eslint config variants plus a shared common module, stack RULES docs, its own audit script and CI template — no preset.meta.json staleness pins and no main entry, unlike its preset siblings.
plugin skill using-getff — session-start orientation (I5)
The plugin skill that loads at session start in a getff-plugin repo: it establishes the instruction-priority ladder (the project's own CLAUDE.md/AGENTS.md always win) and the invoke-the-relevant-skill-before-responding discipline.