Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
7f57a64
Add per-project settings
shivamhwp Jun 16, 2026
67773b8
Fix per-project settings PR validation
shivamhwp Jun 30, 2026
9957075
Revert local-environment workarounds that break pnpm CI
shivamhwp Jul 3, 2026
f7df35f
Revert broken drive-by changes to mobile keyboard list, imageMime, an…
shivamhwp Jul 3, 2026
2070e3a
Retrigger CI after runner cache timeout
shivamhwp Jul 3, 2026
d5172e1
Merge remote-tracking branch 'upstream/main' into per-project-settings
shivamhwp Jul 3, 2026
c17820e
Address Macroscope review feedback
shivamhwp Jul 3, 2026
86d9eeb
Address second-round review feedback
shivamhwp Jul 3, 2026
287ea82
Merge remote-tracking branch 'upstream/main' into per-project-settings
shivamhwp Jul 3, 2026
7f0689e
Fix formatting in SourceControlProviderRegistry
shivamhwp Jul 3, 2026
8083729
Address third-round review feedback
shivamhwp Jul 3, 2026
605efda
Pass projectId per stacked-action invocation
shivamhwp Jul 3, 2026
3069d76
Retrigger CI after CursorAdapter interrupt test flake
shivamhwp Jul 3, 2026
59b30c2
Refresh sibling status cache entries and track draft keys per commit
shivamhwp Jul 4, 2026
860da05
Merge remote-tracking branch 'upstream/main' into per-project-settings
shivamhwp Jul 25, 2026
23eb95e
Refine project settings navigation
shivamhwp Jul 25, 2026
1783a86
Space project settings heading
shivamhwp Jul 25, 2026
d437f04
Compact project settings layout
shivamhwp Jul 25, 2026
14a687e
Align project settings grid
shivamhwp Jul 25, 2026
0ddadbd
Polish project settings alignment
shivamhwp Jul 25, 2026
8d6e667
Make project settings fit the viewport
shivamhwp Jul 25, 2026
de7b7be
Fill project settings viewport
shivamhwp Jul 25, 2026
cb761a9
Refine project settings layout
shivamhwp Jul 25, 2026
9cd345c
Merge branch 'main' into per-project-settings
shivamhwp Jul 25, 2026
8e497de
Polish project settings and harden project behavior
shivamhwp Jul 26, 2026
c3940ec
Use an icon for compact settle action
shivamhwp Jul 26, 2026
fa95fdc
Make settle action responsive
shivamhwp Jul 26, 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
7 changes: 4 additions & 3 deletions apps/desktop/src/settings/DesktopClientSettings.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -121,13 +121,14 @@ describe("DesktopClientSettings", () => {
assert.instanceOf(error, DesktopClientSettings.DesktopClientSettingsWriteError);
assert.equal(error.operation, "replace-settings-file");
assert.equal(error.path, environment.clientSettingsPath);
assert.instanceOf(error.cause, PlatformError.PlatformError);
assert.isString(error.cause.stack);
const platformCause = error.cause as PlatformError.PlatformError;
assert.equal(platformCause._tag, "PlatformError");
assert.isString(platformCause.stack);
assert.equal(
error.message,
`Desktop client settings write failed during replace-settings-file at ${environment.clientSettingsPath}.`,
);
assert.notInclude(error.message, error.cause.message);
assert.notInclude(error.message, platformCause.message);
}),
),
);
Expand Down
12 changes: 7 additions & 5 deletions apps/server/src/bin.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
// @effect-diagnostics anyUnknownInErrorContext:off - The CLI runner reports framework-owned parse/runtime failures at the process boundary.

import * as NodeRuntime from "@effect/platform-node/NodeRuntime";
import * as NodeServices from "@effect/platform-node/NodeServices";
import * as Effect from "effect/Effect";
Expand Down Expand Up @@ -56,9 +58,9 @@ export const makeCli = ({ cloudEnabled = hasCloudPublicConfig } = {}) =>
export const cli = makeCli();

if (import.meta.main) {
Command.run(cli, { version: packageJson.version }).pipe(
Effect.scoped,
Effect.provide(CliRuntimeLayer),
NodeRuntime.runMain,
);
const cliMain = Effect.scoped(
Command.run(cli, { version: packageJson.version }).pipe(Effect.provide(CliRuntimeLayer)),
) as Effect.Effect<void, unknown, never>;

NodeRuntime.runMain(cliMain);
}
2 changes: 1 addition & 1 deletion apps/server/src/checkpointing/Diffs.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { parsePatchFiles } from "@pierre/diffs/utils/parsePatchFiles";
import { parsePatchFiles } from "@pierre/diffs";

export interface TurnDiffFileSummary {
readonly path: string;
Expand Down
46 changes: 45 additions & 1 deletion apps/server/src/git/GitManager.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import type {
GitActionProgressEvent,
GitPreparePullRequestThreadInput,
ModelSelection,
SourceControlProviderInfo,
ThreadId,
} from "@t3tools/contracts";

Expand Down Expand Up @@ -639,6 +640,8 @@ function preparePullRequestThread(

function makeManager(input?: {
ghScenario?: FakeGhScenario;
sourceControlProviderContext?: SourceControlProviderRegistry.SourceControlProviderHandle["context"];
sourceControlProviderContextSource?: SourceControlProviderRegistry.SourceControlProviderHandle["contextSource"];
textGeneration?: Partial<FakeGitTextGeneration>;
setupScriptRunner?: ProjectSetupScriptRunner.ProjectSetupScriptRunner["Service"];
}) {
Expand All @@ -661,7 +664,12 @@ function makeManager(input?: {
Effect.map((provider) =>
SourceControlProviderRegistry.SourceControlProviderRegistry.of({
get: () => Effect.succeed(provider),
resolveHandle: () => Effect.succeed({ provider, context: null }),
resolveHandle: () =>
Effect.succeed({
provider,
context: input?.sourceControlProviderContext ?? null,
contextSource: input?.sourceControlProviderContextSource ?? null,
}),
resolve: () => Effect.succeed(provider),
discover: Effect.succeed([]),
}),
Expand Down Expand Up @@ -696,6 +704,18 @@ const GitManagerTestLayer = GitVcsDriver.layer.pipe(
Layer.provideMerge(NodeServices.layer),
);

const githubProvider = {
kind: "github",
name: "GitHub",
baseUrl: "https://github.com",
} satisfies SourceControlProviderInfo;

const gitlabProvider = {
kind: "gitlab",
name: "GitLab",
baseUrl: "https://gitlab.com",
} satisfies SourceControlProviderInfo;

it.layer(GitManagerTestLayer)("GitManager", (it) => {
it.effect("status includes PR metadata when branch already has an open PR", () =>
Effect.gen(function* () {
Expand Down Expand Up @@ -739,6 +759,30 @@ it.layer(GitManagerTestLayer)("GitManager", (it) => {
}),
);

it.effect("status prefers branch remote over detected provider context", () =>
Effect.gen(function* () {
const repoDir = yield* makeTempDir("t3code-git-manager-");
yield* initRepo(repoDir);
yield* runGit(repoDir, ["remote", "add", "origin", "git@gitlab.com:pingdotgg/t3code.git"]);
yield* runGit(repoDir, ["remote", "add", "upstream", "git@github.com:pingdotgg/t3code.git"]);
yield* runGit(repoDir, ["checkout", "-b", "branch-remote"]);
yield* runGit(repoDir, ["config", "branch.branch-remote.remote", "upstream"]);

const { manager } = yield* makeManager({
sourceControlProviderContext: {
provider: gitlabProvider,
remoteName: "origin",
remoteUrl: "git@gitlab.com:pingdotgg/t3code.git",
},
sourceControlProviderContextSource: "detected",
});

const status = yield* manager.localStatus({ cwd: repoDir });

expect(status.sourceControlProvider).toEqual(githubProvider);
}),
);

it.effect("status trims PR metadata returned by gh before publishing it", () =>
Effect.gen(function* () {
const repoDir = yield* makeTempDir("t3code-git-manager-");
Expand Down
Loading
Loading