claude-multi 0.5.5 → 0.5.6

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 (37) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/bin/claude-multi.cmd +26 -0
  3. package/bin/claude-multi.js +22 -0
  4. package/dist/cli.js +5 -19
  5. package/package.json +13 -6
  6. package/.agents/skills/three/SKILL.md +0 -106
  7. package/.agents/skills/threejs-animation/SKILL.md +0 -552
  8. package/.agents/skills/threejs-fundamentals/SKILL.md +0 -488
  9. package/.agents/skills/threejs-geometry/SKILL.md +0 -548
  10. package/.agents/skills/threejs-interaction/SKILL.md +0 -660
  11. package/.agents/skills/threejs-lighting/SKILL.md +0 -481
  12. package/.agents/skills/threejs-loaders/SKILL.md +0 -623
  13. package/.agents/skills/threejs-materials/SKILL.md +0 -520
  14. package/.agents/skills/threejs-postprocessing/SKILL.md +0 -602
  15. package/.agents/skills/threejs-shaders/SKILL.md +0 -642
  16. package/.agents/skills/threejs-textures/SKILL.md +0 -628
  17. package/.commandcode/taste/taste.md +0 -9
  18. package/astro.config.mjs +0 -69
  19. package/bun.lock +0 -1349
  20. package/public/android-chrome-192x192.png +0 -0
  21. package/public/android-chrome-512x512.png +0 -0
  22. package/public/apple-touch-icon.png +0 -0
  23. package/public/favicon-16x16.png +0 -0
  24. package/public/favicon-32x32.png +0 -0
  25. package/public/favicon-animated.svg +0 -140
  26. package/public/favicon.json +0 -1
  27. package/public/favicon.svg +0 -14
  28. package/public/logo.svg +0 -14
  29. package/public/site.webmanifest +0 -11
  30. package/screenshots-review/01-main-menu.png +0 -0
  31. package/screenshots-review/02-list-instances.png +0 -0
  32. package/screenshots-review/07-mcp-details.png +0 -0
  33. package/screenshots-review/v2-01-main-menu.png +0 -0
  34. package/scripts/capture-screens.tsx +0 -440
  35. package/scripts/gen-lottie.cjs +0 -160
  36. package/scripts/shoot-changelog.mjs +0 -18
  37. package/skills-lock.json +0 -71
package/CHANGELOG.md CHANGED
@@ -5,6 +5,24 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.5.6] - 2026-05-23
9
+
10
+ ### Added
11
+ - **`robots.txt` route** (`src/web/pages/robots.txt.ts`): serves sitemap reference and user-agent directives for the docs site
12
+
13
+ ### Changed
14
+ - **Runtime-agnostic launcher** (`bin/claude-multi.js`): polyglot bin entry is simultaneously valid POSIX sh and ESM JavaScript
15
+ - On Linux/macOS: shell shebang detects bun/node/deno and execs the correct runtime
16
+ - On Windows + bun global install: bun's `.exe` shim reads the `.js` extension and runs directly as ESM — no `/bin/sh` lookup required
17
+ - On Windows + npm install: npm's `.cmd` shim calls `node` on the `.js` file
18
+ - Shebang changed to `#!/usr/bin/env bun` so bun's Windows shim can resolve itself in `PATH`
19
+
20
+ ### CI
21
+ - Add cross-platform install verification workflow covering bun, node, and deno on Linux, Windows, and macOS
22
+ - Separate build into its own job; test jobs download the artifact instead of rebuilding
23
+ - Publish workflow now includes version bump step and enhanced post-publish verification
24
+ - Add `ci:test-install` script to trigger the install-verification workflow from local
25
+
8
26
  ## [0.5.5] - 2026-05-22
9
27
 
10
28
  ### Added
@@ -0,0 +1,26 @@
1
+ @echo off
2
+ setlocal
3
+ :: Resolve package root (bin\ -> ..\)
4
+ set "_cli=%~dp0..\dist\cli.js"
5
+
6
+ where bun >nul 2>&1
7
+ if not errorlevel 1 (
8
+ bun "%_cli%" %*
9
+ exit /b %errorlevel%
10
+ )
11
+
12
+ where node >nul 2>&1
13
+ if not errorlevel 1 (
14
+ node "%_cli%" %*
15
+ exit /b %errorlevel%
16
+ )
17
+
18
+ where deno >nul 2>&1
19
+ if not errorlevel 1 (
20
+ deno run -A "%_cli%" %*
21
+ exit /b %errorlevel%
22
+ )
23
+
24
+ echo claude-multi: no JavaScript runtime found (install bun, node, or deno) 1>&2
25
+ exit /b 1
26
+ endlocal
@@ -0,0 +1,22 @@
1
+ #!/usr/bin/env sh
2
+ SCRIPT="$0"
3
+ while [ -L "$SCRIPT" ]; do
4
+ LINK=$(readlink "$SCRIPT")
5
+ case "$LINK" in
6
+ /*) SCRIPT="$LINK" ;;
7
+ *) SCRIPT="$(dirname "$SCRIPT")/$LINK" ;;
8
+ esac
9
+ done
10
+ DIR=$(cd "$(dirname "$SCRIPT")" && pwd)
11
+ CLI="$DIR/../dist/cli.js"
12
+
13
+ if command -v bun >/dev/null 2>&1; then
14
+ exec bun "$CLI" "$@"
15
+ elif command -v node >/dev/null 2>&1; then
16
+ exec node "$CLI" "$@"
17
+ elif command -v deno >/dev/null 2>&1; then
18
+ exec deno run -A "$CLI" "$@"
19
+ else
20
+ echo "claude-multi: no JavaScript runtime found (install bun, node, or deno)" >&2
21
+ exit 1
22
+ fi
package/dist/cli.js CHANGED
@@ -1,4 +1,3 @@
1
- #!/usr/bin/env node
2
1
  import { createRequire } from "node:module";
3
2
  var __create = Object.create;
4
3
  var __getProtoOf = Object.getPrototypeOf;
@@ -8619,24 +8618,11 @@ function getClaudePath() {
8619
8618
  }
8620
8619
  function generateWrapperScript(options) {
8621
8620
  const claudePath = getClaudePath();
8622
- return `#!/usr/bin/env node
8623
-
8624
- // Claude Multi - Wrapper for ${options.name}
8625
- // Generated by claude-multi
8626
-
8627
- import { spawn } from 'child_process';
8628
-
8629
- process.env.CLAUDE_CONFIG_DIR = "${options.configDir}";
8630
-
8631
- // Execute the original Claude Code CLI with all arguments
8632
- const claude = spawn("${claudePath}", process.argv.slice(2), {
8633
- stdio: 'inherit',
8634
- env: process.env
8635
- });
8636
-
8637
- claude.on('exit', (code) => {
8638
- process.exit(code || 0);
8639
- });
8621
+ return `#!/bin/sh
8622
+ # Claude Multi - Wrapper for ${options.name}
8623
+ # Generated by claude-multi
8624
+ export CLAUDE_CONFIG_DIR="${options.configDir}"
8625
+ exec "${claudePath}" "$@"
8640
8626
  `;
8641
8627
  }
8642
8628
  function generateWindowsWrapperScript(options) {
package/package.json CHANGED
@@ -1,23 +1,29 @@
1
1
  {
2
2
  "name": "claude-multi",
3
- "version": "0.5.5",
3
+ "version": "0.5.6",
4
4
  "description": "Manage multiple Claude Code instances with different aliases and configurations",
5
5
  "type": "module",
6
6
  "bin": {
7
- "claude-multi": "./dist/cli.js"
7
+ "claude-multi": "./bin/claude-multi.js"
8
8
  },
9
+ "files": [
10
+ "bin/",
11
+ "dist/cli.js",
12
+ "CHANGELOG.md"
13
+ ],
9
14
  "scripts": {
10
- "build": "bun build src/cli.ts --outdir dist --target node --format esm && chmod +x dist/cli.js",
15
+ "build": "bun build src/cli.ts --outdir dist --target node --format esm && chmod +x bin/claude-multi.js",
11
16
  "dev": "bun run src/cli.ts",
12
17
  "test": "bun test",
13
18
  "prepublishOnly": "bun run build",
14
- "test:binary": "./dist/cli.js",
19
+ "test:binary": "./bin/claude-multi.js",
15
20
  "install:global": "bun link",
16
21
  "docs:dev": "astro dev",
17
22
  "docs:build": "astro build",
18
23
  "docs:preview": "astro preview",
19
24
  "ci:docs:deploy": "gh workflow run deploy-docs.yml",
20
- "ci:publish": "gh workflow run publish.yml -f version=$(node -p \"require('./package.json').version\")"
25
+ "ci:publish": "gh workflow run publish.yml -f version=$(node -p \"require('./package.json').version\")",
26
+ "ci:test-install": "gh workflow run test-install.yml"
21
27
  },
22
28
  "keywords": [
23
29
  "claude",
@@ -64,6 +70,7 @@
64
70
  "three": "^0.184.0"
65
71
  },
66
72
  "engines": {
67
- "node": ">=18.0.0"
73
+ "node": ">=18.0.0",
74
+ "bun": ">=1.0.0"
68
75
  }
69
76
  }
@@ -1,106 +0,0 @@
1
- ---
2
- name: three
3
- description: Three.js and WebGL adapter patterns for HyperFrames. Use when creating deterministic Three.js scenes, WebGL canvas layers, AnimationMixer timelines, camera motion, shader-driven visuals, or canvas renders that respond to HyperFrames hf-seek events.
4
- ---
5
-
6
- # Three.js for HyperFrames
7
-
8
- HyperFrames supports Three.js through its `three` runtime adapter. The adapter does not own your scene. It publishes HyperFrames time and dispatches a seek event so your composition can render the exact frame.
9
-
10
- ## Contract
11
-
12
- - Create the scene, camera, renderer, materials, and assets synchronously when possible.
13
- - Render from HyperFrames time, not wall-clock time.
14
- - Listen for the `hf-seek` event and render exactly that time.
15
- - Load models, textures, and HDRIs before render-critical seeking. Do not fetch them at seek time.
16
- - Avoid `requestAnimationFrame` or `renderer.setAnimationLoop` as the source of truth for render-critical motion.
17
-
18
- The adapter sets `window.__hfThreeTime` and dispatches `new CustomEvent("hf-seek", { detail: { time } })` on each seek.
19
-
20
- ## Basic Pattern
21
-
22
- ```html
23
- <canvas id="three-layer"></canvas>
24
- <script type="module">
25
- import * as THREE from "https://cdn.jsdelivr.net/npm/three@0.181.2/+esm";
26
-
27
- const canvas = document.getElementById("three-layer");
28
- const renderer = new THREE.WebGLRenderer({ canvas, alpha: true, antialias: true });
29
- // Match these to your composition's frame size.
30
- renderer.setSize(1920, 1080, false);
31
- renderer.setPixelRatio(1);
32
-
33
- const scene = new THREE.Scene();
34
- const camera = new THREE.PerspectiveCamera(35, 1920 / 1080, 0.1, 100);
35
- camera.position.set(0, 0, 6);
36
-
37
- const mesh = new THREE.Mesh(
38
- new THREE.IcosahedronGeometry(1.4, 4),
39
- new THREE.MeshStandardMaterial({ color: 0x64d2ff, roughness: 0.38 }),
40
- );
41
- scene.add(mesh);
42
- scene.add(new THREE.HemisphereLight(0xffffff, 0x223344, 2));
43
-
44
- function renderAt(time) {
45
- mesh.rotation.y = time * 0.7;
46
- mesh.rotation.x = Math.sin(time * 0.6) * 0.16;
47
- renderer.render(scene, camera);
48
- }
49
-
50
- window.addEventListener("hf-seek", (event) => {
51
- renderAt(event.detail.time);
52
- });
53
-
54
- renderAt(window.__hfThreeTime || 0);
55
- </script>
56
- ```
57
-
58
- ```css
59
- #three-layer {
60
- width: 100%;
61
- height: 100%;
62
- display: block;
63
- }
64
- ```
65
-
66
- ## AnimationMixer Pattern
67
-
68
- For GLTF or authored clip animation, seek the mixer directly:
69
-
70
- ```js
71
- function renderAt(time) {
72
- mixer.setTime(time);
73
- renderer.render(scene, camera);
74
- }
75
- ```
76
-
77
- If several mixers exist, seek all of them from the same `time`.
78
-
79
- ## Good Uses
80
-
81
- - Deterministic 3D objects, product spins, particles with seeded data, and shader plates.
82
- - Camera moves derived from `time`.
83
- - GLTF animation clips when assets are local and loaded before validation completes.
84
-
85
- ## Avoid
86
-
87
- - Using `Date.now()`, `performance.now()`, or clock deltas to update scene state.
88
- - Leaving render-critical work inside a free-running animation loop.
89
- - Loading remote models or textures at render time.
90
- - Device-pixel-ratio dependent output. Pin renderer size and pixel ratio for video renders.
91
- - Post-processing passes that depend on previous frame history unless you can reconstruct state from time.
92
-
93
- ## Validation
94
-
95
- After editing a Three.js composition:
96
-
97
- ```bash
98
- npx hyperframes lint
99
- npx hyperframes validate
100
- ```
101
-
102
- ## Credits And References
103
-
104
- - HyperFrames adapter source: `packages/core/src/runtime/adapters/three.ts`.
105
- - Three.js `WebGLRenderer` docs: https://threejs.org/docs/pages/WebGLRenderer.html
106
- - Three.js `AnimationMixer.setTime()` docs: https://threejs.org/docs/pages/AnimationMixer.html