Scaffold the os-git plugin with the OsGit namespace and backends #1587
Labels
No labels
P0
P1
P2
P3
bug
category/code-change
category/cross-repo
category/eval-run
category/investigation
category/no-test-target
category/owner-ruling
category/prose-artifact
category/recurring-chore
category/structure
category/umbrella
crc-refactor
create
delete
enhancement
filed-by/agent
filed-by/user
frozen
lint-rule
needs-info
needs-triage
next
plugin/cc-architect
plugin/os
plugin/os-adr
plugin/os-aidd-lint
plugin/os-backlog
plugin/os-context
plugin/os-doc-hygiene
plugin/os-sdlc
plugin/os-vault
project/cc-os
ready-for-agent
ready-for-human
recurring
review
rule-proposal
update
waiting
wayfinder:grilling
wayfinder:map
wayfinder:map
wayfinder:research
wayfinder:task
wayfinder:task
wontfix
worklist/deviations
worklist/lint-rule
worklist/new-implement-build
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
jared/cc-os#1587
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Problem
No
plugins/os-gitexists. Every later os-git ticket needs a plugin layout, a namespace, a backend seam, and a test fixture builder first.Design:
docs/os-git/use-cases-and-domain.md(design) anddocs/os-git/call-site-checklist.md(call sites).Settled by the user on 2026-11-06. Do not reopen these:
plugins/os-gitnow. Plugins load it bypath:. It moves toruby-gemslater.git-contextandos:worktreemerge intoos-git.os-contextandos-vaultwill be Ruby. Their Python git sites are replaced by the port.os-git.Reproduce
n/a: new component.
Approach
Follow
plugins/cc-architect/references/conventions/cc-os-naming.md: nocommands/dispatcher directory, noname:field in anySKILL.mdfrontmatter. Follow ADR-0166 (a Gemfile per plugin), ADR-0241 (oneboot.rb, Zeitwerk is a hard dependency), and ADR-0302. Use the layout in design section 3.4. Use the default adapter that the spike (#1586) records. Use the namespace that the ADR (#1585) records.Required work:
Gemfileforplugins/os-git— check: presentos-gitinplugins/os-git/.claude-plugin/plugin.jsonOsGitinplugins/os-git/lib/os_git.rbOsGit::Backendinterface documented as a shared contract test module, with aFakeadapter that records messages and returns canned values — check: presentFakeinplugins/os-git/lib/os_git/backend/fake.rbBackend::Cliadapter that runsgit -C <root> <argv>throughOpen3, raisesOsGit::Errorwithargv,exit_status, andstderr, and kills the child on timeout — check: presentOpen3inplugins/os-git/lib/os_git/backend/cli.rbBackend::RubyGit: the spike (#1586) dropped it. The implementation-status leaf states why, in one line — check: presentRubyGitindocs/implementation-status/os-git.mdOsGit::Errorand its subclassesNotARepository,CommandFailed,TimedOut,MergeConflict,MergeOpen,NotMerged,NotAncestor,NotClean,Diverged— check: presentTimedOutinplugins/os-git/lib/os_git/error.rbOsGit::FailOpen.call(default:) { ... }for hook edges — check: presentFailOpeninplugins/os-git/lib/os_git/fail_open.rbOsGit::Testing::ScratchRepowithcreate,write,commit_all,branch,add_worktree,repository— check: presentScratchRepoinplugins/os-git/lib/os_git/testing/scratch_repo.rbos-gitindocs/implementation-status.mdbin/refresh-pluginsafter the change.Acceptance criteria
bundle installand the plugin test runner run inplugins/os-git, then they pass.OsGit::Backend::Fake, when a domain object sends a message, then the fake records it and returns the canned value.OsGit::Backend::Clion aScratchRepo, when a command exits nonzero, then it raisesOsGit::CommandFailedwithargv,exit_status, andstderr.Backend::Cliruns it, then it raisesOsGit::TimedOutand no child process remains.OsGit::Error, whenFailOpen.call(default: [])runs it, then it prints one stderr line and returns[].ScratchRepo.create, when the block runs, then the repository has a fixed author identity and the files and commits that the block wrote.SKILL.mdfrontmatter, then no file has aname:field and nocommands/directory exists.bin/refresh-pluginshas run, thenplugins/os-gitis loaded in a new session.Owner sketch
Blocking edges
Blocked by the ADR ticket (#1585) and the spike (#1586).
Origin
Work started by the #1610 orchestrator. Branch: ticket-1587. Adapter per #1586: Backend::Cli and Fake; RubyGit dropped.
Resolution
Done: plugins/os-git exists: Backend seam with Cli and Fake, error family, FailOpen, ScratchRepo, status leaf, registry row, marketplace entries, plugin installed. Hand-finished after escalation unexpected_pass.
Evidence:
fef44087. 27 runs, 77 assertions, 0 failures; rubocop clean. Design audit found 7 items, all fixed. claude plugin details os-git@local-plugins resolves. Implementation 242 abandoned as hand-finished.Follow-ups: Clearing GIT_CONFIG_PARAMETERS in ScratchRepo goes into #1588. ScratchRepo fixed dates dropped: no test needs them.