Learn-skills.dev commit-and-push
Commit staged changes and push to the remote using conventional commits with GPG signing. Use when you need to commit and push work, create a PR if missing, and wait for Gemini review before addressing feedback.
git clone https://github.com/NeverSight/learn-skills.dev
T=$(mktemp -d) && git clone --depth=1 https://github.com/NeverSight/learn-skills.dev "$T" && mkdir -p ~/.claude/skills && cp -r "$T/data/skills-md/a2f0/tearleads/commit-and-push" ~/.claude/skills/neversight-learn-skills-dev-commit-and-push && rm -rf "$T"
data/skills-md/a2f0/tearleads/commit-and-push/SKILL.mdCommit and Push
Commit staged changes, push the branch, create a PR if needed, and handle initial Gemini review.
Setup
Determine the repository for all
gh commands:
REPO=$(./scripts/agents/tooling/agentTool.ts getRepo)
Always pass
-R "$REPO" to gh commands.
Track these state flags during execution:
: Boolean, startsgemini_quota_exhausted
. Set tofalse
when Gemini returns its daily quota message.true
: Boolean, startsused_fallback_agent_review
. Set tofalse
after running one fallback cross-agent review.true
: Array ofdeferred_items
, starts empty. Populated by{thread_id, path, line, body, html_url}
when review feedback is deferred rather than fixed on-the-fly. Pass this state to$address-gemini-feedback
for issue creation.$enter-merge-queue
Workflow
-
Check branch:
- If on
, create a new branch named for the change.main - After creating/switching, update the VS Code title:
./scripts/agents/tooling/agentTool.ts setVscodeTitle - If on
-
Analyze changes:
- Run
andgit status
to confirm what will be committed.git diff --staged - If tooling reports actions but
shows no unexpected changes, proceed without asking about generated files.git status
- Run
-
Commit format:
- Follow
commit guidelines (conventional commits, GPG signed with 5s timeout, no co-author lines, no footers).CLAUDE.md - Header must be ≤ 50 characters (enforced by commitlint
). The header is the entire first line:header-max-length
. To ensure adherence, count characters before committing. If too long, shorten the scope or description:type(scope): description- Drop the scope:
feat: add redis and garage reset scripts - Abbreviate:
(put details in body)feat(scripts): add reset scripts - Use a broader verb:
feat(scripts): add stack reset tooling
- Drop the scope:
- Do not bump versions here.
- Follow
-
Push:
- Push the current branch to the remote after the commit.
- The pre-push hook runs full builds and tests; set a long timeout and do not assume timeouts mean failure.
-
Verify push completed:
- Before proceeding to PR creation or Gemini follow-up, verify the push actually completed:
BRANCH=$(git branch --show-current) git fetch origin "$BRANCH" [ "$(git rev-parse HEAD)" = "$(git rev-parse origin/$BRANCH)" ] || echo "NOT PUSHED"- Do NOT proceed to step 6 or 7 until verification passes. Replying to Gemini with "Fixed in commit X" when X is not visible on remote creates confusion.
-
Open PR:
- If no PR exists, create one with
.gh pr create - Do not include auto-close keywords (
,Closes
,Fixes
).Resolves - Use the Claude-style PR body format and include the evaluated agent id.
- Avoid shell interpolation bugs in PR bodies: always build body content with a single-quoted heredoc and pass it via
(or--body-file
only when no backticks/$/[] are present).--body "$(cat ...)"
Compute the agent id:
AGENT_ID=$(basename "$(git rev-parse --show-toplevel)")PR body template (fill in real bullets, keep section order). Prefer this safe pattern:
PR_BODY_FILE=$(mktemp) cat <<'EOF' > "$PR_BODY_FILE" ## Summary - <verb-led, concrete change> - <second concrete change if needed> ## Testing - <command run or "not run (reason)"> ## Issue - #<issue-number> Agent: __AGENT_ID__ EOF sed -i'' -e "s/__AGENT_ID__/${AGENT_ID}/g" "$PR_BODY_FILE" gh pr create ... --body-file "$PR_BODY_FILE" rm -f "$PR_BODY_FILE"If there is no associated issue, replace the
section with:## Issue## Related - <link or short reference>- After creating the PR, run:
./scripts/agents/tooling/agentTool.ts setVscodeTitle./scripts/agents/tooling/agentTool.ts tagPrWithTuxedoInstance
- If no PR exists, create one with
-
Wait for Gemini:
- Wait 60 seconds for Gemini Code Assist to review.
-
Check for quota exhaustion:
- Gemini quota exhaustion can happen during the initial wait OR later follow-up interactions.
- Check all Gemini response surfaces for the quota message:
./scripts/agents/tooling/agentTool.ts checkGeminiQuota --number "$PR_NUMBER"Treat
in the JSON response as quota exhaustion.quota_exhausted: true-
If found:
- Set
.gemini_quota_exhausted=true - If
, run one fallback cross-agent review (Codex):used_fallback_agent_review=false
# Equivalent skill invocation: /cross-agent-review codex ./scripts/agents/tooling/agentTool.ts solicitCodexReview- Set
.used_fallback_agent_review=true - Skip further Gemini follow-ups for this run.
- Proceed to
or end the skill./enter-merge-queue
- Set
-
Address feedback:
- If
, rungemini_quota_exhausted=false
for unresolved comments.$address-gemini-feedback - When replying to Gemini, always tag
to ensure it receives a notification.@gemini-code-assist - Reply to Gemini with
(not./scripts/agents/tooling/agentTool.ts replyToGemini --number <pr> --comment-id <id> --commit <sha>
).gh pr review - Use
only for custom non-fix responses.replyToComment - Re-run step 8 after each Gemini interaction. If quota appears later, switch to fallback immediately.
may populate$address-gemini-feedback
if any feedback is deferred rather than fixed on-the-fly.deferred_items
- If
-
Report state for downstream skills:
- PR number and URL
- Whether Gemini quota was exhausted
- Any
that were collecteddeferred_items
If
is non-empty, mention thatdeferred_items
will create a tracking issue with the$enter-merge-queue
label after merge.deferred-fix
Token Efficiency (CRITICAL)
MANDATORY: ALL git commit and push commands MUST redirect stdout to
/dev/null. Failure to do this wastes thousands of tokens on hook output.
# CORRECT - always use these forms git commit -S -m "message" >/dev/null git push >/dev/null # WRONG - NEVER run without stdout suppression git commit -m "message" # Burns 1000+ tokens on pre-commit output git push # Burns 5000+ tokens on pre-push output
Why this is non-negotiable:
- Husky pre-commit hooks output lint results, type-check results
- Husky pre-push hooks run full test suites and builds
- A single unsuppressed
can add 5,000+ lines to contextgit push - Errors go to stderr, which
preserves>/dev/null