Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
130 commits
Select commit Hold shift + click to select a range
1f3d151
react-native-caz beginning
mickmister Aug 27, 2025
4b39cb4
make scaffold cli command
mickmister Aug 27, 2025
cbeec59
add separate createServerState and createServerAction APIs
mickmister Nov 10, 2025
6d3eba1
fix typo. get file transformer tests working
mickmister Nov 10, 2025
126f33c
clean up tests
mickmister Nov 10, 2025
b50c87d
cache kv values when initializing server state piece
mickmister Nov 12, 2025
c36b6eb
fix references to shared vs server kv
mickmister Nov 13, 2025
0be953c
Initialize git repository and make initial commit
mickmister Nov 18, 2025
5143799
refactor ModuleAPI to use namespaced structure and add build transfor…
mickmister Nov 21, 2025
374e5b2
implement registerReactProvider with multiple providers support
mickmister Nov 21, 2025
8826c20
update implementation spec with Phase 1 & 2 completion status
mickmister Nov 21, 2025
55ff2b9
add provider ranking system for fine-grained control
mickmister Nov 21, 2025
3ec7d8a
Move internal ModuleAPI methods to _internal namespace
mickmister Nov 21, 2025
b07f475
Add singular state creation methods to namespace APIs
mickmister Nov 22, 2025
331a0de
Rename _internal to internal in ModuleAPI
mickmister Nov 22, 2025
32bee0d
Restore type safety to getModule method
mickmister Nov 22, 2025
8a9ae11
adds runsOn and esbuild plugin changes for that. fix all existing fea…
mickmister Nov 22, 2025
525ba18
change runOn to return undefined instead of null. add @babel/parser a…
mickmister Nov 26, 2025
5aaf8a3
Add springboard-mcp analysis document
Feb 6, 2026
c0a17bf
Pivot from MCP server to CLI tool design
Feb 6, 2026
d11e447
Rename CLI commands to `sb docs` subcommand
Feb 7, 2026
b8ba68f
Add `sb docs` command structure for AI agent support
Feb 7, 2026
05dcace
Add `sb docs` help and create CLAUDE.md/AGENTS.md files
Feb 7, 2026
9ad16fb
Improve `sb docs` onboarding following svelte-mcp patterns
Feb 7, 2026
f71ae82
Add example modules system and comparison document
Feb 7, 2026
7d9659f
Add questionnaire for sb docs command implementation
Feb 7, 2026
c925f81
Implement sb docs commands with bundled documentation
Feb 9, 2026
b9f4c54
Remove validate and scaffold commands from sb docs
Feb 9, 2026
a033f9b
Add useModule hook for React component module access
Feb 9, 2026
7f9d079
Remove validate references from generated CLAUDE.md and AGENTS.md
Feb 16, 2026
98e4760
Consolidate CLAUDE.md and AGENTS.md into single template
Feb 16, 2026
7646ba7
merge main
Feb 16, 2026
5001fbe
Include CLI in springboard package with sb bin alias
Feb 16, 2026
87e0959
change docs command to be imported with require
Feb 16, 2026
db24ad8
remove comments
Feb 16, 2026
e1a86ce
add commander dep to springboard
Feb 16, 2026
80a0f24
fix import
Feb 16, 2026
549964d
Fix ES module __dirname usage in CLI
Feb 16, 2026
72a1841
use esm for docs import
Feb 16, 2026
ea12f08
Re-initialize Springboard engine on HMR for src/ changes
Feb 16, 2026
64df4f7
Improve HMR user code detection to be cross-platform
Feb 16, 2026
cd90d8e
Add automatic KV refresh on websocket reconnection
Feb 21, 2026
4e0ed63
Add createLocalSessionState API for sessionStorage-backed state
Feb 24, 2026
c347ab7
Use process.env.PORT in node server template if defined
Feb 24, 2026
900da7a
Move springboard dev to single-port ModuleRunner
Feb 25, 2026
7b8f423
Add kv-2.db to .gitignore
Feb 25, 2026
24883d9
Add midi_files_module to @jamtools/core package exports
Feb 26, 2026
4e02efa
Refactor io_module to use separate .browser.ts and .node.ts files
Feb 26, 2026
e0366d8
Use package.json export conditions for platform-specific io_dependencies
Feb 27, 2026
5786193
Fix ES module import reassignment in io_module for Vite dev mode
Feb 27, 2026
48723f5
Fix @tonejs/midi import to use default import with type import
Feb 27, 2026
51fe57e
Fix dev plugin stream and module-graph typings
Mar 22, 2026
c6b22d8
Add e2e dev-route HMR test for registerServerModule
Mar 22, 2026
ac6c546
docs: clarify registerServerModule contract
Mar 25, 2026
76d916a
apps/vite-test: add start script and configurable port
Mar 25, 2026
b2a694f
Committed the two requested files as `apps/vite-test: add start scrip…
Mar 25, 2026
1543cb5
apps/vite-test: add debug log for module load
Mar 25, 2026
2335c8e
fix: use single-port dev server in vite plugin
Mar 25, 2026
b3b9628
fix: install vite dev middleware before spa fallback
Mar 25, 2026
6a8c1c4
refactor: remove unused vite plugin modules
Mar 25, 2026
c44e8be
Committed the deletions as `refactor: remove unused vite plugin modul…
Mar 25, 2026
98cb178
refactor: store generated vite files in node_modules
Mar 25, 2026
8fb45c6
edit scripts
Mar 25, 2026
1616cba
fix: serve dev web entry through vite transform
Mar 25, 2026
7b0b74c
build: support SongDrive Vite migration
Apr 23, 2026
b7ebb0d
fix: improve jamtools core vitest module resolution
May 6, 2026
d05024d
test: tighten macro input test bootstrap
May 6, 2026
83e635a
chore: initialize beads workflow for springboard
May 6, 2026
782b48d
feat: scaffold defineModule and entrypoint descriptors
May 8, 2026
5bd9eb0
feat: support async springboard entrypoint descriptors
May 10, 2026
6901287
feat: add expo-native react native host shell
May 10, 2026
75792e6
feat: add expo auth and push helpers
May 10, 2026
b7b6ea0
fix: stop forcing localhost npm registry in ci
May 12, 2026
f2559ab
Update lockfile for Expo-native Springboard deps
May 12, 2026
29c73ca
Fix server module routes before SPA fallback
May 13, 2026
5269f6e
Register SPA fallback after server modules
May 15, 2026
7e08d2e
Limit Springboard CI to Springboard packages
May 15, 2026
87bdce4
Exclude jamtools core from CI jobs
May 15, 2026
7d6a299
Merge origin/main into server-state
May 24, 2026
6a3d2c8
fix: restore CI for server-state branch
May 25, 2026
8e9b4fb
Fix jamtools core Vitest self imports
May 25, 2026
94e21c4
Merge branch 'preview-pr-70-vk-8100-fix-vite-dev-nod' into vk/e1e4-co…
Jun 6, 2026
6db3543
Improve Springboard agent docs
Jun 6, 2026
32c43a1
Fix springboard reset preserving registered modules
Jun 6, 2026
d817a56
Add shared mobile WebView host E2E fixtures
Jun 8, 2026
a0a9a92
Make Springboard git refs easier to consume
Jun 8, 2026
78f4025
Include Springboard build configs in git package
Jun 8, 2026
1705b90
Declare Expo config plugins for mobile E2E
Jun 8, 2026
698d605
Fix Springboard mobile E2E Android CLI deps
Jun 8, 2026
b5eb1e8
Export Springboard React Native platform entry
Jun 8, 2026
edf4ae9
Fix mobile E2E Expo autolinking
Jun 8, 2026
7712122
Configure mobile E2E React Native autolinking
Jun 8, 2026
b707f4c
Fix Node CrossWS adapter interop
Jun 8, 2026
8f048ac
Build mobile E2E release APK fallback
Jun 8, 2026
364c4bd
Fix mobile E2E Metro bundling fallback
Jun 8, 2026
635ba86
Stabilize mobile E2E fixture Metro config
Jun 8, 2026
f696daa
Add descriptor-based Springboard test helper
Jun 8, 2026
8ef2dbb
Use direct mobile WebView host export
Jun 8, 2026
572ec0c
Stabilize mobile E2E readiness wait
Jun 8, 2026
c8c4e8a
Stabilize mobile E2E readiness check
Jun 8, 2026
277cffc
Refresh shared state after reconnect
Jun 10, 2026
485822b
Resolve IO dependencies through package exports
Jun 12, 2026
7ffda9f
Use explicit ESM extensions in Jamtools core
Jun 12, 2026
52b6ed8
Use Springboard register subpath in Jamtools core
Jun 12, 2026
6b770ae
Remove extra module dependency plumbing
Jun 13, 2026
1722725
Fix ReactDOM client import
Jul 28, 2026
848340c
Optimize ReactDOM client dependency
Jul 28, 2026
72419ea
Scan Springboard web entry for Vite deps
Jul 28, 2026
041e11f
Fix server module routes before SPA fallback
Jul 31, 2026
1355944
Merge branch 'vk/e9bf-analyze-svelte-m' into vk/d1e2-springboard-week
Aug 1, 2026
52973e9
Merge branch 'vk/6c2d-vk-wrapper-app' into vk/d1e2-springboard-week
Aug 1, 2026
6213cd4
Merge branch 'vk/e1e4-copy-jamtools-fe' into vk/d1e2-springboard-week
Aug 1, 2026
714374f
Merge branch 'vk/e560-vd-mobile-app' into vk/d1e2-springboard-week
Aug 1, 2026
4fbfe80
Merge branch 'server-state' into vk/d1e2-springboard-week
Aug 1, 2026
b68f247
Merge branch 'vk/75e1-sb-register-serv' into vk/d1e2-springboard-week
Aug 1, 2026
c687671
Merge branch 'vk/5f78-sb-make-it-so-wh' into vk/d1e2-springboard-week
Aug 1, 2026
68c4674
Merge remote-tracking branch 'origin/mobile-scaffold' into vk/d1e2-sp…
Aug 1, 2026
8b9b282
Merge remote-tracking branch 'origin/mickmister-patch-2' into vk/d1e2…
Aug 1, 2026
7f6d8f0
Merge branch 'hotfix/jamapp-13-react-dom-create-root' into vk/d1e2-sp…
Aug 1, 2026
7433576
Fix pnpm lockfile after integration merges
Aug 1, 2026
a37fbdf
Fix Springboard publish precheck tests
Aug 24, 2026
623b538
Fix create app initial commit in CI
Aug 24, 2026
1e3d08b
disable claude review workflow
Aug 24, 2026
10bac4c
disable mobile e2e workflow
Aug 24, 2026
1d48f4c
Restore create app default initial commit
Aug 24, 2026
f9acced
Restore create app CI commit identity fallback
Aug 24, 2026
37ff0f9
initial commit code restructure
Aug 24, 2026
e45db71
Restore create app commit identity fallback
Aug 24, 2026
0685d1a
Prepare v2 alpha package exports
Aug 27, 2026
96976f4
Make JamTools core modules descriptor-first
Aug 31, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 29 additions & 5 deletions .claude/settings.json
Original file line number Diff line number Diff line change
@@ -1,4 +1,31 @@
{
"enabledMcpjsonServers": [
"batchit"
],
"hooks": {
"PreCompact": [
{
"hooks": [
{
"command": "bd prime",
"type": "command"
}
],
"matcher": ""
}
],
"SessionStart": [
{
"hooks": [
{
"command": "bd prime",
"type": "command"
}
],
"matcher": ""
}
]
},
"permissions": {
"allow": [
"WebFetch(domain:github.com)",
Expand All @@ -23,8 +50,5 @@
"mcp__batchit__batch_execute"
],
"deny": []
},
"enabledMcpjsonServers": [
"batchit"
]
}
}
}
2 changes: 2 additions & 0 deletions .devcontainer/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ RUN git lfs install

ENV PNPM_HOME=/workspaces/pnpm

WORKDIR /workspaces/songdrive

RUN corepack enable pnpm

COPY pnpm-lock.yaml ./
Expand Down
14 changes: 7 additions & 7 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ jobs:
- name: Install modules
run: pnpm i
- name: Build app
run: npx turbo run build
run: pnpm --recursive --if-present --filter '!...@jamtools/core' run build
types:
runs-on: ubuntu-latest
steps:
Expand All @@ -45,9 +45,9 @@ jobs:
- name: Install modules
run: pnpm i
- name: Build app
run: npx turbo run build
run: pnpm --recursive --if-present --filter '!...@jamtools/core' run build
- name: Check Types
run: npx turbo run check-types
run: pnpm --recursive --if-present --filter '!...@jamtools/core' run check-types
lint:
runs-on: ubuntu-latest
steps:
Expand All @@ -64,9 +64,9 @@ jobs:
- name: Install modules
run: pnpm i
- name: Build app
run: npx turbo run build
run: pnpm --recursive --if-present --filter '!...@jamtools/core' run build
- name: Run eslint
run: npx turbo run lint
run: pnpm --recursive --if-present --filter '!...@jamtools/core' run lint
test:
runs-on: ubuntu-latest
steps:
Expand All @@ -83,6 +83,6 @@ jobs:
- name: Install modules
run: pnpm i
- name: Build app
run: npx turbo run build
run: pnpm --recursive --if-present --filter '!...@jamtools/core' run build
- name: Run tests
run: npx turbo run test
run: pnpm --recursive --if-present --filter '!...@jamtools/core' run test
5 changes: 3 additions & 2 deletions .github/workflows/claude-code-review.yml
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
name: Claude Code Review

on:
pull_request:
types: [opened]
workflow_dispatch:
# pull_request:
# types: [opened]
# Optional: Only run on specific file changes
# paths:
# - "src/**/*.ts"
Expand Down
106 changes: 106 additions & 0 deletions .github/workflows/cli_test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -98,3 +98,109 @@ jobs:
- name: Stop Verdaccio
if: always()
run: kill $(cat verdaccio.pid) || true

test-caz-workflows:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.13.2
- name: Install Node.js
uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Install modules
run: pnpm i
- name: Build create-springboard-app CLI
run: npm run prepublishOnly
working-directory: ./packages/springboard/create-springboard-app
- name: Install Verdaccio
run: npm install -g verdaccio
- name: Start Verdaccio
run: |
verdaccio --config ./verdaccio/config/config.yaml > verdaccio.log 2>&1 & echo $! > verdaccio.pid
for i in {1..10}; do
if curl -s http://localhost:4873/-/ping > /dev/null; then
echo "Verdaccio is up"
break
fi
echo "Waiting for Verdaccio..."
sleep 2
done

- name: Set npm registry to Verdaccio
run: npm config set registry http://localhost:4873
- name: Configure authentication for Verdaccio
run: |
echo "registry=http://localhost:4873/" > ~/.npmrc
echo "//localhost:4873/:_authToken=fake" >> ~/.npmrc

- name: Publish create-springboard-app CLI
run: ./scripts/run-all-folders.sh 0.2.0 --mode verdaccio
- name: Install create-springboard-app CLI
run: npm install -g create-springboard-app
env:
NPM_CONFIG_REGISTRY: http://localhost:4873
- name: Create app with workflows
run: mkdir test-caz-app && cd test-caz-app && create-springboard-app --template bare
env:
NPM_CONFIG_REGISTRY: http://localhost:4873
- name: Verify GitHub workflows were created
run: |
if [ ! -d "test-caz-app/.github/workflows" ]; then
echo "ERROR: .github/workflows directory not created"
exit 1
fi
if [ ! -f "test-caz-app/.github/workflows/ci.yml" ]; then
echo "ERROR: ci.yml workflow not created"
exit 1
fi
echo "SUCCESS: GitHub workflows were created"
ls -la test-caz-app/.github/workflows/
- name: Verify GitHub actions were created
run: |
if [ ! -d "test-caz-app/.github/actions" ]; then
echo "ERROR: .github/actions directory not created"
exit 1
fi
echo "SUCCESS: GitHub actions were created"
ls -la test-caz-app/.github/actions/
- name: Verify workflows contain scaffolding functionality
run: |
if ! grep -q "scaffold_springboard_project" test-caz-app/.github/workflows/ci.yml; then
echo "ERROR: Scaffolding functionality not found in ci.yml"
exit 1
fi
echo "SUCCESS: Scaffolding functionality found in workflows"
- name: Test sb scaffold mobile command
run: |
cd test-caz-app
# Test that scaffold mobile command exists and runs
npx sb scaffold mobile --help > /dev/null 2>&1
if [ $? -ne 0 ]; then
echo "ERROR: sb scaffold mobile command not working"
exit 1
fi
echo "SUCCESS: sb scaffold mobile command is available"
- name: Test mobile scaffolding (dry run)
run: |
cd test-caz-app
# Create a simple test to verify the command structure without actually running React Native init
# We'll just check that the function exists and can be called
node -e "
const { generateReactNativeProject } = require('node_modules/springboard-cli/dist/generators/mobile/react_native_project_generator.js');
console.log('Mobile scaffolding function available:', typeof generateReactNativeProject === 'function');
" || echo "Mobile scaffolding test skipped - function may not be available in built CLI"

- name: Display Verdaccio logs on failure
if: failure()
run: |
echo "Verdaccio logs:"
cat verdaccio.log

- name: Stop Verdaccio
if: always()
run: kill $(cat verdaccio.pid) || true
177 changes: 177 additions & 0 deletions .github/workflows/mobile_android_e2e.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,177 @@
name: mobile_android_e2e

on:
# push:
# pull_request:
workflow_dispatch:

jobs:
android-mobile-e2e:
runs-on: ubuntu-latest
timeout-minutes: 60
strategy:
fail-fast: false
matrix:
mode:
- local-assets
- remote-server
env:
SPRINGBOARD_MOBILE_E2E_MODE: ${{ matrix.mode }}
MOBILE_E2E_SITE_URL: http://10.0.2.2:1337
HOST_SITE_URL: http://127.0.0.1:1337
PORT: '1337'
steps:
- name: Checkout repo
uses: actions/checkout@v4

- name: Enable KVM group permissions
run: |
echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules
sudo udevadm control --reload-rules
sudo udevadm trigger --name-match=kvm

- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.13.2

- name: Install Node.js
uses: actions/setup-node@v4
with:
node-version: 22
cache: pnpm

- name: Install Java
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: 17

- name: Install Android SDK
uses: android-actions/setup-android@v3

- name: Setup Expo and EAS
uses: expo/expo-github-action@v8
with:
eas-version: latest
packager: pnpm

- name: Install dependencies
run: pnpm install --frozen-lockfile

- name: Build Springboard packages
run: pnpm --filter springboard build

- name: Build Android APK (EAS local when authenticated)
working-directory: apps/mobile-e2e
shell: bash
run: |
artifact_dir="$GITHUB_WORKSPACE/artifacts/mobile-e2e/${SPRINGBOARD_MOBILE_E2E_MODE}"
mkdir -p "$artifact_dir"

if [ -n "${EXPO_TOKEN:-}" ]; then
eas build \
--non-interactive \
--wait \
--platform android \
--profile "$SPRINGBOARD_MOBILE_E2E_MODE" \
--local \
--output "$artifact_dir/app.apk"
else
echo "::notice::EXPO_TOKEN is not configured, so EAS CLI cannot run in CI. Falling back to Expo prebuild + Gradle to keep the Android E2E fixture compiling and runnable on PRs."
skip_dependency_update="expo,react,react-native,react-native-webview,expo-asset,expo-constants,expo-file-system,expo-splash-screen,react-native-safe-area-context,@react-native-community/cli"
pnpm exec expo prebuild \
--platform android \
--clean \
--no-install \
--skip-dependency-update "$skip_dependency_update"
mkdir -p android/app/src/main/assets
pnpm exec react-native bundle \
--platform android \
--dev false \
--entry-file "$PWD/index.js" \
--config metro.config.js \
--bundle-output android/app/src/main/assets/index.android.bundle \
--assets-dest android/app/src/main/res
(cd android && ./gradlew assembleRelease --no-daemon --stacktrace)
release_apk="$(find android/app/build/outputs/apk/release -type f -name '*.apk' | head -n 1)"
if [ -z "$release_apk" ]; then
echo "No release APK found" >&2
find android/app/build/outputs/apk -maxdepth 4 -type f >&2 || true
exit 1
fi
cp "$release_apk" "$artifact_dir/app.apk"
fi
env:
EXPO_TOKEN: ${{ secrets.EXPO_TOKEN }}
EXPO_GITHUB_ACTIONS_RUN: 'true'
EAS_LOCAL_BUILD_ARTIFACTS_DIR: ${{ github.workspace }}/artifacts/mobile-e2e/${{ matrix.mode }}
EXPO_MOBILE_E2E_MODE: ${{ matrix.mode }}
EXPO_PUBLIC_SITE_URL: ${{ env.MOBILE_E2E_SITE_URL }}
NODE_ENV: production

- name: Locate APK
shell: bash
run: |
apk_path="$(find "artifacts/mobile-e2e/${SPRINGBOARD_MOBILE_E2E_MODE}" -type f -name '*.apk' | head -n 1)"
if [ -z "$apk_path" ]; then
echo "No APK found" >&2
find "artifacts/mobile-e2e/${SPRINGBOARD_MOBILE_E2E_MODE}" -maxdepth 4 -type f >&2 || true
exit 1
fi
echo "MOBILE_APK_PATH=$GITHUB_WORKSPACE/$apk_path" >> "$GITHUB_ENV"

- name: Install mobile E2E dependencies
working-directory: tests/mobile-e2e
run: npm ci

- name: Install Appium Android driver
working-directory: tests/mobile-e2e
run: npx appium driver install uiautomator2

- name: Start remote fixture server
if: matrix.mode == 'remote-server'
shell: bash
run: |
mkdir -p "artifacts/mobile-e2e/${SPRINGBOARD_MOBILE_E2E_MODE}"
nohup node tests/mobile-e2e/remote-server.mjs > "artifacts/mobile-e2e/${SPRINGBOARD_MOBILE_E2E_MODE}/server.log" 2>&1 &
echo $! > "artifacts/mobile-e2e/${SPRINGBOARD_MOBILE_E2E_MODE}/server.pid"
for i in {1..30}; do
if curl -fsS "$HOST_SITE_URL" >/dev/null; then
echo "Remote fixture server is ready at $HOST_SITE_URL"
exit 0
fi
sleep 1
done
cat "artifacts/mobile-e2e/${SPRINGBOARD_MOBILE_E2E_MODE}/server.log" >&2 || true
exit 1

- name: Run Android WebView E2E test
uses: reactivecircus/android-emulator-runner@v2
with:
api-level: 35
target: google_apis
arch: x86_64
profile: pixel_6
disable-animations: true
script: |
adb devices
set +e
npm --prefix tests/mobile-e2e test
status=$?
adb logcat -d > "artifacts/mobile-e2e/${SPRINGBOARD_MOBILE_E2E_MODE}/logcat.txt" || true
exit $status

- name: Stop remote fixture server
if: always() && matrix.mode == 'remote-server'
run: |
if [ -f "artifacts/mobile-e2e/${SPRINGBOARD_MOBILE_E2E_MODE}/server.pid" ]; then
kill "$(cat "artifacts/mobile-e2e/${SPRINGBOARD_MOBILE_E2E_MODE}/server.pid")" || true
fi

- name: Upload mobile E2E artifacts
if: always()
uses: actions/upload-artifact@v4
with:
name: springboard-mobile-android-e2e-${{ matrix.mode }}
path: artifacts/mobile-e2e/${{ matrix.mode }}
Loading
Loading