Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
90 commits
Select commit Hold shift + click to select a range
4294ddc
test(supply-chain): require deterministic npm lock generator
seonghobae Aug 7, 2026
afb20be
fix(supply-chain): pin npm lock generator metadata
seonghobae Aug 7, 2026
e64c229
ci(supply-chain): prove npm version and lock reproduction
seonghobae Aug 7, 2026
ebbde9b
docs(supply-chain): record npm generator provenance
seonghobae Aug 7, 2026
694ca83
docs(changelog): record npm generator contract
seonghobae Aug 7, 2026
90dc2a0
fix(supply-chain): avoid serializing npm into runtime engines
seonghobae Aug 7, 2026
fecc36b
test(supply-chain): keep npm enforcement out of runtime engines
seonghobae Aug 7, 2026
9eb83c3
docs(supply-chain): separate npm generator from runtime engines
seonghobae Aug 7, 2026
5609b88
ci(supply-chain): publish deterministic lock reproduction evidence
seonghobae Aug 7, 2026
032314d
test(supply-chain): require preserved lock reproduction evidence
seonghobae Aug 7, 2026
0263ad4
test(security): require coordinated PDF.js and Undici baseline
seonghobae Aug 7, 2026
2cbf767
test(security): disable PDF expression evaluation
seonghobae Aug 7, 2026
475de96
fix(security): pin the patched Undici transitive version
seonghobae Aug 7, 2026
deb74ac
fix(security): pin the patched PDF.js release
seonghobae Aug 7, 2026
dc90d5b
fix(security): disable PDF expression evaluation
seonghobae Aug 7, 2026
b23b957
docs(security): record coordinated PDF and HTTP remediation
seonghobae Aug 7, 2026
2e99f72
docs(changelog): record coordinated security remediation
seonghobae Aug 7, 2026
8f50fe4
fix(security): anchor the Undici override to an exact root floor
seonghobae Aug 7, 2026
e2c0c2d
test(security): bind exact root floor and npm package locations
seonghobae Aug 7, 2026
dd93f96
ci(pr783): import exact npm 10.9.8 lock artifact
seonghobae Aug 7, 2026
dd8d1ac
fix(score): align PDF.js boundary with 6.2.108 API
seonghobae Aug 7, 2026
988dc1d
test(score): prove the supported data-only PDF.js boundary
seonghobae Aug 7, 2026
a39e37f
docs(security): record the supported PDF.js 6.2.108 boundary
seonghobae Aug 7, 2026
6b753e6
docs(changelog): describe the supported patched PDF boundary
seonghobae Aug 7, 2026
b773653
ci(pr783): rerun lock import after supported API repair
seonghobae Aug 7, 2026
01cb39e
ci(pr783): publish the verified lock from the bounded importer
seonghobae Aug 7, 2026
ad558ac
ci(pr783): fetch complete lineage for verified lock publication
seonghobae Aug 7, 2026
83865dc
fix(security): import verified npm 10.9.8 lock
github-actions[bot] Aug 7, 2026
e6b48ca
test(ci): preserve canonical npm provenance formatting
seonghobae Aug 7, 2026
3edf173
ci(pr783): diagnose Ruff import ordering
seonghobae Aug 7, 2026
2345219
style(ci): normalize security test imports
seonghobae Aug 7, 2026
dc7e8b4
style(ci): normalize npm provenance test imports
seonghobae Aug 7, 2026
c5ee630
chore(ci): remove completed Ruff diagnostic
seonghobae Aug 7, 2026
f0c9ad1
ci(pr783): finalize exact Ruff formatting
seonghobae Aug 7, 2026
102a89f
chore(ci): remove temporary branch writer
seonghobae Aug 7, 2026
d4887ec
style(test): apply Ruff formatting to security contracts
seonghobae Aug 7, 2026
459abdd
style(test): finish Ruff formatting for npm provenance
seonghobae Aug 7, 2026
ace4257
fix(security): refresh vulnerable npm transitive pins
seonghobae Aug 11, 2026
63d0ae6
fix(deps): restore manifest-lock consistency
seonghobae Aug 11, 2026
6bba612
ci: add one-shot canonical lock repair for PR 783
seonghobae Aug 14, 2026
ef938fa
fix(deps): regenerate canonical npm 10.9.8 lock
github-actions[bot] Aug 14, 2026
a48ff96
ci: retrigger exact-head validation after canonical lock generation
seonghobae Aug 14, 2026
fd9389a
ci: add one-shot Ruff formatter for PR 783
seonghobae Aug 14, 2026
afba132
style(test): apply canonical Ruff formatting
github-actions[bot] Aug 14, 2026
e214e96
ci: retrigger exact-head validation after canonical Ruff formatting
seonghobae Aug 14, 2026
0cd6836
fix(test): verify canonical hoisted PDF.js lock record
seonghobae Aug 14, 2026
f4a5a19
ci: add final one-shot Ruff formatter for PR 783
seonghobae Aug 14, 2026
219267e
style(test): apply final canonical Ruff formatting
github-actions[bot] Aug 14, 2026
db7b1c1
chore(ci): retrigger exact-head protected checks
seonghobae Aug 14, 2026
f4d8850
fix(ci): validate npm lock without mutable resolution
seonghobae Aug 14, 2026
8a143ab
test(supply-chain): format npm toolchain contract
seonghobae Aug 14, 2026
b3ac826
test(supply-chain): satisfy ruff formatting gate
seonghobae Aug 14, 2026
885c037
test(supply-chain): format npm toolchain contract
seonghobae Aug 14, 2026
de0cd6b
test(supply-chain): apply repository Ruff width
seonghobae Aug 14, 2026
f3cfae4
docs(security): align npm lock provenance with frozen validation
seonghobae Aug 14, 2026
de75178
fix(ci): disable persisted checkout credentials
seonghobae Aug 14, 2026
164e6f2
docs(changelog): correct UI test coverage claim
seonghobae Aug 14, 2026
07c1dd2
test(lock): reject esbuild peer metadata drift
seonghobae Aug 15, 2026
ad4551b
docs(lock): record esbuild metadata sentinel
seonghobae Aug 15, 2026
6f81f52
docs(changelog): record lock metadata drift gate
seonghobae Aug 15, 2026
6665f02
fix(security): make PDF XML boundary explicit
seonghobae Aug 15, 2026
bf5a3a3
test(security): lock down PDF parser options
seonghobae Aug 15, 2026
c65f5b1
docs(security): record PDF parser hardening evidence
seonghobae Aug 15, 2026
dae5d3c
docs(security): correct PDF.js advisory attribution
seonghobae Aug 15, 2026
afdecc5
test(build): require coordinated Node 22.22.2 and jsdom 30 floor
seonghobae Aug 17, 2026
1dbe037
test(build): align Node floor contract with canonical npm generator
seonghobae Aug 17, 2026
66c97c2
merge: stack Node compatibility migration on dependency baseline
seonghobae Aug 17, 2026
32cf47c
build(node): raise supported Node 22 floor
seonghobae Aug 17, 2026
f74beb0
build(deps-dev): adopt jsdom 30 on coordinated Node floor
seonghobae Aug 17, 2026
2affed5
docs(build): publish Node 22.22.2 minimum
seonghobae Aug 17, 2026
65d199d
test(build): align npm provenance with Node compatibility floor
seonghobae Aug 17, 2026
c721cee
test(build): require explicit minimum-Node npm bootstrap lane
seonghobae Aug 17, 2026
fcb0b27
ci(build): add exact Node 22.22.2 compatibility lane
seonghobae Aug 17, 2026
aa527bb
test(build): audit canonical runtime documentation paths
seonghobae Aug 17, 2026
5b50c59
test(ci): prevent pre-bootstrap npm cache discovery
seonghobae Aug 17, 2026
783112b
fix(ci): bootstrap canonical npm before cache discovery
seonghobae Aug 17, 2026
e004765
docs(build): reconcile Node floor with npm generator provenance
seonghobae Aug 17, 2026
b3a3c91
test(ci): require setup-node automatic cache opt-out
seonghobae Aug 17, 2026
feb4136
fix(ci): disable setup-node auto cache before npm bootstrap
seonghobae Aug 17, 2026
a256606
test(node): require Corepack npm bootstrap and lock provenance
seonghobae Aug 17, 2026
9eb5c10
fix(node): harden npm bootstrap and capture lock provenance
seonghobae Aug 17, 2026
6f5d1e4
test(node): assert direct workspace jsdom resolution
seonghobae Aug 17, 2026
0766cdb
fix(ci): keep Node floor lane frozen-install only
seonghobae Aug 17, 2026
8596bd1
fix(ci): satisfy workflow supply-chain baseline
seonghobae Aug 17, 2026
ce45742
test(ci): preserve credential-free lock validation in node floor
seonghobae Aug 18, 2026
c07e516
fix(ci): inherit credential-free lock validation
seonghobae Aug 18, 2026
76f0953
chore(node): reconstruct compatibility lane on protected develop
seonghobae Aug 29, 2026
5108c9a
fix(node): inherit protected npm runtime authority
seonghobae Aug 29, 2026
8e6a738
docs(node): align npm provenance with raised runtime floor
seonghobae Aug 29, 2026
fc3d1ec
chore(node): restack npm compatibility owner on protected develop
seonghobae Sep 4, 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
72 changes: 72 additions & 0 deletions .github/workflows/node-minimum-compatibility.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
name: node-minimum-compatibility

on:
pull_request:
push:
branches:
- develop
- main

permissions:
contents: read

env:
GIT_CONFIG_COUNT: "1"
GIT_CONFIG_KEY_0: init.defaultBranch
GIT_CONFIG_VALUE_0: develop
EXPECTED_NPM_VERSION: "10.9.9"

jobs:
node-minimum-compatibility:
name: gate / build / node-minimum-compatibility
runs-on: macos-15
steps:
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
persist-credentials: false
- uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
with:
node-version: 22.22.2
package-manager-cache: false
- name: Activate pinned npm runtime
run: corepack enable npm
- name: Verify exact npm lockfile generator and bundled tar
run: |
test "$(npm --version)" = "$EXPECTED_NPM_VERSION"
npm run check:npm-runtime
- name: Install frozen Node dependencies
run: npm ci --ignore-scripts --no-audit --no-fund
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
with:
python-version: "3.12"
- uses: astral-sh/setup-uv@11f9893b081a58869d3b5fccaea48c9e9e46f990 # v8.3.2
with:
version: "0.8.6"
enable-cache: false
- name: Install stable Rust toolchain
run: rustup toolchain install stable --profile minimal
- name: Sync frozen Python dependencies
run: uv sync --project services/analysis-engine --group dev --frozen
- name: Build and install Rust numeric extension
shell: bash
run: |
VENV_PY="$PWD/services/analysis-engine/.venv/bin/python"
uvx maturin@1.9.6 build --release \
--manifest-path services/analysis-engine/rust/Cargo.toml \
--interpreter "$VENV_PY" \
--out services/analysis-engine/rust/dist
uv pip install --python "$VENV_PY" services/analysis-engine/rust/dist/*.whl
- name: Lint
run: npm run lint
- name: Typecheck
run: npm run typecheck
- name: Test with measured coverage
run: npm run test
- name: Build production workspaces
run: npm run build
- name: Build Storybook
run: npm run build-storybook --workspace @bandscope/desktop
- name: Check Tauri shell
run: cargo +stable check --manifest-path apps/desktop/src-tauri/Cargo.toml --locked
- name: Test Tauri shell
run: cargo +stable test --manifest-path apps/desktop/src-tauri/Cargo.toml --locked
4 changes: 2 additions & 2 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ Agent execution and delegation rules live in `docs/agents/README.md`. PR canonic

## Common commands

Setup (Node >=22.13 <23, Python >=3.12 via `uv`, Rust stable only for the Tauri shell):
Setup (Node >=22.22.2 <23, Python >=3.12 via `uv`, Rust stable only for the Tauri shell):

```bash
npm install
Expand Down Expand Up @@ -51,7 +51,7 @@ BandScope is a local-first desktop app for rehearsal prep: it turns a song into

Three layers, decoupled through shared contracts:

- `apps/desktop` — Tauri 2 + Vite + React 19 shell (Tailwind 4, Base UI, Storybook). Feature screens live in `src/features/` (home, workspace, chords, ranges, player, settings). The ready workspace names tonight's first playable range and the next instrument check. `src/lib/analysis.ts` and `src/lib/job_runner.ts` call typed Tauri IPC commands, with a browser fallback that serves demo data when not running inside Tauri.
- `apps/desktop` — Tauri 2 + Vite + React 19 shell (Tailwind 4, Base UI, Storybook). Feature screens live in `src/features/` (home, workspace, chords, ranges, player, settings). `src/lib/analysis.ts` and `src/lib/job_runner.ts` call typed Tauri IPC commands, with a browser fallback that serves demo data when not running inside Tauri.
- `apps/desktop/src-tauri/src/main.rs` — the Rust orchestration boundary. Tauri commands (`start_analysis_job`, `get_analysis_job_status`, `select_local_audio_source`, `import_youtube_url`) validate untrusted input (project IDs, file paths, URLs) and spawn the Python engine as a subprocess. There is no loopback HTTP listener and no network path for local analysis.
- `services/analysis-engine` — Python package `bandscope_analysis` (librosa/numpy). Entry point `cli.py` reads a JSON job request on stdin and prints a structured job-status JSON envelope on stdout (`--progress-jsonl` streams progress lines). `api.py` orchestrates the pipeline across the `separation`, `sections`, `roles`, `chords`, `ranges`, `temporal`, `transcription`, and `youtube` modules.

Expand Down
2 changes: 1 addition & 1 deletion apps/desktop/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@
"@vitejs/plugin-react": "^6.0.2",
"@vitest/coverage-v8": "^4.1.10",
"eslint": "^10.7.0",
"jsdom": "^29.1.1",
"jsdom": "^30.0.1",
"storybook": "^10.4.6",
"tailwindcss": "^4.2.4",
"typescript": "^6.0.3",
Expand Down
Loading
Loading