@jackwener/opencli 0.7.6 → 0.7.9
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/.agents/skills/cross-project-adapter-migration/SKILL.md +249 -0
- package/.agents/workflows/cross-project-adapter-migration.md +54 -0
- package/dist/_debug.d.ts +1 -0
- package/dist/_debug.js +7 -0
- package/dist/browser/discover.d.ts +8 -0
- package/dist/browser/discover.js +83 -0
- package/dist/browser/errors.d.ts +21 -0
- package/dist/browser/errors.js +54 -0
- package/dist/browser/index.d.ts +22 -0
- package/dist/browser/index.js +22 -0
- package/dist/browser/mcp.d.ts +33 -0
- package/dist/browser/mcp.js +304 -0
- package/dist/browser/page.d.ts +41 -0
- package/dist/browser/page.js +142 -0
- package/dist/browser/tabs.d.ts +13 -0
- package/dist/browser/tabs.js +70 -0
- package/dist/browser-tab.d.ts +2 -0
- package/dist/browser-tab.js +30 -0
- package/dist/browser.test.js +1 -1
- package/dist/cli-manifest.json +70 -3
- package/dist/clis/github/search.d.ts +1 -0
- package/dist/clis/github/search.js +20 -0
- package/dist/clis/index.d.ts +27 -0
- package/dist/clis/index.js +41 -0
- package/dist/clis/twitter/timeline.js +174 -35
- package/dist/clis/xiaohongshu/me.d.ts +1 -0
- package/dist/clis/xiaohongshu/me.js +86 -0
- package/dist/completion.js +2 -2
- package/dist/doctor.js +7 -7
- package/dist/engine.js +6 -4
- package/dist/errors.d.ts +25 -0
- package/dist/errors.js +42 -0
- package/dist/logger.d.ts +22 -0
- package/dist/logger.js +47 -0
- package/dist/main.js +8 -2
- package/dist/pipeline/_debug.d.ts +1 -0
- package/dist/pipeline/_debug.js +7 -0
- package/dist/pipeline/executor.js +8 -8
- package/dist/pipeline/steps/browser.d.ts +7 -7
- package/dist/pipeline/steps/intercept.d.ts +1 -1
- package/dist/pipeline/steps/tap.d.ts +1 -1
- package/dist/promote.d.ts +1 -0
- package/dist/promote.js +3 -0
- package/dist/register.d.ts +2 -0
- package/dist/register.js +2 -0
- package/dist/scaffold.d.ts +2 -0
- package/dist/scaffold.js +2 -0
- package/dist/setup.js +9 -3
- package/dist/smoke.d.ts +2 -0
- package/dist/smoke.js +2 -0
- package/package.json +3 -3
- package/scripts/clean-yaml.cjs +19 -0
- package/scripts/copy-yaml.cjs +21 -0
- package/scripts/postinstall.js +30 -9
- package/src/bilibili.ts +1 -1
- package/src/browser/discover.ts +90 -0
- package/src/browser/errors.ts +89 -0
- package/src/browser/index.ts +26 -0
- package/src/browser/mcp.ts +305 -0
- package/src/browser/page.ts +152 -0
- package/src/browser/tabs.ts +76 -0
- package/src/browser.test.ts +1 -1
- package/src/clis/twitter/timeline.ts +204 -36
- package/src/completion.ts +2 -2
- package/src/doctor.ts +13 -1
- package/src/engine.ts +9 -4
- package/src/errors.ts +48 -0
- package/src/logger.ts +57 -0
- package/src/main.ts +10 -3
- package/src/pipeline/executor.ts +8 -7
- package/src/pipeline/steps/browser.ts +18 -18
- package/src/pipeline/steps/intercept.ts +8 -8
- package/src/pipeline/steps/tap.ts +2 -2
- package/src/setup.ts +9 -3
- package/tsconfig.json +1 -2
- package/src/browser.ts +0 -698
|
@@ -6,7 +6,7 @@ import type { IPage } from '../../types.js';
|
|
|
6
6
|
import { render } from '../template.js';
|
|
7
7
|
import { generateInterceptorJs, generateReadInterceptedJs } from '../../interceptor.js';
|
|
8
8
|
|
|
9
|
-
export async function stepIntercept(page: IPage, params: any, data: any, args: Record<string, any>): Promise<any> {
|
|
9
|
+
export async function stepIntercept(page: IPage | null, params: any, data: any, args: Record<string, any>): Promise<any> {
|
|
10
10
|
const cfg = typeof params === 'object' ? params : {};
|
|
11
11
|
const trigger = cfg.trigger ?? '';
|
|
12
12
|
const capturePattern = cfg.capture ?? '';
|
|
@@ -16,28 +16,28 @@ export async function stepIntercept(page: IPage, params: any, data: any, args: R
|
|
|
16
16
|
if (!capturePattern) return data;
|
|
17
17
|
|
|
18
18
|
// Step 1: Inject fetch/XHR interceptor BEFORE trigger
|
|
19
|
-
await page
|
|
19
|
+
await page!.evaluate(generateInterceptorJs(JSON.stringify(capturePattern)));
|
|
20
20
|
|
|
21
21
|
// Step 2: Execute the trigger action
|
|
22
22
|
if (trigger.startsWith('navigate:')) {
|
|
23
23
|
const url = render(trigger.slice('navigate:'.length), { args, data });
|
|
24
|
-
await page
|
|
24
|
+
await page!.goto(String(url));
|
|
25
25
|
} else if (trigger.startsWith('evaluate:')) {
|
|
26
26
|
const js = trigger.slice('evaluate:'.length);
|
|
27
27
|
const { normalizeEvaluateSource } = await import('../template.js');
|
|
28
|
-
await page
|
|
28
|
+
await page!.evaluate(normalizeEvaluateSource(render(js, { args, data }) as string));
|
|
29
29
|
} else if (trigger.startsWith('click:')) {
|
|
30
30
|
const ref = render(trigger.slice('click:'.length), { args, data });
|
|
31
|
-
await page
|
|
31
|
+
await page!.click(String(ref).replace(/^@/, ''));
|
|
32
32
|
} else if (trigger === 'scroll') {
|
|
33
|
-
await page
|
|
33
|
+
await page!.scroll('down');
|
|
34
34
|
}
|
|
35
35
|
|
|
36
36
|
// Step 3: Wait a bit for network requests to fire
|
|
37
|
-
await page
|
|
37
|
+
await page!.wait(Math.min(timeout, 3));
|
|
38
38
|
|
|
39
39
|
// Step 4: Retrieve captured data
|
|
40
|
-
const matchingResponses = await page
|
|
40
|
+
const matchingResponses = await page!.evaluate(generateReadInterceptedJs());
|
|
41
41
|
|
|
42
42
|
// Step 5: Select from response if specified
|
|
43
43
|
let result = matchingResponses.length === 1 ? matchingResponses[0] :
|
|
@@ -13,7 +13,7 @@ import type { IPage } from '../../types.js';
|
|
|
13
13
|
import { render } from '../template.js';
|
|
14
14
|
import { generateTapInterceptorJs } from '../../interceptor.js';
|
|
15
15
|
|
|
16
|
-
export async function stepTap(page: IPage, params: any, data: any, args: Record<string, any>): Promise<any> {
|
|
16
|
+
export async function stepTap(page: IPage | null, params: any, data: any, args: Record<string, any>): Promise<any> {
|
|
17
17
|
const cfg = typeof params === 'object' ? params : {};
|
|
18
18
|
const storeName = String(render(cfg.store ?? '', { args, data }));
|
|
19
19
|
const actionName = String(render(cfg.action ?? '', { args, data }));
|
|
@@ -96,5 +96,5 @@ export async function stepTap(page: IPage, params: any, data: any, args: Record<
|
|
|
96
96
|
}
|
|
97
97
|
`;
|
|
98
98
|
|
|
99
|
-
return page
|
|
99
|
+
return page!.evaluate(js);
|
|
100
100
|
}
|
package/src/setup.ts
CHANGED
|
@@ -24,7 +24,7 @@ import {
|
|
|
24
24
|
upsertTomlConfigToken,
|
|
25
25
|
writeFileWithMkdir,
|
|
26
26
|
} from './doctor.js';
|
|
27
|
-
import { getTokenFingerprint } from './browser.js';
|
|
27
|
+
import { getTokenFingerprint } from './browser/index.js';
|
|
28
28
|
import { type CheckboxItem, checkboxPrompt } from './tui.js';
|
|
29
29
|
|
|
30
30
|
export async function runSetup(opts: { cliVersion?: string; token?: string } = {}) {
|
|
@@ -184,11 +184,17 @@ export async function runSetup(opts: { cliVersion?: string; token?: string } = {
|
|
|
184
184
|
if (result.ok) {
|
|
185
185
|
console.log(` ${chalk.green('✓')} Browser connected in ${(result.durationMs / 1000).toFixed(1)}s`);
|
|
186
186
|
} else {
|
|
187
|
+
console.log(` ${chalk.green('✓')} Token saved successfully.`);
|
|
187
188
|
console.log(` ${chalk.yellow('!')} Browser connectivity test failed: ${result.error ?? 'unknown'}`);
|
|
188
|
-
console.log(chalk.dim('
|
|
189
|
+
console.log(chalk.dim(' Token configuration is complete. To use opencli, make sure Chrome'));
|
|
190
|
+
console.log(chalk.dim(' is running with the Playwright MCP Bridge extension enabled.'));
|
|
191
|
+
console.log(chalk.dim(` Run ${chalk.bold('opencli doctor --live')} to re-test connectivity.`));
|
|
189
192
|
}
|
|
190
193
|
} catch {
|
|
191
|
-
console.log(` ${chalk.
|
|
194
|
+
console.log(` ${chalk.green('✓')} Token saved successfully.`);
|
|
195
|
+
console.log(` ${chalk.yellow('!')} Browser connectivity test skipped (Chrome may not be running).`);
|
|
196
|
+
console.log(chalk.dim(' Token configuration is complete. Start Chrome to begin using opencli.'));
|
|
197
|
+
console.log(chalk.dim(` Run ${chalk.bold('opencli doctor --live')} to re-test connectivity.`));
|
|
192
198
|
}
|
|
193
199
|
console.log();
|
|
194
200
|
}
|
package/tsconfig.json
CHANGED