Skip to content

Add card gap and quick-create in worktree dialog - #10

Merged
nwparker merged 3 commits into
mainfrom
nwparker/card-padding
Mar 22, 2026
Merged

nwparker merged 3 commits into
mainfrom
nwparker/card-padding

Conversation

@nwparker

Copy link
Copy Markdown
Contributor

Summary

  • Add 8px gap between worktree cards in the sidebar virtual list for better visual separation
  • Allow pressing Enter anywhere in the Add Worktree dialog to quickly create a worktree (skips needing to click "Create" button)

Test plan

  • Verify worktree cards have visible spacing between them
  • Open Add Worktree dialog, confirm default name is present, press Enter — worktree should be created
  • Verify Enter doesn't submit when name is empty or during creation
  • Verify Shift+Enter in the comment textarea doesn't trigger creation

🤖 Generated with Claude Code

nwparker and others added 3 commits March 21, 2026 16:50
- Add 8px (pb-2) gap between worktree cards in the virtual list
- Allow pressing Enter in the Add Worktree dialog to quickly create
  a worktree without clicking the Create button

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Check for active text selection in the card click handler and bail
out, so selecting text in PR/issue/comment hovercards doesn't
accidentally switch the active worktree.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@nwparker
nwparker merged commit a9e2b49 into main Mar 22, 2026
LesleyMurfin referenced this pull request in LesleyMurfin/orca Jun 20, 2026
…w (4 fixes)

NotebookLM peer review verdict: CHANGES-NEEDED. Applied the genuine
findings (assessed against actual Electron/Node behavior; teardown was
the only hypothesis NLM rated already-Established):

- fix #7: also override XDG_RUNTIME_DIR (scratch, mode 0700) -- Chromium/
  Electron IPC sockets live there (/run/user/UID, shared w/ prod) and are
  NOT covered by app.getPath('userData').
- fix #8: PRE-7b df -h /tmp gate -- --appimage-extract-and-run unpacks the
  full ~400-600MB squashfs into shared /tmp; a full /tmp could hang prod.
- fix #9: correct Step 4 + acceptance #2 -- under the HOME override,
  homedir() resolves to the scratch home, so expect that cwd (avoids a
  false-negative wrong-cwd failure).
- fix #10: documented prod-recovery pointer for Lesley (systemctl restart
  / orca-serve-version restore); STOP-first posture retained per the
  never-hotfix / deviation=STOP governance.

Execution remains GATED on Lesley's approval. Notebook:
cf8d676b-fb68-4f01-9388-922b83568759

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
scolety1 added a commit to scolety1/orca that referenced this pull request Sep 11, 2026
Documents the fresh 2-pass stability sequence run after finding stablyai#11
reset the counter: Pass stablyai#1 (run stablyai#10, PASS, 2 classic-artifact
failures including one newly-isolated-confirmed RAPID SWITCHING),
one RESOURCE_ABORTED attempt (run stablyai#11, real OOM kill), then Pass stablyai#2
(run stablyai#12, PASS) launched under the owner's explicit ">95%-used-only"
memory rule. Updates the session-status header, §12 stability
declaration, §13 SHA ledger, §14 resource-pressure section, §15/§16
worktree/SHA, §17 next-highest-value work, and the terminal
declaration block to reflect STABILITY_PASS = 2 of 2 at current tip
SHA 9374ba7.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CdU7C6R8tKG5diqfdjNCPp
gaberudy added a commit to goldenhelix/vsagent that referenced this pull request Sep 12, 2026
Ported the VSAgent brand mark and the CLI help-text rebrand seam, plus one
package.json script addition, per B5 (stablyai#6, stablyai#8, stablyai#9, stablyai#10, stablyai#14):

- resources/vsagent.svg: net-new flat SVG logo (blue #068AFE mark), copied
  verbatim from the fork (no upstream collision).
- src/renderer/web-index.html: title -> "VSAgent"; inlined SVG favicon (data:
  URI, base64) since `orca serve`'s static handler only exposes
  /web-index.html and /assets/*. Re-derived the base64 from this commit's own
  resources/vsagent.svg (base64 -w0) rather than copying the fork's literal
  string, then diffed byte-for-byte against the fork's inlined value to
  confirm they match exactly.
- src/renderer/src/assets/main.css: added the 9-line `.titlebar-brand-logo`
  rule immediately after `:root:not(.dark) .titlebar-logo { filter:
  invert(1); }` — the VSAgent mark is full-color and must not be inverted in
  light mode the way the monochrome Orca mark is.
- src/cli/help.ts: added `brandHelpText()` (rewrites /\bOrca\b/ and /\borca\b/
  when VSAGENT_BRAND_CLI=1) and wrapped all 3 printHelp() console.log sites
  with it. printHelp's shape and the ROOT_HELP_TEXT_PRIMARY/SECONDARY split
  (upstream's own refactor, unrelated to this bucket) were untouched.
  VSAGENT_BRAND_CLI is the same seam name S15/B2's formatRuntimePairingOffer
  reads and B6's scripts/vsagent-cli launcher sets — not renamed here.
- package.json: added "smoke:web": "node tests/web-client-smoke.mjs" next to
  "smoke:computer" (script backing file lands with B6/S38-S39; the entry is
  inert but harmless until then). Left "name": "orca" and "version": "1.4.197"
  untouched per Q7 — vsagent-next tracks upstream's version, not the fork's
  0.6.10.

Did not touch root-help-text-primary.ts/-secondary.ts (S15's pairing-url
content) or notification-permission-probe.ts/startup-notification-
registration.ts (left unbranded per Q9).

Verification: corepack pnpm tc (tc:node/tc:cli/tc:web) clean; brandHelpText
sanity (`Usage: orca foo` -> `Usage: vsagent foo` only when
VSAGENT_BRAND_CLI=1, unchanged otherwise); src/cli/handlers/terminal.test.ts
(16 tests, exercises printHelp with no VSAGENT_BRAND_CLI set — unbranded
regression) and src/cli/index.test.ts (27 tests) both pass;
check:code-quality:changed clean (0 findings, 13 changed files);
check:max-lines-ratchet and check:runtime-electron-ratchet both unchanged.

Fork-origin: 6669054

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Wekb1M8qsHPobDxMHzoMEZ
scolety1 added a commit to scolety1/orca that referenced this pull request Sep 15, 2026
…e override moved to Advanced disclosure

New shared ui/src/components/AdvancedDisclosure.tsx (a plain native
<details>, collapsed by default) -- the one reusable progressive-disclosure
surface this batch's Global rule calls for, reused by both findings below.

Finding stablyai#8 (IA problem): ProjectCard.tsx's card footer showed a raw git SHA
prefix; now shows the real, already-populated release.stable.branch (plain
language). ProjectDetailPage.tsx's Release card now leads with
Branch/Testing/Adoption/Published in plain language; exact
Stable/Previous Stable/Upgrade commit+tree identity moves into an
AdvancedDisclosure -- never deleted, one click away.

Finding stablyai#10 (IA problem): KeepGoingTickForm.tsx's worktree/agent fields
(the "Run now" dispatch form's own placement controls) move into an
AdvancedDisclosure, collapsed by default. Ordinary use of this form (work
item id, scope, optional spec) no longer requires engaging with placement
at all. Worktree remains a real, required field with no fabricated
default -- hasExplicitPlacement's own safety history (a prior default
silently resolved to the coordinator's own working directory, not the
project's) is exactly why no default is introduced here either; the
existing client-side validation error already tells an operator who
forgets it to provide one, so expert capability is fully preserved.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CdU7C6R8tKG5diqfdjNCPp
scolety1 added a commit to scolety1/orca that referenced this pull request Sep 15, 2026
…ehind Advanced

The Overview tab's Recent Decision card was already plain-language
(title/rationale from analysis.direction.recommendedNextMission) --
unchanged. The Onboarding card's own maturity/alignment/unfinished-summary/
upgrade-backlog fields are already reasonably plain-language too; only its
Orca-registration-check and exact analysis timestamp read as engineering
mechanics rather than owner-facing summary. Moved into the same
AdvancedDisclosure Finding stablyai#8/stablyai#10 already established, never deleted.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CdU7C6R8tKG5diqfdjNCPp
nwparker added a commit that referenced this pull request Sep 30, 2026
Reverses my own restore of `native-chat-assembler-merge-parity.test.ts`. I kept it
believing it was a live cross-implementation differential oracle; it is not.

`native-chat-session-assembler.ts:233` documents the gate: the `turnKey` fallback
"only merges a candidate against an existing message of a DIFFERENT source (#10)".
The test passes `sources: { transcript }` — a single source — so that fallback is
gated off, the assembler reduces to id-dedup-and-append, and it equals the mobile
id-only merge by construction. The assertion is identity === identity.

Both contracts it nominally covered are owned directly, by tests asserting concrete
values rather than comparing two implementations that degenerate to the same
operation: identical same-source prompts surviving at
`native-chat-session-assembler.test.ts:328` and `:354` (both citing #10), and
id-append order at `mobile/src/session/mobile-native-chat-merge.test.ts:18`.

The lesson generalizes: a differential is only worth keeping if the two
implementations can actually diverge on the fixture used. Check that the fixture
reaches the code that differs.
nwparker added a commit that referenced this pull request Sep 30, 2026
#23968)

* test: retire native-chat and sidebar cases their fixtures or predicates neutralize

Semantic sweep of renderer sidebar, right-sidebar and native-chat. 10 cases
removed across 6 files; one test-only production re-export removed.

Two new shapes here, both of which make a case unable to fail:

A fixture that neutralizes its own variation. `NativeChatNoticeRow`'s
`old-reader compatibility` table had six rows, but the test's own
`oldStatusSchema.omit({tone, presentation})` strips the metadata being varied, so
all six render the identical body `{kind:'status', text:'…'}`. Its
schema-acceptance half is owned case-for-case at
`agent-session-journal-schemas.test.ts:310-318`.

A fixture that makes the distinction its name claims impossible. "Counts a new
turn from its stamp, not a row held open by background work" set `turnStartedAt`
and `mainAgent.stateStartedAt` to the same `now - 5_000`, so it could not tell the
two links apart; `native-chat-terminal-turn.test.ts:75` owns the real version.

Also removed: two cases varying `stateHistory`, which no native-chat production
file reads (`NativeChatHookTurnEntry` omits it); the `agent-session` row of a
transport table whose guard is `valueSource === 'dispatched' && transport ===
'catalog'`, so under `reported` the transport is never consulted — the `catalog`
row stays as the only test of the non-dispatched arm; `openclaude` from an
`it.each` where the only agent test on that path is `args.agent === 'codex'`, so
both agents take the identical arm.

Production change: `NativeChatMessageList.tsx` no longer re-exports
`ProviderFrameRow`. That export existed only for
`NativeChatMessageList.provider-frame.test.tsx`; both production callers
(`NativeChatNoticeRow.tsx:9`, `NativeChatMessageRow.tsx:24`) already import it
from `NativeChatTranscriptChrome` directly, so the test now does too.

Kept where the call site differs though the assertions match: a dispatched-pill
tooltip case and a transport-hedge case hit `NativeChatSessionOptionPickers.tsx:278`
(model pill) versus `:302` (options pill). Kept as live branches: the
`lifecycle === null || lifecycle === 'published'` disjuncts, the four distinct
wirings in `native-chat-reader-scroll-input.ts:33-46`, and a ring case that is the
only one reaching the module's own keydown listener, because the sibling's click
path already runs `dropPendingHover`.

* test: delete the assembler/id-merge differential, which cannot fail

Reverses my own restore of `native-chat-assembler-merge-parity.test.ts`. I kept it
believing it was a live cross-implementation differential oracle; it is not.

`native-chat-session-assembler.ts:233` documents the gate: the `turnKey` fallback
"only merges a candidate against an existing message of a DIFFERENT source (#10)".
The test passes `sources: { transcript }` — a single source — so that fallback is
gated off, the assembler reduces to id-dedup-and-append, and it equals the mobile
id-only merge by construction. The assertion is identity === identity.

Both contracts it nominally covered are owned directly, by tests asserting concrete
values rather than comparing two implementations that degenerate to the same
operation: identical same-source prompts surviving at
`native-chat-session-assembler.test.ts:328` and `:354` (both citing #10), and
id-append order at `mobile/src/session/mobile-native-chat-merge.test.ts:18`.

The lesson generalizes: a differential is only worth keeping if the two
implementations can actually diverge on the fixture used. Check that the fixture
reaches the code that differs.
enrick-dev pushed a commit to enrick-dev/orca that referenced this pull request Oct 15, 2026
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
nwparker added a commit that referenced this pull request Oct 19, 2026
…-page readers off the deprecated owner resolver (#30478)

Thirteen read-routing callers (#4, #5, #10-#20 of the round-3 caller list) read the owner through
runtimeEnvironmentIdWithLegacyFallbackUnlessTwin. A workspace two hosts publish is no longer
searched on either host. The focus-read ratchet now counts the legacy-fallback adapter, which
reads the focused runtime inside an object literal its discovery skipped; the five F1 entries
that blind spot pruned come back. Deprecated importers 53 -> 40.
nwparker added a commit that referenced this pull request Oct 19, 2026
…win projections stay on their host (review-5 #2 #9 #11)

A selected ssh: host that two paired servers proxy now resolves ambiguous at the one
selected-host resolver, so no caller can fall back to this app's own SSH connection.
File Explorer and SSH mutation expectations derive the full {endpoint, place} pair from
resolveOwner, so a server folder's nested SSH target stays the write's host. A local
lineage write projects onto its own host's rows only. The id-only store-write ratchet
now also covers persistence repo-row lookups by id alone (review-5 #10's shape).
nwparker added a commit that referenced this pull request Oct 20, 2026
…win projections stay on their host (review-5 #2 #9 #11) (#30890)

* fix(renderer): host writes route only through the strict owner, and twin projections stay on their host (review-5 #2 #9 #11)

A selected ssh: host that two paired servers proxy now resolves ambiguous at the one
selected-host resolver, so no caller can fall back to this app's own SSH connection.
File Explorer and SSH mutation expectations derive the full {endpoint, place} pair from
resolveOwner, so a server folder's nested SSH target stays the write's host. A local
lineage write projects onto its own host's rows only. The id-only store-write ratchet
now also covers persistence repo-row lookups by id alone (review-5 #10's shape).

* fix(ratchet): the id-only lookup scan also sees optional chaining and destructured ids

* fix(renderer): an unstamped folder keeps reading its host from its repos; editor focus fallback left for a follow-up

* docs(renderer): the File Explorer owner comment names its folder fallback
KyleQuinn888 added a commit to KyleQuinn888/orca that referenced this pull request Oct 27, 2026
…: isLocalSession/policy on native scope, cursor advance in (epoch,seq) order not ts, candidate metrics dedup via folded-cursor stamp, workspace fallback picks a real journal carrier
KyleQuinn888 added a commit to KyleQuinn888/orca that referenced this pull request Oct 28, 2026
rizoadev added a commit to rizoadev/orca that referenced this pull request Nov 3, 2026
- Add CloudflareRuntimeHint — reads cloudflareRelayHostname from settings,
  shows banner with copy button when tunnel is active
- Inject into runtime-share-computer-button.tsx below RuntimePairingUrlGenerator
- Click 'Copy' copies wss:// URL to clipboard + toast instructs user to
  paste into Custom Address field
- Update INJECTION-MAP.md (touch point stablyai#10)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant