Date: Thu, 21 May 2026 05:13:17 +0000
Subject: [PATCH 34/42] Remove playlist transitions panel
Agent-Logs-Url: https://github.com/samsta/KeyBpmMap/sessions/b935ceee-0146-452b-8d98-995d4a464519
Co-authored-by: samsta <3915450+samsta@users.noreply.github.com>
---
src/App.tsx | 45 +--------------------------------------------
1 file changed, 1 insertion(+), 44 deletions(-)
diff --git a/src/App.tsx b/src/App.tsx
index 5e15fa4..8f38c9b 100644
--- a/src/App.tsx
+++ b/src/App.tsx
@@ -11,7 +11,6 @@ import {
MAX_BPM_BAND_SIZE,
MIN_BPM_BAND_SIZE,
summarizeTracks,
- summarizeTransitions,
} from './lib/analysis'
import { CAMELOT_KEYS } from './lib/camelot'
import { loadEngineDjLibrary } from './lib/engineDj'
@@ -99,27 +98,6 @@ function App() {
})
}, [filters, library.tracks, playlistLookup])
- const filteredTrackIds = useMemo(
- () => new Set(filteredTracks.map((track) => track.id)),
- [filteredTracks],
- )
-
- const filteredTransitions = useMemo(() => {
- return library.transitions.filter((transition) => {
- if (
- filters.playlistId !== 'all' &&
- transition.playlistId !== filters.playlistId
- ) {
- return false
- }
-
- return (
- filteredTrackIds.has(transition.fromTrackId) &&
- filteredTrackIds.has(transition.toTrackId)
- )
- })
- }, [filteredTrackIds, filters.playlistId, library.transitions])
-
const bpmBands = useMemo(
() => createBpmBands(filteredTracks, bpmBandSize),
[bpmBandSize, filteredTracks],
@@ -146,10 +124,6 @@ function App() {
)
const summary = useMemo(() => summarizeTracks(filteredTracks), [filteredTracks])
const sparseCells = useMemo(() => findSparseCells(densityCells, bpmBands), [bpmBands, densityCells])
- const topTransitions = useMemo(
- () => summarizeTransitions(filteredTransitions),
- [filteredTransitions],
- )
const handleLoadMockData = () => {
setLibrary(createMockLibrary())
@@ -254,7 +228,7 @@ function App() {
See where your key and BPM density actually lives.
Load a local Engine DJ SQLite database in the browser, inspect harmonic and
- tempo hotspots, and drill into sparse areas or playlist transitions without
+ tempo hotspots, and drill into sparse areas without
uploading your library anywhere. Engine DJ usually stores it at
{' '}
@@ -598,23 +572,6 @@ function App() {
)}
-
- Top playlist transitions
-
-
)
From fe33036cd1677293c408ebbf8436c8786a180038 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Thu, 21 May 2026 05:35:59 +0000
Subject: [PATCH 35/42] Add track title spacing
Agent-Logs-Url: https://github.com/samsta/KeyBpmMap/sessions/3bbe7cd3-239e-4cc7-86f3-c9ce760a9282
Co-authored-by: samsta <3915450+samsta@users.noreply.github.com>
---
src/App.css | 6 ++++++
src/App.tsx | 2 +-
2 files changed, 7 insertions(+), 1 deletion(-)
diff --git a/src/App.css b/src/App.css
index f1a5ee0..57e6fa2 100644
--- a/src/App.css
+++ b/src/App.css
@@ -262,6 +262,12 @@ select {
gap: 8px;
}
+.track-title {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 0.35em;
+}
+
.track-list strong,
.simple-list strong,
.source-panel strong {
diff --git a/src/App.tsx b/src/App.tsx
index 8f38c9b..a7e8791 100644
--- a/src/App.tsx
+++ b/src/App.tsx
@@ -514,7 +514,7 @@ function App() {
{selectedCell.tracks.length > 0 ? (
selectedCell.tracks.map((track) => (
-
+
{track.artist}
{track.title}
From 2fad768aa68d8a4cac91e2e07f811a658c300baa Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Thu, 21 May 2026 05:42:50 +0000
Subject: [PATCH 36/42] Add visible app version
Agent-Logs-Url: https://github.com/samsta/KeyBpmMap/sessions/c8e26471-412f-4aac-ba26-e4f809f916b7
Co-authored-by: samsta <3915450+samsta@users.noreply.github.com>
---
package.json | 2 +-
src/App.tsx | 6 ++++++
src/globals.d.ts | 1 +
vite.config.ts | 3 +++
4 files changed, 11 insertions(+), 1 deletion(-)
create mode 100644 src/globals.d.ts
diff --git a/package.json b/package.json
index 2e447ee..e44f68c 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
{
"name": "keybpmmap",
"private": true,
- "version": "0.0.0",
+ "version": "0.1.0",
"type": "module",
"scripts": {
"dev": "vite",
diff --git a/src/App.tsx b/src/App.tsx
index a7e8791..a136152 100644
--- a/src/App.tsx
+++ b/src/App.tsx
@@ -42,6 +42,7 @@ interface OpenFilePickerConfig {
type PolarKeyMode = 'both' | 'A' | 'B'
const POLAR_KEY_MODES = ['both', 'A', 'B'] as const
+const APP_VERSION = __APP_VERSION__
function App() {
const [library, setLibrary] = useState
(() => createMockLibrary())
@@ -290,6 +291,11 @@ function App() {
Browser only
No upload path, no remote API, no backend.
+
+
Version
+
v{APP_VERSION}
+
Manually bumped in package.json for each PR.
+
{error ? : null}
diff --git a/src/globals.d.ts b/src/globals.d.ts
new file mode 100644
index 0000000..e042dcc
--- /dev/null
+++ b/src/globals.d.ts
@@ -0,0 +1 @@
+declare const __APP_VERSION__: string
diff --git a/vite.config.ts b/vite.config.ts
index 8941466..49c6a7d 100644
--- a/vite.config.ts
+++ b/vite.config.ts
@@ -3,5 +3,8 @@ import react from '@vitejs/plugin-react'
export default defineConfig({
base: '/KeyBpmMap/',
+ define: {
+ __APP_VERSION__: JSON.stringify(process.env.npm_package_version ?? '0.1.0'),
+ },
plugins: [react()],
})
From 62b1ea92415faee1b61d3616affaafe82054869a Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Thu, 21 May 2026 05:44:04 +0000
Subject: [PATCH 37/42] Read app version from package metadata
Agent-Logs-Url: https://github.com/samsta/KeyBpmMap/sessions/c8e26471-412f-4aac-ba26-e4f809f916b7
Co-authored-by: samsta <3915450+samsta@users.noreply.github.com>
---
vite.config.ts | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/vite.config.ts b/vite.config.ts
index 49c6a7d..b63143f 100644
--- a/vite.config.ts
+++ b/vite.config.ts
@@ -1,10 +1,15 @@
+import { readFileSync } from 'node:fs'
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
+const { version } = JSON.parse(
+ readFileSync(new URL('./package.json', import.meta.url), 'utf8'),
+) as { version: string }
+
export default defineConfig({
base: '/KeyBpmMap/',
define: {
- __APP_VERSION__: JSON.stringify(process.env.npm_package_version ?? '0.1.0'),
+ __APP_VERSION__: JSON.stringify(version),
},
plugins: [react()],
})
From 3daf4a4da010e2340e398f698ab0a47130ed0ec4 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Thu, 21 May 2026 05:45:05 +0000
Subject: [PATCH 38/42] Validate package version metadata
Agent-Logs-Url: https://github.com/samsta/KeyBpmMap/sessions/c8e26471-412f-4aac-ba26-e4f809f916b7
Co-authored-by: samsta <3915450+samsta@users.noreply.github.com>
---
vite.config.ts | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)
diff --git a/vite.config.ts b/vite.config.ts
index b63143f..1bf6c15 100644
--- a/vite.config.ts
+++ b/vite.config.ts
@@ -2,9 +2,15 @@ import { readFileSync } from 'node:fs'
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
-const { version } = JSON.parse(
+const packageMetadata = JSON.parse(
readFileSync(new URL('./package.json', import.meta.url), 'utf8'),
-) as { version: string }
+) as { version?: unknown }
+
+if (typeof packageMetadata.version !== 'string' || packageMetadata.version.length === 0) {
+ throw new Error('package.json must define a non-empty string version')
+}
+
+const version = packageMetadata.version
export default defineConfig({
base: '/KeyBpmMap/',
From 3baad9f273107e1e7847944bed79993ae219e7ea Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Thu, 21 May 2026 05:50:19 +0000
Subject: [PATCH 39/42] Add Copilot version review guidance
Agent-Logs-Url: https://github.com/samsta/KeyBpmMap/sessions/f0d861be-38c4-4937-a76e-76759a62930e
Co-authored-by: samsta <3915450+samsta@users.noreply.github.com>
---
.github/copilot-instructions.md | 7 +++++++
1 file changed, 7 insertions(+)
create mode 100644 .github/copilot-instructions.md
diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md
new file mode 100644
index 0000000..6ff4128
--- /dev/null
+++ b/.github/copilot-instructions.md
@@ -0,0 +1,7 @@
+# Copilot review instructions
+
+- The app version shown in the UI comes from `package.json`.
+- Every pull request should bump `package.json` to a newer version before review.
+- Treat the project version as monotonically increasing: never reuse, lower, or skip back to an older version than the base branch.
+- Follow the current project convention of incrementing the minor version for each PR (for example `0.1.0` → `0.2.0`).
+- Copilot reviews should flag any PR that does not update the version, or that updates it to a value that is not strictly greater than the version on the base branch.
From 3d38569ffa52d4203841ad992e965ee69616fc75 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Thu, 21 May 2026 05:50:51 +0000
Subject: [PATCH 40/42] Clarify version bump example
Agent-Logs-Url: https://github.com/samsta/KeyBpmMap/sessions/f0d861be-38c4-4937-a76e-76759a62930e
Co-authored-by: samsta <3915450+samsta@users.noreply.github.com>
---
.github/copilot-instructions.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md
index 6ff4128..42e6f84 100644
--- a/.github/copilot-instructions.md
+++ b/.github/copilot-instructions.md
@@ -3,5 +3,5 @@
- The app version shown in the UI comes from `package.json`.
- Every pull request should bump `package.json` to a newer version before review.
- Treat the project version as monotonically increasing: never reuse, lower, or skip back to an older version than the base branch.
-- Follow the current project convention of incrementing the minor version for each PR (for example `0.1.0` → `0.2.0`).
+- Follow the current project convention of incrementing the minor version for each PR (for example `0.1.0` → `0.2.0` → `0.3.0` across consecutive PRs).
- Copilot reviews should flag any PR that does not update the version, or that updates it to a value that is not strictly greater than the version on the base branch.
From c30078e58fe0d0106ffa8bb44151cadeab17571f Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Thu, 21 May 2026 05:51:23 +0000
Subject: [PATCH 41/42] Polish Copilot version review guidance
Agent-Logs-Url: https://github.com/samsta/KeyBpmMap/sessions/f0d861be-38c4-4937-a76e-76759a62930e
Co-authored-by: samsta <3915450+samsta@users.noreply.github.com>
---
.github/copilot-instructions.md | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md
index 42e6f84..e4e36bf 100644
--- a/.github/copilot-instructions.md
+++ b/.github/copilot-instructions.md
@@ -1,7 +1,7 @@
# Copilot review instructions
- The app version shown in the UI comes from `package.json`.
-- Every pull request should bump `package.json` to a newer version before review.
+- Every pull request should bump `package.json` to a newer version before merge.
- Treat the project version as monotonically increasing: never reuse, lower, or skip back to an older version than the base branch.
-- Follow the current project convention of incrementing the minor version for each PR (for example `0.1.0` → `0.2.0` → `0.3.0` across consecutive PRs).
+- The project convention is to increment the minor version for each PR (for example `0.1.0` → `0.2.0` → `0.3.0` across consecutive PRs).
- Copilot reviews should flag any PR that does not update the version, or that updates it to a value that is not strictly greater than the version on the base branch.
From bbbf1cddae873a11098ca59981184af86e6742b7 Mon Sep 17 00:00:00 2001
From: Sam Nobs
Date: Thu, 21 May 2026 17:52:14 +1200
Subject: [PATCH 42/42] Apply suggestion from @samsta
---
src/App.tsx | 1 -
1 file changed, 1 deletion(-)
diff --git a/src/App.tsx b/src/App.tsx
index a136152..b1ae83a 100644
--- a/src/App.tsx
+++ b/src/App.tsx
@@ -294,7 +294,6 @@ function App() {
Version
v{APP_VERSION}
-
Manually bumped in package.json for each PR.