Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
3bec5d7
Initial commit
Sep 29, 2026
95e3286
feat: Android client for True Tunes
Sep 29, 2026
7311a72
chore: add lint, format, coverage and CI tooling
Sep 29, 2026
d36128a
ci: tag-triggered signed release pipeline
Sep 29, 2026
3225226
feat: debug builds get their own package name
Sep 29, 2026
388b5e0
Merge pull request #1 from TrueNorthIT/ci/android-release
RichKelsey Sep 29, 2026
24bc6bc
Merge pull request #2 from TrueNorthIT/develop
RichKelsey Sep 30, 2026
af166dd
feat: use the desktop app icon
Sep 30, 2026
f885388
Merge pull request #3 from TrueNorthIT/feat/app-icon
RichKelsey Sep 30, 2026
3a65b43
Merge pull request #4 from TrueNorthIT/develop
RichKelsey Sep 30, 2026
d96a352
Build and package the SMTC native addon in Windows releases
JoePittsy Oct 1, 2026
975b6a7
Merge pull request #106 from TrueNorthIT/fix/package-smtc-addon
JoePittsy Oct 1, 2026
b3230f9
chore: bump version to 1.0.47
github-actions[bot] Oct 1, 2026
293c9ee
feat(ios): add iOS platform and bundle identifier
JoePittsy Oct 9, 2026
3c60d01
feat(ios): adopt the UIScene life cycle so the app launches on iOS 27
JoePittsy Oct 9, 2026
ad67449
chore(deps): bump Expo SDK 57 patch versions for expo-doctor
JoePittsy Oct 9, 2026
cd2552a
Merge pull request #5 from TrueNorthIT/feat/ios
JoePittsy Oct 9, 2026
a58a250
chore: move the Android app into apps/mobile with its history
JoePittsy Oct 9, 2026
4979838
chore: keep the desktop lint and format tooling out of apps/
JoePittsy Oct 9, 2026
26922bd
chore: merge the Claude settings and drop the renderer's stray packag…
JoePittsy Oct 9, 2026
4c05bdd
ci: split the workflows into desktop and mobile
JoePittsy Oct 9, 2026
4bbf464
docs: describe the monorepo layout, workflows and android-v tags
JoePittsy Oct 9, 2026
58e2dcf
docs: drop a duplicated release-tag note from the mobile CLAUDE.md
JoePittsy Oct 9, 2026
73ab663
chore: move the desktop app into apps/desktop and adopt npm workspaces
JoePittsy Oct 9, 2026
702eebb
ci: run the workflows against the workspace layout
JoePittsy Oct 9, 2026
b0018c7
chore(desktop): move to the mobile app's test and lint tooling
JoePittsy Oct 9, 2026
08c2819
style(desktop): run Prettier over the main process and renderer sources
JoePittsy Oct 9, 2026
8a8ed65
docs: describe the workspace layout and where each command runs
JoePittsy Oct 9, 2026
8da1ee7
feat(core): move the platform-neutral modules into packages/core
JoePittsy Oct 9, 2026
8b7b324
docs: describe packages/core and how to add a capability to it
JoePittsy Oct 9, 2026
b85cbc4
ci(desktop): publish only on desktop paths, not the shared lock or pa…
JoePittsy Oct 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
3 changes: 2 additions & 1 deletion .claude/settings.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
{
"enabledPlugins": {
"frontend-design@claude-plugins-official": true
"frontend-design@claude-plugins-official": true,
"expo@claude-plugins-official": true
}
}
78 changes: 78 additions & 0 deletions .github/workflows/core.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
name: Core

# packages/core (@truetunes/core): typecheck, lint (including the platform-neutral import ban) and Node tests.
on:
push:
branches: [main]
paths:
- 'packages/core/**'
- 'apps/mobile/src/types/globals.d.ts'
- 'package.json'
- 'package-lock.json'
- '.github/workflows/core.yml'
pull_request:
branches: [main, develop]
paths:
- 'packages/core/**'
- 'apps/mobile/src/types/globals.d.ts'
- 'package.json'
- 'package-lock.json'
- '.github/workflows/core.yml'

permissions:
contents: read
checks: write
pull-requests: write

env:
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
ELECTRON_SKIP_BINARY_DOWNLOAD: 1

defaults:
run:
working-directory: packages/core

jobs:
validate:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v4

- uses: actions/setup-node@v4
with:
node-version-file: '.nvmrc'
cache: 'npm'

- run: npm ci
working-directory: .

- run: npm run lint

- run: npm run typecheck

- name: Test with coverage
run: >
npm run test:run --
--reporter=default
--reporter=junit
--outputFile.junit=./junit.xml
--coverage

- name: Publish test results
uses: dorny/test-reporter@v1
if: always()
with:
name: Core Vitest Tests
path: packages/core/junit.xml
reporter: java-junit
fail-on-error: true

- name: Publish coverage report
uses: davelosert/vitest-coverage-report-action@v2
if: always()
with:
name: Core
json-summary-path: packages/core/coverage/coverage-summary.json
json-final-path: packages/core/coverage/coverage-final.json
vite-config-path: packages/core/vitest.config.ts
46 changes: 38 additions & 8 deletions .github/workflows/publish.yml → .github/workflows/desktop.yml
Original file line number Diff line number Diff line change
@@ -1,10 +1,26 @@
name: Publish
name: Desktop

# Validates desktop PRs; on push to main, bumps the patch version and publishes a desktop release.
# Only desktop paths trigger it: without the filter, every mobile commit to main would publish a desktop release.
# PRs also run it for server/ changes, because the server is linted with the desktop ESLint config.
on:
# Publishing is narrower than validation: the root lock and packages/ change with mobile work too, and each
# push here ships a release. Desktop dependency changes always touch apps/desktop/package.json. Add packages/**
# once the desktop imports @truetunes/core.
push:
branches: [main]
paths:
- 'apps/desktop/**'
- '.github/workflows/desktop.yml'
pull_request:
branches: [main, develop]
paths:
- 'apps/desktop/**'
- 'packages/**'
- 'server/**'
- 'package.json'
- 'package-lock.json'
- '.github/workflows/desktop.yml'

permissions:
contents: write
Expand All @@ -14,6 +30,10 @@ permissions:
env:
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true

defaults:
run:
working-directory: apps/desktop

jobs:
validate:
runs-on: ubuntu-latest
Expand All @@ -27,9 +47,13 @@ jobs:
cache: 'npm'

- run: npm ci
working-directory: .

- run: npm run lint

- run: npm run lint:server
working-directory: .

- run: npm run typecheck

- name: Test with coverage
Expand All @@ -45,17 +69,18 @@ jobs:
if: always()
with:
name: Vitest Tests
path: renderer/junit.xml
path: apps/desktop/renderer/junit.xml
reporter: java-junit
fail-on-error: true

- name: Publish coverage report
uses: davelosert/vitest-coverage-report-action@v2
if: always()
with:
json-summary-path: renderer/coverage/coverage-summary.json
json-final-path: renderer/coverage/coverage-final.json
vite-config-path: renderer/vitest.config.ts
name: Desktop
json-summary-path: apps/desktop/renderer/coverage/coverage-summary.json
json-final-path: apps/desktop/renderer/coverage/coverage-final.json
vite-config-path: apps/desktop/renderer/vitest.config.ts

version:
needs: validate
Expand All @@ -72,18 +97,21 @@ jobs:
with:
node-version-file: '.nvmrc'

# --package-lock-only: bump apps/desktop/package.json and its entry in the root lock without installing anything.
- name: Bump patch version
id: bump
working-directory: .
run: |
npm version patch --no-git-tag-version
echo "new_version=$(node -p "require('./package.json').version")" >> $GITHUB_OUTPUT
npm version patch -w apps/desktop --no-git-tag-version --package-lock-only
echo "new_version=$(node -p "require('./apps/desktop/package.json').version")" >> $GITHUB_OUTPUT

- name: Commit and push
id: push
working-directory: .
run: |
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
git add package.json package-lock.json
git add apps/desktop/package.json package-lock.json
git commit -m "chore: bump version to ${{ steps.bump.outputs.new_version }}"
git push
echo "sha=$(git rev-parse HEAD)" >> $GITHUB_OUTPUT
Expand Down Expand Up @@ -112,7 +140,9 @@ jobs:
cache: 'npm'

- run: npm ci
working-directory: .

# electron-builder runs from apps/desktop (output in apps/desktop/release) and finds the hoisted node_modules itself.
- run: npm run ${{ matrix.script }}
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
Expand Down
82 changes: 82 additions & 0 deletions .github/workflows/mobile-ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
name: Mobile CI

on:
push:
branches: [main]
paths:
- 'apps/mobile/**'
- 'packages/**'
- 'package.json'
- 'package-lock.json'
- '.github/workflows/mobile-ci.yml'
pull_request:
branches: [main, develop]
paths:
- 'apps/mobile/**'
- 'packages/**'
- 'package.json'
- 'package-lock.json'
- '.github/workflows/mobile-ci.yml'

permissions:
contents: read
checks: write
pull-requests: write

env:
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
# The root npm ci installs the desktop workspace too; mobile never needs the Electron binary.
ELECTRON_SKIP_BINARY_DOWNLOAD: 1

defaults:
run:
working-directory: apps/mobile

jobs:
validate:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v4

- uses: actions/setup-node@v4
with:
node-version-file: '.nvmrc'
cache: 'npm'
cache-dependency-path: package-lock.json

- run: npm ci
working-directory: .

- run: npm run lint

- run: npm run typecheck

# Catches Expo SDK / native dependency mismatches before they become a broken build.
- run: npx expo-doctor

- name: Test with coverage
run: >
npm run test:run --
--reporter=default
--reporter=junit
--outputFile.junit=./junit.xml
--coverage

- name: Publish test results
uses: dorny/test-reporter@v1
if: always()
with:
name: Mobile Vitest Tests
path: apps/mobile/junit.xml
reporter: java-junit
fail-on-error: true

- name: Publish coverage report
uses: davelosert/vitest-coverage-report-action@v2
if: always()
with:
name: Mobile
json-summary-path: apps/mobile/coverage/coverage-summary.json
json-final-path: apps/mobile/coverage/coverage-final.json
vite-config-path: apps/mobile/vitest.config.ts
Loading
Loading