Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
129ae16
feat: show feature splash before login for new users
adboio Mar 17, 2026
7da10f8
Fix wordmark import to use existing SVG asset
charlesvien Apr 12, 2026
5954bee
Migrate onboarding components from stale useAuthStore to query-based …
charlesvien Apr 12, 2026
b9d036b
Replace folder icon with git branch icon for repo groups
charlesvien Apr 14, 2026
e5df649
Unify welcome screen into the onboarding wizard flow
charlesvien Apr 14, 2026
be196f7
Add support link and icons to onboarding footer buttons
charlesvien Apr 14, 2026
d6571fc
Extract external links into shared constants
charlesvien Apr 14, 2026
05c1d29
Add org switcher to project select and standardize step buttons
charlesvien Apr 14, 2026
8e944ee
Add hover animation to welcome screen feature list items
charlesvien Apr 14, 2026
8ad0997
Revamp welcome screen feature list and bold step titles
charlesvien Apr 14, 2026
94dc474
Add product workbench subtitle to welcome screen
charlesvien Apr 14, 2026
8b1ed84
Add auto-cycling highlight and staggered entrance to feature list
charlesvien Apr 14, 2026
81b7a31
Remove duplicate and unused image assets
charlesvien Apr 14, 2026
6bdf41d
Extract StepActions and bake animation into OnboardingHogTip
charlesvien Apr 14, 2026
3250f7f
Add talking wobble animation to hedgehog tips
charlesvien Apr 14, 2026
e788450
Reorder welcome screen feature list
charlesvien Apr 14, 2026
6488233
Prefer user's current team when auto-selecting project
charlesvien Apr 14, 2026
403d8c8
Rework project select step for unauthenticated state
charlesvien Apr 14, 2026
1852a78
Fix repos not iterable when API returns non-array data
charlesvien Apr 14, 2026
cadc40b
Respect dark mode in onboarding and auth screens
charlesvien Apr 14, 2026
cfdd508
Use happy-hog in project select and tweak GitHub copy
charlesvien Apr 14, 2026
85a2afe
Fix org switch loading flash with bridging state flag
charlesvien Apr 14, 2026
2f3e7d2
Drop Oxford comma from repo summary text
charlesvien Apr 14, 2026
75b7876
Adopt upstream SignalSourceToggles for signals step
charlesvien Apr 14, 2026
014eba6
Remove billing onboarding steps
charlesvien Apr 14, 2026
c90d68e
Update TaskInput.tsx
charlesvien Apr 14, 2026
5624cc7
Fix crash on logout during onboarding
charlesvien Apr 14, 2026
9c92bee
Use optional auth client in useIntegrations
charlesvien Apr 14, 2026
6b681a2
Extract shared DotPatternBackground component
charlesvien Apr 14, 2026
19a0693
Remove session replay and evaluations from signal sources
charlesvien Apr 14, 2026
78ddc84
Polish onboarding copy and consolidate feature list to 4 items
charlesvien Apr 14, 2026
3b04853
Pluralize agent references across onboarding
charlesvien Apr 14, 2026
fb1cfe2
Rework welcome screen feature list and signals copy
charlesvien Apr 14, 2026
10eb45f
Bold arrow icons on onboarding buttons
charlesvien Apr 14, 2026
0f9556c
Move context collection from onboarding to sidebar setup tab
charlesvien Apr 14, 2026
72087b8
Remove task examples from task input
charlesvien Apr 14, 2026
a332861
Add CLI tools install step to onboarding
charlesvien Apr 14, 2026
c02bbe8
Improve signals step hog tip copy
charlesvien Apr 14, 2026
5ce7272
lint
charlesvien Apr 15, 2026
c713268
Add keyboard navigation to onboarding flow
charlesvien Apr 15, 2026
8e11fae
Fix smoke test to recognize onboarding screen as valid boot state
charlesvien Apr 15, 2026
a5bcecd
Fix white wordmark snoot fill color
charlesvien Apr 15, 2026
a3bde47
Update SignalSourceToggles.tsx
charlesvien Apr 15, 2026
6118077
Update ProjectSwitcher.tsx
charlesvien Apr 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions apps/code/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,9 @@
"@trpc/client": "^11.12.0",
"@trpc/server": "^11.12.0",
"@trpc/tanstack-react-query": "^11.12.0",
"@tsparticles/engine": "^3.9.1",
"@tsparticles/react": "^3.0.0",
"@tsparticles/slim": "^3.9.1",
"@xterm/addon-fit": "^0.10.0",
"@xterm/addon-serialize": "^0.13.0",
"@xterm/addon-web-links": "^0.11.0",
Expand Down
8 changes: 8 additions & 0 deletions apps/code/src/main/services/git/schemas.ts
Original file line number Diff line number Diff line change
Expand Up @@ -212,6 +212,14 @@ export const commitInput = z.object({

export type CommitInput = z.infer<typeof commitInput>;

// Git CLI status
export const gitStatusOutput = z.object({
installed: z.boolean(),
version: z.string().nullable(),
});

export type GitStatusOutput = z.infer<typeof gitStatusOutput>;

// GitHub CLI status
export const ghStatusOutput = z.object({
installed: z.boolean(),
Expand Down
18 changes: 17 additions & 1 deletion apps/code/src/main/services/git/service.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import { execFile } from "node:child_process";
import fs from "node:fs";
import path from "node:path";
import { promisify } from "node:util";
import { execGh } from "@posthog/git/gh";
import {
getAllBranches,
Expand Down Expand Up @@ -53,6 +55,7 @@ import type {
GitHubIssue,
GitRepoInfo,
GitStateSnapshot,
GitStatusOutput,
GitSyncStatus,
OpenPrOutput,
PrActionType,
Expand Down Expand Up @@ -683,6 +686,17 @@ export class GitService extends TypedEventEmitter<GitServiceEvents> {
};
}

public async getGitStatus(): Promise<GitStatusOutput> {
const execFileAsync = promisify(execFile);
try {
const { stdout } = await execFileAsync("git", ["--version"]);
const version = stdout.trim().replace("git version ", "");
return { installed: true, version };
} catch {
return { installed: false, version: null };
}
}

public async getGhStatus(): Promise<GhStatusOutput> {
const versionResult = await execGh(["--version"]);
if (versionResult.exitCode !== 0) {
Expand All @@ -699,7 +713,9 @@ export class GitService extends TypedEventEmitter<GitServiceEvents> {
const authResult = await execGh(["auth", "status"]);
const authenticated = authResult.exitCode === 0;
const authOutput = `${authResult.stdout}\n${authResult.stderr}`;
const usernameMatch = authOutput.match(/Logged in to github.com as (\S+)/);
const usernameMatch = authOutput.match(
/Logged in to github.com (?:as |account )(\S+)/,
);

return {
installed: true,
Expand Down
5 changes: 5 additions & 0 deletions apps/code/src/main/trpc/routers/git.ts
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ import {
ghAuthTokenOutput,
ghStatusOutput,
gitStateSnapshotSchema,
gitStatusOutput,
openPrInput,
openPrOutput,
prStatusInput,
Expand Down Expand Up @@ -269,6 +270,10 @@ export const gitRouter = router({
getService().sync(input.directoryPath, input.remote),
),

getGitStatus: publicProcedure
.output(gitStatusOutput)
.query(() => getService().getGitStatus()),

getGhStatus: publicProcedure
.output(ghStatusOutput)
.query(() => getService().getGhStatus()),
Expand Down
18 changes: 9 additions & 9 deletions apps/code/src/renderer/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -156,8 +156,16 @@ function App() {
);
}

// Four-phase rendering: auth → access gate → onboarding → main app
// Rendering: onboarding → auth → access gate → main app
const renderContent = () => {
if (!hasCompletedOnboarding) {
return (
<motion.div key="onboarding" initial={{ opacity: 1 }}>
<OnboardingFlow />
</motion.div>
);
}

if (!isAuthenticated) {
return (
<motion.div key="auth" initial={{ opacity: 1 }}>
Expand Down Expand Up @@ -189,14 +197,6 @@ function App() {
);
}

if (!hasCompletedOnboarding) {
return (
<motion.div key="onboarding">
<OnboardingFlow />
</motion.div>
);
}

return (
<motion.div
key="main"
Expand Down
3 changes: 2 additions & 1 deletion apps/code/src/renderer/api/posthogClient.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1096,7 +1096,8 @@ export class PostHogAPIClient {

const data = await response.json();

const repos = data.repositories ?? data.results ?? data ?? [];
const repos =
data.repositories ?? data.results ?? (Array.isArray(data) ? data : []);
return repos.map((repo: string | { full_name?: string; name?: string }) => {
if (typeof repo === "string") return repo;
return (repo.full_name ?? repo.name ?? "").toLowerCase();
Expand Down
Binary file removed apps/code/src/renderer/assets/images/bw-logo.png
Binary file not shown.
Binary file removed apps/code/src/renderer/assets/images/cave-hero.jpg
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
15 changes: 0 additions & 15 deletions apps/code/src/renderer/assets/images/logomark.svg

This file was deleted.

6 changes: 0 additions & 6 deletions apps/code/src/renderer/assets/images/tree-bg.svg

This file was deleted.

22 changes: 22 additions & 0 deletions apps/code/src/renderer/assets/images/wordmark-white.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
45 changes: 45 additions & 0 deletions apps/code/src/renderer/components/DotPatternBackground.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import { useId } from "react";

const DOT_FILL = "var(--gray-6)";

interface DotPatternBackgroundProps {
style?: React.CSSProperties;
}

export function DotPatternBackground({ style }: DotPatternBackgroundProps) {
const patternId = useId();

return (
<svg
aria-hidden="true"
style={{
position: "absolute",
bottom: 0,
left: 0,
width: "100%",
height: "100%",
pointerEvents: "none",
opacity: 0.4,
maskImage: "linear-gradient(to top, black 0%, transparent 100%)",
WebkitMaskImage: "linear-gradient(to top, black 0%, transparent 100%)",
...style,
}}
>
<defs>
<pattern
id={patternId}
patternUnits="userSpaceOnUse"
width="8"
height="8"
>
<circle cx="0" cy="0" r="1" fill={DOT_FILL} />
<circle cx="0" cy="8" r="1" fill={DOT_FILL} />
<circle cx="8" cy="8" r="1" fill={DOT_FILL} />
<circle cx="8" cy="0" r="1" fill={DOT_FILL} />
<circle cx="4" cy="4" r="1" fill={DOT_FILL} />
</pattern>
</defs>
<rect width="100%" height="100%" fill={`url(#${patternId})`} />
</svg>
);
}
3 changes: 3 additions & 0 deletions apps/code/src/renderer/components/MainLayout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import { CommandCenterView } from "@features/command-center/components/CommandCe
import { InboxView } from "@features/inbox/components/InboxView";
import { FolderSettingsView } from "@features/settings/components/FolderSettingsView";
import { SettingsDialog } from "@features/settings/components/SettingsDialog";
import { SetupView } from "@features/setup/components/SetupView";
import { MainSidebar } from "@features/sidebar/components/MainSidebar";
import { SkillsView } from "@features/skills/components/SkillsView";
import { TaskDetail } from "@features/task-detail/components/TaskDetail";
Expand Down Expand Up @@ -80,6 +81,8 @@ export function MainLayout() {
{view.type === "command-center" && <CommandCenterView />}

{view.type === "skills" && <SkillsView />}

{view.type === "setup" && <SetupView />}
</Box>
</Flex>

Expand Down
Loading
Loading