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.
Files changed (134) hide show
  1. package/README.md +54 -182
  2. package/bin/abelworkflow.mjs +5 -3
  3. package/extensions/pi-gpt-responses-compat/index.ts +1 -1
  4. package/lib/cli/args.mjs +76 -0
  5. package/lib/cli/main.mjs +385 -0
  6. package/lib/cli/prompts.mjs +106 -0
  7. package/lib/config/dotenv.mjs +102 -0
  8. package/lib/config/jsonc.mjs +80 -0
  9. package/lib/config/store.mjs +310 -0
  10. package/lib/config/toml.mjs +638 -0
  11. package/lib/installer/assets.mjs +324 -0
  12. package/lib/installer/install.mjs +153 -0
  13. package/lib/installer/links.mjs +427 -0
  14. package/lib/installer/state.mjs +163 -0
  15. package/lib/paths.mjs +99 -0
  16. package/lib/providers/claude.mjs +197 -0
  17. package/lib/providers/codex.mjs +433 -0
  18. package/lib/providers/pi.mjs +577 -0
  19. package/lib/providers/skills.mjs +105 -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/lib/templates/workflow/AGENTS.md +50 -0
  27. package/lib/templates/workflow/commands/abel-design.md +175 -0
  28. package/{commands → lib/templates/workflow/commands}/abel-diagnose.md +5 -5
  29. package/lib/templates/workflow/commands/abel-implement.md +170 -0
  30. package/{commands → lib/templates/workflow/commands}/abel-init.md +3 -5
  31. package/{.gitignore → lib/templates/workflow/gitignore.template} +0 -2
  32. package/lib/tools/cli-installer.mjs +277 -0
  33. package/package.json +37 -10
  34. package/skills/context7-auto-research/SKILL.md +5 -5
  35. package/skills/context7-auto-research/{context7-api.js → context7-api.cjs} +5 -8
  36. package/skills/dev-browser/SKILL.md +53 -33
  37. package/skills/dev-browser/dist/scripts/start.d.ts +2 -0
  38. package/skills/dev-browser/dist/scripts/start.d.ts.map +1 -0
  39. package/skills/dev-browser/dist/scripts/start.js +118 -0
  40. package/skills/dev-browser/dist/scripts/start.js.map +1 -0
  41. package/skills/dev-browser/dist/src/client.d.ts +93 -0
  42. package/skills/dev-browser/dist/src/client.d.ts.map +1 -0
  43. package/skills/dev-browser/dist/src/client.js +310 -0
  44. package/skills/dev-browser/dist/src/client.js.map +1 -0
  45. package/skills/dev-browser/dist/src/entrypoint.d.ts +29 -0
  46. package/skills/dev-browser/dist/src/entrypoint.d.ts.map +1 -0
  47. package/skills/dev-browser/dist/src/entrypoint.js +106 -0
  48. package/skills/dev-browser/dist/src/entrypoint.js.map +1 -0
  49. package/skills/dev-browser/dist/src/index.d.ts +4 -0
  50. package/skills/dev-browser/dist/src/index.d.ts.map +1 -0
  51. package/skills/dev-browser/dist/src/index.js +2 -0
  52. package/skills/dev-browser/dist/src/index.js.map +1 -0
  53. package/skills/dev-browser/dist/src/page-api.d.ts +25 -0
  54. package/skills/dev-browser/dist/src/page-api.d.ts.map +1 -0
  55. package/skills/dev-browser/dist/src/page-api.js +104 -0
  56. package/skills/dev-browser/dist/src/page-api.js.map +1 -0
  57. package/skills/dev-browser/dist/src/relay.d.ts +27 -0
  58. package/skills/dev-browser/dist/src/relay.d.ts.map +1 -0
  59. package/skills/dev-browser/dist/src/relay.js +521 -0
  60. package/skills/dev-browser/dist/src/relay.js.map +1 -0
  61. package/skills/dev-browser/dist/src/runtime.d.ts +45 -0
  62. package/skills/dev-browser/dist/src/runtime.d.ts.map +1 -0
  63. package/skills/dev-browser/dist/src/runtime.js +54 -0
  64. package/skills/dev-browser/dist/src/runtime.js.map +1 -0
  65. package/skills/dev-browser/dist/src/snapshot/browser-script.d.ts +23 -0
  66. package/skills/dev-browser/dist/src/snapshot/browser-script.d.ts.map +1 -0
  67. package/skills/dev-browser/{src/snapshot/browser-script.ts → dist/src/snapshot/browser-script.js} +21 -30
  68. package/skills/dev-browser/dist/src/snapshot/browser-script.js.map +1 -0
  69. package/skills/dev-browser/dist/src/snapshot/index.d.ts +14 -0
  70. package/skills/dev-browser/dist/src/snapshot/index.d.ts.map +1 -0
  71. package/skills/dev-browser/{src/snapshot/index.ts → dist/src/snapshot/index.js} +2 -2
  72. package/skills/dev-browser/dist/src/snapshot/index.js.map +1 -0
  73. package/skills/dev-browser/dist/src/snapshot/inject.d.ts +13 -0
  74. package/skills/dev-browser/dist/src/snapshot/inject.d.ts.map +1 -0
  75. package/skills/dev-browser/{src/snapshot/inject.ts → dist/src/snapshot/inject.js} +2 -2
  76. package/skills/dev-browser/dist/src/snapshot/inject.js.map +1 -0
  77. package/skills/dev-browser/dist/src/standalone.d.ts +32 -0
  78. package/skills/dev-browser/dist/src/standalone.d.ts.map +1 -0
  79. package/skills/dev-browser/dist/src/standalone.js +174 -0
  80. package/skills/dev-browser/dist/src/standalone.js.map +1 -0
  81. package/skills/dev-browser/dist/src/startup.d.ts +55 -0
  82. package/skills/dev-browser/dist/src/startup.d.ts.map +1 -0
  83. package/skills/dev-browser/dist/src/startup.js +81 -0
  84. package/skills/dev-browser/dist/src/startup.js.map +1 -0
  85. package/skills/dev-browser/dist/src/target-registry.d.ts +29 -0
  86. package/skills/dev-browser/dist/src/target-registry.d.ts.map +1 -0
  87. package/skills/dev-browser/dist/src/target-registry.js +135 -0
  88. package/skills/dev-browser/dist/src/target-registry.js.map +1 -0
  89. package/skills/dev-browser/dist/src/types.d.ts +27 -0
  90. package/skills/dev-browser/dist/src/types.d.ts.map +1 -0
  91. package/skills/dev-browser/dist/src/types.js +2 -0
  92. package/skills/dev-browser/dist/src/types.js.map +1 -0
  93. package/skills/dev-browser/package-lock.json +67 -1510
  94. package/skills/dev-browser/package.json +18 -14
  95. package/skills/dev-browser/references/scraping.md +94 -105
  96. package/skills/grok-search/.env.example +3 -3
  97. package/skills/grok-search/SKILL.md +1 -1
  98. package/skills/grok-search/defaults.json +3 -0
  99. package/skills/grok-search/gitignore.template +4 -0
  100. package/skills/grok-search/scripts/_dotenv.py +5 -1
  101. package/skills/grok-search/scripts/groksearch_cli.py +15 -33
  102. package/skills/prompt-enhancer/SKILL.md +2 -27
  103. package/skills/prompt-enhancer/TEMPLATE.md +0 -4
  104. package/.skill-lock.json +0 -29
  105. package/AGENTS.md +0 -45
  106. package/commands/abel-implement.md +0 -157
  107. package/commands/abel-plan.md +0 -88
  108. package/commands/abel-research.md +0 -126
  109. package/lib/cli/logic.mjs +0 -213
  110. package/lib/cli.mjs +0 -3016
  111. package/skills/confidence-check/SKILL.md +0 -34
  112. package/skills/confidence-check/confidence.ts +0 -276
  113. package/skills/dev-browser/bun.lock +0 -460
  114. package/skills/dev-browser/scripts/start.ts +0 -280
  115. package/skills/dev-browser/src/client.ts +0 -474
  116. package/skills/dev-browser/src/entrypoint.ts +0 -157
  117. package/skills/dev-browser/src/index.ts +0 -289
  118. package/skills/dev-browser/src/relay.ts +0 -731
  119. package/skills/dev-browser/src/runtime.test.ts +0 -60
  120. package/skills/dev-browser/src/runtime.ts +0 -171
  121. package/skills/dev-browser/src/startup.test.ts +0 -95
  122. package/skills/dev-browser/src/startup.ts +0 -153
  123. package/skills/dev-browser/src/types.ts +0 -35
  124. package/skills/dev-browser/tsconfig.json +0 -36
  125. package/skills/dev-browser/vitest.config.ts +0 -12
  126. package/skills/prompt-enhancer/.env.example +0 -12
  127. package/skills/prompt-enhancer/ADVANCED.md +0 -103
  128. package/skills/prompt-enhancer/requirements.txt +0 -2
  129. package/skills/prompt-enhancer/scripts/_dotenv.py +0 -28
  130. package/skills/prompt-enhancer/scripts/enhance.py +0 -191
  131. package/skills/prompt-enhancer/scripts/prompt_enhancer_entry.py +0 -253
  132. package/skills/sequential-think/SKILL.md +0 -198
  133. package/skills/sequential-think/scripts/.env.example +0 -5
  134. 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
- });