Skip to content

amicode(home): fix silent dead-end on 'Open chat' with no tracked projects - #8

Merged
kateebonner merged 1 commit into
local/amicodefrom
kate/home-open-chat-empty-projects
Jul 8, 2026
Merged

amicode(home): fix silent dead-end on 'Open chat' with no tracked projects#8
kateebonner merged 1 commit into
local/amicodefrom
kate/home-open-chat-empty-projects

Conversation

@kateebonner

Copy link
Copy Markdown
Contributor

Bug

On a fresh browser profile pointed at a bare opencode serve, the home page's primary CTA — the Meet-Amico card and its Open chat button — does nothing. No navigation, no error.

Root cause (packages/app/src/pages/home.tsx, fork wiring from 5ef6b7e): startWithPrompt needs newSessionProject(), which resolves from the persisted client-side project list (localStorage). On a fresh profile that list is empty, so the !project branch calls openNewSession() — which needs the same empty newSessionProject() and hits if (!conn || !project) return. Silent no-op.

Hit live on 2026-07-08 driving the web UI against an opencode serve on a scratch directory (Pasqal connector testing).

Fix

When no project is tracked, fall back to the focused server's own working directory — focusedSync().data.path.directory, synced from GET /path (defaults to "" until loaded, so the falsy guard holds). Open + touch it as a project (self-healing: the home page tracks it from then on), then start the draft with the prompt preserved.

Deliberately not sync.data.project: the server's "global" project record has worktree: "/" — falling back to "first server project" would open a session on the filesystem root.

Verification

  • New regression spec e2e/regression/home-open-chat-empty-projects.spec.ts: real UI against the mocked server, no localStorage seed (the regression condition), clicks the CTA, expects navigation to /new-session?draftId= and the cwd persisted as a tracked project. Verified failing on the unfixed code, passing with the fix.
  • tsgo -b clean (also re-run by the pre-push hook)
  • bun run test:unit: 376 pass / 0 fail
  • Locator note: the whole Meet-Amico card is also a role=button whose accessible name contains "Open chat" — the spec uses exact: true.
  • Playwright harness note: the config reuses any server on port 3000; run with PLAYWRIGHT_PORT=<free port> if something else holds it (the harmoniqs website dev server did).

Patch-stack entry added to AMICODE-PATCHES.md (entry 9). No vendor bump in amicode implied by this PR — the extension pins local e9b695191; bump on the next scheduled vendor refresh.

🤖 Generated with Claude Code

…jects

On a fresh browser profile against a bare `opencode serve`, the home
page's primary CTA (Meet-Amico card / "Open chat") did nothing: the
persisted client-side project list is empty, so startWithPrompt fell
through to openNewSession(), which needs the same newSessionProject()
that just came back empty and silently returns.

Fall back to the focused server's own working directory, synced from
GET /path (.directory; "" until loaded, so the guard holds). Open and
touch it as a project — self-healing: the home page tracks it from then
on — and start the draft with the prompt preserved. Deliberately not
sync.data.project: the server's "global" record has worktree "/".

Regression spec drives the real UI against a mocked server with no
localStorage seed; verified failing on the unfixed code and passing
with the fix. tsgo -b clean; bun test:unit 376 pass.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@kateebonner
kateebonner merged commit 99a5918 into local/amicode Jul 8, 2026
0 of 4 checks passed
Rchari1 added a commit that referenced this pull request Jul 9, 2026
…mo udd hit exactly this) + trunk

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
kateebonner added a commit that referenced this pull request Jul 9, 2026
…99

The fork rendered the old "digi" pixel-H mark in four independent copies
while amicode redesigned its mark (PR #99). This unifies them to a single
MARK_PATH and syncs the geometry to #99's FINAL square mark (viewBox
0 0 3600 3600) — not the intermediate "hackathon" geometry an earlier
draft of this branch had copied, which #99 itself later abandoned.

- logo.tsx: MARK_PATH = amico_reduced.svg's outer-bracket path (fill-rule
  evenodd). Mark/Splash render it; viewBox 64x56 → 3600 square.
  MarkDetailed = amico.svg's full mark (bracket + internal accents),
  viewBox 116 287 3377 3035 → 3600 square, for the Meet Amico card only.
- spinner.tsx (AmicoSpinner) + run-card.tsx (share-card SVG) both now
  import MARK_PATH instead of carrying their own copies — run-card was a
  fourth private copy of the old glyph; its transform is recalibrated
  (scale 0.55 → 0.011) for the 3600-unit space.
- favicon/amico.svg: reduced bracket on the yellow chip, viewBox 3600,
  path kept byte-identical to MARK_PATH.
- logo.css: aspect-ratio 8/7 → 1/1 (mark is square now).
- Small contexts use the reduced mark, the Meet Amico card uses the
  detailed one — matching amicode's own small/large split.

Rebased onto local/amicode (picks up PR #8; AMICODE-PATCHES.md conflict
resolved, entry 15 rewritten for the final geometry).

Checks: bun turbo typecheck (ui+app) green; ui bun test src 95 pass;
app vite build clean — new mark path in the bundle, old geometry and the
64x56 viewBox gone (0 chunks), favicon carries the new path.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
kateebonner added a commit that referenced this pull request Jul 9, 2026
…99

The fork rendered the old "digi" pixel-H mark in four independent copies
while amicode redesigned its mark (PR #99). This unifies them to a single
MARK_PATH and syncs the geometry to #99's FINAL square mark (viewBox
0 0 3600 3600) — not the intermediate "hackathon" geometry an earlier
draft of this branch had copied, which #99 itself later abandoned.

- logo.tsx: MARK_PATH = amico_reduced.svg's outer-bracket path (fill-rule
  evenodd). Mark/Splash render it; viewBox 64x56 → 3600 square.
  MarkDetailed = amico.svg's full mark (bracket + internal accents),
  viewBox 116 287 3377 3035 → 3600 square, for the Meet Amico card only.
- spinner.tsx (AmicoSpinner) + run-card.tsx (share-card SVG) both now
  import MARK_PATH instead of carrying their own copies — run-card was a
  fourth private copy of the old glyph; its transform is recalibrated
  (scale 0.55 → 0.011) for the 3600-unit space.
- favicon/amico.svg: reduced bracket on the yellow chip, viewBox 3600,
  path kept byte-identical to MARK_PATH.
- logo.css: aspect-ratio 8/7 → 1/1 (mark is square now).
- Small contexts use the reduced mark, the Meet Amico card uses the
  detailed one — matching amicode's own small/large split.

Rebased onto local/amicode (picks up PR #8; AMICODE-PATCHES.md conflict
resolved, entry 15 rewritten for the final geometry).

Checks: bun turbo typecheck (ui+app) green; ui bun test src 95 pass;
app vite build clean — new mark path in the bundle, old geometry and the
64x56 viewBox gone (0 chunks), favicon carries the new path.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
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