Commit 01f26e3
Phase 4: Web Interface (#14)
* feat(web): scaffold Vite/React/TS project with Tailwind v4 tokens and self-hosted Geist
* feat(web): add API types and fetch client with the 5xx-never-verbatim error contract
* feat(web): add TanStack Query hooks for query answers and index status
* feat(web): add ConfidenceBadge and ErrorCard with icon-locked confidence-state discriminator
* fix(web): use real lucide-react auto-generated classes in ConfidenceBadge/ErrorCard tests
Remove hardcoded className props from icon elements that lucide-react merges
onto its own auto-generated class, which silently defeated the icon-identity
tests. Update the test selectors to match the actual classes generated by the
installed lucide-react 1.25.0 (lucide-circle-check, lucide-triangle-alert,
lucide-circle-x).
* feat(web): add IndexStatusBadge with the not-indexed/error/healthy discriminator
* feat(web): add QueryInput with Enter-to-submit and global '/' focus shortcut
* feat(web): add CopyButton, copies the speakable answer only
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
* feat(web): add inline-expanding sources and supporting-points disclosures
* feat(web): add AnswerCard, LoadingState, and the AnswerPanel status switch
* feat(web): wire AppShell, TopBar, and QueryClientProvider into the real App
* ci(web): add unit/integration test job; add Playwright E2E scaffold for manual runs
* style(web): fix pre-existing Prettier drift so the new CI format check passes
AnswerPanel.test.tsx (Task 9) had a line exceeding printWidth that an
earlier `npm run format` run didn't catch; also add test-results/,
playwright-report/, blob-report/ to .prettierignore so Prettier stops
scanning Playwright's generated output (mirrors the existing dist/
entry — Prettier doesn't consult .gitignore, only .prettierignore).
Whitespace-only; no assertion or logic changes.
* fix(web): personal_examples is an object array, not string[] — matches real backend contract
The frontend types and SupportingPointsDisclosure assumed
personal_examples: string[], but the backend (apps/api/app/generation/schema.py)
returns PersonalExample objects ({project, example, source_chunk_ids}). A
real response with a populated personal_examples array would crash the
whole app with no error boundary to catch it. Also fixes QuerySource.heading
(string -> string | null) to match the backend's actual optional field,
guarding SourceItem against a dangling separator.
---------
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>1 parent 77f5ff8 commit 01f26e3
49 files changed
Lines changed: 6933 additions & 0 deletions
File tree
- .github/workflows
- apps/web
- src
- api
- assets/fonts
- components
- lib
- tests
- api
- components
- e2e
- lib
Some content is hidden
Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
40 | 40 | | |
41 | 41 | | |
42 | 42 | | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
17 | 17 | | |
18 | 18 | | |
19 | 19 | | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
20 | 25 | | |
21 | 26 | | |
22 | 27 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
0 commit comments