abelworkflow 0.9.2 → 1.0.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 +54 -182
- package/bin/abelworkflow.mjs +5 -3
- package/extensions/pi-gpt-responses-compat/index.ts +1 -1
- package/lib/cli/args.mjs +76 -0
- package/lib/cli/main.mjs +385 -0
- package/lib/cli/prompts.mjs +106 -0
- package/lib/config/dotenv.mjs +102 -0
- package/lib/config/jsonc.mjs +80 -0
- package/lib/config/store.mjs +310 -0
- package/lib/config/toml.mjs +638 -0
- package/lib/installer/assets.mjs +324 -0
- package/lib/installer/install.mjs +153 -0
- package/lib/installer/links.mjs +427 -0
- package/lib/installer/state.mjs +163 -0
- package/lib/paths.mjs +99 -0
- package/lib/providers/claude.mjs +197 -0
- package/lib/providers/codex.mjs +433 -0
- package/lib/providers/pi.mjs +577 -0
- package/lib/providers/skills.mjs +105 -0
- package/lib/templates/codex/agents/default.toml +7 -0
- package/lib/templates/codex/agents/explorer.toml +7 -0
- package/lib/templates/codex/agents/planner.toml +7 -0
- package/lib/templates/codex/agents/reviewer.toml +7 -0
- package/lib/templates/codex/agents/worker.toml +7 -0
- package/lib/templates/codex/config-base.toml +11 -3
- package/lib/templates/workflow/AGENTS.md +50 -0
- package/lib/templates/workflow/commands/abel-design.md +175 -0
- package/{commands → lib/templates/workflow/commands}/abel-diagnose.md +5 -5
- package/lib/templates/workflow/commands/abel-implement.md +170 -0
- package/{commands → lib/templates/workflow/commands}/abel-init.md +3 -5
- package/{.gitignore → lib/templates/workflow/gitignore.template} +0 -2
- package/lib/tools/cli-installer.mjs +277 -0
- package/package.json +37 -10
- package/skills/context7-auto-research/SKILL.md +5 -5
- package/skills/context7-auto-research/{context7-api.js → context7-api.cjs} +5 -8
- package/skills/dev-browser/SKILL.md +53 -33
- package/skills/dev-browser/dist/scripts/start.d.ts +2 -0
- package/skills/dev-browser/dist/scripts/start.d.ts.map +1 -0
- package/skills/dev-browser/dist/scripts/start.js +118 -0
- package/skills/dev-browser/dist/scripts/start.js.map +1 -0
- package/skills/dev-browser/dist/src/client.d.ts +93 -0
- package/skills/dev-browser/dist/src/client.d.ts.map +1 -0
- package/skills/dev-browser/dist/src/client.js +310 -0
- package/skills/dev-browser/dist/src/client.js.map +1 -0
- package/skills/dev-browser/dist/src/entrypoint.d.ts +29 -0
- package/skills/dev-browser/dist/src/entrypoint.d.ts.map +1 -0
- package/skills/dev-browser/dist/src/entrypoint.js +106 -0
- package/skills/dev-browser/dist/src/entrypoint.js.map +1 -0
- package/skills/dev-browser/dist/src/index.d.ts +4 -0
- package/skills/dev-browser/dist/src/index.d.ts.map +1 -0
- package/skills/dev-browser/dist/src/index.js +2 -0
- package/skills/dev-browser/dist/src/index.js.map +1 -0
- package/skills/dev-browser/dist/src/page-api.d.ts +25 -0
- package/skills/dev-browser/dist/src/page-api.d.ts.map +1 -0
- package/skills/dev-browser/dist/src/page-api.js +104 -0
- package/skills/dev-browser/dist/src/page-api.js.map +1 -0
- package/skills/dev-browser/dist/src/relay.d.ts +27 -0
- package/skills/dev-browser/dist/src/relay.d.ts.map +1 -0
- package/skills/dev-browser/dist/src/relay.js +521 -0
- package/skills/dev-browser/dist/src/relay.js.map +1 -0
- package/skills/dev-browser/dist/src/runtime.d.ts +45 -0
- package/skills/dev-browser/dist/src/runtime.d.ts.map +1 -0
- package/skills/dev-browser/dist/src/runtime.js +54 -0
- package/skills/dev-browser/dist/src/runtime.js.map +1 -0
- package/skills/dev-browser/dist/src/snapshot/browser-script.d.ts +23 -0
- package/skills/dev-browser/dist/src/snapshot/browser-script.d.ts.map +1 -0
- package/skills/dev-browser/{src/snapshot/browser-script.ts → dist/src/snapshot/browser-script.js} +21 -30
- package/skills/dev-browser/dist/src/snapshot/browser-script.js.map +1 -0
- package/skills/dev-browser/dist/src/snapshot/index.d.ts +14 -0
- package/skills/dev-browser/dist/src/snapshot/index.d.ts.map +1 -0
- package/skills/dev-browser/{src/snapshot/index.ts → dist/src/snapshot/index.js} +2 -2
- package/skills/dev-browser/dist/src/snapshot/index.js.map +1 -0
- package/skills/dev-browser/dist/src/snapshot/inject.d.ts +13 -0
- package/skills/dev-browser/dist/src/snapshot/inject.d.ts.map +1 -0
- package/skills/dev-browser/{src/snapshot/inject.ts → dist/src/snapshot/inject.js} +2 -2
- package/skills/dev-browser/dist/src/snapshot/inject.js.map +1 -0
- package/skills/dev-browser/dist/src/standalone.d.ts +32 -0
- package/skills/dev-browser/dist/src/standalone.d.ts.map +1 -0
- package/skills/dev-browser/dist/src/standalone.js +174 -0
- package/skills/dev-browser/dist/src/standalone.js.map +1 -0
- package/skills/dev-browser/dist/src/startup.d.ts +55 -0
- package/skills/dev-browser/dist/src/startup.d.ts.map +1 -0
- package/skills/dev-browser/dist/src/startup.js +81 -0
- package/skills/dev-browser/dist/src/startup.js.map +1 -0
- package/skills/dev-browser/dist/src/target-registry.d.ts +29 -0
- package/skills/dev-browser/dist/src/target-registry.d.ts.map +1 -0
- package/skills/dev-browser/dist/src/target-registry.js +135 -0
- package/skills/dev-browser/dist/src/target-registry.js.map +1 -0
- package/skills/dev-browser/dist/src/types.d.ts +27 -0
- package/skills/dev-browser/dist/src/types.d.ts.map +1 -0
- package/skills/dev-browser/dist/src/types.js +2 -0
- package/skills/dev-browser/dist/src/types.js.map +1 -0
- package/skills/dev-browser/package-lock.json +67 -1510
- package/skills/dev-browser/package.json +18 -14
- package/skills/dev-browser/references/scraping.md +94 -105
- package/skills/grok-search/.env.example +3 -3
- package/skills/grok-search/SKILL.md +1 -1
- package/skills/grok-search/defaults.json +3 -0
- package/skills/grok-search/gitignore.template +4 -0
- package/skills/grok-search/scripts/_dotenv.py +5 -1
- package/skills/grok-search/scripts/groksearch_cli.py +15 -33
- package/skills/prompt-enhancer/SKILL.md +2 -27
- package/skills/prompt-enhancer/TEMPLATE.md +0 -4
- package/.skill-lock.json +0 -29
- package/AGENTS.md +0 -45
- package/commands/abel-implement.md +0 -157
- package/commands/abel-plan.md +0 -88
- package/commands/abel-research.md +0 -126
- package/lib/cli/logic.mjs +0 -213
- package/lib/cli.mjs +0 -3016
- package/skills/confidence-check/SKILL.md +0 -34
- package/skills/confidence-check/confidence.ts +0 -276
- package/skills/dev-browser/bun.lock +0 -460
- package/skills/dev-browser/scripts/start.ts +0 -280
- package/skills/dev-browser/src/client.ts +0 -474
- package/skills/dev-browser/src/entrypoint.ts +0 -157
- package/skills/dev-browser/src/index.ts +0 -289
- package/skills/dev-browser/src/relay.ts +0 -731
- package/skills/dev-browser/src/runtime.test.ts +0 -60
- package/skills/dev-browser/src/runtime.ts +0 -171
- package/skills/dev-browser/src/startup.test.ts +0 -95
- package/skills/dev-browser/src/startup.ts +0 -153
- package/skills/dev-browser/src/types.ts +0 -35
- package/skills/dev-browser/tsconfig.json +0 -36
- package/skills/dev-browser/vitest.config.ts +0 -12
- package/skills/prompt-enhancer/.env.example +0 -12
- package/skills/prompt-enhancer/ADVANCED.md +0 -103
- package/skills/prompt-enhancer/requirements.txt +0 -2
- package/skills/prompt-enhancer/scripts/_dotenv.py +0 -28
- package/skills/prompt-enhancer/scripts/enhance.py +0 -191
- package/skills/prompt-enhancer/scripts/prompt_enhancer_entry.py +0 -253
- package/skills/sequential-think/SKILL.md +0 -198
- package/skills/sequential-think/scripts/.env.example +0 -5
- package/skills/sequential-think/scripts/sequential_think_cli.py +0 -253
|
@@ -1,280 +0,0 @@
|
|
|
1
|
-
import { existsSync, mkdirSync, readFileSync, readdirSync } from "node:fs";
|
|
2
|
-
import { spawn, spawnSync } from "node:child_process";
|
|
3
|
-
import { join } from "node:path";
|
|
4
|
-
|
|
5
|
-
import { formatHttpUrl, parseEntrypointArgs, resolveHostForProbe } from "@/entrypoint.js";
|
|
6
|
-
import {
|
|
7
|
-
commandExists,
|
|
8
|
-
findAvailablePackageManager,
|
|
9
|
-
getMissingPackageDependencies,
|
|
10
|
-
isPlaywrightChromiumInstalled,
|
|
11
|
-
resolveSkillDirFromEntrypoint,
|
|
12
|
-
resolveRuntimePaths,
|
|
13
|
-
shouldUseShellForPackageCommands,
|
|
14
|
-
} from "@/runtime.js";
|
|
15
|
-
import {
|
|
16
|
-
ensurePlaywrightChromium,
|
|
17
|
-
preflightStandaloneStartup,
|
|
18
|
-
runEntrypoint,
|
|
19
|
-
} from "@/startup.js";
|
|
20
|
-
|
|
21
|
-
const runtimePaths = resolveRuntimePaths(resolveSkillDirFromEntrypoint(import.meta.url));
|
|
22
|
-
const useShell = shouldUseShellForPackageCommands(process.platform);
|
|
23
|
-
|
|
24
|
-
async function main() {
|
|
25
|
-
const args = parseEntrypointArgs(process.argv.slice(2));
|
|
26
|
-
await ensureSkillDependencies();
|
|
27
|
-
|
|
28
|
-
await runEntrypoint(args, {
|
|
29
|
-
runtimePaths,
|
|
30
|
-
mkdir: mkdirSync,
|
|
31
|
-
serveStandalone: async (options) => {
|
|
32
|
-
const { serve } = await import("@/index.js");
|
|
33
|
-
return serve(options);
|
|
34
|
-
},
|
|
35
|
-
serveExtension: async (options) => {
|
|
36
|
-
const { serveRelay } = await import("@/relay.js");
|
|
37
|
-
return serveRelay(options);
|
|
38
|
-
},
|
|
39
|
-
registerShutdown,
|
|
40
|
-
keepAlive: () => new Promise(() => {}),
|
|
41
|
-
log: (line) => console.log(line),
|
|
42
|
-
ensureBrowser: () =>
|
|
43
|
-
ensurePlaywrightChromium({
|
|
44
|
-
isInstalled: () =>
|
|
45
|
-
isPlaywrightChromiumInstalled({
|
|
46
|
-
skillDir: runtimePaths.skillDir,
|
|
47
|
-
platform: process.platform,
|
|
48
|
-
env: process.env,
|
|
49
|
-
exists: existsSync,
|
|
50
|
-
readDir: readdirSync,
|
|
51
|
-
}),
|
|
52
|
-
findPackageManager: () =>
|
|
53
|
-
findAvailablePackageManager((command) =>
|
|
54
|
-
commandExists(command, (candidate) =>
|
|
55
|
-
spawnSync(candidate, ["--version"], {
|
|
56
|
-
stdio: "ignore",
|
|
57
|
-
shell: useShell,
|
|
58
|
-
windowsHide: useShell,
|
|
59
|
-
})
|
|
60
|
-
)
|
|
61
|
-
),
|
|
62
|
-
runCommand,
|
|
63
|
-
log: (line) => console.log(line),
|
|
64
|
-
}),
|
|
65
|
-
preflightStandalone: () =>
|
|
66
|
-
preflightStandaloneStartup(args, {
|
|
67
|
-
checkServer: async (host, port) => {
|
|
68
|
-
try {
|
|
69
|
-
const response = await fetch(formatHttpUrl(resolveHostForProbe(host), port), {
|
|
70
|
-
signal: AbortSignal.timeout(1000),
|
|
71
|
-
});
|
|
72
|
-
if (!response.ok) {
|
|
73
|
-
return { ok: false };
|
|
74
|
-
}
|
|
75
|
-
const info = (await response.json()) as { wsEndpoint?: string };
|
|
76
|
-
return { ok: true, info };
|
|
77
|
-
} catch {
|
|
78
|
-
return { ok: false };
|
|
79
|
-
}
|
|
80
|
-
},
|
|
81
|
-
isPortInUse,
|
|
82
|
-
browserDataDir: runtimePaths.browserDataDir,
|
|
83
|
-
recoverStaleBrowser: ({ cdpPort, browserDataDir }) =>
|
|
84
|
-
recoverStaleDevBrowserChromium({
|
|
85
|
-
cdpPort,
|
|
86
|
-
browserDataDir,
|
|
87
|
-
isPortInUse,
|
|
88
|
-
log: (line) => console.log(line),
|
|
89
|
-
}),
|
|
90
|
-
log: (line) => console.log(line),
|
|
91
|
-
}),
|
|
92
|
-
});
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
async function ensureSkillDependencies() {
|
|
96
|
-
const packageJson = JSON.parse(readFileSync(join(runtimePaths.skillDir, "package.json"), "utf8")) as {
|
|
97
|
-
dependencies?: Record<string, string>;
|
|
98
|
-
};
|
|
99
|
-
const missingDependencies = getMissingPackageDependencies({
|
|
100
|
-
skillDir: runtimePaths.skillDir,
|
|
101
|
-
dependencies: Object.keys(packageJson.dependencies ?? {}),
|
|
102
|
-
exists: existsSync,
|
|
103
|
-
});
|
|
104
|
-
|
|
105
|
-
if (missingDependencies.length === 0) {
|
|
106
|
-
return;
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
console.log("dev-browser dependencies not found. Installing local packages...");
|
|
110
|
-
await runCommand("npm", ["install"]);
|
|
111
|
-
console.log("dev-browser dependencies installed.");
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
async function runCommand(command: string, args: string[]) {
|
|
115
|
-
await new Promise<void>((resolve, reject) => {
|
|
116
|
-
const child = spawn(command, args, {
|
|
117
|
-
cwd: runtimePaths.skillDir,
|
|
118
|
-
stdio: "inherit",
|
|
119
|
-
shell: useShell,
|
|
120
|
-
windowsHide: useShell,
|
|
121
|
-
});
|
|
122
|
-
child.on("error", reject);
|
|
123
|
-
child.on("close", (code) => {
|
|
124
|
-
if (code === 0) {
|
|
125
|
-
resolve();
|
|
126
|
-
return;
|
|
127
|
-
}
|
|
128
|
-
reject(new Error(`${command} ${args.join(" ")} exited with code ${code}`));
|
|
129
|
-
});
|
|
130
|
-
});
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
async function isPortInUse(port: number) {
|
|
134
|
-
const socket = await import("node:net");
|
|
135
|
-
return await new Promise<boolean>((resolve) => {
|
|
136
|
-
const server = socket.createServer();
|
|
137
|
-
server.once("error", () => resolve(true));
|
|
138
|
-
server.once("listening", () => {
|
|
139
|
-
server.close(() => resolve(false));
|
|
140
|
-
});
|
|
141
|
-
server.listen(port, "127.0.0.1");
|
|
142
|
-
});
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
async function recoverStaleDevBrowserChromium({
|
|
146
|
-
cdpPort,
|
|
147
|
-
browserDataDir,
|
|
148
|
-
isPortInUse,
|
|
149
|
-
log,
|
|
150
|
-
}: {
|
|
151
|
-
cdpPort: number;
|
|
152
|
-
browserDataDir: string;
|
|
153
|
-
isPortInUse: (port: number) => Promise<boolean>;
|
|
154
|
-
log: (line: string) => void;
|
|
155
|
-
}) {
|
|
156
|
-
const pid = findListeningPid(cdpPort);
|
|
157
|
-
if (!pid) {
|
|
158
|
-
return false;
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
const commandLine = readProcessCommandLine(pid);
|
|
162
|
-
if (!commandLine || !isOwnedDevBrowserProcess(commandLine, browserDataDir, cdpPort)) {
|
|
163
|
-
return false;
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
log(`Cleaning up stale dev-browser Chromium on CDP port ${cdpPort} (PID: ${pid})`);
|
|
167
|
-
if (!terminateProcess(pid)) {
|
|
168
|
-
return false;
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
const deadline = Date.now() + 3000;
|
|
172
|
-
while (Date.now() < deadline) {
|
|
173
|
-
if (!(await isPortInUse(cdpPort))) {
|
|
174
|
-
return true;
|
|
175
|
-
}
|
|
176
|
-
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
return !(await isPortInUse(cdpPort));
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
function findListeningPid(port: number): number | null {
|
|
183
|
-
if (process.platform === "win32") {
|
|
184
|
-
const result = runCapture("powershell.exe", [
|
|
185
|
-
"-NoProfile",
|
|
186
|
-
"-Command",
|
|
187
|
-
`Get-NetTCPConnection -LocalPort ${port} -State Listen -ErrorAction SilentlyContinue | Select-Object -ExpandProperty OwningProcess -First 1`,
|
|
188
|
-
]);
|
|
189
|
-
return parsePid(result.stdout);
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
const result = runCapture("lsof", ["-nP", `-iTCP:${port}`, "-sTCP:LISTEN", "-t"]);
|
|
193
|
-
return parsePid(result.stdout);
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
function readProcessCommandLine(pid: number): string | null {
|
|
197
|
-
if (process.platform === "win32") {
|
|
198
|
-
const result = runCapture("powershell.exe", [
|
|
199
|
-
"-NoProfile",
|
|
200
|
-
"-Command",
|
|
201
|
-
`(Get-CimInstance Win32_Process -Filter "ProcessId = ${pid}").CommandLine`,
|
|
202
|
-
]);
|
|
203
|
-
return normalizeOutput(result.stdout);
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
const result = runCapture("ps", ["-p", String(pid), "-o", "args="]);
|
|
207
|
-
return normalizeOutput(result.stdout);
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
function isOwnedDevBrowserProcess(commandLine: string, browserDataDir: string, cdpPort: number): boolean {
|
|
211
|
-
const normalizedCommandLine = normalizePathLike(commandLine);
|
|
212
|
-
const normalizedBrowserDataDir = normalizePathLike(browserDataDir);
|
|
213
|
-
|
|
214
|
-
return (
|
|
215
|
-
normalizedCommandLine.includes(`--remote-debugging-port=${cdpPort}`) &&
|
|
216
|
-
normalizedCommandLine.includes("--user-data-dir=") &&
|
|
217
|
-
normalizedCommandLine.includes(normalizedBrowserDataDir)
|
|
218
|
-
);
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
function terminateProcess(pid: number): boolean {
|
|
222
|
-
if (process.platform === "win32") {
|
|
223
|
-
return runCapture("taskkill", ["/PID", String(pid), "/T", "/F"]).status === 0;
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
try {
|
|
227
|
-
process.kill(pid, "SIGKILL");
|
|
228
|
-
return true;
|
|
229
|
-
} catch (error) {
|
|
230
|
-
return error instanceof Error && "code" in error && error.code === "ESRCH";
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
function runCapture(command: string, args: string[]) {
|
|
235
|
-
const result = spawnSync(command, args, {
|
|
236
|
-
cwd: runtimePaths.skillDir,
|
|
237
|
-
encoding: "utf8",
|
|
238
|
-
shell: false,
|
|
239
|
-
windowsHide: true,
|
|
240
|
-
});
|
|
241
|
-
|
|
242
|
-
return {
|
|
243
|
-
status: result.status,
|
|
244
|
-
stdout: typeof result.stdout === "string" ? result.stdout : "",
|
|
245
|
-
};
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
function parsePid(stdout: string): number | null {
|
|
249
|
-
const value = normalizeOutput(stdout);
|
|
250
|
-
if (!value) {
|
|
251
|
-
return null;
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
const pid = Number.parseInt(value.split(/\s+/)[0] ?? "", 10);
|
|
255
|
-
return Number.isInteger(pid) && pid > 0 ? pid : null;
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
function normalizeOutput(stdout: string): string | null {
|
|
259
|
-
const value = stdout.trim();
|
|
260
|
-
return value.length > 0 ? value : null;
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
function normalizePathLike(value: string): string {
|
|
264
|
-
return value.replaceAll("\\", "/").toLowerCase();
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
function registerShutdown(stop: () => Promise<void>) {
|
|
268
|
-
const shutdown = async () => {
|
|
269
|
-
await stop();
|
|
270
|
-
process.exit(0);
|
|
271
|
-
};
|
|
272
|
-
|
|
273
|
-
process.on("SIGINT", shutdown);
|
|
274
|
-
process.on("SIGTERM", shutdown);
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
main().catch((error) => {
|
|
278
|
-
console.error("Failed to start dev-browser:", error);
|
|
279
|
-
process.exit(1);
|
|
280
|
-
});
|