Finishing a Development Branch
obra/superpowers
Walks the last step of a branch: confirm tests pass, detect the git environment, ask how to integrate, carry out your choice and clean up the worktree.
Migrates a public method from Git::Base or Git::Lib to a Git::Repository facade method (under lib/git/repository/) as part of the v5.0.0 architectural redesign.
$ npx skills add ruby-git/ruby-git --skill extract-facade-from-base-lib -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install ruby-git/ruby-git extract-facade-from-base-lib --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/ruby-git/ruby-git.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.github/skills-deprecated/extract-facade-from-base-lib .claude/skills/extract-facade-from-base-lib && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "extract-facade-from-base-lib" agent skill from https://github.com/ruby-git/ruby-git/tree/main/.github/skills-deprecated/extract-facade-from-base-lib into .claude/skills/extract-facade-from-base-lib/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "extract-facade-from-base-lib", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/ruby-git/ruby-git/tree/main/.github/skills-deprecated/extract-facade-from-base-libType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add ruby-git/ruby-git --skill extract-facade-from-base-lib -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install ruby-git/ruby-git extract-facade-from-base-lib --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ruby-git/ruby-git.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.github/skills-deprecated/extract-facade-from-base-lib .agents/skills/extract-facade-from-base-lib && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "extract-facade-from-base-lib" agent skill from https://github.com/ruby-git/ruby-git/tree/main/.github/skills-deprecated/extract-facade-from-base-lib into .agents/skills/extract-facade-from-base-lib/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "extract-facade-from-base-lib", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add ruby-git/ruby-git --skill extract-facade-from-base-lib -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install ruby-git/ruby-git extract-facade-from-base-lib --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ruby-git/ruby-git.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.github/skills-deprecated/extract-facade-from-base-lib .cursor/skills/extract-facade-from-base-lib && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "extract-facade-from-base-lib" agent skill from https://github.com/ruby-git/ruby-git/tree/main/.github/skills-deprecated/extract-facade-from-base-lib into .cursor/skills/extract-facade-from-base-lib/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "extract-facade-from-base-lib", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/ruby-git/ruby-git.git --path .github/skills-deprecated/extract-facade-from-base-lib--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add ruby-git/ruby-git --skill extract-facade-from-base-lib -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install ruby-git/ruby-git extract-facade-from-base-lib --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ruby-git/ruby-git.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.github/skills-deprecated/extract-facade-from-base-lib .gemini/skills/extract-facade-from-base-lib && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "extract-facade-from-base-lib" agent skill from https://github.com/ruby-git/ruby-git/tree/main/.github/skills-deprecated/extract-facade-from-base-lib into .gemini/skills/extract-facade-from-base-lib/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "extract-facade-from-base-lib", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install ruby-git/ruby-git extract-facade-from-base-libInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add ruby-git/ruby-git --skill extract-facade-from-base-lib -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/ruby-git/ruby-git.git skills-src && mkdir -p .github/skills && cp -r skills-src/.github/skills-deprecated/extract-facade-from-base-lib .github/skills/extract-facade-from-base-lib && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "extract-facade-from-base-lib" agent skill from https://github.com/ruby-git/ruby-git/tree/main/.github/skills-deprecated/extract-facade-from-base-lib into .github/skills/extract-facade-from-base-lib/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "extract-facade-from-base-lib", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add ruby-git/ruby-git --skill extract-facade-from-base-lib -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install ruby-git/ruby-git extract-facade-from-base-lib --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ruby-git/ruby-git.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.github/skills-deprecated/extract-facade-from-base-lib .opencode/skills/extract-facade-from-base-lib && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "extract-facade-from-base-lib" agent skill from https://github.com/ruby-git/ruby-git/tree/main/.github/skills-deprecated/extract-facade-from-base-lib into .opencode/skills/extract-facade-from-base-lib/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "extract-facade-from-base-lib", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
extract-facade-from-base-libMigrates a public method from Git::Base or Git::Lib to a Git::Repository facade method (under lib/git/repository/) as part of the v5.0.0 architectural redesign.
Extract Facade From Base Lib is an agent skill from ruby-git/ruby-git. Migrates a public method from Git::Base or Git::Lib to a Git::Repository facade method (under lib/git/repository/) as part of the v5.0.0 architectural redesign. Use when extracting a specific public method during the Strangler Fig migration of Git::Base / Git::Lib into Git::Repository.
Its SKILL.md is about 6.3k tokens, which your agent loads only when the skill is triggered. The skill folder holds 1 other file (for example `KEYWORD_ARG_REMEDIATION.md`).
It sits in Development, covering Git workflow. It works with Git. The repository describes itself as: Ruby/Git is a Ruby library that can be used to create, read and manipulate Git repositories by wrapping system calls to the git binary. The licence is MIT.
6 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit f3bf20f. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
bundlegitFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use git, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Extract Facade From Base Lib loads about 6.3k tokens when it runs. Until then it costs about 79 tokens; SKILL.md has 2,625 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from ruby-git/ruby-git at commit f3bf20f, republished under its MIT licence (© ruby-git). 2,625 words, ~6,262 tokens.
.claude/skills/extract-facade-from-base-lib/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.Migrate an existing public method from Git::Base and/or Git::Lib to a
Git::Repository::* facade method. This is the second extraction step of the
v5.0.0 redesign — it follows
Extract Command from Lib, which moves
the underlying CLI invocation into a Git::Commands::* class.
In Phase 4 of the redesign, both Git::Base and Git::Lib will be deleted.
This migration moves their public surface to Git::Repository. Until Phase 4,
the original methods remain in place and delegate to the new facade method to
preserve backward compatibility within the migration window.
Attach this file to your Copilot Chat context, then invoke with the public method to migrate. Examples:
Using the Extract Facade from Base/Lib skill, migrate Git::Base#commit to
Git::Repository#commit.Extract Facade: Git::Lib#branches_all (called publicly via g.lib.branches_all)Before starting, you MUST load the following skill(s):
Git::Commands::* class. Run first when no command class exists yet.Git::Commands::* class needs to be scaffoldedRequired:
Git::Base and/or Git::Lib public method to migrate.Public methods being migrated fall into one of three patterns. Identify which pattern applies before planning the migration.
Git::Base wrapper + Git::Lib implementationThe most common pattern. Git::Base#foo is a thin wrapper that forwards to
Git::Lib#foo, which contains the orchestration logic.
Examples: commit, diff_full, branches, worktree_add.
# lib/git/base.rb
def commit(message, opts = {})
self.lib.commit(message, opts)
end
# lib/git/lib.rb
def commit(message, opts = {})
opts = opts.merge(message: message) if message
deprecate_commit_no_gpg_sign_option!(opts)
Git::Commands::Commit.new(self).call(edit: false, **opts).stdout
endPublic contract source: Git::Base#commit signature; Git::Lib#commit
implementation.
When migrating, the facade method must preserve this signature exactly (e.g.
commit(message, opts = {})) — even though greenfield facade methods would prefer**optionsper facade-implementation REFERENCE.md — Choosing the method signature. The legacy public contract wins during migration.
Git::Lib-only (public-by-exposure)The public API is g.lib.foo — Git::Base exposes Git::Lib as #lib (or
through a similar accessor), so Git::Lib methods are reachable as public API
even when no Git::Base wrapper exists.
Examples: branches_all, worktrees_all, current_branch_state.
# lib/git/lib.rb (no Git::Base wrapper exists)
def branches_all
result = Git::Commands::Branch::List.new(self).call(all: true, format: ...)
Git::Parsers::Branch.parse_list(result.stdout)
endPublic contract source: Git::Lib#foo signature and implementation.
Migration consequence: After Phase 4, callers using g.lib.foo must migrate
to g.foo (or g.repository.foo). Document this in the migration plan.
Git::Base-only (no Git::Lib method)The implementation lives entirely in Git::Base with no Git::Lib counterpart.
The method may call command(...) directly via lib.send(...) or implement
filesystem operations.
Examples: add_remote, with_index, repo_size, archive.
# lib/git/base.rb
def repo_size
all_files_size = 0
Find.find(repo.path) { |f| all_files_size += File.size(f) if File.file?(f) }
all_files_size
endPublic contract source: Git::Base#foo signature and implementation.
Use this policy in both extraction mode and review mode:
| Classification | When it applies | Signature requirement |
|---|---|---|
legacy-contract | Method existed in Git::Base and/or Git::Lib as public API | Copy the 4.x signature verbatim, including rare **opts forms where they already exist |
5.x-native | Truly new facade API with no legacy public predecessor | Use opts = {} style (kwargs migration is deferred to v6.x for consistency) |
Rules:
legacy-contract methods preserve the exact 4.x call shape verbatim,
including rare **opts signatures; never alter the parameter list when a
legacy predecessor exists.
5.x-native methods use opts = {} style for consistency; a broader kwargs
migration is deferred to v6.x so it can be applied uniformly across the
entire public API.
Every extracted method must be explicitly classified as legacy-contract or
5.x-native before the PR is opened.
The classification must appear in the PR description and in the extracted
method's YARD @note. Example:
# @note Signature compatibility: legacy-contract — preserves the exact Git::Base#foo 4.x call shape.See KEYWORD_ARG_REMEDIATION.md for the initial list
of facade methods that use **opts/** keyword-splat where the legacy predecessor
used opts = {}. Each method in this list must be resolved before
Git.open/.clone/.init/.bare are changed to return Git::Repository:
either fix the signature to match the legacy-contract classification, or
record an explicit 5.x-native justification.
When the facade method uses assert_valid_opts!, the allowlist (*_ALLOWED_OPTS) must
contain only the options that were accepted in the 4.x branch of this gem. Do not
expand the allowlist to match everything the underlying Git::Commands::* class
supports — new options are deferred to a follow-up PR so they can be properly
documented and tested.
How to find the 4.x allowlist for a method:
https://github.com/ruby-git/ruby-git/blob/4.x/lib/git/lib.rb and search
for the method's *_OPTION_MAP constant (e.g. ADD_OPTION_MAP,
RESET_OPTION_MAP).ArgumentError via
ArgsBuilder.validate! — confirmed by
https://github.com/ruby-git/ruby-git/blob/4.x/lib/git/args_builder.rb.*_ALLOWED_OPTS
constant, @option YARD tags, and integration/unit tests.Git::Commands::* class supports additional options beyond the
4.x map, note them in a follow-up issue rather than silently including them.All work must be done on a feature branch. Never commit or push directly to
main.
git checkout -b <feature-branch-name>Locate the public method in Git::Base and/or Git::Lib.
Determine which Source pattern applies (A, B, or C).
Note:
legacy-contract or 5.x-native) and
justification.stdout, .stdout.chomp, a parser call, a domain
object, nil, etc. Do not assume from the YARD @return tag, which
may be stale or missing. The facade must reproduce this exact value (e.g.
if Git::Lib#add ends in .stdout, the facade returns String, not
Git::CommandLineResult).timeout:, chdir:, env:)*_OPTION_MAP
constant in 4.x/lib/git/lib.rb and record which option keys it declared.
These become the facade's *_ALLOWED_OPTS allowlist — see
Determining the option allowlist.Document the method's current public contract in writing — it must be preserved exactly by the facade method.
Run linters and rubocop to confirm a clean baseline:
bundle exec rubocopBefore writing or changing any code, present a migration plan and wait for explicit confirmation from the user.
The plan must include:
| Public method | Source pattern | Underlying command class | Class exists? | Target facade module | Notes |
|---|---|---|---|---|---|
Git::Base#foo | A / B / C | Git::Commands::Foo | ✅ / 🆕 | Git::Repository::Topic (existing or new) | mapping decisions |
Also state:
legacy-contract or 5.x-native).legacy-contract methods, confirm the exact 4.x call shape is preserved
verbatim (including rare **opts signatures).Git::Base / Git::Lib for
siblings on the same git topic before deciding — see
Choosing a module for a new facade method.Git::Base and/or Git::Lib (Step 6) — both
remain in place during the migration window and delegate to the new facade.g.lib.foo callers will need to migrate
before Phase 4; capture this as a follow-up issue or CHANGELOG entry.Then ask:
Does this mapping look correct? Any changes before I start implementing?
Do not move to Step 3 until the user confirms the plan.
Verify that legacy tests in tests/units/ and existing specs in spec/
adequately cover the public method. The legacy tests guarantee the migration
preserves backward compatibility.
Search for coverage:
grep -rn '<method_name>' tests/units/ spec/If coverage is insufficient, add minimal new tests that exercise the
current public contract. Use existing legacy test conventions for Test::Unit
tests in tests/units/. Do not change existing tests.
Add or update facade tests that prove signature behavior:
legacy-contract methods, test the expected legacy call shape(s) (positional hash and/or keyword-arg / **opts)Run the new tests and RuboCop:
bundle exec bin/test <test-file-basename>
bundle exec rubocop tests/units/<test-file>Commit:
git commit -m "refactor(test): add legacy tests for <method_name>"Git::Commands::* class existsThe facade method calls one or more Git::Commands::* classes. If any required
command class does not exist yet, scaffold it first using
Extract Command from Lib (which in turn
uses Command Implementation).
For Pattern C migrations, the source Git::Base method may not currently call
through a Git::Commands::* class at all (it uses command(...) directly or
filesystem operations). In that case, you must scaffold the Git::Commands::*
class before this step.
Skip this step when every required command class already exists.
Delegate to the Facade Implementation skill in Scaffold or Update mode. That skill handles:
lib/git/repository/<topic>.rbspec/unit/git/repository/<topic>_spec.rbspec/integration/git/repository/<topic>_spec.rbThe new facade method must preserve the source method's public contract
exactly — same signature, same return type, same raised errors. Use the
exact return type the source method documented (String, Array, Hash, domain
object, CommandLineResult).
Apply the Signature compatibility policy:
legacy-contract: preserve the 4.x call shape verbatim and add call-shape
tests.5.x-native: use opts = {} style; classification must be explicit in
migration notes.For Pattern A and B migrations, copy any pre-processing logic
(option whitelisting, deprecation rewrites, key normalization) from Git::Lib
to the facade method. Do not leave it behind in Git::Lib — the facade is
now the source of truth.
When copying option whitelisting logic, use only the keys from the 4.x
*_OPTION_MAP for the *_ALLOWED_OPTS constant — do not expand to match the
full Git::Commands::* argument DSL. See
Determining the option allowlist.
For Pattern C migrations, port any pre-processing or filesystem logic from
Git::Base to the facade method.
After the facade method is in place and tests pass, commit:
git commit -m "feat(repository): add Git::Repository#<method_name> facade method"Git::Base and/or Git::Lib to delegateThe original methods stay in place during the migration window and delegate to
the new facade method. Both Git::Base and Git::Lib will be deleted in
Phase 4; until then, delegation preserves backward compatibility.
For each source pattern, the delegation looks like:
Pattern A — both files delegate:
# lib/git/base.rb — already a wrapper; redirect to repository
def commit(message, opts = {})
repository.commit(message, opts)
end
# lib/git/lib.rb — keep public-by-exposure callers working
def commit(message, opts = {})
@repository.commit(message, opts)
endPattern B — Git::Lib delegates:
# lib/git/lib.rb
def branches_all
@repository.branches_all
endPattern C — Git::Base delegates:
# lib/git/base.rb
def remote_add(name, url, opts = {})
facade_repository.remote_add(name, url, opts)
end(Use facade_repository to access the Git::Repository facade instance — this
is the accessor used by all migrated methods in Git::Base.)
After delegation is in place, verify:
bundle exec bin/test <legacy-test-file-basename>
bundle exec rspec
bundle exec rubocop
bundle exec rake yardCommit:
git commit -m "refactor(base): delegate <method_name> to Git::Repository"(Use refactor(lib): if only Git::Lib was updated. When both files change,
use two separate commits — one per scope — to keep each commit single-scoped.)
Keep work organized into three logical commit categories (each optional if no changes were needed for that step):
refactor(test): add legacy tests for <method_name> — new tests in
tests/units/ (Step 3)feat(repository): add Git::Repository#<method_name> facade method — new
facade module/method, unit specs, integration specs (Step 5)refactor(base): delegate <method_name> to Git::Repository — Git::Base
updated to delegate (Step 6); use refactor(lib): if only Git::Lib
changed. When both files change, prefer two separate commits — one
per scope — so each commit has a single conventional-commits scope.If a new Git::Commands::* class was scaffolded in Step 4, it gets its own
commit (refactor(command): add Git::Commands::<Command> class) per
Extract Command from Lib.
Issue and PR references in commit bodies: Do not use #<number> in the
commit body — write issue 1000 not issue #1000. To close an issue/PR, use
Closes/Fixes/Resolves #<number> in the footer.
If further changes are needed after task commits are created, amend into the appropriate commit and rebase. Always verify quality gates pass after rebasing.
Run the gates discovered from the project's parallel default task at every step:
bundle exec ruby -e "require 'rake'; load 'Rakefile'; puts Rake::Task['default:parallel'].prerequisites"Run each listed task individually via bundle exec rake <task> and fix
failures before advancing. All listed tasks must pass before committing.
Stays in Git::Base / Git::Lib until Phase 4:
Git::Repository facade
method, preserving backward compatibility during the migration window.Moves to Git::Repository::*:
Branch workflow: Implement migrations on a feature branch. Never commit or push directly to
main— open a pull request when changes are ready to merge.
Use this checklist to audit a completed extraction PR. For each item, read the relevant source files, check the box, and note any finding.
Using the Extract Facade from Base/Lib skill (review mode), audit the extraction
of Git::Base#<method_name>.Git::Base and Git::Lib.legacy-contract or 5.x-native, with rationale.legacy-contract methods, facade
signature behavior preserves the legacy call shape contract; for
5.x-native, opts = {} style is confirmed (no **kwargs in v5).String from .stdout, not CommandLineResult). Read
the source — do not rely on YARD tags alone.*_ALLOWED_OPTS constant contains
only keys declared in the corresponding *_OPTION_MAP in
4.x/lib/git/lib.rb. Look up the map at
https://github.com/ruby-git/ruby-git/blob/4.x/lib/git/lib.rb. Any extra
keys are a finding.Git::Lib is reproduced in the facade. Nothing
was left behind in Git::Lib.Git::Lib is reproduced in the facade.tests/units/ has tests exercising the
public method. Verify with bundle exec bin/test <test-file-basename>.*_ALLOWED_OPTS has at
least one legacy or integration test that passes an actual value and asserts
the outcome.Git::Commands::* class used by the facade
exists in lib/git/commands/.*_ALLOWED_OPTS maps to a declared entry in the command's arguments block.Git::Repository::* module per the redesign topic groupings.assert_valid_opts! used. The facade calls
Git::Repository::Internal.assert_valid_opts!(ALLOWED_OPTS, **) before
forwarding to the command.*_ALLOWED_OPTS placement correct. Each <METHOD>_ALLOWED_OPTS
constant is declared immediately before the public facade method that
uses it (not grouped at the top of the module, not inside Private).@option tag with
type, name, default, and description. @param, @return, @raise are
present and accurate.spec/unit/git/repository/<topic>_spec.rb
covers: default call, explicit path(s), each documented option, unknown
option raises ArgumentError, return value is .stdout.legacy-contract methods, tests assert
the expected legacy call shape(s) as used in 4.x (positional hash and/or keyword-arg / **opts where applicable).spec/integration/git/repository/<topic>_spec.rb only when the facade
adds behavior not exercised by any single command's integration tests —
specifically multi-command orchestration or facade-owned post-processing of
real git output. For one-line delegators (e.g. #add, #reset) the
command's own integration tests already provide end-to-end coverage; omit
the facade integration spec and add a comment in the unit spec explaining
which command integration specs provide coverage.Git::Base delegates. The original Git::Base method is a one-line
forward to facade_repository.<method>(...).Git::Lib delegates (Pattern A/B only). The original Git::Lib
method is a one-line forward to the facade.bundle exec bin/test <test-file-basename> against the delegating methods.bundle exec rspec passesbundle exec rubocop passesbundle exec rake yard passes (no undocumented public methods)© ruby-git, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 1 other file in .github/skills-deprecated/extract-facade-from-base-lib of ruby-git/ruby-git.
Open the folder on GitHubat commit f3bf20f
Extract Facade From Base Lib next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Extract Facade From Base Lib this skillruby-git/ruby-git | 1.8k | — | ~6.3k | Automated safety check: Pass | MIT | |
| Finishing a Development Branchobra/superpowers | 296k | 5 repos | ~1.9k | Automated safety check: Pass | MIT | |
| Code Design Rationale Investigatorcursor/plugins | 10k | 9 repos | ~2.6k | Automated safety check: Pass | None | |
| Contributor-First PR MergeHKUDS/OpenHarness | 16k | 1 repos | ~847 | Automated safety check: Pass | MIT | |
| Migrate Internal Package into GhostTryGhost/Ghost | 55k | — | ~3.8k | Automated safety check: Pass | MIT | |
| Create Pull Requestcline/cline | 70k | 1 repos | ~1.6k | Automated safety check: Pass | Apache-2.0 |
obra/superpowers
Walks the last step of a branch: confirm tests pass, detect the git environment, ask how to integrate, carry out your choice and clean up the worktree.
cursor/plugins
Digs into why code is shaped the way it is by checking git history, pull requests and connected tools in parallel, then reporting a cited read on the tradeoffs.
HKUDS/OpenHarness
Merges external GitHub pull requests while keeping the original author credited, and fixes conflicts after the merge instead of rewriting the contribution.
TryGhost/Ghost
Moves a package from another TryGhost repository into Ghost as an internal workspace package while keeping its Git history, with checkpoints for the steps that need an administrator.
cline/cline
Opens a GitHub pull request from your current branch with the gh CLI, after reviewing the commits and diff and gathering the details the PR needs.
tailcallhq/forgecode
Resolves Git merge conflicts with a plan-first workflow that keeps both sides' intent, regenerates lock files and backs up deleted-but-modified files.
ruby-git/ruby-git
Addresses unresolved pull request review threads and suppressed (low-confidence) Copilot review comments on the current branch, folds each fix into the…
ruby-git/ruby-git
Assesses what an API change would break before it is made, finds every usage, documents the impact and plans a deprecation or migration path.
ruby-git/ruby-git
Diagnoses and fixes failing GitHub Actions runs by identifying the failure, fetching only the relevant logs, finding the root cause and reproducing it locally.
ruby-git/ruby-git
Scaffolds and reviews `Git::Commands::*` classes in the ruby-git library, with unit tests, integration tests and YARD docs, using the Base command architecture.
ruby-git/ruby-git
Workflow for updating gem dependencies and fixing CVEs in the ruby-git project: assess with bundle outdated and audit, edit the gemspec, test, then commit with conventional messages.
ruby-git/ruby-git
Migrates a direct command call in Ruby Git's Git::Lib to a Git::Commands class, as part of a Strangler Fig redesign, with a plan, legacy tests and a pull request.
Works with
Categories
Migrates a public method from Git::Base or Git::Lib to a Git::Repository facade method (under lib/git/repository/) as part of the v5.0.0 architectural redesign. Extract Facade From Base Lib is an agent skill from ruby-git/ruby-git.0 architectural redesign.
Extract Facade From Base Lib fits situations like: extracting a specific public method during the Strangler Fig migration of Git::Base / Git::Lib into Git::Repository; tasks that involve Git workflow.
Run `npx skills add ruby-git/ruby-git --skill extract-facade-from-base-lib -a claude-code`. Or copy the skill folder (.github/skills-deprecated/extract-facade-from-base-lib in ruby-git/ruby-git) into .claude/skills/extract-facade-from-base-lib in your project. Claude Code loads it when a task matches its description.
Run `npx skills add ruby-git/ruby-git --skill extract-facade-from-base-lib -a codex`. Or copy the skill folder (.github/skills-deprecated/extract-facade-from-base-lib in ruby-git/ruby-git) into .agents/skills/extract-facade-from-base-lib in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add ruby-git/ruby-git --skill extract-facade-from-base-lib -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/extract-facade-from-base-lib, .gemini/skills/extract-facade-from-base-lib, .github/skills/extract-facade-from-base-lib and .opencode/skills/extract-facade-from-base-lib in your project.
Going by SKILL.md and its folder, Extract Facade From Base Lib needs the command-line tools its instructions call (bundle and git).
SKILL.md contains no URLs. Its commands use git, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Extract Facade From Base Lib is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 6.3k tokens (SKILL.md is roughly 25k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Extract Facade From Base Lib: Finishing a Development Branch (obra/superpowers, 296k stars), Code Design Rationale Investigator (cursor/plugins, 10k stars), Contributor-First PR Merge (HKUDS/OpenHarness, 16k stars) and Migrate Internal Package into Ghost (TryGhost/Ghost, 55k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
ruby-git (a GitHub organization) maintains it in ruby-git/ruby-git, which has 1,799 GitHub stars. The repository holds 30 skills in this directory. The repository was last updated on October 2, 2026.
Source: ruby-git/ruby-git on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.