Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
eddcbd2
feat: show feature splash before login for new users
adboio Mar 17, 2026
61b21a1
Fix wordmark import to use existing SVG asset
charlesvien Apr 12, 2026
2ac57b2
Migrate onboarding components from stale useAuthStore to query-based …
charlesvien Apr 12, 2026
5ab05b6
Replace folder icon with git branch icon for repo groups
charlesvien Apr 14, 2026
b002de4
Unify welcome screen into the onboarding wizard flow
charlesvien Apr 14, 2026
81b2ffd
Add support link and icons to onboarding footer buttons
charlesvien Apr 14, 2026
4af0df6
Extract external links into shared constants
charlesvien Apr 14, 2026
79e4aba
Add org switcher to project select and standardize step buttons
charlesvien Apr 14, 2026
e154295
Add hover animation to welcome screen feature list items
charlesvien Apr 14, 2026
da0aa5d
Revamp welcome screen feature list and bold step titles
charlesvien Apr 14, 2026
6660b09
Add product workbench subtitle to welcome screen
charlesvien Apr 14, 2026
c2e3c88
Add auto-cycling highlight and staggered entrance to feature list
charlesvien Apr 14, 2026
2165995
Remove duplicate and unused image assets
charlesvien Apr 14, 2026
ed180af
Extract StepActions and bake animation into OnboardingHogTip
charlesvien Apr 14, 2026
e59701b
Add talking wobble animation to hedgehog tips
charlesvien Apr 14, 2026
422bd97
Reorder welcome screen feature list
charlesvien Apr 14, 2026
6fca4cd
Prefer user's current team when auto-selecting project
charlesvien Apr 14, 2026
0d3af5c
Rework project select step for unauthenticated state
charlesvien Apr 14, 2026
33b7d59
Fix repos not iterable when API returns non-array data
charlesvien Apr 14, 2026
1cb2b93
Respect dark mode in onboarding and auth screens
charlesvien Apr 14, 2026
c946f51
Use happy-hog in project select and tweak GitHub copy
charlesvien Apr 14, 2026
5414b57
Fix org switch loading flash with bridging state flag
charlesvien Apr 14, 2026
ae86e89
Drop Oxford comma from repo summary text
charlesvien Apr 14, 2026
47c0a41
Adopt upstream SignalSourceToggles for signals step
charlesvien Apr 14, 2026
c822746
Remove billing onboarding steps
charlesvien Apr 14, 2026
c57bcbe
Update TaskInput.tsx
charlesvien Apr 14, 2026
4eaed1f
Fix crash on logout during onboarding
charlesvien Apr 14, 2026
c71b345
Use optional auth client in useIntegrations
charlesvien Apr 14, 2026
af0192b
Extract shared DotPatternBackground component
charlesvien Apr 14, 2026
df51564
Remove session replay and evaluations from signal sources
charlesvien Apr 14, 2026
2a053e1
Polish onboarding copy and consolidate feature list to 4 items
charlesvien Apr 14, 2026
cd601bf
Pluralize agent references across onboarding
charlesvien Apr 14, 2026
0fedcf8
Rework welcome screen feature list and signals copy
charlesvien Apr 14, 2026
1c71a4f
Bold arrow icons on onboarding buttons
charlesvien Apr 14, 2026
02bd0bf
Move context collection from onboarding to sidebar setup tab
charlesvien Apr 14, 2026
e51fe3b
Remove task examples from task input
charlesvien Apr 14, 2026
c76ba40
Add CLI tools install step to onboarding
charlesvien Apr 14, 2026
248f325
Improve signals step hog tip copy
charlesvien Apr 14, 2026
10c7719
lint
charlesvien Apr 15, 2026
2ee03b1
Add keyboard navigation to onboarding flow
charlesvien Apr 15, 2026
a3a404a
Fix smoke test to recognize onboarding screen as valid boot state
charlesvien Apr 15, 2026
ed8f301
Fix white wordmark snoot fill color
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 @@ -150,6 +150,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 @@ -1061,7 +1061,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