Skip to content

Commit 010ae7b

Browse files
ndemiancclaude
andcommitted
De-brand: kill VS Code onboarding modal + release-notes leak + config sweep (WS-A/B/E)
First batch of the Visual-Studio-Code de-branding audit — the three things a client actually saw plus a config sweep. All core edits are captured in patches/levelcode-core.patch (regenerated with diff HEAD so the pre-existing Copilot-unbundling patches are preserved) and logged in docs/CORE-PATCHES.md. WS-A (blocker): the first-run 'Welcome to VS Code — Sign in to use GitHub Copilot' overlay is dead — experimentalOnboarding default flipped to false + experiment:{mode:'auto'} removed, and tryShowOnboarding() early-returns as the guarantee. Did NOT null product.defaultChatAgent (assertDefined, used in ~15 core files) — killed the entry point instead. WS-B (blocker): the in-editor Release Notes tab no longer renders Microsoft's live 'Visual Studio Code 1.126' notes — releaseNotesEditor.show() opens product.releaseNotesUrl (GitHub releases) in the browser; the local-file dev command still works. WS-E (config): overlay adds serverLicenseUrl → LevelCode LICENSE, win32ShellNameShort → LevelCode, crashReporter companyName SystemU. Verified: overlay JSON valid; patch reverse-applies to the current tree AND forward-applies onto a pristine upstream checkout. Needs a rebuild + re-notarize to reach the installed app. Remaining: WS-C strings + WS-D assets. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
1 parent b220ef4 commit 010ae7b

3 files changed

Lines changed: 72 additions & 5 deletions

File tree

‎branding/product.overlay.json‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,10 @@
2727

2828
"licenseName": "MIT",
2929
"licenseUrl": "https://github.com/levelcodeai/levelcode/blob/main/LICENSE",
30+
"serverLicenseUrl": "https://github.com/levelcodeai/levelcode/blob/main/LICENSE",
3031
"reportIssueUrl": "https://github.com/levelcodeai/levelcode/issues/new",
32+
"win32ShellNameShort": "LevelCode",
33+
"crashReporter": { "companyName": "SystemU", "productName": "LevelCode" },
3134

3235
"_downloadComment": "Download + update funnel through levelcode.ai (see site/app/download/[arch]/route.ts). downloadUrl is where the notify-only updater's Download button sends the user; releaseNotesUrl backs its 'Release Notes' button. updateUrl is the feed base — the updater GETs {updateUrl}/api/update/{target}/{quality}/{commit}; until that endpoint is live it returns 404 and the updater silently treats it as 'up to date' (notify-only, non-fatal). RELEASE NOTE: levelcode.ai must resolve to the deployed site before these links work.",
3336
"downloadUrl": "https://levelcode.ai/download",

‎docs/CORE-PATCHES.md‎

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,15 @@ So a full rebuild from nothing is: `bootstrap.sh` (clone + brand + extensions +
2020
To re-create the core patch after changing core files in `vscode/`:
2121

2222
```bash
23-
git -C vscode diff -- \
23+
git -C vscode diff HEAD -- \
2424
src/vs/workbench/contrib/files/browser/files.contribution.ts \
25-
build/lib/extensions.ts build/lib/copilot.ts > patches/levelcode-core.patch
25+
build/lib/extensions.ts build/lib/copilot.ts \
26+
src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStarted.contribution.ts \
27+
src/vs/workbench/contrib/welcomeGettingStarted/browser/startupPage.ts \
28+
src/vs/workbench/contrib/update/browser/releaseNotesEditor.ts \
29+
> patches/levelcode-core.patch
30+
# NOTE: use `diff HEAD` (not plain `diff`) — bootstrap's `git apply` may leave these STAGED,
31+
# and plain `git diff` shows only UNSTAGED changes, silently dropping the staged patches.
2632
```
2733

2834
To find every core touch in the checkout:
@@ -38,6 +44,9 @@ grep -rn "\[LevelCode\]" vscode/src vscode/build
3844
| 1 | `src/vs/workbench/contrib/files/browser/files.contribution.ts` | `files.hotExit` default → `onExitAndWindowClose` (was `onExit`) | Sublime-style persistence by default. `files.hotExit` is application-scoped, which extensions are forbidden from overriding (only machine-overridable/window/resource/language-overridable defaults may be set by extensions), so this must be a core default. |
3945
| 2 | `build/lib/extensions.ts` (`packageCopilotExtensionStream`) | Return an empty stream — don't bundle the GitHub Copilot Chat extension. | Copilot Chat is **proprietary, not MIT**; redistributing it in a non-Microsoft product isn't permitted, and its from-source packaging is fragile (missing `shims.txt`/prebuilts broke the build). LevelCode's own AI layer (M2) replaces it. |
4046
| 3 | `build/lib/copilot.ts` (`prepareBuiltInCopilotRipgrepShim`) | Skip (return) instead of throwing when the Copilot SDK dir is absent. | Pairs with patch #2: with Copilot not bundled, the ripgrep-shim packaging step must no-op rather than fail. |
47+
| 4 | `src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStarted.contribution.ts` | `workbench.welcomePage.experimentalOnboarding` default `true`→`false`; removed the `experiment:{mode:'auto'}` block. | De-brand (WS-A/B1-B2). Kills the first-run **"Welcome to VS Code — Sign in to use GitHub Copilot"** onboarding overlay a client saw. The experiment block would silently re-enable it, so it must go too. |
48+
| 5 | `src/vs/workbench/contrib/welcomeGettingStarted/browser/startupPage.ts` (`tryShowOnboarding`) | Early `return` — never invoke `onboardingService.show()`. | De-brand (WS-A/B1). Guaranteed kill of the onboarding overlay regardless of config/experiment. Do NOT null `product.defaultChatAgent` (it's `assertDefined`-d and used in ~15 core files) — killing the *entry point* is the safe route. |
49+
| 6 | `src/vs/workbench/contrib/update/browser/releaseNotesEditor.ts` (`show`) | Open `product.releaseNotesUrl` in the browser instead of fetching `code.visualstudio.com/raw/v{ver}.md`. | De-brand (WS-B/B5). Stops the in-editor **"Visual Studio Code 1.126"** release-notes tab. The `useCurrentFile` dev command (author a local `.md`) still renders locally. |
4150

4251
> Dev mode (`run-dev.sh`) still loads `extensions/copilot` from source; patches #2/#3 only affect the **packaged** app. We can disable it in dev too later if desired.
4352

‎patches/levelcode-core.patch‎

Lines changed: 58 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
diff --git a/build/lib/copilot.ts b/build/lib/copilot.ts
2-
index 74babc79..a95c9cf4 100644
2+
index 74babc79..4d696744 100644
33
--- a/build/lib/copilot.ts
44
+++ b/build/lib/copilot.ts
55
@@ -185,7 +185,10 @@ export function prepareBuiltInCopilotRipgrepShim(platform: string, arch: string,
@@ -15,7 +15,7 @@ index 74babc79..a95c9cf4 100644
1515
pruneNonTargetCopilotSdkPrebuilds(platformArch, path.join(copilotSdkBase, 'prebuilds'), copilotPlatforms);
1616
pruneNonTargetCopilotSdkPrebuilds(tgrepPlatformArch, path.join(copilotSdkBase, path.join('tgrep', 'bin')), copilotTgrepPlatforms);
1717
diff --git a/build/lib/extensions.ts b/build/lib/extensions.ts
18-
index e487ff5c..ec0f5734 100644
18+
index e487ff5c..778c3de9 100644
1919
--- a/build/lib/extensions.ts
2020
+++ b/build/lib/extensions.ts
2121
@@ -461,26 +461,12 @@ function doPackageLocalExtensionsStream(forWeb: boolean, disableMangle: boolean,
@@ -52,7 +52,7 @@ index e487ff5c..ec0f5734 100644
5252

5353
export function packageMarketplaceExtensionsStream(forWeb: boolean): Stream {
5454
diff --git a/src/vs/workbench/contrib/files/browser/files.contribution.ts b/src/vs/workbench/contrib/files/browser/files.contribution.ts
55-
index 574c2d8e..398873be 100644
55+
index 574c2d8e..f6b8c7af 100644
5656
--- a/src/vs/workbench/contrib/files/browser/files.contribution.ts
5757
+++ b/src/vs/workbench/contrib/files/browser/files.contribution.ts
5858
@@ -125,7 +125,7 @@ const hotExitConfiguration: IConfigurationPropertySchema = isNative ?
@@ -64,3 +64,58 @@ index 574c2d8e..398873be 100644
6464
'markdownEnumDescriptions': [
6565
nls.localize('hotExit.off', 'Disable hot exit. A prompt will show when attempting to close a window with editors that have unsaved changes.'),
6666
nls.localize('hotExit.onExit', 'Hot exit will be triggered when the last window is closed on Windows/Linux or when the `workbench.action.quit` command is triggered (command palette, keybinding, menu). All windows without folders opened will be restored upon next launch. A list of previously opened windows with unsaved files can be accessed via `File > Open Recent > More...`'),
67+
diff --git a/src/vs/workbench/contrib/update/browser/releaseNotesEditor.ts b/src/vs/workbench/contrib/update/browser/releaseNotesEditor.ts
68+
index 835f4980..f452db2c 100644
69+
--- a/src/vs/workbench/contrib/update/browser/releaseNotesEditor.ts
70+
+++ b/src/vs/workbench/contrib/update/browser/releaseNotesEditor.ts
71+
@@ -91,6 +91,15 @@ export class ReleaseNotesManager extends Disposable {
72+
}
73+
74+
public async show(version: string, useCurrentFile: boolean): Promise<boolean> {
75+
+ // [LevelCode] Never render Microsoft's hosted VS Code release notes in-editor (loadReleaseNotes
76+
+ // hardcodes code.visualstudio.com/raw/v{ver}.md → showed "Visual Studio Code 1.126"). Open our own
77+
+ // releases page (product.releaseNotesUrl) in the browser instead. The `useCurrentFile` dev command
78+
+ // (Developer: Open Current File as Release Notes) still renders the local .md below.
79+
+ if (!useCurrentFile && this._productService.releaseNotesUrl) {
80+
+ await this._openerService.open(URI.parse(this._productService.releaseNotesUrl));
81+
+ return true;
82+
+ }
83+
+
84+
const releaseNoteText = await this.loadReleaseNotes(version, useCurrentFile);
85+
const base = await this.getBase(useCurrentFile);
86+
this._lastMeta = { text: releaseNoteText, base };
87+
diff --git a/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStarted.contribution.ts b/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStarted.contribution.ts
88+
index 067580a4..d23d4885 100644
89+
--- a/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStarted.contribution.ts
90+
+++ b/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStarted.contribution.ts
91+
@@ -342,12 +342,10 @@ configurationRegistry.registerConfiguration({
92+
'workbench.welcomePage.experimentalOnboarding': {
93+
scope: ConfigurationScope.APPLICATION,
94+
type: 'boolean',
95+
- default: true,
96+
+ default: false, // [LevelCode] off by default — suppress the Copilot-centric "Welcome to VS Code" onboarding overlay
97+
tags: ['experimental'],
98+
description: localize('workbench.welcomePage.experimentalOnboarding', "When enabled, show the new onboarding experience instead of the classic walkthrough on first launch."),
99+
- experiment: {
100+
- mode: 'auto'
101+
- }
102+
+ // [LevelCode] removed `experiment: { mode: 'auto' }` so the experiment service can't silently re-enable the upstream onboarding
103+
}
104+
}
105+
});
106+
diff --git a/src/vs/workbench/contrib/welcomeGettingStarted/browser/startupPage.ts b/src/vs/workbench/contrib/welcomeGettingStarted/browser/startupPage.ts
107+
index 777f3ad8..eb15caf5 100644
108+
--- a/src/vs/workbench/contrib/welcomeGettingStarted/browser/startupPage.ts
109+
+++ b/src/vs/workbench/contrib/welcomeGettingStarted/browser/startupPage.ts
110+
@@ -234,6 +234,11 @@ export class StartupPageRunnerContribution extends Disposable implements IWorkbe
111+
}
112+
113+
private tryShowOnboarding(): void {
114+
+ // [LevelCode] Never show the upstream AI onboarding overlay ("Welcome to VS Code" / "Sign in to
115+
+ // use GitHub Copilot") — it's off-brand and Copilot-centric; LevelCode ships its own welcome.
116+
+ // Guaranteed kill switch (the config default is also flipped off in gettingStarted.contribution.ts).
117+
+ return;
118+
+
119+
if (this.environmentService.skipWelcome) {
120+
return; // skip welcome flag is set
121+
}

0 commit comments

Comments
 (0)