Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
39a511f
fix(hotkey): don't consume LWin keyup — kept Win stuck-down in OS state
devangk003 May 16, 2026
dc7a292
Phase 8 pill polish: full PILL_DESIGN.md + drag + multi-monitor sticky
devangk003 May 16, 2026
39b0748
Phase 9: MainWindow + 6 tabs + theming + pill flips with theme
devangk003 May 16, 2026
e2064b6
Phase 10: Onboarding modal — 7 steps + first-launch trigger
devangk003 May 16, 2026
dd3a399
Phase 11 + UX audit W1: crash reporter, egress killswitch, sidebar bi…
devangk003 May 16, 2026
65484f2
UX audit W2: design-system extraction (typography, dot, button, focus…
devangk003 May 16, 2026
c0729ff
UX audit W3: missing UX — history search/purge, log clear, model down…
devangk003 May 16, 2026
7b66456
UX follow-up: History as a table · pill Settings → Preferences · spac…
devangk003 May 17, 2026
a010d16
UX audit Round 2: tokens, surfaces, expanded typography, History sing…
devangk003 May 17, 2026
3fe3598
About tab: byline + 4 social icons · Models/About card spacing · 1px→8px
devangk003 May 17, 2026
2c7a69d
Sentry: forward unhandled exceptions to CaptureException
devangk003 May 17, 2026
eb1a5c3
Fix: OnboardingWindow black corners + model download pinned to real H…
devangk003 May 17, 2026
e835f5c
Audio tab: fix mic-always-on + add LIVE indicator + restore Test tran…
devangk003 May 17, 2026
ce40039
History hover-actions + Models redesign (action buttons, no radios)
devangk003 May 17, 2026
e5d37fe
Audio: input-device picker — user-selectable microphone
devangk003 May 17, 2026
f4d2413
Audio mic picker: fix dropdown lag (remove DropShadowEffect + per-ope…
devangk003 May 17, 2026
e1fdad4
Pill Phase 1: chrome restructure — dock drawer + pin + magic-wand but…
devangk003 May 17, 2026
2676b6f
Pill Phase 2: idle content swaps to visualizer + IDLE label on hover
devangk003 May 17, 2026
ee8f7b9
Pill Phase 3: breath + hue drift animations · Accessibility toggle
devangk003 May 17, 2026
a3faad4
Pill Phase 4: light-theme mint gradient on visualizer bars
devangk003 May 17, 2026
eae11fc
Pill follow-ups: 6 bug fixes (center-expand, height recovery, picker,…
devangk003 May 17, 2026
54b4ae9
Pill follow-ups round 2: black strips + picker lag + audio tab lag
devangk003 May 17, 2026
82654ed
Pill: pin = compact-mode toggle + mint idle wordmark
devangk003 May 17, 2026
8e102a3
Tray redesign + record-toggle wiring + nudge fix
devangk003 May 17, 2026
7e4b69f
Pill UX polish: BETA labels + pin lock + audit pass
devangk003 May 17, 2026
3dd6a2c
Default theme dark + Light [BETA] + onboarding step 6 = real dictation
devangk003 May 17, 2026
d94bb30
Roadmap: add R1.2-10 long-mode chunk-on-VAD streaming on second hotkey
devangk003 May 17, 2026
26b41c3
Onboarding step 3: mic chooser dropdown + CLAUDE.md deviation log update
devangk003 May 17, 2026
03853e7
Onboarding fixes: Skip=Completed, pill defer, step 3 async, apartment…
devangk003 May 17, 2026
5b8d766
About tab: globe icon matches LinkedIn visual size
devangk003 May 17, 2026
3309f8f
Pill compact-record grey + nudge 2s + social icon size parity
devangk003 May 17, 2026
92d3200
About tagline + pill bottom-corners squared while dock is open
devangk003 May 17, 2026
f725321
Dock record glyph: grey-idle/red-recording + tagline middle-dot
devangk003 May 17, 2026
0ce194c
History search bar: mint accent (icon + 2px bottom underline)
devangk003 May 17, 2026
9d478c9
Docs alignment: CLAUDE.md log + APP_DESIGN + PILL_DESIGN dogfood sect…
devangk003 May 17, 2026
51b4006
Phase 12: CI/CD + Inno installer + bundled tiny.en + CFA-friendly Mod…
devangk003 May 17, 2026
76e3305
Merge remote-tracking branch 'origin/main' into feat/ui-fixes
Copilot May 17, 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
61 changes: 54 additions & 7 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
# KusPus CI — build, test, lint on every PR + push to main.
# Phase 12 — see TECH_SPEC §31.
# KusPus CI — build + test on every PR + push to main.
# Phase 12 — see TECH_SPEC §31, validated against 2025 best-practices
# research (2026-05-17).

name: ci

Expand All @@ -8,11 +9,57 @@ on:
branches: [main]
pull_request:

# Cancel in-flight CI when a newer commit lands on the same branch.
# Safe on CI (not release) because each commit re-runs the suite from
# scratch — there's no partial state to clean up.
concurrency:
group: ci-${{ github.ref }}
cancel-in-progress: true

permissions:
contents: read

jobs:
placeholder:
build-test:
runs-on: windows-latest
steps:
- name: Not implemented
run: |
echo "ci.yml not implemented yet (Phase 12)."
exit 1
- name: Checkout
uses: actions/checkout@v5
# Don't fetch submodules — Phase 12 downloads whisper.cpp prebuilt
# binaries via tools/build-whisper-windows.ps1 instead of building
# from third_party/whisper.cpp. Submodule is preserved in the repo
# for source-audit purposes but isn't needed for CI.
with:
submodules: false

- name: Setup .NET 10
uses: actions/setup-dotnet@v4
with:
dotnet-version: '10.0.x'

- name: Cache NuGet packages
uses: actions/cache@v4
with:
path: ~/.nuget/packages
key: nuget-${{ runner.os }}-${{ hashFiles('**/*.csproj', '**/Directory.Build.props') }}
restore-keys: |
nuget-${{ runner.os }}-

- name: Restore
run: dotnet restore

- name: Build (Debug, zero warnings tolerated)
# Directory.Build.props sets TreatWarningsAsErrors=true so any new
# analyzer rule firing on master fails CI immediately.
run: dotnet build --configuration Debug --no-restore

- name: Test
run: dotnet test --configuration Debug --no-build --logger "trx;LogFileName=test-results.trx"

- name: Upload test results
if: always() # publish even on test failure so the report is browsable
uses: actions/upload-artifact@v4
with:
name: test-results
path: '**/test-results.trx'
retention-days: 14
128 changes: 123 additions & 5 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -1,17 +1,135 @@
# KusPus release — tag-triggered build of the unsigned installer.
# Phase 12 — see TECH_SPEC §31, §32.
# Phase 12 — see TECH_SPEC §31, §32. Validated against 2025 best-practices
# research (2026-05-17).
#
# Flow on tag push (v*.*.*):
# 1. Checkout (no submodules — whisper.cpp pulled prebuilt by step 4)
# 2. Setup .NET 10
# 3. Restore + run full test suite (release fails fast on a regression)
# 4. Run tools/build-whisper-windows.ps1 → installer/payload/whisper/
# 5. dotnet publish with PublishProfile=win-x64 → publish/win-x64/
# (self-contained single-file ~86 MB)
# 6. Install Inno Setup 6.4.3 (windows-latest migrated to Server 2025 in
# Sept 2025 — Inno is no longer pre-installed; see
# actions/runner-images#12464)
# 7. iscc.exe installer/KusPus.iss /DAppVersion=<tag> → installer/Output/
# 8. softprops/action-gh-release publishes as DRAFT with auto-generated
# notes; you flip to published from the GitHub UI after smoke-testing
# the produced setup.exe on a clean machine.

name: release

on:
push:
tags: ['v*']

# A release is one-and-done; do NOT cancel-in-progress on tag pushes. If
# you push two tags in quick succession, run them both.
concurrency:
group: release-${{ github.ref }}
cancel-in-progress: false

permissions:
contents: write # needed for action-gh-release to create the GitHub Release

jobs:
placeholder:
release:
runs-on: windows-latest
steps:
- name: Not implemented
- name: Checkout
uses: actions/checkout@v5
with:
submodules: false # whisper.cpp pulled prebuilt by step 4
fetch-depth: 0 # release notes generation reads full git log

- name: Setup .NET 10
uses: actions/setup-dotnet@v4
with:
dotnet-version: '10.0.x'

- name: Cache NuGet packages
uses: actions/cache@v4
with:
path: ~/.nuget/packages
key: nuget-${{ runner.os }}-${{ hashFiles('**/*.csproj', '**/Directory.Build.props') }}
restore-keys: |
nuget-${{ runner.os }}-

- name: Restore
run: dotnet restore

- name: Test (full suite)
# Release builds run the full xunit suite first — a failing test
# on a tagged commit is a release-blocker. Use Release config so
# the test environment matches what the published binary uses.
run: dotnet test --configuration Release --no-restore

- name: Build whisper.exe payload (pinned upstream release)
# Downloads v1.8.4 (or whatever tools/build-whisper-windows.ps1
# has -Tag default) from ggerganov/whisper.cpp's GitHub release,
# extracts whisper.exe + DLLs + SHA256SUMS to installer/payload/whisper/.
shell: pwsh
run: ./tools/build-whisper-windows.ps1

- name: Publish KusPus.App (self-contained single-file)
# PublishProfile=win-x64 sets SelfContained, PublishSingleFile,
# IncludeNativeLibrariesForSelfExtract, EnableCompressionInSingleFile,
# PublishReadyToRun, PublishTrimmed=false, DebugType=embedded.
run: dotnet publish src/KusPus.App -p:PublishProfile=win-x64 -o publish/win-x64

- name: Build installer (install Inno + compile)
# As of the Sept 2025 windows-latest → Windows Server 2025 migration,
# Inno Setup is no longer pre-installed on GitHub-hosted runners
# (actions/runner-images#12464). This action both installs Inno 6
# AND runs ISCC.exe on the script — one step for two jobs.
# AppVersion via /DAppVersion= stamps the tag into both
# OutputBaseFilename (→ KusPus-Setup-v1.0.0.exe) and the .exe's
# version-info resource.
# /Qp = quiet output, errors only.
# TODO Phase 12+: pin to commit SHA + add Dependabot config so
# third-party actions auto-update. v1.2.5 was the latest as of
# 2026-05-17 research; current at run time may be newer.
uses: Minionguyjpro/Inno-Setup-Action@v1.2.5
with:
path: installer/KusPus.iss
options: /DAppVersion=${{ github.ref_name }} /Qp

- name: Verify installer artifact
# Belt-and-suspenders: confirm the .exe exists at the expected path
# before action-gh-release tries to upload it. fail_on_unmatched_files
# on the upload action would also catch this, but a named step gives
# a clearer log on failure.
run: |
echo "release.yml not implemented yet (Phase 12)."
exit 1
$artifact = Get-ChildItem -Path installer/Output -Filter "KusPus-Setup-*.exe" | Select-Object -First 1
if (-not $artifact) { throw "No KusPus-Setup-*.exe in installer/Output/" }
$sizeMB = [math]::Round($artifact.Length / 1MB, 1)
$sha = (Get-FileHash -Algorithm SHA256 -LiteralPath $artifact.FullName).Hash
Write-Host "Artifact: $($artifact.Name) ($sizeMB MB)"
Write-Host "SHA-256: $sha"
shell: pwsh

- name: Publish GitHub Release (draft)
# draft: true is intentional — the friends-only audience means the
# author smoke-tests the installer on a clean Windows VM before
# flipping the release from "draft" to "published" via the GitHub UI.
# Flipping draft = no extra workflow run, no rebuild.
# generate_release_notes auto-builds the notes from PRs + commits
# since the previous tag.
uses: softprops/action-gh-release@v2
with:
files: installer/Output/KusPus-Setup-*.exe
generate_release_notes: true
draft: true
fail_on_unmatched_files: true
name: KusPus ${{ github.ref_name }}
body: |
Local Privacy First. Windows dictation, fully on-device.

## Install
1. Download `KusPus-Setup-${{ github.ref_name }}.exe`.
2. **Right-click → Properties → check "Unblock" → Apply** before running. This downgrades SmartScreen friction to a single "Run anyway" click.
3. Run the installer. No admin prompt — installs to `%LOCALAPPDATA%\Programs\KusPus`.
4. If Smart App Control is enabled (Win11), the installer will be silently blocked with no override UI. Disable SAC under Windows Security → App & browser control → Smart App Control → Off, then re-run.

## Notes
See generated release notes below.
Loading
Loading