abelworkflow 0.9.2 → 1.0.0-rc.1

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.
Files changed (126) hide show
  1. package/README.md +55 -182
  2. package/bin/abelworkflow.mjs +5 -3
  3. package/lib/cli/args.mjs +76 -0
  4. package/lib/cli/main.mjs +387 -0
  5. package/lib/cli/prompts.mjs +119 -0
  6. package/lib/config/dotenv.mjs +102 -0
  7. package/lib/config/jsonc.mjs +80 -0
  8. package/lib/config/store.mjs +310 -0
  9. package/lib/config/toml.mjs +638 -0
  10. package/lib/installer/assets.mjs +326 -0
  11. package/lib/installer/install.mjs +167 -0
  12. package/lib/installer/links.mjs +427 -0
  13. package/lib/installer/render.mjs +46 -0
  14. package/lib/installer/state.mjs +182 -0
  15. package/lib/paths.mjs +99 -0
  16. package/lib/providers/claude.mjs +388 -0
  17. package/lib/providers/codex.mjs +433 -0
  18. package/lib/providers/pi.mjs +362 -0
  19. package/lib/providers/skills.mjs +164 -0
  20. package/lib/templates/codex/agents/default.toml +7 -0
  21. package/lib/templates/codex/agents/explorer.toml +7 -0
  22. package/lib/templates/codex/agents/planner.toml +7 -0
  23. package/lib/templates/codex/agents/reviewer.toml +7 -0
  24. package/lib/templates/codex/agents/worker.toml +7 -0
  25. package/lib/templates/codex/config-base.toml +11 -3
  26. package/{AGENTS.md → lib/templates/workflow/AGENTS.md} +8 -3
  27. package/{commands → lib/templates/workflow/commands}/abel-diagnose.md +5 -5
  28. package/{commands → lib/templates/workflow/commands}/abel-implement.md +3 -8
  29. package/{commands → lib/templates/workflow/commands}/abel-init.md +1 -1
  30. package/{commands → lib/templates/workflow/commands}/abel-plan.md +1 -7
  31. package/{commands → lib/templates/workflow/commands}/abel-research.md +1 -1
  32. package/{.gitignore → lib/templates/workflow/gitignore.template} +0 -2
  33. package/lib/tools/cli-installer.mjs +277 -0
  34. package/package.json +43 -10
  35. package/skills/context7-auto-research/SKILL.md +5 -5
  36. package/skills/context7-auto-research/{context7-api.js → context7-api.cjs} +5 -8
  37. package/skills/dev-browser/SKILL.md +53 -33
  38. package/skills/dev-browser/dist/scripts/start.d.ts +2 -0
  39. package/skills/dev-browser/dist/scripts/start.d.ts.map +1 -0
  40. package/skills/dev-browser/dist/scripts/start.js +118 -0
  41. package/skills/dev-browser/dist/scripts/start.js.map +1 -0
  42. package/skills/dev-browser/dist/src/client.d.ts +93 -0
  43. package/skills/dev-browser/dist/src/client.d.ts.map +1 -0
  44. package/skills/dev-browser/dist/src/client.js +310 -0
  45. package/skills/dev-browser/dist/src/client.js.map +1 -0
  46. package/skills/dev-browser/dist/src/entrypoint.d.ts +29 -0
  47. package/skills/dev-browser/dist/src/entrypoint.d.ts.map +1 -0
  48. package/skills/dev-browser/dist/src/entrypoint.js +106 -0
  49. package/skills/dev-browser/dist/src/entrypoint.js.map +1 -0
  50. package/skills/dev-browser/dist/src/index.d.ts +4 -0
  51. package/skills/dev-browser/dist/src/index.d.ts.map +1 -0
  52. package/skills/dev-browser/dist/src/index.js +2 -0
  53. package/skills/dev-browser/dist/src/index.js.map +1 -0
  54. package/skills/dev-browser/dist/src/page-api.d.ts +25 -0
  55. package/skills/dev-browser/dist/src/page-api.d.ts.map +1 -0
  56. package/skills/dev-browser/dist/src/page-api.js +104 -0
  57. package/skills/dev-browser/dist/src/page-api.js.map +1 -0
  58. package/skills/dev-browser/dist/src/relay.d.ts +27 -0
  59. package/skills/dev-browser/dist/src/relay.d.ts.map +1 -0
  60. package/skills/dev-browser/dist/src/relay.js +521 -0
  61. package/skills/dev-browser/dist/src/relay.js.map +1 -0
  62. package/skills/dev-browser/dist/src/runtime.d.ts +45 -0
  63. package/skills/dev-browser/dist/src/runtime.d.ts.map +1 -0
  64. package/skills/dev-browser/dist/src/runtime.js +54 -0
  65. package/skills/dev-browser/dist/src/runtime.js.map +1 -0
  66. package/skills/dev-browser/dist/src/snapshot/browser-script.d.ts +23 -0
  67. package/skills/dev-browser/dist/src/snapshot/browser-script.d.ts.map +1 -0
  68. package/skills/dev-browser/{src/snapshot/browser-script.ts → dist/src/snapshot/browser-script.js} +21 -30
  69. package/skills/dev-browser/dist/src/snapshot/browser-script.js.map +1 -0
  70. package/skills/dev-browser/dist/src/snapshot/index.d.ts +14 -0
  71. package/skills/dev-browser/dist/src/snapshot/index.d.ts.map +1 -0
  72. package/skills/dev-browser/{src/snapshot/index.ts → dist/src/snapshot/index.js} +2 -2
  73. package/skills/dev-browser/dist/src/snapshot/index.js.map +1 -0
  74. package/skills/dev-browser/dist/src/snapshot/inject.d.ts +13 -0
  75. package/skills/dev-browser/dist/src/snapshot/inject.d.ts.map +1 -0
  76. package/skills/dev-browser/{src/snapshot/inject.ts → dist/src/snapshot/inject.js} +2 -2
  77. package/skills/dev-browser/dist/src/snapshot/inject.js.map +1 -0
  78. package/skills/dev-browser/dist/src/standalone.d.ts +32 -0
  79. package/skills/dev-browser/dist/src/standalone.d.ts.map +1 -0
  80. package/skills/dev-browser/dist/src/standalone.js +174 -0
  81. package/skills/dev-browser/dist/src/standalone.js.map +1 -0
  82. package/skills/dev-browser/dist/src/startup.d.ts +55 -0
  83. package/skills/dev-browser/dist/src/startup.d.ts.map +1 -0
  84. package/skills/dev-browser/dist/src/startup.js +81 -0
  85. package/skills/dev-browser/dist/src/startup.js.map +1 -0
  86. package/skills/dev-browser/dist/src/target-registry.d.ts +29 -0
  87. package/skills/dev-browser/dist/src/target-registry.d.ts.map +1 -0
  88. package/skills/dev-browser/dist/src/target-registry.js +135 -0
  89. package/skills/dev-browser/dist/src/target-registry.js.map +1 -0
  90. package/skills/dev-browser/dist/src/types.d.ts +27 -0
  91. package/skills/dev-browser/dist/src/types.d.ts.map +1 -0
  92. package/skills/dev-browser/dist/src/types.js +2 -0
  93. package/skills/dev-browser/dist/src/types.js.map +1 -0
  94. package/skills/dev-browser/package-lock.json +67 -1510
  95. package/skills/dev-browser/package.json +18 -14
  96. package/skills/dev-browser/references/scraping.md +94 -105
  97. package/skills/grok-search/defaults.json +3 -0
  98. package/skills/grok-search/gitignore.template +4 -0
  99. package/skills/grok-search/scripts/_dotenv.py +5 -1
  100. package/skills/grok-search/scripts/groksearch_cli.py +15 -33
  101. package/skills/prompt-enhancer/TEMPLATE.md +0 -4
  102. package/skills/prompt-enhancer/requirements.txt +0 -1
  103. package/skills/prompt-enhancer/scripts/_dotenv.py +5 -1
  104. package/skills/prompt-enhancer/scripts/enhance.py +4 -51
  105. package/skills/prompt-enhancer/scripts/prompt_enhancer_entry.py +1 -16
  106. package/.skill-lock.json +0 -29
  107. package/lib/cli/logic.mjs +0 -213
  108. package/lib/cli.mjs +0 -3016
  109. package/skills/confidence-check/SKILL.md +0 -34
  110. package/skills/confidence-check/confidence.ts +0 -276
  111. package/skills/dev-browser/bun.lock +0 -460
  112. package/skills/dev-browser/scripts/start.ts +0 -280
  113. package/skills/dev-browser/src/client.ts +0 -474
  114. package/skills/dev-browser/src/entrypoint.ts +0 -157
  115. package/skills/dev-browser/src/index.ts +0 -289
  116. package/skills/dev-browser/src/relay.ts +0 -731
  117. package/skills/dev-browser/src/runtime.test.ts +0 -60
  118. package/skills/dev-browser/src/runtime.ts +0 -171
  119. package/skills/dev-browser/src/startup.test.ts +0 -95
  120. package/skills/dev-browser/src/startup.ts +0 -153
  121. package/skills/dev-browser/src/types.ts +0 -35
  122. package/skills/dev-browser/tsconfig.json +0 -36
  123. package/skills/dev-browser/vitest.config.ts +0 -12
  124. package/skills/sequential-think/SKILL.md +0 -198
  125. package/skills/sequential-think/scripts/.env.example +0 -5
  126. package/skills/sequential-think/scripts/sequential_think_cli.py +0 -253
@@ -1,11 +1,11 @@
1
1
  ---
2
2
  name: dev-browser
3
- description: Browser automation with persistent page state. Use when users ask to navigate websites, fill forms, take screenshots, extract web data, test web apps, or automate browser workflows. Trigger phrases include "go to [url]", "click on", "fill out the form", "take a screenshot", "scrape", "automate", "test the website", "log into", or any browser interaction request.
3
+ description: Browser automation with page state shared while the server process runs. Use when users ask to navigate websites, fill forms, take screenshots, extract web data, test web apps, or automate browser workflows. Trigger phrases include "go to [url]", "click on", "fill out the form", "take a screenshot", "scrape", "automate", "test the website", "log into", or any browser interaction request.
4
4
  ---
5
5
 
6
6
  # Dev Browser Skill
7
7
 
8
- Browser automation that maintains page state across script executions. Write small, focused scripts to accomplish tasks incrementally. Once you've proven out part of a workflow and there is repeated work to be done, you can write a script to do the repeated work in a single execution.
8
+ Browser automation that maintains page state across script executions while the server process runs. Write small, focused scripts to accomplish tasks incrementally.
9
9
 
10
10
  ## Choosing Your Approach
11
11
 
@@ -22,13 +22,13 @@ Two supported startup modes are available on **Linux** and **native Windows**. R
22
22
  Launches a new Chromium browser for fresh automation sessions.
23
23
 
24
24
  ```text
25
- npx tsx scripts/start.ts standalone
25
+ node dist/scripts/start.js standalone
26
26
  ```
27
27
 
28
28
  Add `--headless` if needed:
29
29
 
30
30
  ```text
31
- npx tsx scripts/start.ts standalone --headless
31
+ node dist/scripts/start.js standalone --headless
32
32
  ```
33
33
 
34
34
  Wait for the stable readiness line `Ready` before running scripts.
@@ -43,7 +43,7 @@ Connects to the user's existing Chrome browser. Use this when:
43
43
  Start the relay server with:
44
44
 
45
45
  ```text
46
- npx tsx scripts/start.ts extension
46
+ node dist/scripts/start.js extension
47
47
  ```
48
48
 
49
49
  Wait for `Waiting for extension to connect...`. Once the browser extension attaches, the relay logs `Extension connected`.
@@ -54,25 +54,32 @@ If the extension hasn't connected yet, tell the user to launch and activate it.
54
54
 
55
55
  | Mode | Linux | Native Windows | Readiness signal | Notes |
56
56
  |------|-------|----------------|------------------|-------|
57
- | standalone mode | Supported | Supported | `Ready` | Launches a managed Chromium profile under `profiles/` |
57
+ | standalone mode | Supported | Supported | `Ready` | Uses a process-owned temporary Chromium profile and cleans it on exit |
58
58
  | extension mode | Supported | Supported | `Waiting for extension to connect...` then `Extension connected` | Requires the external browser extension to attach |
59
59
 
60
60
  ## Verification Checklist
61
61
 
62
- - Start `standalone mode` with `npx tsx scripts/start.ts standalone`
62
+ - Start `standalone mode` with `node dist/scripts/start.js standalone`
63
63
  - Observe the readiness line `Ready`
64
64
  - Connect with `connect()` and create a named page
65
- - Start `extension mode` with `npx tsx scripts/start.ts extension`
65
+ - Start `extension mode` with `node dist/scripts/start.js extension`
66
66
  - Observe `Waiting for extension to connect...`
67
67
  - Attach the browser extension and confirm `Extension connected`
68
68
 
69
69
  ## Known Differences
70
70
 
71
- - `standalone mode` launches and owns its own Chromium profile under this skill directory.
71
+ - `standalone mode` owns a temporary Chromium profile only for the server process lifetime and cleans it on exit.
72
72
  - `extension mode` depends on the external browser extension and the user's existing Chrome session.
73
73
  - In `extension mode`, relay readiness means the server is waiting for the extension; it does not imply browser control is available until `Extension connected` appears.
74
74
  - `standalone mode` is the default path for deterministic local automation; `extension mode` is for working inside an already-authenticated browser.
75
75
 
76
+ ## Relay Origin Boundary
77
+
78
+ - State-changing `/pages` requests accept only originless JSON clients; browser-origin and non-JSON mutations are rejected before backend calls.
79
+ - `/cdp` accepts only originless WebSocket clients, which is the normal behavior of the Node client. Browser pages always send an `Origin` and are rejected.
80
+ - `/extension` accepts originless protocol clients and valid `chrome-extension://` origins. HTTP(S), `null`, malformed, and other origins are rejected.
81
+ - Rejected sockets close with WebSocket policy code `1008` before they can own a client ID, replace the extension, or route buffered messages.
82
+
76
83
  ## Non-goal Environments
77
84
 
78
85
  - `WSL` and `Git Bash` are not part of the supported Windows path for this skill.
@@ -81,37 +88,45 @@ If the extension hasn't connected yet, tell the user to launch and activate it.
81
88
 
82
89
  ## Writing Scripts
83
90
 
84
- Use small TypeScript files under `tmp/` instead of shell heredocs. Run them from the same `dev-browser` skill directory so the `@/` import alias resolves correctly.
91
+ Treat the installed `dev-browser` skill directory as read-only. Store scripts and artifacts in the OS temporary directory or task workspace, never inside the skill directory, and delete files you created when the task ends.
85
92
 
86
- Example script (`tmp/example.ts`):
93
+ External scripts cannot use package self-resolution, so pass the installed skill directory as the first argument and import its compiled client by file URL. Example:
87
94
 
88
- ```typescript
89
- import { connect, waitForPageLoad } from "@/client.js";
95
+ ```javascript
96
+ import { tmpdir } from "node:os";
97
+ import { join } from "node:path";
98
+ import { pathToFileURL } from "node:url";
99
+
100
+ const skillDir = process.argv[2];
101
+ if (!skillDir) throw new Error("Pass the installed dev-browser skill directory");
102
+ const { connect, waitForPageLoad } = await import(
103
+ pathToFileURL(join(skillDir, "dist", "src", "client.js")).href
104
+ );
90
105
 
91
106
  const client = await connect();
92
107
  const page = await client.page("example", { viewport: { width: 1920, height: 1080 } });
93
108
 
94
109
  await page.goto("https://example.com");
95
110
  await waitForPageLoad(page);
111
+ const screenshotPath = join(tmpdir(), "dev-browser-screenshot.png");
112
+ await page.screenshot({ path: screenshotPath });
96
113
 
97
- console.log({ title: await page.title(), url: page.url() });
114
+ console.log({ title: await page.title(), url: page.url(), screenshotPath });
98
115
  await client.disconnect();
99
116
  ```
100
117
 
101
- Run it with:
118
+ This invocation works in Linux shells, PowerShell, and Command Prompt when the two paths are quoted:
102
119
 
103
120
  ```text
104
- npx tsx tmp/example.ts
121
+ node "PATH_TO_SCRIPT.mjs" "PATH_TO_INSTALLED_DEV_BROWSER"
105
122
  ```
106
123
 
107
- **Write to `tmp/` files only when** the script needs reuse, is complex, or user explicitly requests it.
108
-
109
124
  ### Key Principles
110
125
 
111
126
  1. **Small scripts**: Each script does ONE thing (navigate, click, fill, check)
112
127
  2. **Evaluate state**: Log/return state at the end to decide next steps
113
128
  3. **Descriptive page names**: Use `"checkout"`, `"login"`, not `"main"`
114
- 4. **Disconnect to exit**: `await client.disconnect()` - pages persist on server
129
+ 4. **Disconnect to exit**: `await client.disconnect()` - pages persist while the server process runs
115
130
  5. **Plain JS in evaluate**: `page.evaluate()` runs in browser - no TypeScript syntax
116
131
 
117
132
  ## Workflow Loop
@@ -156,7 +171,7 @@ const pageWithSize = await client.page("name", { viewport: { width: 1920, height
156
171
 
157
172
  const pages = await client.list(); // List all page names
158
173
  await client.close("name"); // Close a page
159
- await client.disconnect(); // Disconnect (pages persist)
174
+ await client.disconnect(); // Disconnect (pages persist while the server runs)
160
175
 
161
176
  // ARIA Snapshot methods
162
177
  const snapshot = await client.getAISnapshot("name"); // Get accessibility tree
@@ -167,9 +182,7 @@ The `page` object is a standard Playwright Page.
167
182
 
168
183
  ## Waiting
169
184
 
170
- ```typescript
171
- import { waitForPageLoad } from "@/client.js";
172
-
185
+ ```javascript
173
186
  await waitForPageLoad(page); // After navigation
174
187
  await page.waitForSelector(".results"); // For specific elements
175
188
  await page.waitForURL("**/success"); // For specific URL
@@ -179,11 +192,18 @@ await page.waitForURL("**/success"); // For specific URL
179
192
 
180
193
  ### Screenshots
181
194
 
182
- ```typescript
183
- await page.screenshot({ path: "tmp/screenshot.png" });
184
- await page.screenshot({ path: "tmp/full.png", fullPage: true });
195
+ ```javascript
196
+ import { tmpdir } from "node:os";
197
+ import { join } from "node:path";
198
+
199
+ const screenshotPath = join(tmpdir(), "dev-browser-screenshot.png");
200
+ const fullScreenshotPath = join(tmpdir(), "dev-browser-full.png");
201
+ await page.screenshot({ path: screenshotPath });
202
+ await page.screenshot({ path: fullScreenshotPath, fullPage: true });
185
203
  ```
186
204
 
205
+ Inspect the files, then remove them no later than task completion.
206
+
187
207
  ### ARIA Snapshot (Element Discovery)
188
208
 
189
209
  Use `getAISnapshot()` to discover page elements. Returns YAML-formatted accessibility tree:
@@ -222,26 +242,26 @@ await element.click();
222
242
 
223
243
  ## Error Recovery
224
244
 
225
- Page state persists after failures. To inspect the current state, save a short script such as `tmp/debug.ts` and run it from the `dev-browser` skill directory:
226
-
227
- ```typescript
228
- import { connect } from "@/client.js";
245
+ Page state persists after failures while the server process runs. Reuse the external script pattern above from the OS temporary directory or task workspace:
229
246
 
247
+ ```javascript
230
248
  const client = await connect();
231
249
  const page = await client.page("hackernews");
232
250
 
233
- await page.screenshot({ path: "tmp/debug.png" });
251
+ const debugScreenshotPath = join(tmpdir(), "dev-browser-debug.png");
252
+ await page.screenshot({ path: debugScreenshotPath });
234
253
  console.log({
235
254
  url: page.url(),
236
255
  title: await page.title(),
237
256
  bodyText: await page.textContent("body").then((t) => t?.slice(0, 200)),
257
+ debugScreenshotPath,
238
258
  });
239
259
 
240
260
  await client.disconnect();
241
261
  ```
242
262
 
243
- Run it with:
263
+ Run it with the same cross-platform invocation and delete the debug script and screenshot when finished:
244
264
 
245
265
  ```text
246
- npx tsx tmp/debug.ts
266
+ node "PATH_TO_DEBUG_SCRIPT.mjs" "PATH_TO_INSTALLED_DEV_BROWSER"
247
267
  ```
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=start.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../scripts/start.ts"],"names":[],"mappings":""}
@@ -0,0 +1,118 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import { spawn } from "node:child_process";
3
+ import { createRequire } from "node:module";
4
+ import { join } from "node:path";
5
+ import { formatHttpUrl, parseEntrypointArgs, resolveHostForProbe } from "../src/entrypoint.js";
6
+ import { getInvalidRuntimeDependencies, getLockedRuntimeDependencies, getPlaywrightInstallCommand, getRuntimeDependencyInstallCommand, isPlaywrightChromiumInstalled, isTcpPortInUse, resolveSkillDirFromEntrypoint, resolveRuntimePaths, shouldUseShellForPackageCommands, } from "../src/runtime.js";
7
+ import { ensurePlaywrightChromium, preflightStandaloneStartup, runEntrypoint, } from "../src/startup.js";
8
+ const runtimePaths = resolveRuntimePaths(resolveSkillDirFromEntrypoint(import.meta.url));
9
+ const useShell = shouldUseShellForPackageCommands(process.platform);
10
+ const require = createRequire(import.meta.url);
11
+ async function main() {
12
+ const args = parseEntrypointArgs(process.argv.slice(2));
13
+ await ensureSkillDependencies();
14
+ await runEntrypoint(args, {
15
+ runtimePaths,
16
+ serveStandalone: async (options) => {
17
+ const { serve } = await import("../src/index.js");
18
+ return serve(options);
19
+ },
20
+ serveExtension: async (options) => {
21
+ const { serveRelay } = await import("../src/relay.js");
22
+ return serveRelay(options);
23
+ },
24
+ registerShutdown,
25
+ keepAlive: () => new Promise(() => { }),
26
+ log: (line) => console.log(line),
27
+ ensureBrowser: async () => {
28
+ const { registry } = require("playwright-core/lib/server/registry/index");
29
+ await ensurePlaywrightChromium({
30
+ isInstalled: () => isPlaywrightChromiumInstalled({
31
+ headless: args.headless,
32
+ findExecutable: (name) => registry.findExecutable(name),
33
+ exists: existsSync,
34
+ }),
35
+ installCommand: getPlaywrightInstallCommand({ skillDir: runtimePaths.skillDir }),
36
+ runCommand,
37
+ log: (line) => console.log(line),
38
+ });
39
+ },
40
+ preflightStandalone: () => preflightStandaloneStartup(args, {
41
+ checkServer: async (host, port) => {
42
+ try {
43
+ const response = await fetch(formatHttpUrl(resolveHostForProbe(host), port), {
44
+ signal: AbortSignal.timeout(1000),
45
+ });
46
+ if (!response.ok) {
47
+ return { ok: false };
48
+ }
49
+ const info = (await response.json());
50
+ return { ok: true, info };
51
+ }
52
+ catch {
53
+ return { ok: false };
54
+ }
55
+ },
56
+ isPortInUse: isTcpPortInUse,
57
+ log: (line) => console.log(line),
58
+ }),
59
+ });
60
+ }
61
+ async function ensureSkillDependencies() {
62
+ const packageLock = JSON.parse(readFileSync(join(runtimePaths.skillDir, "package-lock.json"), "utf8"));
63
+ const invalidDependencies = getInvalidRuntimeDependencies({
64
+ skillDir: runtimePaths.skillDir,
65
+ lockedDependencies: getLockedRuntimeDependencies(packageLock),
66
+ readPackageVersion: (path) => {
67
+ try {
68
+ const installed = JSON.parse(readFileSync(path, "utf8"));
69
+ return typeof installed.version === "string" ? installed.version : undefined;
70
+ }
71
+ catch {
72
+ return undefined;
73
+ }
74
+ },
75
+ });
76
+ if (invalidDependencies.length === 0)
77
+ return;
78
+ console.log("dev-browser dependencies missing or out of date. Installing local packages...");
79
+ const installCommand = getRuntimeDependencyInstallCommand();
80
+ await runCommand(installCommand.command, installCommand.args);
81
+ console.log("dev-browser dependencies installed.");
82
+ }
83
+ async function runCommand(command, args) {
84
+ await new Promise((resolve, reject) => {
85
+ const child = spawn(command, args, {
86
+ cwd: runtimePaths.skillDir,
87
+ stdio: "inherit",
88
+ shell: useShell && command === "npm",
89
+ windowsHide: useShell && command === "npm",
90
+ });
91
+ child.on("error", reject);
92
+ child.on("close", (code) => {
93
+ if (code === 0) {
94
+ resolve();
95
+ return;
96
+ }
97
+ reject(new Error(`${command} ${args.join(" ")} exited with code ${code}`));
98
+ });
99
+ });
100
+ }
101
+ function registerShutdown(stop) {
102
+ let shutdownPromise;
103
+ const shutdown = () => {
104
+ shutdownPromise ??= (async () => {
105
+ await stop();
106
+ process.exit(0);
107
+ })();
108
+ return shutdownPromise;
109
+ };
110
+ process.on("SIGINT", shutdown);
111
+ process.on("SIGTERM", shutdown);
112
+ process.on("SIGHUP", shutdown);
113
+ }
114
+ main().catch((error) => {
115
+ console.error("Failed to start dev-browser:", error);
116
+ process.exit(1);
117
+ });
118
+ //# sourceMappingURL=start.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.js","sourceRoot":"","sources":["../../scripts/start.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,93 @@
1
+ import { type Page, type ElementHandle } from "playwright";
2
+ import type { ViewportSize } from "./types.js";
3
+ /**
4
+ * Options for waiting for page load
5
+ */
6
+ export interface WaitForPageLoadOptions {
7
+ /** Maximum time to wait in ms (default: 10000) */
8
+ timeout?: number;
9
+ /** How often to check page state in ms (default: 50) */
10
+ pollInterval?: number;
11
+ /** Minimum time to wait even if page appears ready in ms (default: 100) */
12
+ minimumWait?: number;
13
+ /** Wait for network to be idle (no pending requests) (default: true) */
14
+ waitForNetworkIdle?: boolean;
15
+ }
16
+ /**
17
+ * Result of waiting for page load
18
+ */
19
+ export interface WaitForPageLoadResult {
20
+ /** Whether the page is considered loaded */
21
+ success: boolean;
22
+ /** Document ready state when finished */
23
+ readyState: string;
24
+ /** Number of pending network requests when finished */
25
+ pendingRequests: number;
26
+ /** Time spent waiting in ms */
27
+ waitTimeMs: number;
28
+ /** Whether timeout was reached */
29
+ timedOut: boolean;
30
+ }
31
+ /**
32
+ * Wait for a page to finish loading using document.readyState and performance API.
33
+ *
34
+ * Uses browser-use's approach of:
35
+ * - Checking document.readyState for 'complete'
36
+ * - Monitoring pending network requests via Performance API
37
+ * - Filtering out ads, tracking, and non-critical resources
38
+ * - Graceful timeout handling (continues even if timeout reached)
39
+ */
40
+ export declare function waitForPageLoad(page: Page, options?: WaitForPageLoadOptions): Promise<WaitForPageLoadResult>;
41
+ /** Server mode information */
42
+ export interface ServerInfo {
43
+ wsEndpoint: string;
44
+ mode: "standalone" | "extension";
45
+ extensionConnected?: boolean;
46
+ }
47
+ /**
48
+ * Options for creating or getting a page
49
+ */
50
+ export interface PageOptions {
51
+ /** Viewport size for new pages */
52
+ viewport?: ViewportSize;
53
+ }
54
+ export interface DevBrowserClient {
55
+ page: (name: string, options?: PageOptions) => Promise<Page>;
56
+ list: () => Promise<string[]>;
57
+ close: (name: string) => Promise<void>;
58
+ disconnect: () => Promise<void>;
59
+ /**
60
+ * Get AI-friendly ARIA snapshot for a page.
61
+ * Returns YAML format with refs like [ref=e1], [ref=e2].
62
+ * Refs are stored on window.__devBrowserRefs for cross-connection persistence.
63
+ */
64
+ getAISnapshot: (name: string) => Promise<string>;
65
+ /**
66
+ * Get an element handle by its ref from the last getAISnapshot call.
67
+ * Refs persist across Playwright connections.
68
+ */
69
+ selectSnapshotRef: (name: string, ref: string) => Promise<ElementHandle | null>;
70
+ /**
71
+ * Get server information including mode and extension connection status.
72
+ */
73
+ getServerInfo: () => Promise<ServerInfo>;
74
+ }
75
+ interface TargetLookupSession {
76
+ send(method: "Target.getTargetInfo"): Promise<{
77
+ targetInfo: {
78
+ targetId: string;
79
+ };
80
+ }>;
81
+ detach(): Promise<void>;
82
+ }
83
+ interface TargetLookupContext<TPage> {
84
+ pages(): TPage[];
85
+ newCDPSession(page: TPage): Promise<TargetLookupSession>;
86
+ }
87
+ interface TargetLookupBrowser<TPage> {
88
+ contexts(): Array<TargetLookupContext<TPage>>;
89
+ }
90
+ export declare function findPageByTargetId<TPage>(browser: TargetLookupBrowser<TPage>, targetId: string): Promise<TPage | null>;
91
+ export declare function connect(serverUrl?: string): Promise<DevBrowserClient>;
92
+ export {};
93
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,KAAK,IAAI,EAAE,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AACnF,OAAO,KAAK,EAIV,YAAY,EACb,MAAM,YAAY,CAAC;AAGpB;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,kDAAkD;IAClD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,wDAAwD;IACxD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,2EAA2E;IAC3E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wEAAwE;IACxE,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,4CAA4C;IAC5C,OAAO,EAAE,OAAO,CAAC;IACjB,yCAAyC;IACzC,UAAU,EAAE,MAAM,CAAC;IACnB,uDAAuD;IACvD,eAAe,EAAE,MAAM,CAAC;IACxB,+BAA+B;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,kCAAkC;IAClC,QAAQ,EAAE,OAAO,CAAC;CACnB;AAcD;;;;;;;;GAQG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,IAAI,EACV,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,qBAAqB,CAAC,CAmDhC;AA8FD,8BAA8B;AAC9B,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,YAAY,GAAG,WAAW,CAAC;IACjC,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,kCAAkC;IAClC,QAAQ,CAAC,EAAE,YAAY,CAAC;CACzB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7D,IAAI,EAAE,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9B,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC;;;;OAIG;IACH,aAAa,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACjD;;;OAGG;IACH,iBAAiB,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC;IAChF;;OAEG;IACH,aAAa,EAAE,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC;CAC1C;AAED,UAAU,mBAAmB;IAC3B,IAAI,CAAC,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAAC;QAAE,UAAU,EAAE;YAAE,QAAQ,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAC,CAAC;IACpF,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACzB;AAED,UAAU,mBAAmB,CAAC,KAAK;IACjC,KAAK,IAAI,KAAK,EAAE,CAAC;IACjB,aAAa,CAAC,IAAI,EAAE,KAAK,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;CAC1D;AAED,UAAU,mBAAmB,CAAC,KAAK;IACjC,QAAQ,IAAI,KAAK,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC;CAC/C;AAED,wBAAsB,kBAAkB,CAAC,KAAK,EAC5C,OAAO,EAAE,mBAAmB,CAAC,KAAK,CAAC,EACnC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,CAmBvB;AAED,wBAAsB,OAAO,CAAC,SAAS,SAA0B,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA8I5F"}