Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
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
32 changes: 0 additions & 32 deletions .github/workflows/build-baseline.yml
Original file line number Diff line number Diff line change
Expand Up @@ -94,18 +94,10 @@ jobs:
- name: Package Windows amd64 artifact
run: python scripts/release/package_desktop_artifact.py
- name: Upload Windows amd64 artifact
id: upload-windows-amd64
continue-on-error: ${{ github.event_name == 'pull_request' }}
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: bandscope-windows-amd64-${{ github.sha }}
path: artifacts/*
- name: Explain non-blocking Windows amd64 artifact upload failure
if: ${{ steps.upload-windows-amd64.outcome == 'failure' }}
run: |
echo "Artifact upload failed after the Windows amd64 bundle was packaged." >> "$GITHUB_STEP_SUMMARY"
echo "Pull request builds keep artifact upload non-blocking because GitHub artifact service or DNS failures do not invalidate the build evidence." >> "$GITHUB_STEP_SUMMARY"
echo "Tag and release builds remain blocking because release publication requires uploaded artifacts." >> "$GITHUB_STEP_SUMMARY"

build-windows-arm64:
name: build / windows / arm64
Expand Down Expand Up @@ -181,18 +173,10 @@ jobs:
- name: Package Windows arm64 artifact
run: python scripts/release/package_desktop_artifact.py
- name: Upload Windows arm64 artifact
id: upload-windows-arm64
continue-on-error: ${{ github.event_name == 'pull_request' }}
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: bandscope-windows-arm64-${{ github.sha }}
path: artifacts/*
- name: Explain non-blocking Windows arm64 artifact upload failure
if: ${{ steps.upload-windows-arm64.outcome == 'failure' }}
run: |
echo "Artifact upload failed after the Windows arm64 bundle was packaged." >> "$GITHUB_STEP_SUMMARY"
echo "Pull request builds keep artifact upload non-blocking because GitHub artifact service or DNS failures do not invalidate the build evidence." >> "$GITHUB_STEP_SUMMARY"
echo "Tag and release builds remain blocking because release publication requires uploaded artifacts." >> "$GITHUB_STEP_SUMMARY"

gate-windows:
name: gate / build / windows
Expand Down Expand Up @@ -247,18 +231,10 @@ jobs:
- name: Package macOS amd64 artifact
run: python3 scripts/release/package_desktop_artifact.py
- name: Upload macOS amd64 artifact
id: upload-macos-amd64
continue-on-error: ${{ github.event_name == 'pull_request' }}
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: bandscope-macos-amd64-${{ github.sha }}
path: artifacts/*
- name: Explain non-blocking macOS amd64 artifact upload failure
if: ${{ steps.upload-macos-amd64.outcome == 'failure' }}
run: |
echo "Artifact upload failed after the macOS amd64 bundle was packaged." >> "$GITHUB_STEP_SUMMARY"
echo "Pull request builds keep artifact upload non-blocking because GitHub artifact service or DNS failures do not invalidate the build evidence." >> "$GITHUB_STEP_SUMMARY"
echo "Tag and release builds remain blocking because release publication requires uploaded artifacts." >> "$GITHUB_STEP_SUMMARY"

build-macos-arm64:
name: build / macos / arm64
Expand Down Expand Up @@ -303,18 +279,10 @@ jobs:
- name: Package macOS arm64 artifact
run: python3 scripts/release/package_desktop_artifact.py
- name: Upload macOS arm64 artifact
id: upload-macos-arm64
continue-on-error: ${{ github.event_name == 'pull_request' }}
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: bandscope-macos-arm64-${{ github.sha }}
path: artifacts/*
- name: Explain non-blocking macOS arm64 artifact upload failure
if: ${{ steps.upload-macos-arm64.outcome == 'failure' }}
run: |
echo "Artifact upload failed after the macOS arm64 bundle was packaged." >> "$GITHUB_STEP_SUMMARY"
echo "Pull request builds keep artifact upload non-blocking because GitHub artifact service or DNS failures do not invalidate the build evidence." >> "$GITHUB_STEP_SUMMARY"
echo "Tag and release builds remain blocking because release publication requires uploaded artifacts." >> "$GITHUB_STEP_SUMMARY"

gate-macos:
name: gate / build / macos
Expand Down
4 changes: 4 additions & 0 deletions .jules/bolt.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,3 +41,7 @@
## 2025-02-15 - Replace Array.from(map.values()).map with a for...of loop
**Learning:** Using `Array.from(map.values()).map(...)` creates an unnecessary intermediate array which wastes memory allocation and garbage collection time, particularly for frequently re-rendered components handling large collections.
**Action:** Use a `for...of` loop over `map.values()` to iterate and push mapped elements directly into the final array for O(1) memory and avoiding intermediate array allocations.

## 2025-02-15 - Vectorize diagonal windowed operations
**Learning:** Iterating through a large NumPy matrix along the diagonal using a Python `for` loop with array slicing and summation causes high constant time overhead due to repeated inner-loop allocations.
**Action:** When performing windowed operations strictly along the diagonal of large matrices, use sub-matrix diagonal vectorization (`numpy.lib.stride_tricks.sliding_window_view` coupled with `np.diagonal` and `np.einsum`) to delegate iteration and computation to optimized C-level routines.
6 changes: 0 additions & 6 deletions .jules/sentinel.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,3 @@
**Vulnerability:** Any project identifier that can reach a filesystem path join must be treated as untrusted, even when it is generated internally or passed through IPC lookup flows.
**Learning:** Reject only dangerous path segments (`.` and `..`) and path separators (`/` and `\`) so the guard blocks traversal without rejecting ordinary identifiers such as `my..id`.
**Prevention:** Keep project ID validation centralized before `base_root.join(project_id)`, and cover forward-slash, backslash, parent-component, and benign interior-dot cases in unit tests.

## 2025-02-09 - Ensure Maximum URL Length Limit on Backend

**Vulnerability:** The Rust backend (`apps/desktop/src-tauri/src/main.rs`) did not enforce a maximum URL length limit when processing YouTube URLs via `import_youtube_url`. While the frontend enforced `MAX_YOUTUBE_URL_LENGTH = 2000` via the input element, this could be bypassed by an attacker sending requests directly to the Tauri backend API, potentially causing a Denial of Service (DoS) due to unbounded URL parsing and regex matching.
**Learning:** Input validation must occur at the entry point of untrusted data on the backend, even if it is also validated on the frontend. Relying solely on frontend validation for constraints like string length can expose the backend to resource exhaustion vulnerabilities.
**Prevention:** Always enforce constraints like maximum length, format validation, and sanitization at the earliest possible point on the backend, typically at the API boundary, regardless of frontend safeguards.
8 changes: 0 additions & 8 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -58,11 +58,3 @@
- Issue #36: Implemented rehearsal priority calculation and cue-sheet (CSV) / chart (JSON) exports
- Issue #30: Added policy-constrained YouTube import with local fallback
- Issue #26: Finalized roadmap and prepared application for initial release

## [0.1.4] - 2026-05-15

### 추가됨 (Added)

- `ChordsFeature` (코드 분석) 화면에서 각 파트(Role)의 `transpositionPlan`(이조/조옮김 계획)을 표시하는 기능을 추가했습니다.
- `RangesFeature` (음역대 분석) 화면에서 겹침 경고(Overlap warning) 외에 해당 파트의 채보(Transcription) 가능 노드 수를 요약하여 보여주는 기능을 추가했습니다.
- 신규 UI 요소에 대한 100% 테스트 커버리지를 보장하는 단위 테스트를 추가했습니다 (`apps/desktop/src/features/chords/index.test.tsx`, `apps/desktop/src/features/ranges/index.test.tsx`).
75 changes: 0 additions & 75 deletions CLAUDE.md

This file was deleted.

2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# BandScope

BandScope is a public GitHub project for a local-first desktop app that turns a song into a practical rehearsal view: likely harmony by section and by instrument or vocal role, section roadmap, tempo and groove cues, rough stem previews, playable ranges, simplification hints, transposition or capo guidance, overlap cues, visible confidence, and rehearsal priorities without DAW complexity.
BandScope is a public GitHub project for a local-first desktop app that turns a song into a practical rehearsal view: likely harmony by section and by instrument or vocal role, section roadmap, tempo and groove cues, separated stems, playable ranges, simplification hints, transposition or capo guidance, overlap cues, visible confidence, and rehearsal priorities without DAW complexity.

It does not promise notation-grade full arrangement transcription or DAW-style production editing.

Expand Down
1 change: 0 additions & 1 deletion apps/desktop/.gitignore

This file was deleted.

23 changes: 0 additions & 23 deletions apps/desktop/.storybook/main.ts

This file was deleted.

14 changes: 0 additions & 14 deletions apps/desktop/.storybook/preview.ts

This file was deleted.

5 changes: 0 additions & 5 deletions apps/desktop/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,6 @@
"scripts": {
"dev": "vite",
"build": "vite build",
"storybook": "storybook dev -p 6006",
"build-storybook": "storybook build",
"lint": "eslint \"src/**/*.{ts,tsx}\" vite.config.ts",
"typecheck": "tsc --noEmit",
"test": "node -e \"require('node:fs').mkdirSync('coverage/.tmp', { recursive: true })\" && vitest run --coverage"
Expand All @@ -22,12 +20,10 @@
"lucide-react": "^1.20.0",
"react": "^19.2.4",
"react-dom": "^19.2.7",
"sonner": "^2.0.7",
"tailwind-merge": "^3.6.0",
"tw-animate-css": "^1.4.0"
},
"devDependencies": {
"@storybook/react-vite": "^10.4.6",
"@tailwindcss/vite": "^4.3.1",
"@tauri-apps/cli": "^2.11.2",
"@testing-library/jest-dom": "^6.6.3",
Expand All @@ -39,7 +35,6 @@
"@vitest/coverage-v8": "^4.1.5",
"eslint": "^10.5.0",
"jsdom": "^29.1.1",
"storybook": "^10.4.6",
"tailwindcss": "^4.2.4",
"typescript": "^6.0.3",
"typescript-eslint": "^8.60.1",
Expand Down
9 changes: 0 additions & 9 deletions apps/desktop/src-tauri/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1107,13 +1107,7 @@ async fn import_youtube_url(
Err("YouTube import failed with an unknown error.".to_string())
}

const MAX_YOUTUBE_URL_LENGTH: usize = 2000;

fn is_supported_youtube_url(url: &str) -> bool {
if url.len() > MAX_YOUTUBE_URL_LENGTH {
return false;
}

let parsed_url = match url::Url::parse(url) {
Ok(u) => u,
Err(_) => return false,
Expand Down Expand Up @@ -1526,9 +1520,6 @@ mod tests {
));
assert!(!is_supported_youtube_url("https://youtu.be/abc123"));
assert!(!is_supported_youtube_url("https://youtu.be/abc123DEF4!"));

let long_url = format!("https://youtube.com/watch?v={}", "a".repeat(2000));
assert!(!is_supported_youtube_url(&long_url));
}

#[test]
Expand Down
3 changes: 0 additions & 3 deletions apps/desktop/src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,6 @@ import { EmptyState, ErrorState, LoadingState } from "./features/workspace/Works
import { Button } from "@/components/ui/button";
import { Input } from "@/components/ui/input";
import { Progress } from "@/components/ui/progress";
import { Toaster } from "@/components/ui/sonner";

const ANALYSIS_POLL_INTERVAL_MS = 250;
const MAX_ERROR_DETAIL_LENGTH = 220;
Expand Down Expand Up @@ -801,8 +800,6 @@ export function App() {
</section>
</main>
</div>

<Toaster />
</div>
);
}
Loading
Loading