alanbox 0.1.2 → 0.1.3

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 (82) hide show
  1. package/0boxer/AGENTS.md +25 -0
  2. package/0boxer/src/AGENTS.md +16 -0
  3. package/0boxer/src/cli.js +53 -0
  4. package/0boxer/src/commands/AGENTS.md +15 -0
  5. package/{0commondflowv1 → 0boxer}/src/commands/install.js +9 -0
  6. package/{0commondflowv1 → 1swarmer}/AGENTS.md +11 -12
  7. package/{0commondflowv1 → 1swarmer}/src/AGENTS.md +6 -5
  8. package/{0commondflowv1 → 1swarmer}/src/args.js +1 -1
  9. package/{0commondflowv1 → 1swarmer}/src/cli.js +5 -21
  10. package/{0commondflowv1 → 1swarmer}/src/commands/AGENTS.md +7 -8
  11. package/{0commondflowv1 → 1swarmer}/src/commands/doctor.js +2 -2
  12. package/{0commondflowv1 → 1swarmer}/src/core/AGENTS.md +2 -2
  13. package/{0commondflowv1 → 1swarmer}/src/core/prompt-templates.js +1 -1
  14. package/{0commondflowv1 → 1swarmer}/src/core/storage.js +1 -1
  15. package/{0commondflowv1 → 1swarmer}/src/prompt/AGENTS.md +1 -1
  16. package/{0commondflowv1 → 1swarmer}/src/prompt/default.md +1 -1
  17. package/{0commondflowv1 → 1swarmer}/src/prompt/synthesizer.md +1 -1
  18. package/{0commondflowv1 → 1swarmer}/src/prompt/verifier.md +1 -1
  19. package/{0commondflowv1 → 1swarmer}/src/runner/AGENTS.md +3 -3
  20. package/2designer/LICENSE +21 -0
  21. package/2designer/README.md +39 -0
  22. package/2designer/dist/cdp-engine-A5WTMTVF.js +10 -0
  23. package/2designer/dist/cdp-engine-A5WTMTVF.js.map +1 -0
  24. package/2designer/dist/cdp-engine-JK2XVDHK.js +314 -0
  25. package/2designer/dist/cdp-engine-JK2XVDHK.js.map +1 -0
  26. package/2designer/dist/chunk-JVF26NXD.js +313 -0
  27. package/2designer/dist/chunk-JVF26NXD.js.map +1 -0
  28. package/2designer/dist/chunk-NLYFLQ3C.js +74 -0
  29. package/2designer/dist/chunk-NLYFLQ3C.js.map +1 -0
  30. package/2designer/dist/chunk-NQ3ASZUE.js +185 -0
  31. package/2designer/dist/chunk-NQ3ASZUE.js.map +1 -0
  32. package/2designer/dist/chunk-SKEIVBOU.js +58 -0
  33. package/2designer/dist/chunk-SKEIVBOU.js.map +1 -0
  34. package/2designer/dist/chunk-UVKSRKXR.js +71 -0
  35. package/2designer/dist/chunk-UVKSRKXR.js.map +1 -0
  36. package/2designer/dist/cli.js +498 -0
  37. package/2designer/dist/cli.js.map +1 -0
  38. package/2designer/dist/index.d.ts +129 -0
  39. package/2designer/dist/index.js +230 -0
  40. package/2designer/dist/index.js.map +1 -0
  41. package/2designer/dist/playwright-engine-3YKJOUNU.js +8 -0
  42. package/2designer/dist/playwright-engine-3YKJOUNU.js.map +1 -0
  43. package/2designer/dist/playwright-engine-YBRDIUHF.js +186 -0
  44. package/2designer/dist/playwright-engine-YBRDIUHF.js.map +1 -0
  45. package/2designer/dist/tint-I3FTT23O.js +60 -0
  46. package/2designer/dist/tint-I3FTT23O.js.map +1 -0
  47. package/2designer/dist/tint-RUSSUAWA.js +7 -0
  48. package/2designer/dist/tint-RUSSUAWA.js.map +1 -0
  49. package/2designer/package.json +56 -0
  50. package/README.md +11 -8
  51. package/bin/alanbox.js +11 -0
  52. package/bin/designer.js +10 -0
  53. package/bin/swarmer.js +11 -0
  54. package/cli.js +153 -0
  55. package/hooks/hooks.json +1 -1
  56. package/package.json +24 -11
  57. package/plugin/AGENTS.md +2 -2
  58. package/plugin/plugin.json +7 -7
  59. package/shared/AGENTS.md +15 -0
  60. package/shared/package-args.js +68 -0
  61. package/skills/AGENTS.md +9 -5
  62. package/skills/aitool/SKILL.md +36 -0
  63. package/skills/desginer/SKILL.md +122 -0
  64. package/skills/swarmer/SKILL.md +109 -0
  65. package/bin/multirunagent.js +0 -15
  66. package/skills/aibox-swam/SKILL.md +0 -77
  67. package/skills/sub-codex-doctor/SKILL.md +0 -27
  68. package/skills/sub-codex-swarm/SKILL.md +0 -56
  69. /package/{0commondflowv1 → 1swarmer}/res/three-lens-review.js +0 -0
  70. /package/{0commondflowv1 → 1swarmer}/src/commands/info.js +0 -0
  71. /package/{0commondflowv1 → 1swarmer}/src/commands/swarm/auto.js +0 -0
  72. /package/{0commondflowv1 → 1swarmer}/src/commands/swarm/custom.js +0 -0
  73. /package/{0commondflowv1 → 1swarmer}/src/commands/swarm/index.js +0 -0
  74. /package/{0commondflowv1 → 1swarmer}/src/core/handoff.js +0 -0
  75. /package/{0commondflowv1 → 1swarmer}/src/core/prompt-builder.js +0 -0
  76. /package/{0commondflowv1 → 1swarmer}/src/core/swarm-executor.js +0 -0
  77. /package/{0commondflowv1 → 1swarmer}/src/core/workers.js +0 -0
  78. /package/{0commondflowv1 → 1swarmer}/src/core/workflow-planner.js +0 -0
  79. /package/{0commondflowv1 → 1swarmer}/src/core/workflow-storage.js +0 -0
  80. /package/{0commondflowv1 → 1swarmer}/src/prompt/reviewer.md +0 -0
  81. /package/{0commondflowv1 → 1swarmer}/src/runner/codex-runner.js +0 -0
  82. /package/{0commondflowv1 → 1swarmer}/src/runner/config.json +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/overlay/tint.ts"],"sourcesContent":["import sharp from 'sharp'\r\n\r\nexport type TintMode = 'magenta' | 'ghost' | 'difference'\r\n\r\n/**\r\n * Process a design image for overlay compositing.\r\n *\r\n * Modes:\r\n * - 'magenta': Tint non-white pixels magenta (best for white/light backgrounds)\r\n * - 'ghost': Reduce opacity uniformly (works on any background color)\r\n * - 'difference': No preprocessing — caller should use 'difference' blend mode\r\n *\r\n * Returns a PNG buffer with alpha channel.\r\n */\r\nexport async function tintDesignImage(\r\n imagePath: string,\r\n mode: TintMode = 'auto' as any,\r\n): Promise<Buffer> {\r\n const { data, info } = await sharp(imagePath)\r\n .ensureAlpha()\r\n .raw()\r\n .toBuffer({ resolveWithObject: true })\r\n\r\n const pixels = new Uint8Array(data.buffer)\r\n\r\n // Auto-detect: check if background is white/light\r\n const resolvedMode = mode === ('auto' as any) ? detectMode(pixels) : mode\r\n\r\n if (resolvedMode === 'magenta') {\r\n return tintMagenta(pixels, info)\r\n }\r\n\r\n if (resolvedMode === 'difference') {\r\n // Return as-is for difference blend\r\n return sharp(imagePath).ensureAlpha().png().toBuffer()\r\n }\r\n\r\n // ghost mode: uniform opacity reduction\r\n return tintGhost(pixels, info, 0.4)\r\n}\r\n\r\nfunction detectMode(pixels: Uint8Array): TintMode {\r\n // Sample corners + edges to detect background color\r\n // If most sampled pixels are bright (>220), use magenta mode\r\n // Otherwise use ghost mode\r\n let brightCount = 0\r\n const sampleSize = Math.min(pixels.length / 4, 1000)\r\n const step = Math.floor(pixels.length / 4 / sampleSize)\r\n\r\n for (let i = 0; i < sampleSize; i++) {\r\n const idx = i * step * 4\r\n const brightness = (pixels[idx] + pixels[idx + 1] + pixels[idx + 2]) / 3\r\n if (brightness > 220) brightCount++\r\n }\r\n\r\n return (brightCount / sampleSize) > 0.5 ? 'magenta' : 'ghost'\r\n}\r\n\r\nconst LIGHT_THRESHOLD = 230\r\nconst MAGENTA: [number, number, number] = [220, 40, 160]\r\n\r\nfunction tintMagenta(\r\n pixels: Uint8Array,\r\n info: { width: number; height: number },\r\n): Promise<Buffer> {\r\n for (let i = 0; i < pixels.length; i += 4) {\r\n const r = pixels[i], g = pixels[i + 1], b = pixels[i + 2]\r\n const brightness = (r + g + b) / 3\r\n\r\n if (brightness > LIGHT_THRESHOLD) {\r\n pixels[i + 3] = 0\r\n } else {\r\n const darkness = 1 - brightness / 255\r\n pixels[i] = MAGENTA[0]\r\n pixels[i + 1] = MAGENTA[1]\r\n pixels[i + 2] = MAGENTA[2]\r\n pixels[i + 3] = Math.round(darkness * 200)\r\n }\r\n }\r\n\r\n return sharp(Buffer.from(pixels.buffer), {\r\n raw: { width: info.width, height: info.height, channels: 4 },\r\n })\r\n .png()\r\n .toBuffer()\r\n}\r\n\r\nfunction tintGhost(\r\n pixels: Uint8Array,\r\n info: { width: number; height: number },\r\n opacity: number,\r\n): Promise<Buffer> {\r\n for (let i = 0; i < pixels.length; i += 4) {\r\n pixels[i + 3] = Math.round(pixels[i + 3] * opacity)\r\n }\r\n\r\n return sharp(Buffer.from(pixels.buffer), {\r\n raw: { width: info.width, height: info.height, channels: 4 },\r\n })\r\n .png()\r\n .toBuffer()\r\n}\r\n"],"mappings":";;;;AAAA,OAAO,WAAW;AAclB,eAAsB,gBACpB,WACA,OAAiB,QACA;AACjB,QAAM,EAAE,MAAM,KAAK,IAAI,MAAM,MAAM,SAAS,EACzC,YAAY,EACZ,IAAI,EACJ,SAAS,EAAE,mBAAmB,KAAK,CAAC;AAEvC,QAAM,SAAS,IAAI,WAAW,KAAK,MAAM;AAGzC,QAAM,eAAe,SAAU,SAAiB,WAAW,MAAM,IAAI;AAErE,MAAI,iBAAiB,WAAW;AAC9B,WAAO,YAAY,QAAQ,IAAI;AAAA,EACjC;AAEA,MAAI,iBAAiB,cAAc;AAEjC,WAAO,MAAM,SAAS,EAAE,YAAY,EAAE,IAAI,EAAE,SAAS;AAAA,EACvD;AAGA,SAAO,UAAU,QAAQ,MAAM,GAAG;AACpC;AAEA,SAAS,WAAW,QAA8B;AAIhD,MAAI,cAAc;AAClB,QAAM,aAAa,KAAK,IAAI,OAAO,SAAS,GAAG,GAAI;AACnD,QAAM,OAAO,KAAK,MAAM,OAAO,SAAS,IAAI,UAAU;AAEtD,WAAS,IAAI,GAAG,IAAI,YAAY,KAAK;AACnC,UAAM,MAAM,IAAI,OAAO;AACvB,UAAM,cAAc,OAAO,GAAG,IAAI,OAAO,MAAM,CAAC,IAAI,OAAO,MAAM,CAAC,KAAK;AACvE,QAAI,aAAa,IAAK;AAAA,EACxB;AAEA,SAAQ,cAAc,aAAc,MAAM,YAAY;AACxD;AAEA,IAAM,kBAAkB;AACxB,IAAM,UAAoC,CAAC,KAAK,IAAI,GAAG;AAEvD,SAAS,YACP,QACA,MACiB;AACjB,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK,GAAG;AACzC,UAAM,IAAI,OAAO,CAAC,GAAG,IAAI,OAAO,IAAI,CAAC,GAAG,IAAI,OAAO,IAAI,CAAC;AACxD,UAAM,cAAc,IAAI,IAAI,KAAK;AAEjC,QAAI,aAAa,iBAAiB;AAChC,aAAO,IAAI,CAAC,IAAI;AAAA,IAClB,OAAO;AACL,YAAM,WAAW,IAAI,aAAa;AAClC,aAAO,CAAC,IAAI,QAAQ,CAAC;AACrB,aAAO,IAAI,CAAC,IAAI,QAAQ,CAAC;AACzB,aAAO,IAAI,CAAC,IAAI,QAAQ,CAAC;AACzB,aAAO,IAAI,CAAC,IAAI,KAAK,MAAM,WAAW,GAAG;AAAA,IAC3C;AAAA,EACF;AAEA,SAAO,MAAM,OAAO,KAAK,OAAO,MAAM,GAAG;AAAA,IACvC,KAAK,EAAE,OAAO,KAAK,OAAO,QAAQ,KAAK,QAAQ,UAAU,EAAE;AAAA,EAC7D,CAAC,EACE,IAAI,EACJ,SAAS;AACd;AAEA,SAAS,UACP,QACA,MACA,SACiB;AACjB,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK,GAAG;AACzC,WAAO,IAAI,CAAC,IAAI,KAAK,MAAM,OAAO,IAAI,CAAC,IAAI,OAAO;AAAA,EACpD;AAEA,SAAO,MAAM,OAAO,KAAK,OAAO,MAAM,GAAG;AAAA,IACvC,KAAK,EAAE,OAAO,KAAK,OAAO,QAAQ,KAAK,QAAQ,UAAU,EAAE;AAAA,EAC7D,CAAC,EACE,IAAI,EACJ,SAAS;AACd;","names":[]}
@@ -0,0 +1,7 @@
1
+ import {
2
+ tintDesignImage
3
+ } from "./chunk-SKEIVBOU.js";
4
+ export {
5
+ tintDesignImage
6
+ };
7
+ //# sourceMappingURL=tint-RUSSUAWA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,56 @@
1
+ {
2
+ "name": "designer",
3
+ "version": "0.1.0",
4
+ "description": "Runtime UI measurement CLI for AI agents.",
5
+ "type": "module",
6
+ "bin": {
7
+ "designer": "./dist/cli.js"
8
+ },
9
+ "main": "./dist/index.js",
10
+ "types": "./dist/index.d.ts",
11
+ "scripts": {
12
+ "build": "tsup",
13
+ "dev": "tsup --watch",
14
+ "test": "vitest run",
15
+ "test:watch": "vitest",
16
+ "lint": "tsc --noEmit"
17
+ },
18
+ "files": [
19
+ "dist"
20
+ ],
21
+ "keywords": [
22
+ "design",
23
+ "verification",
24
+ "css",
25
+ "figma",
26
+ "overlay",
27
+ "ai"
28
+ ],
29
+ "license": "MIT",
30
+ "repository": {
31
+ "type": "git",
32
+ "url": "https://github.com/Fzhiyu1/designer.git"
33
+ },
34
+ "packageManager": "pnpm@10.28.2",
35
+ "dependencies": {
36
+ "commander": "^14.0.3",
37
+ "sharp": "^0.34.5",
38
+ "ws": "^8.20.0"
39
+ },
40
+ "devDependencies": {
41
+ "@types/node": "^25.5.2",
42
+ "@types/ws": "^8.18.1",
43
+ "tsup": "^8.5.1",
44
+ "typescript": "^5.8.3",
45
+ "vitest": "^4.1.4"
46
+ },
47
+ "optionalDependencies": {
48
+ "playwright": "^1.59.1"
49
+ },
50
+ "pnpm": {
51
+ "onlyBuiltDependencies": [
52
+ "esbuild",
53
+ "sharp"
54
+ ]
55
+ }
56
+ }
package/README.md CHANGED
@@ -1,8 +1,8 @@
1
1
  # alanbox
2
2
 
3
- `alanbox` is a local worker orchestration CLI for running isolated Codex or Claude child workers.
3
+ `alanbox` is a local AI-tool command package. It routes package resource commands to `0boxer`, worker orchestration to `1swarmer`, and runtime UI measurement to `2designer`.
4
4
 
5
- The current stable workflow is `swam` / `swarm` from `0commondflowv1`.
5
+ The stable worker workflow is still `swarmer` / `swarm` from `1swarmer`.
6
6
 
7
7
  ## Install
8
8
 
@@ -13,21 +13,24 @@ npm install -g alanbox
13
13
  ## Commands
14
14
 
15
15
  ```powershell
16
- alanbox info
16
+ swarmer info
17
17
  alanbox doctor
18
18
  alanbox init
19
19
  alanbox update
20
20
  alanbox install --target codex
21
21
  alanbox install --target claude
22
22
  alanbox install --target both
23
- swam --namespace run-name --worker "codex:reviewer:检查当前改动"
24
- swam --namespace run-name --worker "claude:reviewer:检查当前改动"
23
+ alanbox designer measure --url "http://localhost:3000" --selector ".dialog"
24
+ designer screenshot --url "http://localhost:3000" --output page.png
25
+ swarmer --namespace run-name --worker "codex:reviewer:检查当前改动"
26
+ swarmer --namespace run-name --worker "claude:reviewer:检查当前改动"
25
27
  ```
26
28
 
27
- `alanbox init` and `alanbox update` prompt you to choose Codex, Claude, or both. The package also exposes `swam` as a direct bin, so worker runs do not need the `alanbox` prefix. `multirunagent` remains available as a compatibility bin name.
29
+ `alanbox init` and `alanbox update` prompt you to choose Codex, Claude, or both. The package also exposes `swarmer` and `designer` as direct bins, so those flows do not need the `alanbox` prefix.
28
30
 
29
31
  ## Notes
30
32
 
31
33
  - `init`, `update`, and `install` explicitly copy bundled skills, hooks, scripts, and MCP resource placeholders to Codex and/or Claude homes.
32
- - `1uiflowv1` measure and `2apiflowv1` getapi are not exposed by this npm package yet.
33
- - `swam` is a compatibility alias for `swarm`.
34
+ - `cli.js` is the package-level command router. Keep package resource command parsing inside `0boxer/src/cli.js`, worker parsing inside `1swarmer/src/cli.js`, and UI parsing inside `2designer/dist/cli.js`.
35
+ - `aibox/skills` is the package-level skill installation source. It can include `2designer` workflow guidance. `designer` is now bundled as a direct bin and as `alanbox designer ...`. `3apiflower` getapi is not exposed by this npm package yet.
36
+ - `swarmer` is a compatibility alias for `swarm`.
package/bin/alanbox.js ADDED
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * alanbox package command entry.
5
+ * Keep bin launchers thin and route command handling to package-level cli.js.
6
+ */
7
+
8
+ require('../cli').main().catch((error) => {
9
+ console.error(error.message || error);
10
+ process.exitCode = 1;
11
+ });
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Direct designer bin bundled through alanbox.
5
+ */
6
+
7
+ require('../cli').runDesigner().catch((error) => {
8
+ console.error(error.message || error);
9
+ process.exitCode = error.exitCode || 1;
10
+ });
package/bin/swarmer.js ADDED
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Direct swarmer bin.
5
+ * Keep it mapped to 1swarmer swarm behavior.
6
+ */
7
+
8
+ require('../cli').runSwarmer().catch((error) => {
9
+ console.error(error.message || error);
10
+ process.exitCode = error.exitCode || 1;
11
+ });
package/cli.js ADDED
@@ -0,0 +1,153 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * alanbox 包级命令路由器。
5
+ * 这里只判断进入哪个子流程;各子流程自己的参数解析留在各自实现里。
6
+ */
7
+
8
+ const { existsSync } = require('fs');
9
+ const path = require('path');
10
+ const { spawn } = require('child_process');
11
+
12
+ const BOXER_COMMANDS = new Set(['install', 'init', 'update']);
13
+ const SWARMER_COMMANDS = new Set(['swarm', 'doctor']);
14
+ const DESIGNER_COMMANDS = new Set(['designer']);
15
+
16
+ async function main(argv = process.argv.slice(2)) {
17
+ const command = argv[0] && !argv[0].startsWith('-') ? argv[0] : '';
18
+
19
+ if (!command) {
20
+ if (argv.includes('-h') || argv.includes('--help')) {
21
+ printUsage();
22
+ return;
23
+ }
24
+
25
+ await runCommonFlow(argv);
26
+ return;
27
+ }
28
+
29
+ if (command === 'help') {
30
+ printUsage();
31
+ return;
32
+ }
33
+
34
+ if (command === 'swarmer') {
35
+ await runSwarmer(argv.slice(1));
36
+ return;
37
+ }
38
+
39
+ if (BOXER_COMMANDS.has(command)) {
40
+ await runBoxer(argv);
41
+ return;
42
+ }
43
+
44
+ if (SWARMER_COMMANDS.has(command)) {
45
+ await runSwarmerFlow(argv);
46
+ return;
47
+ }
48
+
49
+ if (DESIGNER_COMMANDS.has(command)) {
50
+ await runDesigner(argv.slice(1));
51
+ return;
52
+ }
53
+
54
+ throw new Error(`unknown alanbox command: ${command}`);
55
+ }
56
+
57
+ async function runSwarmer(argv = process.argv.slice(2)) {
58
+ if (argv[0] === 'info' || argv[0] === 'doctor') {
59
+ await runSwarmerFlow(argv);
60
+ return;
61
+ }
62
+
63
+ await runSwarmerFlow(['swarm', ...argv]);
64
+ }
65
+
66
+ async function runBoxer(argv) {
67
+ await require('./0boxer/src/cli').main(argv);
68
+ }
69
+
70
+ async function runSwarmerFlow(argv) {
71
+ await require('./1swarmer/src/cli').main(argv);
72
+ }
73
+
74
+ async function runCommonFlow(argv) {
75
+ await runSwarmerFlow(argv);
76
+ }
77
+
78
+ async function runDesigner(argv = process.argv.slice(2)) {
79
+ const cliPath = path.join(__dirname, '2designer', 'dist', 'cli.js');
80
+ if (!existsSync(cliPath)) {
81
+ throw new Error(
82
+ 'designer dist/cli.js not found. Build it from 2designer before running this command.',
83
+ );
84
+ }
85
+
86
+ await runNodeCli(cliPath, argv);
87
+ }
88
+
89
+ function runNodeCli(cliPath, argv) {
90
+ return new Promise((resolve, reject) => {
91
+ const child = spawn(process.execPath, [cliPath, ...argv], {
92
+ stdio: 'inherit',
93
+ env: process.env,
94
+ });
95
+
96
+ child.on('error', reject);
97
+ child.on('exit', (code, signal) => {
98
+ if (signal) {
99
+ reject(new Error(`designer exited with signal ${signal}`));
100
+ return;
101
+ }
102
+
103
+ if (code && code !== 0) {
104
+ const error = new Error(`designer exited with code ${code}`);
105
+ error.exitCode = code;
106
+ reject(error);
107
+ return;
108
+ }
109
+
110
+ resolve();
111
+ });
112
+ });
113
+ }
114
+
115
+ function printUsage() {
116
+ console.log(`
117
+ alanbox command router
118
+
119
+ Usage:
120
+ alanbox doctor
121
+ alanbox install --target codex|claude|both
122
+ swarmer info
123
+ swarmer doctor
124
+ alanbox swarmer [options] --worker "codex:<role>:<prompt>"
125
+ alanbox swarm [options] --worker "codex:<role>:<prompt>"
126
+ swarmer [options] --worker "codex:<role>:<prompt>"
127
+ alanbox designer <command> [options]
128
+ designer <command> [options]
129
+
130
+ Command groups:
131
+ install, init, update 0boxer package/resource commands
132
+ swarmer, swarm, doctor 1swarmer worker orchestration and provider diagnostics
133
+ swarmer info 1swarmer worker execution config check
134
+ designer 2designer runtime UI measurement CLI
135
+
136
+ Examples:
137
+ swarmer info
138
+ swarmer doctor
139
+ swarmer --namespace run-name --worker "codex:reviewer:检查当前改动"
140
+ alanbox designer measure --url http://localhost:3000 --selector ".dialog"
141
+ alanbox designer screenshot --url http://localhost:3000 --output page.png
142
+ `);
143
+ }
144
+
145
+ module.exports = {
146
+ main,
147
+ printUsage,
148
+ runBoxer,
149
+ runCommonFlow,
150
+ runSwarmerFlow,
151
+ runSwarmer,
152
+ runDesigner,
153
+ };
package/hooks/hooks.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "description": "Optional Codex hook examples for multirunagent. Keep disabled unless the local Codex hook schema is explicitly configured.",
2
+ "description": "Optional Codex hook examples for alanbox. Keep disabled unless the local Codex hook schema is explicitly configured.",
3
3
  "hooks": {
4
4
  "SessionStart": [
5
5
  {
package/package.json CHANGED
@@ -1,16 +1,21 @@
1
1
  {
2
2
  "name": "alanbox",
3
- "version": "0.1.2",
3
+ "version": "0.1.3",
4
4
  "description": "Run isolated child Codex or Claude workers with serial, parallel, and auto swarm orchestration.",
5
- "main": "0commondflowv1/src/cli.js",
5
+ "main": "cli.js",
6
6
  "bin": {
7
- "alanbox": "bin/multirunagent.js",
8
- "multirunagent": "bin/multirunagent.js",
9
- "swam": "bin/multirunagent.js"
7
+ "alanbox": "bin/alanbox.js",
8
+ "swarmer": "bin/swarmer.js",
9
+ "designer": "bin/designer.js"
10
10
  },
11
11
  "files": [
12
+ "cli.js",
12
13
  "bin/**",
13
- "0commondflowv1/**",
14
+ "shared/**",
15
+ "0boxer/**",
16
+ "1swarmer/**",
17
+ "2designer/package.json",
18
+ "2designer/dist/**",
14
19
  "skills/**",
15
20
  "plugin/**",
16
21
  "hooks/**",
@@ -20,10 +25,11 @@
20
25
  "LICENSE"
21
26
  ],
22
27
  "scripts": {
23
- "swarm": "node bin/multirunagent.js swarm",
24
- "doctor": "node bin/multirunagent.js doctor",
25
- "test": "node bin/multirunagent.js --help && node bin/multirunagent.js info",
26
- "validate": "node bin/multirunagent.js info"
28
+ "swarm": "node bin/swarmer.js",
29
+ "doctor": "node bin/alanbox.js doctor",
30
+ "designer": "node bin/designer.js",
31
+ "test": "node bin/alanbox.js --help && node bin/alanbox.js swarmer info && node bin/swarmer.js info && node bin/swarmer.js doctor --help && node bin/designer.js --help",
32
+ "validate": "node bin/swarmer.js info && node bin/designer.js --help"
27
33
  },
28
34
  "keywords": [
29
35
  "codex",
@@ -41,6 +47,13 @@
41
47
  },
42
48
  "engines": {
43
49
  "node": ">=20.0.0"
50
+ },
51
+ "dependencies": {
52
+ "commander": "^14.0.3",
53
+ "sharp": "^0.34.5",
54
+ "ws": "^8.20.0"
55
+ },
56
+ "optionalDependencies": {
57
+ "playwright": "^1.59.1"
44
58
  }
45
59
  }
46
-
package/plugin/AGENTS.md CHANGED
@@ -1,12 +1,12 @@
1
1
  ## alanbox plugin
2
2
 
3
- `C:\Users\lenovo\Desktop\my-project\101my-aitool\aibox\plugin` 存放源码侧 Codex plugin manifest。安装时 `0commondflowv1/src/commands/install.js` 会把本目录复制到用户插件目录的 `plugins/alanbox/.codex-plugin/`,所以源码目录名是 `plugin/`,安装目标目录名才是 `.codex-plugin/`。
3
+ `C:\Users\lenovo\Desktop\my-project\101my-aitool\aibox\plugin` 存放源码侧 Codex plugin manifest。安装时 `0boxer/src/commands/install.js` 会把本目录复制到用户插件目录的 `plugins/alanbox/.codex-plugin/`,所以源码目录名是 `plugin/`,安装目标目录名才是 `.codex-plugin/`。
4
4
 
5
5
  **Important:** 这里是 Codex 插件展示与 skill 发现配置,不是 Claude 配置。Claude 侧只复用 `skills/`、`hooks/`、`scripts/`、`mcp/` 资源,不读取 `plugin.json`。
6
6
 
7
7
  ### Important files
8
8
 
9
- - `plugin.json` — Codex plugin manifest;`skills` 必须继续指向 `./skills/`,默认提示词应只描述当前真实入口 `swam`/`swarm`、`info`、`doctor`。
9
+ - `plugin.json` — Codex plugin manifest;`skills` 必须继续指向 `./skills/`,默认提示词应只描述当前真实入口 `aitool`、`swarmer`/`swarm`、`info`、`doctor` 和 `designer`。
10
10
 
11
11
  ### Implementation notes
12
12
 
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "alanbox",
3
- "version": "0.1.1",
4
- "description": "Codex skills for using alanbox to run isolated Codex or Claude child workers.",
3
+ "version": "0.1.2",
4
+ "description": "Codex skills for using alanbox AI tools, swarmer worker orchestration, and designer UI measurement.",
5
5
  "author": {
6
6
  "name": "local"
7
7
  },
@@ -16,8 +16,8 @@
16
16
  "skills": "./skills/",
17
17
  "interface": {
18
18
  "displayName": "alanbox",
19
- "shortDescription": "Use alanbox swam/swarm to run child Codex or Claude workers.",
20
- "longDescription": "Provides concise skills that explain how to call alanbox for swam/swarm, parallel worker scheduling, auto workflow, and doctor checks.",
19
+ "shortDescription": "Use alanbox for swarmer workers, diagnostics, and designer UI measurement.",
20
+ "longDescription": "Provides concise skills that explain how to choose alanbox tools, call swarmer/swarm for child workers, run parallel or auto workflows, diagnose with info/doctor, and use designer for UI measurement.",
21
21
  "developerName": "local",
22
22
  "category": "Productivity",
23
23
  "capabilities": [
@@ -25,9 +25,9 @@
25
25
  "Automation"
26
26
  ],
27
27
  "defaultPrompt": [
28
- "Use alanbox swam to run one child Codex worker.",
29
- "Use alanbox swam to run one child Claude worker.",
30
- "Plan a serial swam workflow for this task."
28
+ "Choose the correct alanbox tool for this task.",
29
+ "Use swarmer to run child Codex or Claude workers.",
30
+ "Use designer to measure or compare runtime UI when needed."
31
31
  ]
32
32
  }
33
33
  }
@@ -0,0 +1,15 @@
1
+ ## shared
2
+
3
+ `C:\Users\lenovo\Desktop\my-project\101my-aitool\aibox\shared` 存放 `alanbox` 包级共享工具。这里的代码可以被 `0boxer`、根 CLI 或其他流程复用,但必须保持轻量、无副作用,不应放具体业务流程的 runner、安装写入逻辑或 provider 调用。
4
+
5
+ **Important:** 共享工具被发布包使用时,必须确认 `package.json.files` 包含 `shared/**`。不要把 `1swarmer` 的 worker/swarm 参数解析搬到这里,除非后续明确要做跨流程统一参数模型。
6
+
7
+ ### Important files
8
+
9
+ - `package-args.js` — 包级资源命令参数解析器;当前服务 `0boxer` 的 `install/init/update`,只解析 target 相关选项。
10
+
11
+ ### Implementation notes
12
+
13
+ - 共享模块不要在 require 时读写用户目录、启动 provider、读取个人配置或修改环境变量。
14
+ - 新增共享工具时,优先让命名表达所属语义,例如 `package-*`、`path-*`,避免和 `1swarmer/src/args.js` 这种流程专属模块混淆。
15
+ - 修改共享模块后,从包根目录运行 `npm test` 和 `npm run validate`;涉及发布包内容时再跑 `npm pack --json --dry-run`。
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Package-resource command argument parser.
3
+ * This parser is intentionally separate from 1swarmer worker/swarm args.
4
+ */
5
+
6
+ const VALUE_FLAGS = new Set(['target', 'to', 'platform']);
7
+ const BOOLEAN_FLAGS = new Set(['codex', 'claude', 'both']);
8
+
9
+ function parsePackageArgs(argv = []) {
10
+ const result = { _: [] };
11
+
12
+ for (let i = 0; i < argv.length; i += 1) {
13
+ const arg = argv[i];
14
+
15
+ if (arg === '--') {
16
+ result._.push(...argv.slice(i + 1));
17
+ break;
18
+ }
19
+
20
+ if (!arg.startsWith('-') || arg === '-') {
21
+ result._.push(arg);
22
+ continue;
23
+ }
24
+
25
+ const { key, inlineValue } = splitFlag(arg);
26
+
27
+ if (BOOLEAN_FLAGS.has(key)) {
28
+ if (inlineValue !== undefined) {
29
+ throw new Error(`${formatFlag(key)} does not take a value`);
30
+ }
31
+
32
+ result[key] = true;
33
+ continue;
34
+ }
35
+
36
+ if (VALUE_FLAGS.has(key)) {
37
+ const value = inlineValue !== undefined ? inlineValue : argv[i + 1];
38
+ if (inlineValue === undefined) i += 1;
39
+
40
+ if (!value || String(value).startsWith('-')) {
41
+ throw new Error(`missing value for ${formatFlag(key)}`);
42
+ }
43
+
44
+ result[key] = value;
45
+ continue;
46
+ }
47
+
48
+ throw new Error(`unknown package option: ${arg}`);
49
+ }
50
+
51
+ return result;
52
+ }
53
+
54
+ function splitFlag(arg) {
55
+ const [keyPart, inlineValue] = arg.split('=', 2);
56
+ return {
57
+ key: keyPart.replace(/^--?/, ''),
58
+ inlineValue,
59
+ };
60
+ }
61
+
62
+ function formatFlag(key) {
63
+ return `--${key}`;
64
+ }
65
+
66
+ module.exports = {
67
+ parsePackageArgs,
68
+ };
package/skills/AGENTS.md CHANGED
@@ -1,17 +1,21 @@
1
1
  ## aibox skills
2
2
 
3
- `C:\Users\lenovo\Desktop\my-project\101my-aitool\aibox\skills` 存放随 `alanbox` 分发的 agent skills。当前只描述 `0commondflowv1` 的 `swam`/`swarm`、`info` `doctor` 用法;不要在这里接入 `1uiflowv1` measure `2apiflowv1` 的 getapi,除非用户重新明确要求。
3
+ `C:\Users\lenovo\Desktop\my-project\101my-aitool\aibox\skills` 存放随 `alanbox` 分发的 agent skills,按 `0boxer` 的安装命令作为统一安装源。当前用 `swarmer` 承载 `1swarmer` 的 `swarmer`/`swarm`、`info` 用法,用 `aitool` 作为 alanbox 总入口说明,并保留用户明确要求接入的 `2designer` UI 高精度还原 workflow;不要在这里接入 `3apiflower` 的 getapi,除非用户重新明确要求。
4
4
 
5
- **Important:** skills 只写调用 workflow,不实现业务逻辑。worker 执行示例优先使用裸 `swam ...`;初始化和资源更新使用 `alanbox init` / `alanbox update`;本地源码调试才使用 `node bin/multirunagent.js ...`。
5
+ **Important:** skills 只写调用 workflow,不实现业务逻辑。worker 执行示例优先使用裸 `swarmer ...`;初始化和资源更新使用 `alanbox init` / `alanbox update`;本地源码调试才使用 `node bin/alanbox.js ...`。
6
+
7
+ **Important:** 本目录是 `alanbox install/init/update` 的安装源;`2designer` 不再维护 standalone skill 发布入口。`designer` 相关 agent workflow 以本目录 `desginer/SKILL.md` 为准。
6
8
 
7
9
  ### Important files
8
10
 
9
- - `aibox-swam/SKILL.md` — 通用 swam workflow skill;同时适用于 Codex 和 Claude,示例应覆盖 `codex:` 与 `claude:` worker。
10
- - `sub-codex-swarm/SKILL.md` — 兼容旧触发名的 swarm skill;保留但内容必须和当前 `swam`/`swarm` CLI 行为一致。
11
- - `sub-codex-doctor/SKILL.md` — 诊断 skill;只指导调用 `info` `doctor`。
11
+ - `aitool/SKILL.md` — `alanbox` 总入口 skill;用于在 `swarmer`、`designer` 和安装/更新命令之间选择正确入口。
12
+ - `swarmer/SKILL.md` — 合并后的 worker 编排、配置检查与 provider 诊断 skill;同时覆盖 `codex:`、`claude:` worker、串行/并行/auto workflow、`info` `doctor`。
13
+ - `desginer/SKILL.md` — `2designer` UI 高精度还原 workflow;目录名当前按现状保留,内容通过 `designer` `measure` / `screenshot` / `overlay` 命令做设计稿网站与运行页的像素级对比。
12
14
 
13
15
  ### Implementation notes
14
16
 
15
17
  - 新增或修改 CLI 参数时,同步检查对应 `SKILL.md` 示例。
16
18
  - `install` 会把本目录中含 `SKILL.md` 的子目录安装到 Codex 的 `~/.codex/skills`,以及 Claude 的 `~/.claude/skill`。
19
+ - `desginer` 调用的是 `designer` CLI;更新 `2designer` 的命令名、参数或产物路径约定时,同步更新本目录同名 skill。
20
+ - `aibox-swarmer`、`sub-codex-swarmer`、`sub-codex-doctor` 已合并进 `swarmer`;安装/更新逻辑会清理这些旧 skill 名,避免用户环境里出现重复入口。
17
21
  - 不要把一次性本机 runId、账号、token、私有服务地址写进 skill。
@@ -0,0 +1,36 @@
1
+ ---
2
+ name: aitool
3
+ description: 当需要使用 alanbox 这个本地 AI 工具包,并需要在 swarmer worker 编排、designer UI 测量或安装/更新资源之间选择正确入口时使用。
4
+ ---
5
+
6
+ # aitool
7
+
8
+ `alanbox` 是本机 AI 工具包的总入口。先判断任务属于哪一类,再调用对应 CLI 或 skill;不要把所有参数解析都塞到一个命令里。
9
+
10
+ ## 入口选择
11
+
12
+ - 子 worker 编排、串行/并行复核、自动 workflow 和 `info` 配置检查:使用 `swarmer` skill 和 `swarmer` / `alanbox swarm` 命令。
13
+ - provider 健康检查:使用 `alanbox doctor` 或 `swarmer doctor`,该命令归 `1swarmer`。
14
+ - UI 高精度还原、运行页测量、截图、overlay 对比:使用 `designer` CLI;如果任务是按设计稿精修页面,优先使用当前安装的 UI 还原 skill。
15
+ - 安装或更新 Codex/Claude 资源:使用 `alanbox init`、`alanbox update` 或 `alanbox install --target codex|claude|both`。
16
+ - `3apiflower` API flow 当前不作为 `alanbox` npm 包公开命令;除非用户明确要求,不要把它接进 skills 或默认入口。
17
+
18
+ ## 常用命令
19
+
20
+ ```powershell
21
+ alanbox --help
22
+ swarmer info
23
+ alanbox doctor
24
+ alanbox install --target codex
25
+ alanbox install --target claude
26
+ swarmer --namespace run-name --worker "codex:reviewer:检查当前改动"
27
+ designer measure --url "http://localhost:3000" --selector ".dialog"
28
+ designer screenshot --url "http://localhost:3000" --output page.png
29
+ ```
30
+
31
+ ## 维护边界
32
+
33
+ - CLI 负责真实执行;skills 只负责指导调用。
34
+ - `swarmer` 是 worker 编排稳定入口;内部 `swarm` 是同一条执行链路。
35
+ - `designer` 只采集运行时 UI 数据和图片,不替 agent 做判断。
36
+ - 安装命令会复制 bundled skills、hooks、scripts 和 MCP 占位资源;普通 `npm install` / `npx` 不应隐式注入用户 agent skills。