@spec-box/sdd 0.6.4 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +28 -1
- package/assets/ci/Dockerfile +2 -0
- package/assets/hosts/claude/agent.md +13 -0
- package/assets/project/testing.md +4 -0
- package/assets/roles/challenger.md +4 -0
- package/assets/roles/distiller.md +4 -0
- package/assets/roles/implementer.md +4 -0
- package/assets/roles/planner.md +4 -0
- package/assets/roles/researcher.md +8 -3
- package/assets/roles/reviewer.md +4 -0
- package/assets/roles/tester.md +5 -1
- package/assets/roles/verifier.md +5 -1
- package/assets/skills/sbox-approve.md +11 -0
- package/assets/skills/sbox-browser.md +31 -0
- package/assets/skills/sbox-run.md +24 -0
- package/bin/sbox-browser.js +5 -0
- package/dist/adapters/host/claude/index.js +27 -85
- package/dist/adapters/host/claude/index.js.map +1 -1
- package/dist/adapters/host/index.js +25 -0
- package/dist/adapters/host/index.js.map +1 -0
- package/dist/adapters/host/skills.js +27 -0
- package/dist/adapters/host/skills.js.map +1 -0
- package/dist/browser/cli.js +488 -0
- package/dist/browser/cli.js.map +1 -0
- package/dist/browser/client.js +182 -0
- package/dist/browser/client.js.map +1 -0
- package/dist/browser/commands.js +598 -0
- package/dist/browser/commands.js.map +1 -0
- package/dist/browser/daemon.js +315 -0
- package/dist/browser/daemon.js.map +1 -0
- package/dist/browser/executable.js +138 -0
- package/dist/browser/executable.js.map +1 -0
- package/dist/browser/install.js +49 -0
- package/dist/browser/install.js.map +1 -0
- package/dist/browser/keys.js +44 -0
- package/dist/browser/keys.js.map +1 -0
- package/dist/browser/paths.js +34 -0
- package/dist/browser/paths.js.map +1 -0
- package/dist/browser/protocol.js +34 -0
- package/dist/browser/protocol.js.map +1 -0
- package/dist/browser/selectors.js +53 -0
- package/dist/browser/selectors.js.map +1 -0
- package/dist/browser/session.js +128 -0
- package/dist/browser/session.js.map +1 -0
- package/dist/browser/settings.js +51 -0
- package/dist/browser/settings.js.map +1 -0
- package/dist/browser/snapshot.js +89 -0
- package/dist/browser/snapshot.js.map +1 -0
- package/dist/cli/args.js +9 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/commands/change.js +2 -1
- package/dist/cli/commands/change.js.map +1 -1
- package/dist/cli/commands/doctor.js +16 -0
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/host.js +4 -6
- package/dist/cli/commands/host.js.map +1 -1
- package/dist/cli/commands/init.js +9 -7
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/metrics.js +2 -1
- package/dist/cli/commands/metrics.js.map +1 -1
- package/dist/cli/commands/run.js +5 -4
- package/dist/cli/commands/run.js.map +1 -1
- package/dist/cli/main.js +2 -12
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/output.js +7 -3
- package/dist/cli/output.js.map +1 -1
- package/dist/core/async.js +15 -0
- package/dist/core/async.js.map +1 -0
- package/dist/core/config.js +14 -0
- package/dist/core/config.js.map +1 -1
- package/dist/core/lock.js +2 -1
- package/dist/core/lock.js.map +1 -1
- package/dist/core/packet.js +1 -0
- package/dist/core/packet.js.map +1 -1
- package/dist/core/paths.js +14 -0
- package/dist/core/paths.js.map +1 -1
- package/dist/core/roles.js +16 -5
- package/dist/core/roles.js.map +1 -1
- package/dist/core/run.js +2 -3
- package/dist/core/run.js.map +1 -1
- package/dist/core/skills.js +60 -0
- package/dist/core/skills.js.map +1 -0
- package/docs/design.md +15 -1
- package/package.json +11 -5
|
@@ -0,0 +1,488 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import readline from 'node:readline';
|
|
4
|
+
import { Command, CommanderError, InvalidArgumentError } from 'commander';
|
|
5
|
+
import { intOption } from '../cli/args.js';
|
|
6
|
+
import { emit, emitError } from '../cli/output.js';
|
|
7
|
+
import { SboxError } from '../core/errors.js';
|
|
8
|
+
import { packageVersion } from '../core/paths.js';
|
|
9
|
+
import { budgetFor, sendCommand, spawnDaemon, stopSession } from './client.js';
|
|
10
|
+
import { browserHome } from './paths.js';
|
|
11
|
+
import { assertSessionName, listSessions, readSession } from './session.js';
|
|
12
|
+
import { loadBrowserSettings, parseViewport } from './settings.js';
|
|
13
|
+
function globals(cmd) {
|
|
14
|
+
const g = cmd.optsWithGlobals();
|
|
15
|
+
return { json: Boolean(g.json), session: g.session ?? 'default', profile: g.profile, cwd: g.cwd, timeout: g.timeout };
|
|
16
|
+
}
|
|
17
|
+
function sessionOption(value) {
|
|
18
|
+
try {
|
|
19
|
+
return assertSessionName(value);
|
|
20
|
+
}
|
|
21
|
+
catch (e) {
|
|
22
|
+
throw new InvalidArgumentError(e.message);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
const note = (g, text) => {
|
|
26
|
+
if (!g.json)
|
|
27
|
+
process.stderr.write(`${text}\n`);
|
|
28
|
+
};
|
|
29
|
+
/** Сессия: работающая или поднятая только что по настройкам (флаги → окружение → конфиг). */
|
|
30
|
+
async function ensureSession(g, flags = {}) {
|
|
31
|
+
const settings = loadBrowserSettings({ cwd: g.cwd, timeout: g.timeout, profile: g.profile, ...flags });
|
|
32
|
+
const existing = readSession(g.session);
|
|
33
|
+
if (existing) {
|
|
34
|
+
if (settings.profile && existing.profile !== settings.profile)
|
|
35
|
+
note(g, `сессия ${g.session} уже работает с профилем ${existing.profile ?? '(без профиля)'}, а запрошен ${settings.profile}: остановите её (\`sbox-browser stop\`) или используйте другое имя --session`);
|
|
36
|
+
return { info: existing, settings, started: false };
|
|
37
|
+
}
|
|
38
|
+
// Загрузчик и поиск браузера нужны только при запуске демона: не грузим их в каждую команду.
|
|
39
|
+
const { resolveExecutable, notFoundError } = await import('./executable.js');
|
|
40
|
+
const exe = await resolveExecutable({ explicit: settings.executable, cacheDir: settings.cacheDir, headed: !settings.headless });
|
|
41
|
+
if (!exe)
|
|
42
|
+
throw notFoundError();
|
|
43
|
+
const spec = {
|
|
44
|
+
session: g.session,
|
|
45
|
+
executable: exe.path,
|
|
46
|
+
headless: settings.headless,
|
|
47
|
+
profile: settings.profile,
|
|
48
|
+
viewport: settings.viewport,
|
|
49
|
+
idleMinutes: settings.idleMinutes,
|
|
50
|
+
baseUrl: settings.baseUrl,
|
|
51
|
+
timeoutMs: settings.timeoutMs,
|
|
52
|
+
cwd: settings.projectRoot ?? process.cwd(),
|
|
53
|
+
};
|
|
54
|
+
const info = await spawnDaemon(spec);
|
|
55
|
+
note(g, `сессия ${g.session} запущена: ${settings.headless ? 'headless' : 'окно'}, ${exe.path}${settings.profile ? `, профиль ${settings.profile}` : ''}`);
|
|
56
|
+
return { info, settings, started: true };
|
|
57
|
+
}
|
|
58
|
+
async function send(g, cmd, args = {}) {
|
|
59
|
+
const { settings } = await ensureSession(g);
|
|
60
|
+
const withTimeout = g.timeout !== undefined && args.timeout === undefined ? { ...args, timeout: g.timeout } : args;
|
|
61
|
+
return sendCommand(g.session, cmd, withTimeout, { timeoutMs: budgetFor(cmd, withTimeout, settings.timeoutMs) });
|
|
62
|
+
}
|
|
63
|
+
/** Обёртка действия команды: единый вывод ошибок и код выхода. */
|
|
64
|
+
function action(fn) {
|
|
65
|
+
return async (...all) => {
|
|
66
|
+
const cmd = all[all.length - 1];
|
|
67
|
+
const g = globals(cmd);
|
|
68
|
+
try {
|
|
69
|
+
await fn(g, ...all.slice(0, -1));
|
|
70
|
+
}
|
|
71
|
+
catch (e) {
|
|
72
|
+
emitError(g, e);
|
|
73
|
+
process.exitCode = 1;
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
function describeSession(s) {
|
|
78
|
+
return `${s.name}: pid ${s.pid}, ${s.headless ? 'headless' : 'окно'}, ${s.executable}${s.profile ? `, профиль ${s.profile}` : ''}, с ${s.startedAt}`;
|
|
79
|
+
}
|
|
80
|
+
function describeStop(session, r) {
|
|
81
|
+
switch (r.reason) {
|
|
82
|
+
case 'stopped':
|
|
83
|
+
return `Сессия ${session} остановлена (pid ${r.pid}).`;
|
|
84
|
+
case 'killed':
|
|
85
|
+
return `Сессия ${session} не вышла сама и остановлена сигналом (pid ${r.pid}).`;
|
|
86
|
+
case 'stale':
|
|
87
|
+
return `Сессия ${session} уже не работала: устаревший след снят.`;
|
|
88
|
+
case 'foreign_pid':
|
|
89
|
+
return `След сессии ${session} указывал на чужой процесс ${r.pid}: след снят, процесс не тронут.`;
|
|
90
|
+
default:
|
|
91
|
+
return `Сессия ${session} не была запущена.`;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
function formatLog(e) {
|
|
95
|
+
return `[${e.kind === 'console' ? e.type : e.kind}] ${e.text}${e.location ? ` (${e.location})` : ''}`;
|
|
96
|
+
}
|
|
97
|
+
function formatNet(e) {
|
|
98
|
+
return `${e.method} ${e.status ?? 'FAILED'} ${e.url}${e.failure ? ` — ${e.failure}` : ''} [${e.resourceType}]`;
|
|
99
|
+
}
|
|
100
|
+
function waitForEnter() {
|
|
101
|
+
return new Promise((resolve) => {
|
|
102
|
+
const rl = readline.createInterface({ input: process.stdin });
|
|
103
|
+
rl.once('line', () => {
|
|
104
|
+
rl.close();
|
|
105
|
+
resolve();
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
export function buildBrowserProgram() {
|
|
110
|
+
const program = new Command();
|
|
111
|
+
program
|
|
112
|
+
.name('sbox-browser')
|
|
113
|
+
.description('Браузер для проверки интерфейса: команды для агентов и людей поверх puppeteer-core')
|
|
114
|
+
.version(packageVersion())
|
|
115
|
+
// Ошибки разбора не завершают процесс сами: main() печатает их в общем конверте (--json) и ставит код выхода.
|
|
116
|
+
.exitOverride()
|
|
117
|
+
.option('--json', 'один JSON-документ в stdout', false)
|
|
118
|
+
.option('--session <name>', 'имя сессии браузера', sessionOption, 'default')
|
|
119
|
+
.option('--profile <name>', 'постоянный профиль (куки, вход) в ~/.sbox/browser/profiles или путь к каталогу; действует при запуске сессии')
|
|
120
|
+
.option('--cwd <dir>', 'корень проекта или каталог внутри него (для browser в .sbox/config.yaml)')
|
|
121
|
+
.option('--timeout <ms>', 'таймаут действий и ожиданий, мс', intOption);
|
|
122
|
+
// --- браузеры ---
|
|
123
|
+
program
|
|
124
|
+
.command('install')
|
|
125
|
+
.description('Скачать браузер в кэш инструмента (~/.sbox/browser/cache); повторный вызов ничего не качает')
|
|
126
|
+
.option('--browser <name>', 'какой: chrome | chrome-headless-shell | chromium', 'chrome')
|
|
127
|
+
.option('--build <tag>', 'stable | beta | dev | canary | latest | точный buildId (по умолчанию stable, для chromium latest)')
|
|
128
|
+
.option('--cache-dir <dir>', 'куда ставить (по умолчанию из настроек)')
|
|
129
|
+
.action(action(async (g, o) => {
|
|
130
|
+
const { INSTALLABLE, installBrowser, isInstallable } = await import('./install.js');
|
|
131
|
+
if (!isInstallable(o.browser))
|
|
132
|
+
throw new SboxError('BROWSER_BAD_ARGS', `Неизвестный браузер «${o.browser}»; доступны ${INSTALLABLE.join(', ')}.`);
|
|
133
|
+
const settings = loadBrowserSettings({ cwd: g.cwd, cacheDir: o.cacheDir });
|
|
134
|
+
let lastPercent = -1;
|
|
135
|
+
const result = await installBrowser({
|
|
136
|
+
browser: o.browser,
|
|
137
|
+
tag: o.build,
|
|
138
|
+
cacheDir: settings.cacheDir,
|
|
139
|
+
onProgress: (done, total) => {
|
|
140
|
+
if (g.json || !total)
|
|
141
|
+
return;
|
|
142
|
+
const percent = Math.floor((done / total) * 100);
|
|
143
|
+
if (percent !== lastPercent) {
|
|
144
|
+
lastPercent = percent;
|
|
145
|
+
process.stderr.write(`\rзагрузка ${o.browser}: ${percent}% (${Math.round(done / 1_048_576)} МБ)`);
|
|
146
|
+
if (percent === 100)
|
|
147
|
+
process.stderr.write('\n');
|
|
148
|
+
}
|
|
149
|
+
},
|
|
150
|
+
});
|
|
151
|
+
emit(g, { ...result, cacheDir: settings.cacheDir }, (d) => `${d.alreadyInstalled ? 'Уже установлен' : 'Установлен'} ${d.browser} ${d.buildId} (${d.platform})\n ${d.executablePath}\nДальше: \`sbox-browser doctor\` покажет, какой браузер будет использован.`);
|
|
152
|
+
}));
|
|
153
|
+
program
|
|
154
|
+
.command('installed')
|
|
155
|
+
.description('Браузеры в кэше инструмента')
|
|
156
|
+
.action(action(async (g) => {
|
|
157
|
+
const { listInstalled } = await import('./install.js');
|
|
158
|
+
const settings = loadBrowserSettings({ cwd: g.cwd });
|
|
159
|
+
const list = await listInstalled(settings.cacheDir);
|
|
160
|
+
emit(g, { cacheDir: settings.cacheDir, browsers: list }, (d) => (d.browsers.length ? d.browsers.map((b) => `${b.browser} ${b.buildId} (${b.platform})${b.complete ? '' : ' — неполная установка, повторите install'}\n ${b.executablePath}`).join('\n') : `Кэш ${d.cacheDir} пуст: \`sbox-browser install\` скачает Chrome.`));
|
|
161
|
+
}));
|
|
162
|
+
program
|
|
163
|
+
.command('uninstall')
|
|
164
|
+
.description('Удалить браузер из кэша инструмента')
|
|
165
|
+
.requiredOption('--browser <name>', 'chrome | chrome-headless-shell | chromium')
|
|
166
|
+
.requiredOption('--build <buildId>', 'точный buildId из `sbox-browser installed`')
|
|
167
|
+
.action(action(async (g, o) => {
|
|
168
|
+
const { uninstallBrowser } = await import('./install.js');
|
|
169
|
+
const settings = loadBrowserSettings({ cwd: g.cwd });
|
|
170
|
+
await uninstallBrowser({ browser: o.browser, buildId: o.build, cacheDir: settings.cacheDir });
|
|
171
|
+
emit(g, { browser: o.browser, buildId: o.build }, (d) => `Удалён ${d.browser} ${d.buildId}.`);
|
|
172
|
+
}));
|
|
173
|
+
program
|
|
174
|
+
.command('doctor')
|
|
175
|
+
.description('Какой браузер будет использован, откуда он взят, какие сессии работают')
|
|
176
|
+
.action(action(async (g) => {
|
|
177
|
+
const { listCandidates } = await import('./executable.js');
|
|
178
|
+
const settings = loadBrowserSettings({ cwd: g.cwd, profile: g.profile });
|
|
179
|
+
const headed = !settings.headless;
|
|
180
|
+
let candidates = [];
|
|
181
|
+
let explicitError = null;
|
|
182
|
+
try {
|
|
183
|
+
candidates = await listCandidates({ explicit: settings.executable, cacheDir: settings.cacheDir, headed });
|
|
184
|
+
}
|
|
185
|
+
catch (e) {
|
|
186
|
+
explicitError = e.message;
|
|
187
|
+
candidates = await listCandidates({ cacheDir: settings.cacheDir, headed });
|
|
188
|
+
}
|
|
189
|
+
const chosen = candidates[0] ?? null;
|
|
190
|
+
emit(g, { chosen, candidates, explicitError, home: browserHome(), cacheDir: settings.cacheDir, headless: settings.headless, profile: settings.profile, baseUrl: settings.baseUrl, projectRoot: settings.projectRoot, sessions: listSessions() }, (d) => {
|
|
191
|
+
const lines = [];
|
|
192
|
+
if (d.explicitError)
|
|
193
|
+
lines.push(`[E] ${d.explicitError}`);
|
|
194
|
+
lines.push(d.chosen ? `Будет использован: ${d.chosen.path} (${d.chosen.source}, ${d.chosen.browser}${d.chosen.buildId ? ` ${d.chosen.buildId}` : ''})` : '[W] Браузер не найден: `sbox-browser install` скачает Chrome, либо укажите существующий через --executable, SBOX_BROWSER_EXECUTABLE или browser.executable в конфиге.');
|
|
195
|
+
if (d.candidates.length > 1)
|
|
196
|
+
lines.push('Другие найденные:', ...d.candidates.slice(1).map((c) => ` ${c.path} (${c.source})`));
|
|
197
|
+
lines.push(`Каталог инструмента: ${d.home}`, `Режим: ${d.headless ? 'headless' : 'окно'}${d.profile ? `, профиль ${d.profile}` : ', профиль не задан'}${d.baseUrl ? `, базовый URL ${d.baseUrl}` : ''}${d.projectRoot ? `, проект ${d.projectRoot}` : ''}`);
|
|
198
|
+
lines.push(d.sessions.length ? `Сессии:\n${d.sessions.map((s) => ` ${describeSession(s)}`).join('\n')}` : 'Сессии: нет');
|
|
199
|
+
return lines.join('\n');
|
|
200
|
+
});
|
|
201
|
+
if (!chosen)
|
|
202
|
+
process.exitCode = 1;
|
|
203
|
+
}));
|
|
204
|
+
// --- сессии ---
|
|
205
|
+
program
|
|
206
|
+
.command('start')
|
|
207
|
+
.description('Запустить сессию браузера в фоне (обычно не нужно: команды страницы делают это сами)')
|
|
208
|
+
.option('--headed', 'с окном, а не headless')
|
|
209
|
+
.option('--executable <path>', 'исполняемый файл браузера')
|
|
210
|
+
.option('--viewport <WxH>', 'размер окна, например 1280x800')
|
|
211
|
+
.option('--idle <min>', 'минут без команд до самозавершения; 0 — не завершаться', intOption)
|
|
212
|
+
.option('--base-url <url>', 'базовый адрес для относительных URL')
|
|
213
|
+
.action(action(async (g, o) => {
|
|
214
|
+
const existing = readSession(g.session);
|
|
215
|
+
if (existing) {
|
|
216
|
+
emit(g, { started: false, session: existing }, (d) => `Сессия уже работает: ${describeSession(d.session)}`);
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
const { info, settings } = await ensureSession(g, { headed: o.headed, executable: o.executable, viewport: o.viewport, idle: o.idle, baseUrl: o.baseUrl });
|
|
220
|
+
emit(g, { started: true, session: info, settings: { headless: settings.headless, profile: settings.profile, baseUrl: settings.baseUrl } }, (d) => `Запущена ${describeSession(d.session)}`);
|
|
221
|
+
}));
|
|
222
|
+
program
|
|
223
|
+
.command('stop')
|
|
224
|
+
.description('Остановить сессию и закрыть браузер')
|
|
225
|
+
.action(action(async (g) => {
|
|
226
|
+
const result = await stopSession(g.session);
|
|
227
|
+
emit(g, { session: g.session, ...result }, (d) => describeStop(d.session, d));
|
|
228
|
+
}));
|
|
229
|
+
program
|
|
230
|
+
.command('status')
|
|
231
|
+
.description('Состояние сессии: страницы, текущий адрес, режим')
|
|
232
|
+
.action(action(async (g) => {
|
|
233
|
+
const info = readSession(g.session);
|
|
234
|
+
if (!info) {
|
|
235
|
+
emit(g, { running: false, session: g.session }, (d) => `Сессия ${d.session} не запущена.`);
|
|
236
|
+
return;
|
|
237
|
+
}
|
|
238
|
+
const ping = await sendCommand(g.session, 'ping', {}, { timeoutMs: 10_000 });
|
|
239
|
+
emit(g, { running: true, session: info, pages: ping.pages, current: ping.current, url: ping.url, uptimeMs: ping.uptimeMs }, (d) => `${describeSession(d.session)}\nвкладок: ${d.pages}, текущая: ${d.current} ${d.url ?? ''}`);
|
|
240
|
+
}));
|
|
241
|
+
program
|
|
242
|
+
.command('sessions')
|
|
243
|
+
.description('Все работающие сессии')
|
|
244
|
+
.action(action(async (g) => {
|
|
245
|
+
const sessions = listSessions();
|
|
246
|
+
emit(g, { sessions }, (d) => (d.sessions.length ? d.sessions.map(describeSession).join('\n') : 'Сессий нет.'));
|
|
247
|
+
}));
|
|
248
|
+
// Демон получает все параметры одним JSON: настройки разрешает клиент, второй копии значений по умолчанию нет.
|
|
249
|
+
program
|
|
250
|
+
.command('serve', { hidden: true })
|
|
251
|
+
.description('Процесс демона (запускается клиентом)')
|
|
252
|
+
.requiredOption('--spec <json>', 'параметры запуска (LaunchSpec)')
|
|
253
|
+
.action(async (o) => {
|
|
254
|
+
const spec = JSON.parse(o.spec);
|
|
255
|
+
const { startDaemon } = await import('./daemon.js');
|
|
256
|
+
const handle = await startDaemon({ ...spec, session: assertSessionName(spec.session) });
|
|
257
|
+
const shutdown = () => {
|
|
258
|
+
void handle.stop();
|
|
259
|
+
setTimeout(() => process.exit(1), 10_000).unref();
|
|
260
|
+
};
|
|
261
|
+
process.on('SIGINT', shutdown);
|
|
262
|
+
process.on('SIGTERM', shutdown);
|
|
263
|
+
await handle.done;
|
|
264
|
+
process.exit(0);
|
|
265
|
+
});
|
|
266
|
+
// --- вход человеком и перенос состояния ---
|
|
267
|
+
program
|
|
268
|
+
.command('login <url>')
|
|
269
|
+
.description('Открыть окно браузера, чтобы человек вошёл в приложение; вход остаётся в профиле (--profile) для следующих команд и сессий')
|
|
270
|
+
.option('--until <target>', 'считать вход завершённым, когда появится элемент (селектор)')
|
|
271
|
+
.option('--until-url <pattern>', 'считать вход завершённым, когда адрес совпадёт с шаблоном (подстрока или glob)')
|
|
272
|
+
.option('--minutes <n>', 'сколько ждать входа', intOption, 10)
|
|
273
|
+
.option('--executable <path>', 'исполняемый файл браузера')
|
|
274
|
+
.action(action(async (g, url, o) => {
|
|
275
|
+
const settings = loadBrowserSettings({ cwd: g.cwd, headed: true, profile: g.profile, executable: o.executable, timeout: g.timeout });
|
|
276
|
+
const existing = readSession(g.session);
|
|
277
|
+
if (existing?.headless)
|
|
278
|
+
throw new SboxError('BROWSER_SESSION_HEADLESS', `Сессия ${g.session} уже работает без окна.`, `Остановите её: \`sbox-browser stop --session ${g.session}\`, либо укажите другую --session.`);
|
|
279
|
+
if (existing && settings.profile && existing.profile !== settings.profile)
|
|
280
|
+
throw new SboxError('BROWSER_SESSION_PROFILE', `Сессия ${g.session} открыта с профилем ${existing.profile ?? '(без профиля)'}, а нужен ${settings.profile}.`, 'Остановите сессию или выберите другое имя --session.');
|
|
281
|
+
await ensureSession(g, { headed: true, executable: o.executable });
|
|
282
|
+
const nav = await sendCommand(g.session, 'goto', { url, wait: 'load' }, { timeoutMs: budgetFor('goto', {}, settings.timeoutMs) });
|
|
283
|
+
if (!settings.profile)
|
|
284
|
+
note(g, 'Профиль не задан: вход сохранится только пока работает эта сессия. Для постоянного входа укажите --profile <имя>.');
|
|
285
|
+
const timeout = o.minutes * 60_000;
|
|
286
|
+
if (o.until || o.untilUrl) {
|
|
287
|
+
note(g, `Ожидание входа до ${o.minutes} мин: ${o.until ? `элемент ${o.until}` : ''}${o.untilUrl ? `адрес ${o.untilUrl}` : ''}`);
|
|
288
|
+
const args = { ...(o.until ? { target: o.until } : {}), ...(o.untilUrl ? { url: o.untilUrl } : {}), timeout };
|
|
289
|
+
await sendCommand(g.session, 'wait', args, { timeoutMs: budgetFor('wait', args, timeout) });
|
|
290
|
+
}
|
|
291
|
+
else if (process.stdin.isTTY) {
|
|
292
|
+
process.stderr.write(`Открыто ${nav.url}. Войдите в приложение в окне браузера и нажмите Enter здесь.\n`);
|
|
293
|
+
await waitForEnter();
|
|
294
|
+
}
|
|
295
|
+
else {
|
|
296
|
+
throw new SboxError('BROWSER_LOGIN_NEEDS_TTY', 'Нет терминала, чтобы дождаться подтверждения входа.', 'Укажите --until <селектор> или --until-url <шаблон>: вход завершится автоматически.');
|
|
297
|
+
}
|
|
298
|
+
const { url: current } = await sendCommand(g.session, 'url', {}, { timeoutMs: 10_000 });
|
|
299
|
+
const { cookies } = await sendCommand(g.session, 'cookies', { action: 'list' }, { timeoutMs: 10_000 });
|
|
300
|
+
const host = new URL(current).hostname;
|
|
301
|
+
const relevant = cookies.filter((c) => host === c.domain.replace(/^\./, '') || host.endsWith(c.domain.startsWith('.') ? c.domain : `.${c.domain}`)).length;
|
|
302
|
+
emit(g, { url: current, profile: settings.profile, cookies: relevant, session: g.session }, (d) => [
|
|
303
|
+
`Вход завершён: ${d.url}, куки для этого хоста: ${d.cookies}${d.profile ? `, профиль ${d.profile}` : ''}.`,
|
|
304
|
+
`Эта сессия остаётся открытой с окном: команды \`sbox-browser goto …\` продолжат работу под входом.`,
|
|
305
|
+
...(d.profile
|
|
306
|
+
? [`Headless-работа под этим профилем: \`sbox-browser stop\`, затем любая команда с глобальным флагом \`--profile ${d.profile}\` (например \`sbox-browser --profile ${d.profile} goto <url>\`) или browser.profile: ${d.profile} в .sbox/config.yaml.`]
|
|
307
|
+
: []),
|
|
308
|
+
`Перенос входа в CI или на другую машину: \`sbox-browser state save auth.json\` (секрет, не коммитить) и там \`sbox-browser state load auth.json\`.`,
|
|
309
|
+
].join('\n'));
|
|
310
|
+
}));
|
|
311
|
+
const state = program.command('state').description('Куки и storage текущей сессии: сохранить в файл или восстановить');
|
|
312
|
+
state
|
|
313
|
+
.command('save <file>')
|
|
314
|
+
.description('Сохранить куки браузера и storage текущей страницы в JSON (секрет)')
|
|
315
|
+
.action(action(async (g, file) => {
|
|
316
|
+
const { state: data } = await send(g, 'state.export');
|
|
317
|
+
const out = path.resolve(file);
|
|
318
|
+
fs.mkdirSync(path.dirname(out), { recursive: true });
|
|
319
|
+
fs.writeFileSync(out, `${JSON.stringify(data, null, 2)}\n`, { mode: 0o600 });
|
|
320
|
+
emit(g, { file: out, cookies: data.cookies.length, origins: data.origins.length }, (d) => `Состояние сохранено: ${d.file} (куки: ${d.cookies}, origins со storage: ${d.origins}). Файл содержит секреты входа: не коммитьте его.`);
|
|
321
|
+
}));
|
|
322
|
+
state
|
|
323
|
+
.command('load <file>')
|
|
324
|
+
.description('Восстановить куки и storage из файла в текущую сессию')
|
|
325
|
+
.action(action(async (g, file) => {
|
|
326
|
+
const data = JSON.parse(fs.readFileSync(path.resolve(file), 'utf8'));
|
|
327
|
+
const result = await send(g, 'state.import', { state: data });
|
|
328
|
+
emit(g, { file: path.resolve(file), ...result }, (d) => `Восстановлено: куки ${d.cookies}, origins со storage ${d.origins}.`);
|
|
329
|
+
}));
|
|
330
|
+
// --- навигация ---
|
|
331
|
+
program
|
|
332
|
+
.command('goto <url>')
|
|
333
|
+
.description('Открыть адрес (относительный — от базового URL)')
|
|
334
|
+
.option('--wait <event>', 'load | domcontentloaded | networkidle', 'load')
|
|
335
|
+
.action(action(async (g, url, o) => emit(g, await send(g, 'goto', { url, wait: o.wait }), (d) => `${String(d.status ?? '—')} ${String(d.url)}\n${String(d.title)}`)));
|
|
336
|
+
for (const name of ['back', 'forward', 'reload']) {
|
|
337
|
+
program
|
|
338
|
+
.command(name)
|
|
339
|
+
.description({ back: 'Назад по истории', forward: 'Вперёд по истории', reload: 'Перезагрузить страницу' }[name])
|
|
340
|
+
.option('--wait <event>', 'load | domcontentloaded | networkidle', 'load')
|
|
341
|
+
.action(action(async (g, o) => emit(g, await send(g, name, { wait: o.wait }), (d) => `${String(d.status ?? '—')} ${String(d.url)}\n${String(d.title)}`)));
|
|
342
|
+
}
|
|
343
|
+
program.command('url').description('Текущий адрес').action(action(async (g) => emit(g, await send(g, 'url'), (d) => String(d.url))));
|
|
344
|
+
program.command('title').description('Заголовок страницы').action(action(async (g) => emit(g, await send(g, 'title'), (d) => String(d.title))));
|
|
345
|
+
program
|
|
346
|
+
.command('pages')
|
|
347
|
+
.description('Список вкладок')
|
|
348
|
+
.action(action(async (g) => emit(g, await send(g, 'pages'), (d) => d.pages.map((p) => `${p.current ? '*' : ' '} ${p.index}: ${p.url} — ${p.title}`).join('\n'))));
|
|
349
|
+
const page = program.command('page').description('Вкладки: new, switch, close');
|
|
350
|
+
page.command('new [url]').description('Открыть вкладку и сделать текущей').action(action(async (g, url) => emit(g, await send(g, 'page.new', url ? { url } : {}), (d) => `вкладка ${String(d.index)}: ${String(d.url)}`)));
|
|
351
|
+
page.command('switch <index>').description('Переключиться на вкладку').action(action(async (g, index) => emit(g, await send(g, 'page.switch', { index: intOption(index) }), (d) => `вкладка ${String(d.index)}: ${String(d.url)}`)));
|
|
352
|
+
page.command('close [index]').description('Закрыть вкладку (по умолчанию текущую)').action(action(async (g, index) => emit(g, await send(g, 'page.close', index !== undefined ? { index: intOption(index) } : {}), (d) => (d.closed ? `закрыта; вкладок: ${String(d.pages)}` : String(d.note)))));
|
|
353
|
+
// --- действия ---
|
|
354
|
+
program
|
|
355
|
+
.command('click <target>')
|
|
356
|
+
.description('Кликнуть по элементу: [eN] из снимка, CSS, text=…, aria=…, xpath=…')
|
|
357
|
+
.option('--right', 'правой кнопкой')
|
|
358
|
+
.option('--middle', 'средней кнопкой')
|
|
359
|
+
.option('--double', 'двойной клик')
|
|
360
|
+
.action(action(async (g, target, o) => emit(g, await send(g, 'click', { target, button: o.right ? 'right' : o.middle ? 'middle' : 'left', count: o.double ? 2 : 1 }), (d) => `клик: <${d.clicked.tag}> «${d.clicked.text}» → ${d.url}`)));
|
|
361
|
+
program.command('hover <target>').description('Навести курсор').action(action(async (g, target) => emit(g, await send(g, 'hover', { target }), (d) => `наведено: <${d.hovered.tag}> «${d.hovered.text}»`)));
|
|
362
|
+
program.command('focus <target>').description('Установить фокус').action(action(async (g, target) => emit(g, await send(g, 'focus', { target }), (d) => `фокус: <${d.focused.tag}> «${d.focused.text}»`)));
|
|
363
|
+
program
|
|
364
|
+
.command('type <target> <text>')
|
|
365
|
+
.description('Напечатать текст в элемент (добавляя к имеющемуся)')
|
|
366
|
+
.option('--delay <ms>', 'задержка между символами', intOption)
|
|
367
|
+
.option('--clear', 'сначала очистить поле')
|
|
368
|
+
.action(action(async (g, target, text, o) => emit(g, await send(g, 'type', { target, text, delay: o.delay, clear: o.clear }), (d) => `введено ${String(d.typed)} символов, значение: ${String(d.value)}`)));
|
|
369
|
+
program.command('fill <target> <text>').description('Очистить поле и ввести текст').action(action(async (g, target, text) => emit(g, await send(g, 'type', { target, text, clear: true }), (d) => `значение: ${String(d.value)}`)));
|
|
370
|
+
program
|
|
371
|
+
.command('press <key>')
|
|
372
|
+
.description('Нажать клавишу: Enter, Tab, Escape, ArrowDown, ctrl+a, ctrl++, пробел в кавычках …')
|
|
373
|
+
.option('--target <target>', 'сначала сфокусировать элемент')
|
|
374
|
+
.action(action(async (g, key, o) => emit(g, await send(g, 'press', { key, target: o.target }), (d) => `нажато ${String(d.pressed)} → ${String(d.url)}`)));
|
|
375
|
+
program.command('select <target> <values...>').description('Выбрать значения в <select>').action(action(async (g, target, values) => emit(g, await send(g, 'select', { target, values }), (d) => `выбрано: ${d.selected.join(', ')}`)));
|
|
376
|
+
program.command('check <target>').description('Включить флажок или переключатель').action(action(async (g, target) => emit(g, await send(g, 'check', { target, checked: true }), (d) => `checked: ${String(d.checked)}`)));
|
|
377
|
+
program.command('uncheck <target>').description('Снять флажок').action(action(async (g, target) => emit(g, await send(g, 'check', { target, checked: false }), (d) => `checked: ${String(d.checked)}`)));
|
|
378
|
+
program.command('upload <target> <files...>').description('Загрузить файлы в <input type=file>').action(action(async (g, target, files) => emit(g, await send(g, 'upload', { target, files: files.map((f) => path.resolve(f)) }), (d) => `загружено: ${d.uploaded.join(', ')}`)));
|
|
379
|
+
program
|
|
380
|
+
.command('scroll [target]')
|
|
381
|
+
.description('Прокрутить к элементу или страницу на число пикселей')
|
|
382
|
+
.option('--down <px>', 'вниз', intOption)
|
|
383
|
+
.option('--up <px>', 'вверх', intOption)
|
|
384
|
+
.action(action(async (g, target, o) => emit(g, await send(g, 'scroll', { target, dy: o.up !== undefined ? -o.up : (o.down ?? 600) }), (d) => (d.scrolledTo ? `прокручено к элементу` : `позиция: ${JSON.stringify(d.position)}`))));
|
|
385
|
+
program
|
|
386
|
+
.command('wait [target]')
|
|
387
|
+
.description('Дождаться элемента, текста, адреса, условия или паузы')
|
|
388
|
+
.option('--hidden', 'ждать исчезновения элемента')
|
|
389
|
+
.option('--attached', 'достаточно присутствия в DOM, без видимости')
|
|
390
|
+
.option('--text <text>', 'текст появился на странице')
|
|
391
|
+
.option('--url <pattern>', 'адрес совпал: подстрока или glob')
|
|
392
|
+
.option('--fn <js>', 'JS-выражение стало истинным')
|
|
393
|
+
.option('--ms <n>', 'просто пауза', intOption)
|
|
394
|
+
.action(action(async (g, target, o) => emit(g, await send(g, 'wait', { target, state: o.hidden ? 'hidden' : o.attached ? 'attached' : undefined, text: o.text, url: o.url, fn: o.fn, ms: o.ms }), (d) => `дождались: ${d.waited.join('; ')} → ${d.url}`)));
|
|
395
|
+
// --- чтение ---
|
|
396
|
+
program
|
|
397
|
+
.command('text [target]')
|
|
398
|
+
.description('Видимый текст страницы или элемента')
|
|
399
|
+
.option('--limit <chars>', 'обрезать до N символов', intOption)
|
|
400
|
+
.action(action(async (g, target, o) => emit(g, await send(g, 'text', { target, limit: o.limit }), (d) => `${d.text}${d.truncated ? `\n… (обрезано: всего ${d.length} символов)` : ''}`)));
|
|
401
|
+
program
|
|
402
|
+
.command('html [target]')
|
|
403
|
+
.description('HTML страницы или элемента')
|
|
404
|
+
.option('--inner', 'innerHTML вместо outerHTML')
|
|
405
|
+
.option('--limit <chars>', 'обрезать до N символов', intOption)
|
|
406
|
+
.action(action(async (g, target, o) => emit(g, await send(g, 'html', { target, outer: !o.inner, limit: o.limit }), (d) => `${d.html}${d.truncated ? `\n… (обрезано: всего ${d.length} символов)` : ''}`)));
|
|
407
|
+
program.command('attr <target> <name>').description('Значение атрибута').action(action(async (g, target, name) => emit(g, await send(g, 'attr', { target, name }), (d) => String(d.value ?? ''))));
|
|
408
|
+
program.command('value <target>').description('Значение поля ввода').action(action(async (g, target) => emit(g, await send(g, 'value', { target }), (d) => String(d.value ?? ''))));
|
|
409
|
+
program.command('count <target>').description('Сколько элементов подходит под селектор').action(action(async (g, target) => emit(g, await send(g, 'count', { target }), (d) => String(d.count))));
|
|
410
|
+
program.command('exists <target>').description('Есть ли элемент на странице сейчас (без ожидания); для [eN] проверяется живой элемент').action(action(async (g, target) => emit(g, await send(g, 'exists', { target }), (d) => (d.exists ? `есть${d.visible ? ', видим' : ', скрыт'}` : 'нет'))));
|
|
411
|
+
program.command('eval <code>').description('Выполнить JS на странице: выражение, список инструкций или тело функции с return/await; результат в JSON').action(action(async (g, code) => emit(g, await send(g, 'eval', { code }), (d) => JSON.stringify(d.result, null, 2))));
|
|
412
|
+
program
|
|
413
|
+
.command('snapshot')
|
|
414
|
+
.description('Снимок дерева доступности со ссылками [eN] для click/type/fill')
|
|
415
|
+
.option('--interactive', 'только элементы, с которыми можно взаимодействовать')
|
|
416
|
+
.option('--root <target>', 'только поддерево элемента')
|
|
417
|
+
.option('--max <chars>', 'предел размера', intOption)
|
|
418
|
+
.action(action(async (g, o) => emit(g, await send(g, 'snapshot', { interactive: o.interactive, root: o.root, maxChars: o.max }), (d) => `# ${d.url} — ${d.title} (${d.count} элементов)\n${d.text}`)));
|
|
419
|
+
program
|
|
420
|
+
.command('screenshot')
|
|
421
|
+
.description('Снимок экрана в PNG; путь печатается')
|
|
422
|
+
.option('--out <file>', 'куда сохранить (по умолчанию ~/.sbox/browser/shots)')
|
|
423
|
+
.option('--full', 'вся страница, а не окно')
|
|
424
|
+
.option('--target <target>', 'только элемент')
|
|
425
|
+
.action(action(async (g, o) => emit(g, await send(g, 'screenshot', { out: o.out ? path.resolve(o.out) : undefined, full: o.full, target: o.target }), (d) => String(d.path))));
|
|
426
|
+
program
|
|
427
|
+
.command('console')
|
|
428
|
+
.description('Сообщения консоли и ошибки страницы с момента открытия (или последней очистки)')
|
|
429
|
+
.option('--clear', 'очистить после чтения')
|
|
430
|
+
.option('--errors', 'только ошибки')
|
|
431
|
+
.action(action(async (g, o) => emit(g, await send(g, 'console', { clear: o.clear, errors: o.errors }), (d) => (d.entries.length ? d.entries.map(formatLog).join('\n') : 'консоль пуста'))));
|
|
432
|
+
program
|
|
433
|
+
.command('requests')
|
|
434
|
+
.description('Неудачные запросы и ответы 4xx/5xx')
|
|
435
|
+
.option('--clear', 'очистить после чтения')
|
|
436
|
+
.action(action(async (g, o) => emit(g, await send(g, 'requests', { clear: o.clear }), (d) => (d.entries.length ? d.entries.map(formatNet).join('\n') : 'сетевых ошибок нет'))));
|
|
437
|
+
// --- окружение страницы ---
|
|
438
|
+
const cookies = program.command('cookies').description('Куки браузера: list, set, clear');
|
|
439
|
+
cookies.command('list').description('Все куки').action(action(async (g) => emit(g, await send(g, 'cookies', { action: 'list' }), (d) => (d.cookies.length ? d.cookies.map((c) => `${c.name}=${c.value.length > 40 ? `${c.value.slice(0, 40)}…` : c.value}; domain=${c.domain}; path=${c.path}`).join('\n') : 'кук нет'))));
|
|
440
|
+
cookies.command('clear').description('Удалить все куки').action(action(async (g) => emit(g, await send(g, 'cookies', { action: 'clear' }), (d) => `удалено: ${String(d.cleared)}`)));
|
|
441
|
+
cookies
|
|
442
|
+
.command('set <name> <value>')
|
|
443
|
+
.description('Поставить куку (домен текущей страницы, если не указан)')
|
|
444
|
+
.option('--domain <domain>')
|
|
445
|
+
.option('--url <url>')
|
|
446
|
+
.option('--path <path>', '', '/')
|
|
447
|
+
.option('--secure')
|
|
448
|
+
.option('--http-only')
|
|
449
|
+
.action(action(async (g, name, value, o) => emit(g, await send(g, 'cookies', { action: 'set', cookies: [{ name, value, domain: o.domain, url: o.url, path: o.path, secure: o.secure, httpOnly: o.httpOnly }] }), (d) => `установлено: ${String(d.set)}`)));
|
|
450
|
+
program.command('viewport <WxH>').description('Размер окна для текущей и новых вкладок, например 1280x800').action(action(async (g, size) => emit(g, await send(g, 'viewport', parseViewport(size)), (d) => JSON.stringify(d.viewport))));
|
|
451
|
+
program
|
|
452
|
+
.command('dialog [action]')
|
|
453
|
+
.description('Политика для alert/confirm/prompt: accept | dismiss (beforeunload подтверждается всегда); без аргумента — текущая политика и последние диалоги')
|
|
454
|
+
.option('--text <text>', 'ответ для prompt')
|
|
455
|
+
.action(action(async (g, act, o) => emit(g, await send(g, 'dialog', { action: act, text: o.text }), (d) => `политика: ${d.policy.action}${d.policy.text !== undefined ? ` («${d.policy.text}»)` : ''}${d.recent.length ? `\nпоследние: ${d.recent.map((e) => `${e.type}: ${e.text}`).join('; ')}` : ''}`)));
|
|
456
|
+
program.command('auth <user> <password>').description('HTTP Basic-аутентификация для текущей вкладки').action(action(async (g, user, password) => emit(g, await send(g, 'auth', { username: user, password }), (d) => `basic auth: ${String(d.auth)}`)));
|
|
457
|
+
program.command('headers <json>').description('Дополнительные HTTP-заголовки для текущей вкладки, JSON-объект').action(action(async (g, json) => emit(g, await send(g, 'headers', { headers: JSON.parse(json) }), (d) => `заголовки: ${d.headers.join(', ')}`)));
|
|
458
|
+
return program;
|
|
459
|
+
}
|
|
460
|
+
/** Точка входа: ошибки разбора аргументов и неожиданные ошибки тоже идут в общем конверте при --json. */
|
|
461
|
+
export async function main(argv) {
|
|
462
|
+
const json = argv.includes('--json');
|
|
463
|
+
const program = buildBrowserProgram();
|
|
464
|
+
program.configureOutput({ writeErr: (s) => { if (!json)
|
|
465
|
+
process.stderr.write(s); } });
|
|
466
|
+
try {
|
|
467
|
+
await program.parseAsync(argv);
|
|
468
|
+
}
|
|
469
|
+
catch (e) {
|
|
470
|
+
if (e instanceof CommanderError) {
|
|
471
|
+
if (e.exitCode === 0)
|
|
472
|
+
return;
|
|
473
|
+
emitError({ json }, new SboxError('BROWSER_BAD_ARGS', e.message.replace(/^error: /, '').trim(), 'Справка: `sbox-browser --help` или `sbox-browser <команда> --help`.'));
|
|
474
|
+
process.exitCode = e.exitCode || 1;
|
|
475
|
+
return;
|
|
476
|
+
}
|
|
477
|
+
emitError({ json }, e);
|
|
478
|
+
process.exitCode = 1;
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
const invokedDirectly = process.argv[1] && /browser[\\/]cli\.(ts|js)$/.test(process.argv[1]);
|
|
482
|
+
if (invokedDirectly) {
|
|
483
|
+
main(process.argv).catch((err) => {
|
|
484
|
+
console.error(err instanceof Error ? err.message : String(err));
|
|
485
|
+
process.exit(1);
|
|
486
|
+
});
|
|
487
|
+
}
|
|
488
|
+
//# sourceMappingURL=cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/browser/cli.ts"],"names":[],"mappings":"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"}
|