Repository navigation
Conversation
There was a problem hiding this comment.
Pull request overview
This PR scaffolds the TalkTerm Electron (Forge + Vite) application and establishes the initial shared domain/port types, renderer UI components (setup + overlay/display primitives), speech adapters, and CI/tooling configuration.
Changes:
- Add project build/test/tooling configuration (Vite configs, TS strict config, ESLint/Prettier/Husky, Vitest + coverage, Tailwind/PostCSS, GitHub Actions).
- Introduce shared domain + port types (sessions, writeback, IPC envelopes/channels, agent events/errors, value objects).
- Implement initial renderer components/hooks and main-process stubs/utilities with accompanying unit tests.
Reviewed changes
Copilot reviewed 147 out of 162 changed files in this pull request and generated 9 comments.
Show a summary per file
| File | Description |
|---|---|
| vitest.config.ts | Adds Vitest configuration with coverage thresholds. |
| vite.renderer.config.ts | Configures PostCSS pipeline for the renderer build. |
| vite.preload.config.ts | Adds preload Vite config placeholder. |
| vite.main.config.ts | Adds main-process Vite resolution settings. |
| tsconfig.json | Enables strict TypeScript options and path mapping. |
| test/setup-renderer.ts | Adds Testing Library jest-dom matchers for Vitest. |
| tailwind.config.ts | Defines design tokens (colors/type/spacing) for Tailwind. |
| src/shared/types/ports/text-to-speech.ts | Defines TextToSpeech port contract. |
| src/shared/types/ports/speech-to-text.ts | Defines SpeechToText port contract. |
| src/shared/types/ports/agent-backend.ts | Defines AgentBackend port + session config. |
| src/shared/types/ports/.gitkeep | Keeps ports directory in VCS. |
| src/shared/types/domain/writeback.ts | Adds writeback target types + default selection by origin. |
| src/shared/types/domain/writeback.test.ts | Tests default writeback selection. |
| src/shared/types/domain/value-objects.ts | Adds branded value objects + constructors. |
| src/shared/types/domain/value-objects.test.ts | Tests value-object validation. |
| src/shared/types/domain/user-profile.ts | Adds UserProfile type + factory. |
| src/shared/types/domain/user-profile.test.ts | Tests UserProfile factory behavior. |
| src/shared/types/domain/session.ts | Adds Session type + factory. |
| src/shared/types/domain/session.test.ts | Tests Session factory behavior. |
| src/shared/types/domain/project.test.ts | Sanity tests for TS strictness flags. |
| src/shared/types/domain/preference.ts | Adds preference threshold utilities/constants. |
| src/shared/types/domain/preference.test.ts | Tests preference threshold logic. |
| src/shared/types/domain/launch-state.ts | Adds setup-step routing helper. |
| src/shared/types/domain/launch-state.test.ts | Tests setup-step routing priority. |
| src/shared/types/domain/ipc-message.ts | Adds IPC message envelope + factory. |
| src/shared/types/domain/ipc-message.test.ts | Tests IPC message factory timestamping. |
| src/shared/types/domain/ipc-channels.ts | Defines canonical IPC channel constants + type. |
| src/shared/types/domain/ipc-channels.test.ts | Tests channel naming + uniqueness. |
| src/shared/types/domain/electron-api.ts | Declares preload bridge contract type for renderer. |
| src/shared/types/domain/avatar-persona.ts | Adds MVP persona roster. |
| src/shared/types/domain/avatar-persona.test.ts | Tests persona roster shape/uniqueness. |
| src/shared/types/domain/audit-entry.ts | Adds AuditEntry type + factory. |
| src/shared/types/domain/audit-entry.test.ts | Tests AuditEntry factory behavior. |
| src/shared/types/domain/api-key-state.ts | Defines API key state + validation result types. |
| src/shared/types/domain/agent-event.ts | Adds AgentEvent union for streaming events. |
| src/shared/types/domain/agent-error.ts | Adds error classification + user-friendly messaging. |
| src/shared/types/domain/agent-error.test.ts | Tests error classification and message safety. |
| src/shared/types/domain/.gitkeep | Keeps domain directory in VCS. |
| src/renderer/types/web-speech.d.ts | Adds Web Speech API window typings. |
| src/renderer/types/.gitkeep | Keeps renderer types directory in VCS. |
| src/renderer/styles/global.css | Adds Tailwind directives + global font/body styles. |
| src/renderer/speech/web-speech-tts.ts | Implements TTS adapter using Web Speech API. |
| src/renderer/speech/web-speech-tts.test.ts | Tests WebSpeechTts behavior under jsdom mocks. |
| src/renderer/speech/web-speech-stt.ts | Implements STT adapter using Web Speech API. |
| src/renderer/speech/web-speech-stt.test.ts | Tests WebSpeechStt behavior under jsdom mocks. |
| src/renderer/speech/barge-in-controller.ts | Adds barge-in state controller (TTS stop + STT start). |
| src/renderer/speech/barge-in-controller.test.ts | Tests barge-in state transitions and calls. |
| src/renderer/speech/.gitkeep | Keeps speech directory in VCS. |
| src/renderer/renderer.tsx | Adds React entrypoint mounting App. |
| src/renderer/hooks/useLayoutState.ts | Adds reducer-driven layout mode hook. |
| src/renderer/hooks/useLayoutState.test.ts | Tests layout mode transitions. |
| src/renderer/hooks/useDisplayMode.ts | Adds display-mode selection state hook. |
| src/renderer/hooks/useDisplayMode.test.ts | Tests display-mode state updates. |
| src/renderer/hooks/useAvatarState.ts | Adds avatar animation-state reducer hook. |
| src/renderer/hooks/useAvatarState.test.ts | Tests avatar state transitions. |
| src/renderer/hooks/.gitkeep | Keeps hooks directory in VCS. |
| src/renderer/context/.gitkeep | Keeps context directory in VCS. |
| src/renderer/components/setup/WorkspaceSelection.tsx | Adds workspace selection UI. |
| src/renderer/components/setup/WorkspaceSelection.test.tsx | Tests workspace selection callbacks. |
| src/renderer/components/setup/ProfileSetup.tsx | Adds profile setup UI. |
| src/renderer/components/setup/ProfileSetup.test.tsx | Tests profile setup interactions. |
| src/renderer/components/setup/AvatarSelection.tsx | Adds avatar selection UI using MVP personas. |
| src/renderer/components/setup/AvatarSelection.test.tsx | Tests avatar selection callback. |
| src/renderer/components/setup/ApiKeySetup.tsx | Adds API key entry/validation UI (stub validation). |
| src/renderer/components/setup/ApiKeySetup.test.tsx | Tests API key setup basic rendering. |
| src/renderer/components/setup/AdminBlockScreen.tsx | Adds blocking admin-privileges screen UI. |
| src/renderer/components/setup/AdminBlockScreen.test.tsx | Tests admin block screen rendering and buttons. |
| src/renderer/components/overlay/ActionPanel.tsx | Adds action panel container (listbox) UI. |
| src/renderer/components/overlay/ActionPanel.test.tsx | Tests action panel rendering and selection. |
| src/renderer/components/overlay/ActionCard.tsx | Adds action card UI with option semantics. |
| src/renderer/components/overlay/ActionCard.test.tsx | Tests action card semantics and interactions. |
| src/renderer/components/display/TaskProgress.tsx | Adds task progress display mode. |
| src/renderer/components/display/TaskProgress.test.tsx | Tests task progress rendering. |
| src/renderer/components/display/DocumentView.tsx | Adds basic document display mode. |
| src/renderer/components/display/DocumentView.test.tsx | Tests document rendering/path display. |
| src/renderer/components/display/ComparisonTable.tsx | Adds comparison table display mode. |
| src/renderer/components/display/ComparisonTable.test.tsx | Tests comparison table expand behavior. |
| src/renderer/components/display/ClusteredCards.tsx | Adds clustered cards display mode. |
| src/renderer/components/display/ClusteredCards.test.tsx | Tests clustered cards expand/priority tags. |
| src/renderer/components/display/ActivityFeed.tsx | Adds activity feed display mode. |
| src/renderer/components/display/ActivityFeed.test.tsx | Tests activity feed visibility/rendering. |
| src/renderer/components/avatar/TextInput.tsx | Adds text input w/ Enter-to-send and mic button. |
| src/renderer/components/avatar/TextInput.test.tsx | Tests text input send/newline/mic behavior. |
| src/renderer/components/avatar/StatusIndicator.tsx | Adds avatar status pill. |
| src/renderer/components/avatar/StatusIndicator.test.tsx | Tests status pill rendering and role=status. |
| src/renderer/components/avatar/CaptionBar.tsx | Adds caption bar w/ delayed hide logic. |
| src/renderer/components/avatar/CaptionBar.test.tsx | Tests caption bar basic rendering conditions. |
| src/renderer/components/.gitkeep | Keeps components directory in VCS. |
| src/renderer/App.tsx | Adds minimal App shell. |
| src/preload/preload.ts | Adds preload bridge stub via contextBridge. |
| src/main/storage/.gitkeep | Keeps storage directory in VCS. |
| src/main/security/admin-check.ts | Adds admin privilege check helper + instructions. |
| src/main/security/admin-check.test.ts | Tests admin privilege check across platforms. |
| src/main/security/.gitkeep | Keeps security directory in VCS. |
| src/main/main.ts | Adds Electron main window creation and lifecycle wiring. |
| src/main/ipc/.gitkeep | Keeps IPC directory in VCS. |
| src/main/agent/fake-agent-backend.ts | Adds FakeAgentBackend test double. |
| src/main/agent/fake-agent-backend.test.ts | Tests FakeAgentBackend event streaming/cancel. |
| src/main/agent/agent-message-router.ts | Adds router forwarding backend events to handler. |
| src/main/agent/agent-message-router.test.ts | Tests router event forwarding and cancel. |
| src/main/agent/.gitkeep | Keeps agent directory in VCS. |
| postcss.config.js | Adds PostCSS config for Tailwind/autoprefixer. |
| package.json | Adds dependencies, scripts, lint-staged config. |
| index.html | Adds renderer entry HTML. |
| forge.config.ts | Configures Electron Forge + Vite plugin + makers. |
| eslint.config.mjs | Adds ESLint flat config with strict TS + React rules. |
| .prettierrc | Adds Prettier config. |
| .prettierignore | Adds Prettier ignore rules. |
| .husky/pre-commit | Adds pre-commit quality gate commands. |
| .gitignore | Adds repo ignore rules (build artifacts/coverage). |
| .github/workflows/release.yml | Adds release workflow for tag builds. |
| .github/workflows/ci.yml | Adds CI workflow with 3-OS matrix quality gates. |
| _bmad-output/implementation-artifacts/*.md | Adds planning/implementation artifacts for stories. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
|
Important Review skippedToo many files! This PR contains 216 files, which is 116 over the limit of 100. To get a review, reduce the PR to 100 files or fewer by splitting it into smaller PRs or changing its base branch. Upgrade to a paid plan to raise the limit. This review couldn't start because sufficient usage credits or metered capacity aren't available. Add credits or update usage-based reviews in the billing tab, then retry.
|
|
|
Auto-rebase failed — merge conflict — this branch has conflicts with Please resolve the conflicts and push: |
|
@claude Please address all open review comments on this PR from CodeRabbit and Copilot. |
|
Claude finished @don-petry's task in 5m 30s —— View job Addressing Open Review CommentsFinding: All 7 Copilot review items were already addressed in prior commits (the PR has 36 commits made after the review was posted). One gap remained: Tasks
What was committed (
Cannot address (GitHub App permissions restrict
|
dddc998 to
11dd524
Compare
Pull request was converted to draft
|
@dev-lead - please fix this PR |
CI Failure: SonarCloud Code AnalysisStep: Quality Gate (New Code Coverage condition) The SonarCloud quality gate failed because coverage on new code is 45.9%, below the required 80%. No individual test failed and there are no annotations. The PR adds code (the diff is over 20,000 lines) that the test suite does not exercise enough. Suggested fix: Add unit tests for the uncovered new code, starting with the files that have the lowest new-code coverage in the SonarCloud "Coverage on New Code" measures view. If some of the added files are generated or vendored, exclude them via |
don-petry
left a comment
There was a problem hiding this comment.
Review — changes requested (posted as comment: GitHub does not allow requesting changes on your own PR)
Top line: the test suite is genuinely green, but as shipped the app is blocked on Windows, re-runs setup on every launch, and gives the agent auto-approved file edits with no working confirmation path. Details are in the line comments; the blockers are the Windows admin gate, the no-op admin Retry, the per-launch setup repeat, and the acceptEdits tool policy.
Verification I ran locally (head d0009ef)
tsc --noEmit— clean.eslint --max-warnings 0— clean.prettier --check .— clean.vitest run— 670/670 pass (77 files) withbetter-sqlite3rebuilt;test:coveragepasses its 90% thresholds.- GitHub checks:
qualitypasses on ubuntu/macos/windows; thee2ejob is failing on this PR (job 121075002536; it'scontinue-on-error, and its logs weren't retrievable while the run was still in progress — worth investigating before merge, since the PR's own E2E/manual test-plan items are still unchecked).
Themes across the line comments
- Broken first-run paths — Windows admin gate can never pass; Retry returns the cached result; launch-state assessment (
assessLaunchState/determineFirstIncompleteStep) is implemented and tested but never called, so setup repeats every launch; a failed session start silently swaps in a random UUID and runs the agent in the wrong cwd. - Agent trust boundary — turns run
acceptEditswith unrestricted tools and nocanUseTool; theConfirmPlan/confirm-requestconfirmation flow is never emitted; full prompts and SDK payloads are logged verbatim; error retries re-execute whole turns (duplicate side effects, no per-turn budget cap). - Dead wiring from the sprint build-out — Rive avatar (emoji ships), memory index + user-name personalization, native folder picker + workspace persistence,
startSession/resumeSessionbackend paths, thekind: 'menu'question branch, andWebSpeechStt/BargeInControllerare all implemented-but-unreachable. Each is small; together they mean several PRD-facing features only exist in tests. - Epic 14 robustness — unverified/partial model downloads trusted forever, and the STT wrapper is excluded from the coverage gate with no test file.
Scope note
This PR is 229 files / +37,305 lines / 259 commits — effectively the entire application — while the description frames it as Epic 13 + 14 on top of Sprint 1. Landing it as one draft makes line-level review of everything else (storage, audit, CI hardening) cursory at best. If the history allows, splitting already-landed sprints from the Epic 13/14 delta would make the next review round far more effective. Not blocking on this, but flagging it.
Suggested order: fix the Windows/retry blockers and wire assessLaunchState, decide the tool-confirmation policy, then re-run the e2e job to green before marking ready.
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: d0009ef326
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 7f90f93939
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 175f387cca
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 7ee6a998a8
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
…, and launch order
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 51208925aa
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
…y decline, keep transient retry context, and cancel live mic restart
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: c7ab178d10
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
…ion ID, default workspace, key validation, and question skip state
c7ab178 to
85ae538
Compare
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 85ae5381f7
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
…op, load tracked analyst skill, and ensure userDataDir exists
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: cc1857db8a
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
…ctured content, ignore review speech, and skip budget retries
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 1f3debe4e7
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
…r stored key for ENV_KEY, and make question review scrollable
|
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 144a107467
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| setActiveError(null); | ||
| displayMode.clear(); |
There was a problem hiding this comment.
Clear obsolete question state when sending a new message
If the user bypasses a question stack by sending a follow-up through the main text input, this handler leaves activeQuestionSet intact. A subsequent plain-text response does not clear it either, so future microphone transcripts are intercepted by startListening() and entered into the old questionnaire instead of being sent to the agent. A mocked component reproduction confirmed that a new voice request populated the obsolete stack without invoking sendAgentMessage. Clear the active question set and its pending speech answer when starting a new conversational turn.
Useful? React with 👍 / 👎.
| .catch(() => { | ||
| // Setup IPC failure — proceed anyway; key is validated client-side | ||
| }); |
There was a problem hiding this comment.
Surface credential-storage failures in API key setup
If OS-backed encryption is unavailable or safeStorage.encryptString() throws, SafeStorageKeyManager.storeKey() rejects the storage IPC request, but this catch silently discards the failure. ApiKeySetup has already set isValid to true and displays “Continuing...”, so setup neither advances nor reports why the validated key could not be saved. A reproduction with encryption unavailable confirmed that the setup step remains unchanged without receiving an error or reset signal. Return the storage failure to the setup component and restore an actionable error/retry state rather than leaving it waiting indefinitely.
Useful? React with 👍 / 👎.
| maxBudgetUsd: 1.0, | ||
| continue: useContinue, | ||
| ...(persistedSdkId !== null && !resumeFailed ? { resume: persistedSdkId } : {}), | ||
| ...(isApproved ? { permissionMode: 'acceptEdits', allowedTools: undefined } : {}), |
There was a problem hiding this comment.
Forward shell-action approval to the SDK permission callback
In a workspace without preconfigured Bash allow rules, approving a command such as npm install cannot authorize its execution. ConversationView.handleConfirmApprove() sends a new message containing approved, and this override only enables acceptEdits; the SDK permission documentation explicitly states that non-filesystem Bash commands still require normal permissions. A repository-wide search of src found no canUseTool callback or permission-response bridge, and this override adds no command-specific allow rule, so the approved command remains subject to denial. Connect the confirmation result to the pending SDK permission decision rather than treating approval as another conversational turn.
Useful? React with 👍 / 👎.







Summary
Commits (stacked)
docs:Spec updates — PRD v2.4 (FR57-FR62), UX spec v1.3 (Journey 7), Epics (Epic 13 stories), Sprint statusfeat:Epic 13 implementation — question-parser.ts, QuestionCardStack, QuestionReview, SuggestionChips, E2E testsfeat:Epic 14 implementation — sherpa-onnx-node adapter, IPC audio pipeline, mic permission handlersNew Files
src/shared/types/domain/question-parser.tssrc/renderer/components/session/QuestionCardStack.tsxsrc/renderer/components/session/QuestionReview.tsxsrc/renderer/components/session/SuggestionChips.tsxsrc/main/speech/sherpa-onnx-stt.tssrc/main/ipc/speech-ipc-handler.tssrc/renderer/speech/ipc-speech-stt.tsTest plan
🤖 Generated with Claude Code