amicode(home): fix silent dead-end on 'Open chat' with no tracked projects - #8
Merged
Merged
Conversation
…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>
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>
5 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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):startWithPromptneedsnewSessionProject(), which resolves from the persisted client-side project list (localStorage). On a fresh profile that list is empty, so the!projectbranch callsopenNewSession()— which needs the same emptynewSessionProject()and hitsif (!conn || !project) return. Silent no-op.Hit live on 2026-07-08 driving the web UI against an
opencode serveon 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 fromGET /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 hasworktree: "/"— falling back to "first server project" would open a session on the filesystem root.Verification
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 -bclean (also re-run by the pre-push hook)bun run test:unit: 376 pass / 0 failrole=buttonwhose accessible name contains "Open chat" — the spec usesexact: true.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 pinslocal e9b695191; bump on the next scheduled vendor refresh.🤖 Generated with Claude Code