mirror of
https://github.com/tiennm99/ccs.git
synced 2026-10-18 00:14:48 +00:00
Merge pull request #1040 from kaitranntt/kai/fix/browser-attach-bootstrap
fix(browser): bootstrap managed attach profile setup
This commit is contained in:
10 files changed
+397
-19
No files matched your search
@@ -81,6 +81,18 @@ function runCcs(args: string[], env: NodeJS.ProcessEnv): RunResult {
|
||||
};
|
||||
}
|
||||
|
||||
function reserveClosedPort(): number {
|
||||
const server = Bun.serve({
|
||||
port: 0,
|
||||
fetch() {
|
||||
return new Response('ok');
|
||||
},
|
||||
});
|
||||
const { port } = server;
|
||||
server.stop(true);
|
||||
return port;
|
||||
}
|
||||
|
||||
describe('default profile browser launch', () => {
|
||||
let tmpHome = '';
|
||||
let fakeClaudePath = '';
|
||||
@@ -259,7 +271,7 @@ server.listen(0, '127.0.0.1', () => {
|
||||
claude: {
|
||||
enabled: true,
|
||||
user_data_dir: '',
|
||||
devtools_port: 9222,
|
||||
devtools_port: 43123,
|
||||
},
|
||||
codex: {
|
||||
enabled: true,
|
||||
@@ -272,8 +284,10 @@ server.listen(0, '127.0.0.1', () => {
|
||||
});
|
||||
|
||||
expect(result.status).toBe(0);
|
||||
expect(result.stderr).toContain('Launching without browser tools');
|
||||
expect(result.stderr).toContain('ccs browser doctor');
|
||||
expect(result.stderr).toContain('CCS created the managed browser profile');
|
||||
expect(result.stderr).toContain('Start Chrome with remote debugging');
|
||||
expect(result.stderr).toContain('continue without browser tools');
|
||||
expect(fs.existsSync(path.join(tmpHome, '.ccs', 'browser', 'chrome-user-data'))).toBe(true);
|
||||
|
||||
const launchedArgs = fs.readFileSync(claudeArgsLogPath, 'utf8');
|
||||
expect(launchedArgs).not.toContain(BROWSER_PROMPT_SNIPPET);
|
||||
@@ -291,6 +305,47 @@ server.listen(0, '127.0.0.1', () => {
|
||||
}
|
||||
});
|
||||
|
||||
it('skips managed browser attach when the managed profile exists but no browser session is running', () => {
|
||||
if (process.platform === 'win32') return;
|
||||
|
||||
const originalCcsHome = process.env.CCS_HOME;
|
||||
process.env.CCS_HOME = tmpHome;
|
||||
|
||||
try {
|
||||
const unreachablePort = reserveClosedPort();
|
||||
const managedProfileDir = path.join(tmpHome, '.ccs', 'browser', 'chrome-user-data');
|
||||
fs.mkdirSync(managedProfileDir, { recursive: true });
|
||||
|
||||
mutateUnifiedConfig((config) => {
|
||||
config.browser = {
|
||||
claude: {
|
||||
enabled: true,
|
||||
user_data_dir: '',
|
||||
devtools_port: unreachablePort,
|
||||
},
|
||||
codex: {
|
||||
enabled: true,
|
||||
},
|
||||
};
|
||||
});
|
||||
|
||||
const result = runCcs(['default', 'smoke'], {
|
||||
...baseEnv,
|
||||
});
|
||||
|
||||
expect(result.status).toBe(0);
|
||||
|
||||
const launchedArgs = fs.readFileSync(claudeArgsLogPath, 'utf8');
|
||||
expect(launchedArgs).not.toContain(BROWSER_PROMPT_SNIPPET);
|
||||
} finally {
|
||||
if (originalCcsHome !== undefined) {
|
||||
process.env.CCS_HOME = originalCcsHome;
|
||||
} else {
|
||||
delete process.env.CCS_HOME;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
it('uses config-backed browser attach settings when env overrides are absent', async () => {
|
||||
if (process.platform === 'win32') return;
|
||||
|
||||
|
||||
@@ -28,6 +28,18 @@ function runCcs(args: string[], env: NodeJS.ProcessEnv): RunResult {
|
||||
};
|
||||
}
|
||||
|
||||
function reserveClosedPort(): number {
|
||||
const server = Bun.serve({
|
||||
port: 0,
|
||||
fetch() {
|
||||
return new Response('ok');
|
||||
},
|
||||
});
|
||||
const { port } = server;
|
||||
server.stop(true);
|
||||
return port;
|
||||
}
|
||||
|
||||
describe('settings profile browser launch', () => {
|
||||
let tmpHome = '';
|
||||
let ccsDir = '';
|
||||
@@ -210,7 +222,7 @@ server.listen(0, '127.0.0.1', () => {
|
||||
claude: {
|
||||
enabled: true,
|
||||
user_data_dir: '',
|
||||
devtools_port: 9222,
|
||||
devtools_port: 43123,
|
||||
},
|
||||
codex: {
|
||||
enabled: true,
|
||||
@@ -223,8 +235,10 @@ server.listen(0, '127.0.0.1', () => {
|
||||
});
|
||||
|
||||
expect(result.status).toBe(0);
|
||||
expect(result.stderr).toContain('Launching without browser tools');
|
||||
expect(result.stderr).toContain('ccs browser doctor');
|
||||
expect(result.stderr).toContain('CCS created the managed browser profile');
|
||||
expect(result.stderr).toContain('Start Chrome with remote debugging');
|
||||
expect(result.stderr).toContain('continue without browser tools');
|
||||
expect(fs.existsSync(path.join(tmpHome, '.ccs', 'browser', 'chrome-user-data'))).toBe(true);
|
||||
|
||||
const launchedArgs = fs.readFileSync(claudeArgsLogPath, 'utf8');
|
||||
expect(launchedArgs).not.toContain(BROWSER_PROMPT_SNIPPET);
|
||||
@@ -242,6 +256,48 @@ server.listen(0, '127.0.0.1', () => {
|
||||
}
|
||||
});
|
||||
|
||||
it('skips managed browser attach for settings-profile launches when no managed browser session is running', () => {
|
||||
if (process.platform === 'win32') return;
|
||||
|
||||
const originalCcsHome = process.env.CCS_HOME;
|
||||
process.env.CCS_HOME = tmpHome;
|
||||
|
||||
try {
|
||||
const unreachablePort = reserveClosedPort();
|
||||
fs.mkdirSync(path.join(tmpHome, '.ccs', 'browser', 'chrome-user-data'), {
|
||||
recursive: true,
|
||||
});
|
||||
|
||||
mutateUnifiedConfig((config) => {
|
||||
config.browser = {
|
||||
claude: {
|
||||
enabled: true,
|
||||
user_data_dir: '',
|
||||
devtools_port: unreachablePort,
|
||||
},
|
||||
codex: {
|
||||
enabled: true,
|
||||
},
|
||||
};
|
||||
});
|
||||
|
||||
const result = runCcs(['glm', 'smoke'], {
|
||||
...baseEnv,
|
||||
});
|
||||
|
||||
expect(result.status).toBe(0);
|
||||
|
||||
const launchedArgs = fs.readFileSync(claudeArgsLogPath, 'utf8');
|
||||
expect(launchedArgs).not.toContain(BROWSER_PROMPT_SNIPPET);
|
||||
} finally {
|
||||
if (originalCcsHome !== undefined) {
|
||||
process.env.CCS_HOME = originalCcsHome;
|
||||
} else {
|
||||
delete process.env.CCS_HOME;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
it('uses config-backed browser attach settings for settings-profile launches', async () => {
|
||||
if (process.platform === 'win32') return;
|
||||
|
||||
|
||||
Reference in new issue
Block a user