Repository navigation
Improve setup wizard onboarding - #85
Conversation
PR Review: Improve setup wizard onboardingConfidence Score: 4/5 The PR cleanly simplifies the setup wizard from 4→3 steps, localizes the harness inventory display, and adds Linux desktop metadata. Builds and typechecks pass. Issues1. Redundant state updates in
// refreshHarnessStatus already did:
// setInventories(result);
// setHarnessState(...);
const result = await refreshHarnessStatus();
if (cancelled) return;
setInventories(result); // redundant
setHarnessState( // redundant
hasModelReadyHarness(result) || hasInstalledHarness(result) ? "ready" : "none",
);This causes two unnecessary renders on mount. The 2. 18 orphaned i18n keys in all three locale files After removing the
These should be removed to avoid dead code and misleading translators. 3. Minor: function stepNumber(step: Step) {
return ["harness", "folder", "finish"].indexOf(step === "opencode" ? "harness" : step);
}When |
# Conflicts: # src/components/AppSidebar.tsx
PR Review: Improve setup wizard onboardingConfidence Score: 5/5 Changes are well-structured, build passes, and the three-step wizard simplification is clean. The old wizard keys are properly removed from all locale files, and the new harness inventory localization is thorough. Issues Detected1. Orphaned i18n key The key 2. Unmounted state update in async function copyOpenCodeInstallCommand() {
try {
await navigator.clipboard.writeText(OPENCODE_INSTALL_COMMAND);
setCopiedInstallCommand(true);
window.setTimeout(() => setCopiedInstallCommand(false), 2000); // 🐛
} catch {
setCopiedInstallCommand(false);
}
}If the wizard unmounts within 2 seconds of copying, the timeout fires const copyTimeoutRef = useRef<ReturnType<typeof setTimeout>>();
async function copyOpenCodeInstallCommand() {
try {
await navigator.clipboard.writeText(OPENCODE_INSTALL_COMMAND);
setCopiedInstallCommand(true);
copyTimeoutRef.current = setTimeout(() => setCopiedInstallCommand(false), 2000);
} catch {
setCopiedInstallCommand(false);
}
}
useEffect(() => {
return () => clearTimeout(copyTimeoutRef.current);
}, []);3. Scope creep in changes Three changes are unrelated to the PR title/description:
These should be split into separate PRs or called out in the description. |


Summary
Testing