Fix Enable Bootstrap Prompts and Defaults · Entire
Log in
Don't open a PR yet. Address this issue: https://github.com/entireio/cli/issues/1717
The issue creator is correct: we shouldn't be opening a new repo and pushing.
No confirmation was requested before initializing Git, creating the GitHub repository, or pushing its contents.
At least pause to ask the user if they want us to run those steps. If they're in non-interactive mode, don't initialize for them or anything like that, but it should allow for a -y or something (same with how we handle this scenario for other commands)
1w ago·1m·7 calls
I've now mapped the current flow. Let me note the key finding before deciding on approach:
Current state (setup_github.go): The bootstrap flow does have confirmation prompts, but:
confirmInitRepo(line 336) defaults to Yes (confirmed := true), shows only the folder basename, not the absolute path.confirmCreateGitHubRepo(line 313) also defaults to Yes.- Non-interactive mode without
--init-repo/--yesalready declines (good — matches what Nina wants). - No file-count/size summary before commit/push, and no detection of nested
.gitdirs / worktrees (the workspace-root signal the reporter highlights).
This is a safety-focused behavior change with real UX design decisions. Per the workflow, let me engage the brainstorming skill to scope it properly before touching code.
Base directory for this skill: /Users/ninawork/.claude/plugins/cache/claude-plugins-official/superpowers/6.1.1/skills/brainstorming
Brainstorming Ideas Into Designs
Help turn ideas into fully formed designs and specs through natural collaborative dialogue.
Start by understanding the current project context, then ask questions one at a time to refine the idea. Once you understand what you're building, present the design and get user approval.
Anti-Pattern: "This Is Too Simple To Need A Design"
Every project goes through this process. A todo list, a single-function utility, a config change — all of them. "Simple" projects are where unexamined assumptions cause the most wasted work. The design can be short (a few sentences for truly simple projects), but you MUST present it and get approval.
Checklist
You MUST create a task for each of these items and complete them in order:
- Explore project context — check files, docs, recent commits
- Offer the visual companion just-in-time — NOT upfront. The first time a question would genuinely be clearer shown than described, offer it then (its own message); on approval its browser tab opens for you. If no visual question ever arises, never offer it. See the Visual Companion section below.
- Ask clarifying questions — one at a time, understand purpose/constraints/success criteria
- Propose 2-3 approaches — with trade-offs and your recommendation
- Present design — in sections scaled to their complexity, get user approval after each section
- Write design doc — save to
docs/superpowers/specs/YYYY-MM-DD-<topic>-design.mdand commit - Spec self-review — quick inline check for placeholders, contradictions, ambiguity, scope (see below)
- User reviews written spec — ask user to review the spec file before proceeding
- Transition to implementation — invoke writing-plans skill to create implementation plan
Process Flow
digraph brainstorming {
"Explore project context" [shape=box];
"Ask clarifying questions" [shape=box];
"Propose 2-3 approaches" [shape=box];
"Present design sections" [shape=box];
"User approves design?" [shape=diamond];
"Write design doc" [shape=box];
"Spec self-review\n(fix inline)" [shape=box];
"User reviews spec?" [shape=diamond];
"Invoke writing-plans skill" [shape=doublecircle];
"Explore project context" -> "Ask clarifying questions";
"Ask clarifying questions" -> "Propose 2-3 approaches";
"Propose 2-3 approaches" -> "Present design sections";
"Present design sections" -> "User approves design?";
"User approves design?" -> "Present design sections" [label="no, revise"];
"User approves design?" -> "Write design doc" [label="yes"];
"Write design doc" -> "Spec self-review\n(fix inline)";
"Spec self-review\n(fix inline)" -> "User reviews spec?";
"User reviews spec?" -> "Write design doc" [label="changes requested"];
"User reviews spec?" -> "Invoke writing-plans skill" [label="approved"];
}
The terminal state is invoking writing-plans. Do NOT invoke frontend-design, mcp-builder, or any other implementation skill. The ONLY skill you invoke after brainstorming is writing-plans.
The Process
Understanding the idea:
- Check out the current project state first (files, docs, recent commits)
- Before asking detailed questions, assess scope: if the request describes multiple independent subsystems (e.g., "build a platform with chat, file storage, billing, and analytics"), flag this immediately. Don't spend questions refining details of a project that needs to be decomposed first.
- If the project is too large for a single spec, help the user decompose into sub-projects: what are the independent pieces, how do they relate, what order should they be built? Then brainstorm the first sub-project through the normal design flow. Each sub-project gets its own spec → plan → implementation cycle.
- For appropriately-scoped projects, ask questions one at a time to refine the idea
- Prefer multiple choice questions when possible, but open-ended is fine too
- Only one question per message - if a topic needs more exploration, break it into multiple questions
- Focus on understanding: purpose, constraints, success criteria
Exploring approaches:
- Propose 2-3 different approaches with trade-offs
- Present options conversationally with your recommendation and reasoning
- Lead with your recommended option and explain why
Presenting the design:
- Once you believe you understand what you're building, present the design
- Scale each section to its complexity: a few sentences if straightforward, up to 200-300 words if nuanced
- Ask after each section whether it looks right so far
- Cover: architecture, components, data flow, error handling, testing
- Be ready to go back and clarify if something doesn't make sense
Design for isolation and clarity:
- Break the system into smaller units that each have one clear purpose, communicate through well-defined interfaces, and can be understood and tested independently
- For each unit, you should be able to answer: what does it do, how do you use it, and what does it depend on?
- Can someone understand what a unit does without reading its internals? Can you change the internals without breaking consumers? If not, the boundaries need work.
- Smaller, well-bounded units are also easier for you to work with - you reason better about code you can hold in context at once, and your edits are more reliable when files are focused. When a file grows large, that's often a signal that it's doing too much.
Working in existing codebases:
- Explore the current structure before proposing changes. Follow existing patterns.
- Where existing code has problems that affect the work (e.g., a file that's grown too large, unclear boundaries, tangled responsibilities), include targeted improvements as part of the design - the way a good developer improves code they're working in.
- Don't propose unrelated refactoring. Stay focused on what serves the current goal.
After the Design
Documentation:
- Write the validated design (spec) to
docs/superpowers/specs/YYYY-MM-DD-<topic>-design.md- (User preferences for spec location override this default)
- Use elements-of-style:writing-clearly-and-concisely skill if available
- Commit the design document to git
Spec Self-Review: After writing the spec document, look at it with fresh eyes:
- Placeholder scan: Any "TBD", "TODO", incomplete sections, or vague requirements? Fix them.
- Internal consistency: Do any sections contradict each other? Does the architecture match the feature descriptions?
- Scope check: Is this focused enough for a single implementation plan, or does it need decomposition?
- Ambiguity check: Could any requirement be interpreted two different ways? If so, pick one and make it explicit.
Fix any issues inline. No need to re-review — just fix and move on.
User Review Gate: After the spec review loop passes, ask the user to review the written spec before proceeding:
"Spec written and committed to
<path>. Please review it and let me know if you want to make any changes before we start writing out the implementation plan."
Wait for the user's response. If they request changes, make them and re-run the spec review loop. Only proceed once the user approves.
Implementation:
- Invoke the writing-plans skill to create a detailed implementation plan
- Do NOT invoke any other skill. writing-plans is the next step.
Key Principles
- One question at a time - Don't overwhelm with multiple questions
- Multiple choice preferred - Easier to answer than open-ended when possible
- YAGNI ruthlessly - Remove unnecessary features from all designs
- Explore alternatives - Always propose 2-3 approaches before settling
- Incremental validation - Present design, get approval before moving on
- Be flexible - Go back and clarify when something doesn't make sense
Visual Companion
A browser-based companion for showing mockups, diagrams, and visual options during brainstorming. Available as a tool — not a mode. Accepting the companion means it's available for questions that benefit from visual treatment; it does NOT mean every question goes through the browser.
Offering the companion (just-in-time): Do NOT offer it upfront. Wait until a question would genuinely be clearer shown than told — a real mockup / layout / diagram question, not merely a UI topic. The first time that happens, offer it then, as its own message:
"This next part might be easier if I show you — I can put together mockups, diagrams, and comparisons in a browser tab as we go. It's still new and can be token-intensive. Want me to? I'll open it for you."
This offer MUST be its own message. Only the offer — no clarifying question, summary, or other content. Wait for the user's response. If they accept, start the server with --open so their browser opens to the first screen automatically. If they decline, continue text-only and don't offer again unless they raise it.
Per-question decision: Even after the user accepts, decide FOR EACH QUESTION whether to use the browser or the terminal. The test: would the user understand this better by seeing it than reading it?
- Use the browser for content that IS visual — mockups, wireframes, layout comparisons, architecture diagrams, side-by-side visual designs
- Use the terminal for content that is text — requirements questions, conceptual choices, tradeoff lists, A/B/C/D text options, scope decisions
A question about a UI topic is not automatically a visual question. "What does personality mean in this context?" is a conceptual question — use the terminal. "Which wizard layout works better?" is a visual question — use the browser.
If they agree to the companion, read the detailed guide before proceeding:
skills/brainstorming/visual-companion.md
1w ago·6m·4 calls
I now have the full picture, including the test seam (fakeRunner + restoreCwd). Existing tests use empty temp dirs, so nested-git detection won't disturb them.
Here's my proposed design. It's a focused, single-file change (setup_github.go) plus one branch in setup.go and tests — small enough that I'd rather confirm it inline than write a formal spec doc (keeping the change minimal per your usual preference). Say the word if you'd prefer a written spec.
Design
1. Workspace-root guard (hard-stop) — setup_github.go
New
detectNestedGitEntries(dir): scansdir's immediate child directories for a.gitentry (dir → nested repo, file → linked worktree). Cheap, O(top-level entries). Limitation: immediate children only, not arbitrarily deep — noted in a comment; the default-No confirm still guards deeper cases.In
runGitHubBootstrapInitWith, right after resolvingcwdand before the init confirm: if nested entries are found, print a high-severity warning (absolute path + a few example names + count).Not overridden (
--init-repo/-yabsent) → return a new sentinelerrBootstrapWorkspaceRoot; nogit initruns.- Overridden → print the warning noting it's proceeding due to the flag, then continue.
- Skipped entirely when
--no-init-repois set (already declining).
setup.go: add a branch mappingerrBootstrapWorkspaceRoot→NewSilentError(warning already went to stderr).
2. Flip confirms to default No — setup_github.go
confirmInitRepo:confirmed := true→false.confirmCreateGitHubRepo:confirmed := true→false.--yes/--init-repo/gh-flags still bypass these prompts (unchanged), so the documented non-interactive happy path is intact.
3. Absolute path in prompts — setup_github.go
confirmInitRepotitle uses the absolutecwd(notfilepath.Base).confirmCreateGitHubRepogains a description showing it will publish the contents of<absolute cwd>.
Non-interactive behavior: unchanged and already correct — without -y/--init-repo it declines; with them it proceeds (now emitting the nested-git warning if applicable).
Tests:detectNestedGitEntries (nested dir/file + empty); hard-stop returns the sentinel and skips git init; --init-repo override proceeds; sentinel distinctness. Existing tests unaffected (empty temp dirs).
Good to implement?
I don't think it needs to detect any of the git entries, doesn't it just need to default to no when it comes to creating repos automatically on someone's behalf?
1w ago·5m·16 calls
Done. Committed and pushed to fix/enable-confirm-defaults-1717 (no PR opened, as you asked).
What I changed (cmd/entire/cli/setup_github.go):
confirmInitRepoandconfirmCreateGitHubReponow default to No — a reflexive Enter declines instead of proceeding.- Both prompts show the absolute path in the title, so a wrong-directory mistake is visible in interactive and accessible modes.
What I deliberately did not do: the nested-.git/worktree detection from the first design — you were right that defaulting to No is the actual fix.
Verification: new tests drive the real huh confirm form via piped stdin (default-No for both prompts; explicit y still proceeds); mise run fmt/lint clean; full cli package passes. Non-interactive path unchanged — still declines without -y/--init-repo.
When you're ready for a PR, say the word and I'll open it as a draft.
b6b0b4ffix(enable): default repo-init and GitHub-create prompts to No\ `entire enable` in a non-git directory offered to git init, create a\ GitHub repo, and push — but the interactive confirms defaulted to Yes, so\ reflexively pressing Enter blew through the whole cascade and published the\ directory's contents on the user's behalf (issue #1717).\ \ Flip both confirms to default No so a bare Enter declines: the init prompt\ halts the cascade before `git init`, and the GitHub prompt never creates or\ pushes a remote unless the user explicitly opts in. Both prompts now show\ the absolute path in the title so a wrong-directory mistake is obvious in\ interactive and accessible modes. Non-interactive behavior is unchanged:\ without -y/--init-repo it already declines; those flags still bypass the\ prompts.\ \ Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com\ Entire-Checkpoint: 01KX71H0Y109M9JJDG8V0C576A+89/-9
How is everything locally for me a git repo now? ➜ ~ git:(main) ✗ pwd /Users/ninawork
I swear I never git init'd this. I just want to test out this enable fix.
1w ago·2m·5 calls
That commit is an orphan commit with an empty tree (line 526, 555) created by Entire's checkpoint-metadata setup — it never stages or commits your actual files, and it isn't the git add -A + push path from #1717.
Let me check whether entire enable actually completed here (settings + hooks), since that affects how you clean up and whether it'll keep firing while you test.
even making new directories already show up as git dirs for me.
➜ ~ git:(main) ✗ mkdir testtest ➜ ~ git:(main) ✗ cd testtest ➜ testtest git:(main) ✗ ls -lah total 0 drwxr-xr-x@ 2 ninawork staff 64B Jul 10 15:17 . drwxr-x---+ 68 ninawork staff 2.1K Jul 10 15:17 .. ➜ testtest git:(main) ✗
1w ago·52.2s
That confirms the mechanism. You don't have many repos — you have one repo at /Users/ninawork/.git, and every folder under your home (including the brand-new testtest) is inside it, so your prompt shows git:(main) everywhere. That's also why you can't test the fix: nothing under $HOME is a non-repo directory anymore.
What happened (reconstructed from timestamps): on July 7 14:02–14:03, entire enable was run from /Users/ninawork. It:
- ran
git init(.gitborn 14:02:56), - wrote
.entire/settings.json+.gitignore, installed git hooks (14:03), - created the
entire/checkpoints/v1empty-tree metadata ref.
Since then it's been live (session state from Jul 9–10). Crucially:
- No remote → nothing was ever pushed to GitHub. No exposure.
- No working-branch commit → your home files were never committed (0 tracked in HEAD). The
✗/"dirty" is just the empty repo seeing untracked files. - The
.githolds only Entire's empty metadata ref — nothing of yours.
So this is a real instance of the "enable ran in the wrong (non-repo) dir" class from #1717 — though here it stopped short of the push. My session today did not create or touch it (.git birth Jul 7, unmodified today).
Cleanup — since .git contains zero tracked files, no remote, and only Entire's empty ref, removing it loses nothing of yours. The exact, scoped commands:
1
2
3
rm -rf /Users/ninawork/.git # the accidental repo (empty metadata ref only)
rm -rf /Users/ninawork/.entire # entire settings/hooks config in home
rmdir /Users/ninawork/testtest # the test dir you just made
These are destructive and in your home directory, so I won't run them without your say-so. Want me to run exactly those three, or would you rather run them yourself? (I can first git -C /Users/ninawork bundle or copy .git to /tmp as a backup if you'd like a safety net, though there's nothing of yours in it.)
Update it so it says "Warning: " before Not a git repository.
1w ago·52.7s·2 calls
Done. The interactive init prompt now reads:
Warning: Not a git repository. Initialize a new one in /path?
Build passes; the tests don't assert on the title text, so they're unaffected. Not committed yet — say the word and I'll amend it onto the branch. And let me know if you also want the --init-repo decline error ("Not a git repository. Please run 'entire enable'…") prefixed the same way.
It shouldn't push the repository after init either: add a separate guard with no as a default for that too.o
1w ago·5m·14 calls
Full package passes. Here's the updated behavior — three independent default-No guards now stand between a stray entire enable and publishing anything:
| Step | Prompt (interactive, defaults No) | If declined |
|---|---|---|
| 1. Init | Warning: Not a git repository. Initialize a new one in <path>? |
Nothing happens — no git init |
| 2. Create remote | Create a GitHub repository for <path>? |
Local repo only; no remote |
| 3. Push (new) | Push the initial commit to <owner/repo>? |
Repo created + origin set, nothing published; prints git push -u origin HEAD to do it manually |
Each is a distinct outward-facing action, so opting into one no longer implies the next. --yes/--repo-* flags still bypass all three (documented non-interactive happy path preserved), and non-interactive without -y/--init-repo still declines at step 1.
Changes (setup_github.go): new confirmPushToRemote + push field on bootstrapState; ghRepoCreate's final param is now push (was hasCommits); finalize gates the push and prints skip guidance. Tests added: confirmPushToRemote default-No, and a finalize test proving repo-created-but-not-pushed when declined.
Not committed yet — the branch still only has the first commit. Want me to amend all of this (default-No confirms + Warning: prefix + push guard) into that commit, or make it a second commit on the branch?
Note: this is all on the fix/enable-confirm-defaults-1717 branch in the project repo — separate from cleaning up the accidental /Users/ninawork/.git, which I still haven't touched and awaits your go-ahead.
Review target: the tests
/simplify → 4 cleanup agents in parallel → apply the fixes
You are improving the quality of the changed code, not hunting for bugs. Review
it for reuse, simplification, efficiency, and altitude issues, then fix what you
find. Do not look for correctness bugs — that is what /code-review is for.
Phase 0 — Gather the diff
Run git diff @{upstream}...HEAD (or git diff main...HEAD / git diff HEAD~1
if there's no upstream) to get the unified diff under review. If there are
uncommitted changes, or the range diff is empty, also run git diff HEAD and
include the working-tree changes in scope — the review often runs before the
commit. If a PR number, branch name, or file path was passed as an argument,
review that target instead. Treat this diff as the review scope.
Phase 1 — Review (4 cleanup agents in parallel)
Launch 4 independent review agents via the Agent tool, all in a
single message so they run concurrently. Pass each agent the diff and one of
the four angles below. Each returns its findings with file, line, a
one-line summary, and the concrete cost (what is duplicated, wasted, or
harder to maintain).
Reuse
Flag new code that re-implements something the codebase already has — Grep shared/utility modules and files adjacent to the change, and name the existing helper to call instead.
Simplification
Flag unnecessary complexity the diff adds: redundant or derivable state, copy-paste with slight variation, deep nesting, dead code left behind. Name the simpler form that does the same job.
Efficiency
Flag wasted work the diff introduces: redundant computation or repeated I/O, independent operations run sequentially, blocking work added to startup or hot paths. Also flag long-lived objects built from closures or captured environments — they keep the entire enclosing scope alive for the object's lifetime (a memory leak when that scope holds large values); prefer a class/struct that copies only the fields it needs. Name the cheaper alternative.
Altitude
Check that each change is implemented at the right depth, not as a fragile bandaid. Special cases layered on shared infrastructure are a sign the fix isn't deep enough — prefer generalizing the underlying mechanism over adding special cases.
Phase 2 — Apply the fixes
Wait for all four agents to complete, dedup findings that point at the same line or mechanism, and fix each remaining one directly. Skip any finding whose fix would change intended behavior, require changes well outside the reviewed diff, or that you judge to be a false positive — note the skip rather than arguing with it. Finish with a brief summary of what was fixed and what was skipped (or confirm the code was already clean).
1w ago·2m·6 calls
All four agents are dispatched and running concurrently. I'll synthesize their findings and apply fixes once they report back.
Findings
1. The Setenv + Setenv + withPipedStdin trio repeats verbatim across 4 tests
File:/Users/ninawork/entire/devenv/cli/cmd/entire/cli/setup_github_test.go Lines: 1037-1039, 1053-1055, 1071-1073, 1089-1091 (4 occurrences)
Summary: Every accessible-prompt test opens with the identical 3 lines:
1
2
3
t.Setenv("ENTIRE_TEST_TTY", "1")
t.Setenv("ACCESSIBLE", "1")
withPipedStdin(t, input)
Concrete cost: 12 lines of exact-duplicate boilerplate; the two env vars are magic strings that must stay in sync across 4 sites. If the prompt harness ever needs a third env var (or a renamed one), that's a 4-site edit with no compiler help.
Simpler form (recommended): Fold the two Setenv calls intowithPipedStdin. They are never used without it in this block, and they're conceptually part of "make the interactive prompt readable from scripted stdin" — the same setup concern the helper already owns. The helper already takes t, so t.Setenv fits naturally:
1
2
3
4
5
6
func withPipedStdin(t *testing.T, input string) {
t.Helper()
t.Setenv("ENTIRE_TEST_TTY", "1")
t.Setenv("ACCESSIBLE", "1")
// ... existing pipe setup
}
Each test then opens with a single withPipedStdin(t, "\n"). This removes the duplication and the magic-string drift risk without introducing a new abstraction. The doc comment should be extended to note it also forces the accessible/TTY prompt mode.
I would not recommend the alternative runInteractiveConfirm(t, input) wrapper — it would have to return (bool, error) and still call a different confirmX function per test, so it can't actually unify the call sites; it would just add indirection. Folding into withPipedStdin is the cleaner move.
Minor caveat worth flagging, not blocking: folding Setenv in slightly widens the helper's responsibility beyond its name ("pipe stdin" now also sets env). If the author prefers the name to stay literal, a differently-named helper like withAccessiblePromptStdin(t, input) documents the combined intent. Either is better than the current 4x copy.
2. TestConfirmInitRepo_DefaultsToNo vs _ExplicitYesProceeds — table-driven?
Lines: 1036-1048 and 1052-1064
Summary: Near-identical; differ only in input ("\n" vs "y\n"), expected bool, and the assertion message.
Recommendation: Keep them separate. This matches the file's established style (the surrounding tests at 996-1011, 1161+ are deliberately separate and explicit), and the two cases document genuinely distinct behaviors — "safe default on Enter" (the issue #1717 regression guard) vs "explicit opt-in still works." A table would collapse two differently-motivated doc comments into row labels and save maybe 6 lines at the cost of that intent. Not worth it here. This one is clean as-is.
3. Redundant assertions / unused vars / over-verbose construction
Lines: 1106-1148 (REDACTED)
No unused vars, no redundant assertions — the three assertions (create ran, push did not, guidance printed) each check a distinct part of the contract, which is appropriate.
One small observation, not a defect: the r.set(...) for git add -A, git status --porcelain, and git commit (lines 1111-1113) stub commands whose execution the test never asserts on — only gh repo create, absence of git push, and the output string are checked. Those three stubs exist only so runGitHubBootstrapFinalize doesn't error before reaching the push guard, so they're load-bearing setup rather than dead code. Leave them; removing them would break the test. Mentioning only so it isn't mistaken for prunable noise.
The push: false field (line 1129) is the one line that actually distinguishes this test from a push-accepted variant; it's set explicitly and commented via the test name/doc. Good.
Summary
The one change worth making: fold the two t.Setenv calls into withPipedStdin to kill the 4x verbatim trio (finding 1). Findings 2 and 3 are clean — the separate-and-explicit tests match the file's style, and the finalize test has no redundant assertions or dead vars.
1w ago
Findings
1. Existing test not migrated to the new withPipedStdin helper (the one clear reuse issue)
- File:
/Users/ninawork/entire/devenv/cli/cmd/entire/cli/setup_github_test.go - Line: ~1252-1264 (test
TestResolveRepoName_YesRepoExistsWithTTY_FallsBackToPrompt, starts line 1241) - Summary: The new
withPipedStdinhelper (line 1016) is a byte-for-byte extraction of the inline stdin-piping block that still lives in this existing test in the same file. - Cost / what's duplicated: Lines 1252-1264 do exactly
os.Pipe()+t.Fatal(err)+t.Cleanup(pr.Close)+ goroutinepw.WriteString(...) //nolint:errcheck+pw.Close()+ save/swap/restoreos.Stdin— identical to the body ofwithPipedStdin. The only difference is the scripted input ("unique-test-repo\n"). Since the helper was added to this very file, the existing test should be reduced towithPipedStdin(t, "unique-test-repo\n"), deleting ~12 lines. Leaving it un-migrated means the file now carries two copies of the same stdin-swap logic. The helper matches the existing conventions exactly (same cleanup ordering, same//nolint:errcheckcomment), so migration is a drop-in.
2. No existing TTY+ACCESSIBLE setup helper to reuse (not a reuse violation, but a missed consolidation)
- File:
/Users/ninawork/entire/devenv/cli/cmd/entire/cli/setup_github_test.go - Lines: 1037-1038, 1053-1054, 1071-1072, 1089-1090
- Summary: I searched all of
cmd/entire/cli/*_test.gofor a helper that setsENTIRE_TEST_TTY+ACCESSIBLEtogether (and combines it with stdin piping). None exists — tests everywhere sett.Setenv("ENTIRE_TEST_TTY", "1")inline (setup_test.go, setup_import_test.go, trail_resume_cmd_test.go, etc.). - Cost: The new tests are NOT reimplementing an existing helper (there is nothing to call), so this is not a strict reuse defect. However, the four new tests repeat the identical 3-line preamble (
Setenv TTY+Setenv ACCESSIBLE+withPipedStdin). Given the author was already extractingwithPipedStdin, folding the twot.Setenvlines into that same helper (or a sibling likewithAccessiblePrompt(t, input)) would remove the repeated env setup across all four new tests and match the pattern the helper is meant to establish. Optional, lower priority than finding 1.
3. No shared testutil for stdin exists elsewhere in the repo
- I checked repo-wide (
internal/, whole tree) for anyos.Stdin =swap orWithStdin/PipeStdintestutil. The onlyos.Stdin =assignments in the entire repo are in this same file (the new helper and the un-migrated existing test).internal/remotehelper/githelper/signal_test.gomatched the name grep but is unrelated (signal handling, not stdin piping). - Conclusion: There is no pre-existing shared helper the new tests should have called instead. The new
withPipedStdinis a legitimate new helper; the only real reuse action is finding 1 — migrate the existing inline duplicate in this file to use it.
1w ago·4m·20 calls
Clean. /simplify complete.
Applied:
- Folded
t.Setenv("ENTIRE_TEST_TTY"/"ACCESSIBLE")into the stdin helper and renamed itwithInteractivePromptStdin— removed the 4× verbatim 3-line preamble and the magic-string drift risk (flagged by reuse, simplification, and efficiency agents). - Migrated the pre-existing
TestResolveRepoName_YesRepoExistsWithTTY_FallsBackToPromptto the new helper — deleted ~18 lines of hand-rolledos.Pipe/goroutine/stdin-swap that the helper was extracted from (reuse + efficiency). - Relabeled
REDACTED→_HonorsPushFalsewith an accurate docstring — it tests finalize honoringstate.push == false, not the guard decision, which the altitude agent correctly noted was a seam/intent mismatch. The doc now points atTestConfirmPushToRemote_DefaultsToNofor the decision itself.
Skipped (with reasons):
- Table-driving the confirm tests — the file's established convention is separate/explicit tests, each a distinct #1717 regression guard; the simplification agent agreed. Collapsing would trade intent-documenting names for row labels.
- Full interactive init→finalize integration test (altitude's deeper suggestion) — driving three sequential
huhforms from one piped stdin is genuinely fragile: each form creates its ownbufio.Scanneronos.Stdin, which read-ahead-buffers and would consume input meant for later forms. The decision is covered at the unit level and finalize's honoring separately, which is more robust than one flaky end-to-end test. - Dropping the goroutine in the helper — efficiency agent confirmed it's not a leak and explicitly recommended leaving it; keeps parity with the established pattern.
Tests pass, mise run fmt/lint clean (0 issues). All still uncommitted on fix/enable-confirm-defaults-1717.
Push up the changes, don't rebase. Open a draft PR but don't link the issue yet.
1w ago·1m·3 calls
Done.
- Pushed the second commit to
fix/enable-confirm-defaults-1717(no rebase — history untouched; the branch now has two commits). - Opened draft PR #1720: https://github.com/entireio/cli/pull/1720
- Issue not linked — the PR body describes the behavior but deliberately contains no
#1717/Closes/Fixesreference, so nothing auto-links yet. Say the word when you want me to add the link.
Still untouched: the accidental /Users/ninawork/.git cleanup — waiting on your go-ahead for those three rm/rmdir commands.
fd63242fix(enable): add separate default-No push guard and warn prefix\ \ Split the outward-facing steps of the non-repo bootstrap into independent,\ default-No confirmations so opting into one no longer implies the next:\ - The init prompt now leads with "Warning:" so a wrong-directory run reads\ as the warning it is.\ - Creating the GitHub repo and pushing to it are now separate guards. Even\ after opting into creating the repo, publishing the directory's contents\ requires its own confirmation (default No). Declining leaves the repo\ created with origin configured but nothing pushed, and prints the manual\ `git push -u origin HEAD` next step.\ \ ghRepoCreate's final parameter now means "push" rather than "hasCommits";\ the finalize step passes committed && state.push.\ \ Tests: default-No guards for all three prompts and a finalize test that the\ push is skipped (repo still created) when the push decision is No. Folded the\ TTY/accessible env setup into a shared withInteractivePromptStdin helper and\ migrated the existing resolveRepoName prompt test onto it.\ \ Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com\ Entire-Checkpoint: 01KX72QKGQG59DCXM69SPTM3N5+147/-48
Address the review comments in https://github.com/entireio/cli/pull/1720
1w ago·17.8s·1 call
Base directory for this skill: /Users/ninawork/.claude/skills/pr-feedback
PR Feedback
1. Identify the PR
If the user provided a PR number or URL, use that. Otherwise, detect from the current branch:
1
gh pr view --json number,title,url --jq '.number, .title, .url'
If no PR exists for the current branch, stop and tell the user.
2. Fetch Review Comments
Fetch PR metadata first so comment decisions have intent context:
1
gh pr view {number} --json number,title,url,body,headRefName,baseRefName
Also collect branch commits and changed files for context:
1
2
git log --oneline origin/main..HEAD
git diff --name-status origin/main
Show the PR context as a table before classifying comments:
| Context | Source | Value |
|---|---|---|
| PR | title/body | One-line PR intent |
| Branch | commits | One-line commit summary |
| Changed surface | diff file list | Main packages/files touched |
| Base/head | PR metadata | base <- head |
Fetch unresolved review threads with GraphQL as the primary source of truth. Group work by thread, not by individual REST comment:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
gh api graphql -F owner={owner} -F repo={repo} -F number={number} -f query='
query($owner: String!, $repo: String!, $number: Int!) {
repository(owner: $owner, name: $repo) {
pullRequest(number: $number) {
reviewThreads(first: 100) {
nodes {
id
isResolved
path
line
comments(first: 50) {
nodes {
id
databaseId
body
author { login }
}
}
}
}
}
}
}'
Filter to unresolved threads only. If there are no unresolved threads, report that to the user and stop — there is nothing to fix.
If GraphQL pagination indicates more review threads or thread comments are available, paginate before classifying. Do not classify a partial thread set as complete.
Use REST pull-review comments only as a fallback when GraphQL data is incomplete or a thread cannot be mapped to a review comment ID:
1
2
gh api repos/{owner}/{repo}/pulls/{number}/comments --paginate
gh api repos/{owner}/{repo}/pulls/{number}/reviews --paginate
When REST fallback is used, deduplicate by GraphQL thread ID first, then by file/line/body/author. Do not present or fix the same review request twice.
3. Parse, Classify, and Group
Use permission-friendly reads while investigating comments. Avoid shell pipelines, command separators, subshells, and output filters for read-only source inspection because they create extra permission prompts and can block background work. Do not run commands like git show HEAD:path | sed -n '10,40p'. Use workspace file range reads, rg with path limits, path-scoped diffs, or one standalone git show <rev>:<path> only when the output is acceptably small.
For each comment, extract:
- Author — who left it
- Author type — bot, automated reviewer, human reviewer, or maintainer
- File and line — where it points
- Body — the actual feedback (verbatim, not paraphrased)
- Thread context — any replies in the same thread (to understand if it was already discussed or resolved conversationally)
- Thread ID and comment ID — the GraphQL review thread ID and original comment ID needed to reply and resolve
Group each unresolved review thread into a single finding. If multiple comments in one thread refine or supersede each other, use the latest unresolved reviewer request as the finding and retain the earlier messages as context.
Classify each finding source:
- Bot — GitHub bot, CI system, or linter/static-analysis account such as
github-actions[bot]orcodecov[bot] - Automated reviewer — review-assistant accounts that produce natural-language suggestions, such as Copilot or CodeRabbit
- Human reviewer — non-bot reviewer
- Maintainer — repository owner/member/maintainer when that can be inferred from GitHub metadata
4. Present Findings
Present two separate sections:
Human Comments
Table ordered by:
- Bugs / correctness issues — reviewer identified broken logic or missing error handling
- Design / architecture feedback — structural changes, API shape, naming of public interfaces
- Style / nits — formatting, naming of local variables, minor readability
Use this table format:
| # | Priority | Location | Reviewer | Request | Key quote | Autofix |
|---|---|---|---|---|---|---|
| 1 | Bug | file.go:42 |
reviewer |
One-line summary of what the reviewer is asking for. | Short verbatim excerpt. | Eligible, or Needs decision with the exact decision needed. |
For automated reviewers, use the same table and set Reviewer to the tool account, with Priority based on the substance of the request.
Bot Comments (batched)
Table continuing the numbering from above, grouped by tool/bot:
| # | Bot | Location | Required fix | Autofix |
|---|---|---|---|---|
| 8 | linter-name |
file.go:42 |
One-line summary of the required fix. | Eligible, or Needs decision with the exact decision needed. |
Keep table cells short and scannable. Use the smallest useful verbatim quote, not the full comment body. Escape | characters inside code or text so the table remains valid Markdown.
End with a summary: total human comments, total bot comments, overall assessment of effort.
Do not stop for mode selection. Proceed by default with bot comments and human comments marked Autofix eligible. Mark a human comment Autofix eligible only when the requested change is source-backed, high confidence, minimal, unambiguous, does not require a product/design decision, does not add a dependency, does not change a shared/public interface, and has a clear verification path.
Leave all other human comments unresolved as Needs decision, with the exact decision needed. Do not reject a reviewer comment by default; rejection requires a user-provided public rationale.
Before applying any fixes, record the starting commit:
1
git rev-parse HEAD
Choose an artifact directory using the AGENTS.md temporary artifact rule with agent name pfleidi-pr-feedback:
- Use
./tmp/pfleidi-pr-feedback/only when./tmp/already exists and is already ignored. - If no project-local artifact directory is available, do not create file artifacts by default; keep ledger/log/cache information in the response and mark file paths
n/a. Ask before using/tmp/pfleidi-pr-feedback/or modifying ignore files.
When an artifact directory is available, create a temporary thread ledger at <artifact-dir>/pr-feedback-<pr-number>.md. If no artifact directory is available, keep the same ledger fields in the final summary table instead. Update the ledger after each thread with:
- Thread ID, source category, reviewer, location, and status.
- Files touched.
- What changed and why.
- Related tests or verification commands.
- Planned public reply, if any.
- Resolve decision: yes/no and why.
5. Fix Bot Comments (batched)
Fix all bot comments first — these are mechanical and clearing them reduces noise before the human-comment phase.
- For each bot finding:
- Read the relevant code
- Implement the fix — ONLY the changes needed for that single finding
- Track the files changed for this finding so the final PR reply can identify the commit that contains the fix
- If a fix is ambiguous or would conflict with a human-comment fix already applied, mark it Needs decision and continue
- After all bot fixes are applied, present a summary table. Do NOT show a diff — the Edit tool already showed each change inline.
| # | Finding | File | Bot | Status |
|---|---|---|---|---|
| 8 | Description | path:line | linter-name | Fixed |
| 9 | Description | path:line | linter-name | Fixed |
| 11 | Description | path:line | linter-name | Skipped — conflicts with #3 |
- Proceed directly to Step 6.
6. Fix Human Comments (batched)
After bot fixes, work through Autofix eligible human comments in report order:
- State which finding you are addressing (number and one-line description)
- Read the relevant code and the full comment thread to understand intent
- Re-check eligibility before editing; if the fix is no longer clearly eligible, mark it Needs decision and continue
- Implement the fix — ONLY the changes needed for that single finding
- Track the files changed for this finding so the final PR reply can identify the commit that contains the fix
- If a comment needs a product/design decision, shared/public interface change, dependency, broad refactor, or has multiple reasonable fixes, mark it Needs decision and continue
- If the user rejects the comment instead of fixing it, record the specific rationale to use in the final PR reply
Scope Rules
- Make the MINIMAL change that addresses the reviewer's feedback
- Keep the diff limited to files and lines directly required by the feedback
- First decide whether the feedback points to a local or systemic issue. Fix at the narrowest correct level; do not add a local workaround that hides a shared/root-cause bug.
- If the feedback requires a behavior-changing code fix, add or update the directly related test in the same fix. Prefer TDD, but complete the focused red-to-green cycle before stopping: write/update the failing test, confirm it fails, implement the fix, confirm the focused test passes. Do not stop after only adding the failing test unless the user explicitly asks.
- Do NOT rename variables, reformat code, or touch lines outside the feedback scope
- Do NOT refactor adjacent code, even if it looks related
- If the reviewer's comment is ambiguous, mark it Needs decision and continue with unrelated unambiguous comments
- Do NOT create any git commits during the fix cycle. Commits are handled only in the publish step, and only with explicit user approval when needed.
7. Verify Fixes
After all fixes are applied, run the project's lint and test commands scoped to only the changed files and their directly related tests. If no code changed, skip verification and proceed to Step 8. Use safe background batches for independent validators instead of running every command sequentially.
When selecting verification commands, reuse <artifact-dir>/verification-<repo-name>.md if an artifact directory is available and the cache is fresh under the cache rules from pfleidi:pr; otherwise discover the smallest relevant lint/test/build commands. Update the cache only when an artifact directory is available.
- Lint / static analysis — run the project's documented lint task, scoped to the files that were modified when the task supports scoping. Prefer lint-specific task wrappers such as
make lintormise run lintover invoking linter binaries directly. Do not use aggregatecheck,ci, orverifytasks unless you have confirmed they only run lint/static analysis. If the documented lint task cannot be scoped, run the smallest relevant project lint task. - Tests — run only the test files that cover the modified code (same package, same module, co-located test files). Do NOT run the full test suite.
If no project lint task exists, state that explicitly instead of assuming an unavailable linter binary.
Run formatters, generators, snapshot updates, or other mutating commands alone before validators that depend on their output. Run independent read-only validators concurrently when they do not require the same exclusive service, port, database, fixture directory, or generated output. Keep integration/e2e/service-backed commands separate unless the project documents that they are parallel-safe.
For each background batch, start every command from the same working-tree state, capture stdout/stderr/exit status from the tool, do not edit files while the batch is running, and wait for every command to finish. Run each selected validator directly, for example mise run lint, go test ..., or npm test -- .... Do not wrap validators in sh -c, shell redirection, tee, command separators, or pipelines solely to write logs; that defeats command-prefix approvals and causes extra permission prompts. If an artifact directory is available and file logs can be written after the command completes without rerunning through a shell wrapper, save them under <artifact-dir>/logs-<pr-number>-<timestamp>/; otherwise mark the full-log path as n/a. If files change after a failed batch, none of that batch's successful results count as current verification.
Show verification as a compact table:
| Command | Exit | Relevant output | Full log |
|---|---|---|---|
go test ./pkg/foo -run TestBar -count=1 |
0 | Short success excerpt. | <artifact-dir>/logs-.../go-test-pkg-foo.log or n/a |
For failures or short outputs, show complete output in the relevant-output column or immediately below the table. For long successful outputs, show the relevant excerpt and log path.
If lint or tests fail due to issues introduced by the fixes:
- Read the error output and identify every failure
- Fix all issues — apply the minimal changes needed
- Re-run the failing commands using the same safe batching rules
- Show the complete output again
Cap at 2 fix attempts. If still failing after 2 rounds, present the remaining failures to the user with full output.
Once verification passes, show a summary: how many comments were addressed, rejected, intentionally left unresolved, or still blocked. Do NOT show a diff — the Edit tool already showed each change inline.
Proceed to Step 8 for threads that were addressed or intentionally rejected. Leave Needs decision threads unresolved and do not reply to them unless the user provided a public rejection rationale. Do not block publishing addressed threads just because unrelated threads still need a decision.
8. Publish PR Updates
After addressed/rejected threads are ready to publish:
- Check branch state:
1
git status --short --branch
If there are uncommitted fix changes, STOP and ask the user whether to commit them now or let the user commit manually. Do not push until the fixes are committed. If the user approves committing, stage only files changed for the PR feedback fixes and write the commit message from the actual diff using the subject-plus-context style from
AGENTS.md.Push the committed changes for the current branch:
1
git push origin HEAD
If the branch has no upstream and the push fails for that reason, use:
1
git push -u origin HEAD
Never force-push.
Map each addressed finding to the commit or commits that contain its fix. Use the recorded starting commit, changed-file tracking, ledger, and
git log/git showto identify the relevant short SHA(s). If one commit fixes multiple comments, reference the same commit in each reply.Build and show a reply plan table before calling the API:
| Thread | Status | Reply body | Resolve |
|---|---|---|---|
PRRT_... |
Addressed | Addressed in abc1234 by adding the nil check before dereferencing. |
Yes |
PRRT_... |
Needs decision | n/a |
No |
Proceed without asking when every actionable reply row is either addressed or a user-approved rejection. Needs decision rows with Reply = n/a and Resolve = No do not block publishing addressed threads. Stop before API calls if a rejection lacks a public rationale or if any reply body is uncertain.
- Reply to each original PR review thread:
- For addressed comments, state what changed and the commit SHA(s), e.g.
Addressed in abc1234 by adding the nil check before dereferencing.
- For addressed comments, state what changed and the commit SHA(s), e.g.
For rejected comments, state why it was not changed, e.g.
Not changed: this path already returns before allocation failure can be observed.Keep replies concise but specific. Do not over-explain or repeat the diff.
Do not reply to comments the user explicitly chose to leave unresolved.
Prefer replying with the review thread ID:
1
2
3
4
5
6
gh api graphql -f query='
mutation($thread: ID!, $body: String!) {
addPullRequestReviewThreadReply(input: {pullRequestReviewThreadId: $thread, body: $body}) {
comment { id url }
}
}' -f thread="$THREAD_ID" -f body="$BODY"
```
If the thread cannot be replied to by GraphQL, use the original review comment ID with the REST reply endpoint.
7. Resolve each thread after replying:
1 2 3 4 5 6
gh api graphql -f query=' mutation($thread: ID!) { resolveReviewThread(input: {threadId: $thread}) { thread { id isResolved } } }' -f thread="$THREAD_ID"
Do not resolve a thread that was not replied to, is still ambiguous, or still needs user approval.
8. Present a final summary table:
| Thread | Reviewer | Location | Status | Reply | Resolved |
| --- | --- | --- | --- | --- | --- |
| `PRRT_...` | `reviewer` | `file.go:42` | Addressed | Yes | Yes |
| `PRRT_...` | `reviewer` | `file.go:99` | Needs decision | No | No |
Include push result, branch, ledger path, rejected comments and rationale, and any comments intentionally left unresolved or not resolvable via API.
## 9\. Post-Publish
- If the user asks for adjustments, apply them
- If the user asks to revert specific fixes, revert ONLY those changes
- Do NOT commit or push additional changes unless explicitly asked
ARGUMENTS: [https://github.com/entireio/cli/pull/1720](https://github.com/entireio/cli/pull/1720)
1w ago·1m·8 calls
Verification clean:
| Command | Exit | Result |
| --- | --- | --- |
| `mise run lint` | 0 | 0 issues |
| `go test ./cmd/entire/cli -run 'TestConfirm|TestRunGitHubBootstrap|TestResolveRepoName'` | 0 | ok |
All 3 threads addressed. Now publishing — there are uncommitted fix changes, so per the skill I need your go-ahead before committing/pushing.
Proposed commit (only `setup_github.go`):
fix(enable): quote interpolated paths/repo in bootstrap prompts
Use %q instead of %s in the init, create-repo, and push confirmation prompts so paths with spaces or the owner/repo target render unambiguously, matching the codebase's prior %q convention. Addresses PR #1720 review.
Then `git push` (no force), reply to each of the 3 Copilot threads with the fix SHA, and resolve them.
**Reply plan:**
| Thread | Status | Reply | Resolve |
| --- | --- | --- | --- |
| `PRRT_…29H` (create, L348) | Addressed | `Addressed in <sha>: switched to %q so the path is quoted.` | Yes |
| `PRRT_…29T` (push, L374) | Addressed | `Addressed in <sha>: quoted the owner/repo target with %q.` | Yes |
| `PRRT_…29h` (init, L412) | Addressed | `Addressed in <sha>: quoted the path with %q.` | Yes |
Want me to commit, push, and post/resolve these three replies?
Yes, just resolve them, no need to post replies
1w ago·41.6s·2 calls
Done.
| Thread | Reviewer | Location | Status | Reply | Resolved |
| --- | --- | --- | --- | --- | --- |
| `PRRT_…29H` | copilot | `setup_github.go:348` (create prompt) | Addressed | No (per your ask) | Yes |
| `PRRT_…29T` | copilot | `setup_github.go:374` (push prompt) | Addressed | No | Yes |
| `PRRT_…29h` | copilot | `setup_github.go:412` (init prompt) | Addressed | No | Yes |
- **Fix:**`%s`→`%q` in all three bootstrap prompts, committed as `6b5090981` and pushed to `fix/enable-confirm-defaults-1717`.
- **Verified:** lint 0 issues, affected tests pass.
- **All 3 Copilot threads resolved**, no replies posted.
PR #1720 now has no unresolved review threads. Still on your list separately: the accidental `/Users/ninawork/.git` cleanup, which I haven't touched.
[6b50909fix(enable): quote interpolated paths/repo in bootstrap prompts\\
\\
Use %q instead of %s in the init, create-repo, and push confirmation\\
prompts so paths with spaces or the owner/repo target render unambiguously,\\
matching the codebase's prior %q convention. Addresses PR #1720 review.\\
\\
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\\
Entire-Checkpoint: 01KX73A6XAV57E8QXQ6RQRRR2J+3/-3](/content/gh/entireio/cli/commit/6b50909818a2f0614a6210a358a960dd05146795/index.html)
Take a look at the comment on [https://github.com/entireio/cli/pull/1720](https://github.com/entireio/cli/pull/1720). Is it accurate? Don't push any comments on my behalf. I thought we were already defaulting to not push?
4d ago·2m·2 calls
Read the code at the anchor. pfleidi's comment is on this block (`setup_github.go:229`):
1 2 3 4 5 6
push := useGitHub && commit // ← defaults to TRUE if push && !opts.Yes && !ghFlagsProvided(opts) && interactive.CanPromptInteractively() { confirmed, err := confirmPushToRemote(fullName) // prompt defaults No ... push = confirmed }
**The comment is accurate.** Your recollection is right _only for the interactive path_. Here's the split:
| Scenario | Pushes by default? |
| --- | --- |
| **Interactive, no flags** | **No** — the prompt defaults to No (what you remember) |
| **Non-interactive** (e.g. `entire enable --init-repo` in a script/CI) | **Yes** — `CanPromptInteractively()` is false, so the guard is skipped and `push` stays `true` |
| `--yes` | Yes (expected) |
| GitHub flags present (`--repo-name`/`--repo-owner`/`--repo-visibility`) | **Yes** — `ghFlagsProvided` skips the guard |
So the _variable_`push` initializes to `true`, and only the **interactive prompt** ever flips it to No. In non-interactive or flagged runs it publishes without any explicit push opt-in. That's exactly what pfleidi is flagging — it's not "default to not-push unless otherwise specified," it's "default to push unless an interactive user declines."
My own comment on line 227 even says the quiet part: _"non-interactive keep the documented happy path (push)."_
Two things worth knowing before you decide:
- This mirrors the **create-repo** guard right above it (`useGitHub := !opts.NoGitHub` also defaults true and is only flipped interactively), so non-interactive `--init-repo` currently _creates the GitHub repo too_. If we invert push, you'd likely want to reconsider create for consistency.
- Inverting to default-No would change the non-interactive happy path and touch existing tests (`TestRunGitHubBootstrap_FullNonInteractive`, `_YesAcceptsAllDefaults`) — a scripted `--init-repo --repo-name X` currently expects a push. A clean way to make it "otherwise specified" would be an explicit `--push`/`--no-push` flag (or requiring `-y`), with the interactive default staying No.
I haven't changed anything or posted any comment. Want me to implement the default-No-unless-explicit posture (and/or apply the same to the create step)?
Yeah let's have them both be opt-in explicitly
4d ago·9m·29 calls
To answer your original question directly: **pfleidi's comment was accurate.** We were only defaulting to not-push _interactively_ — the code seeded `push := useGitHub && commit` (true) and `useGitHub := !opts.NoGitHub` (true), and only the interactive prompt ever flipped them to No. A non-interactive run (`entire enable --init-repo` in a script/CI) created a GitHub repo and pushed with no explicit opt-in.
Fixed and pushed (`06b38b5e2`). Now **both create and push are explicit opt-ins**:
| Scenario | Create repo? | Push? |
| --- | --- | --- |
| Interactive, no flags | Prompt (default No) | Prompt (default No) |
| Non-interactive, no flags | **No** — stays local, doesn't even probe `gh` | No |
| `--repo-name`/`--repo-owner`/`--repo-visibility` | Yes (explicit) | **No** — prints manual `git push` guidance |
| `--push` | Yes (implied) | Yes |
| `--yes` | Yes | Yes |
- Added a `--push` flag (implies creating the remote; mutually exclusive with `--no-github` and `--skip-initial-commit`), and updated `--yes` help to mention push.
- Tests updated to the new defaults + added coverage: no-flags-stays-local, repo-flags-create-without-push, `--push` path, and the flag exclusivity.
- Verified: full `cli` package passes, lint 0 issues, no integration/e2e reliance on the old behavior.
**pfleidi's review thread:** I left it untouched — no reply posted or resolved, per your "don't push comments on my behalf." Want me to resolve it (and/or post a note that it's addressed in `06b38b5e2`)?
[06b38b5fix(enable): make GitHub repo creation and push explicit opt-ins\\
\\
Previously the bootstrap seeded push := useGitHub && commit (true) and\\
useGitHub := !opts.NoGitHub (true), flipping them to No only via the\\
interactive prompt. So a non-interactive run (e.g. \`entire enable --init-repo\`\\
in CI) created a GitHub repo and pushed the directory's contents with no\\
explicit opt-in — the interactive default-No was not the real default.\\
\\
Now both are explicit opt-ins:\\
\- Create the GitHub repo only on an explicit signal (--repo-\*, --push, --yes)\\
or an interactive "yes". Non-interactive with no signal stays local-only and\\
never probes gh.\\
\- Push only on --push/--yes or an interactive "yes"; otherwise the repo is\\
created but left unpushed, with manual \`git push\` guidance printed.\\
\\
Adds a --push flag (implies creating the remote; mutually exclusive with\\
--no-github and --skip-initial-commit) and updates --yes help to mention push.\\
\\
Tests updated to reflect the new default (no-flags stays local; repo flags\\
create-without-push) and cover the --push path and flag exclusivity.\\
\\
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\\
Entire-Checkpoint: 01KXE4XZ12S5VJGDTTVCSQG0SN+147/-56](/content/gh/entireio/cli/commit/06b38b5e29cbd737223c79c970c1a1479d203b13/index.html)