Skip to content

build(deps): bump actions/setup-node from 4 to 6#22

Closed
dependabot[bot] wants to merge 124 commits into
masterfrom
dependabot/github_actions/actions/setup-node-6
Closed

build(deps): bump actions/setup-node from 4 to 6#22
dependabot[bot] wants to merge 124 commits into
masterfrom
dependabot/github_actions/actions/setup-node-6

Conversation

@dependabot

@dependabot dependabot Bot commented on behalf of github Jun 27, 2026

Copy link
Copy Markdown

Bumps actions/setup-node from 4 to 6.

Release notes

Sourced from actions/setup-node's releases.

v6.0.0

What's Changed

Breaking Changes

Dependency Upgrades

Full Changelog: actions/setup-node@v5...v6.0.0

v5.0.0

What's Changed

Breaking Changes

This update, introduces automatic caching when a valid packageManager field is present in your package.json. This aims to improve workflow performance and make dependency management more seamless. To disable this automatic caching, set package-manager-cache: false

steps:
- uses: actions/checkout@v5
- uses: actions/setup-node@v5
  with:
    package-manager-cache: false

Make sure your runner is on version v2.327.1 or later to ensure compatibility with this release. See Release Notes

Dependency Upgrades

New Contributors

Full Changelog: actions/setup-node@v4...v5.0.0

v4.4.0

... (truncated)

Commits

Dependabot compatibility score

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


Dependabot commands and options

You can trigger Dependabot actions by commenting on this PR:

  • @dependabot rebase will rebase this PR
  • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
  • @dependabot show <dependency name> ignore conditions will show all of the ignore conditions of the specified dependency
  • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
  • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
  • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)

LxveAce added 30 commits May 21, 2026 16:22
Phase 1 scaffold for Claude Code Studio:
- Electron Forge with Vite plugin for fast builds
- React 19 + TypeScript renderer with xterm.js terminal
- Custom frameless window with purple-themed title bar
- Sidebar with panel switcher (7 panels planned)
- PTY manager with node-pty support + child_process fallback
- Preload script with secure contextBridge IPC
- Status bar showing Claude PID

node-pty listed as optional — requires C++ build tools for native
compilation. Falls back to child_process.spawn without it.
- Fix main entry: .vite/build/index.js (not main.js)
- Add declarations.d.ts for CSS modules and node-pty types
- Fix WebkitAppRegion TypeScript errors in TitleBar
- PTY manager falls back to child_process when node-pty unavailable
- C++ Build Tools installing for future node-pty compilation
node-pty requires electron-rebuild with Windows SDK. PTY manager has
child_process fallback for systems without native build tools.
…sh-on-close

Phase 2: Resource monitor with CPU/RAM/GPU gauges (purple=Claude, grey=system)
using systeminformation with process tree walking from Claude PID.

Phase 3: Compact controller integration - toggle hooks on/off, live token/vault
status, config display.

New: Commands panel with Quick Commands (clickable model/effort/session buttons),
full slash command reference, and keyboard shortcuts list.

Fix: Object-destroyed crash when closing - PTY and resource monitor now clean up
before window destroy, with safeSend guard on all IPC.
…animations

- New color palette: deeper blacks (#0f0f1a), refined purple accents with gradients
- Sidebar: proper SVG icons (terminal, search, monitor, etc.) with tooltip popups,
  gradient active states with glow, separated primary/secondary button groups
- TitleBar: app icon with gradient badge, proper SVG window controls, version tag
- StatusBar: connection indicator with colored dot + glow, cleaner layout
- GaugeBar: card-based design with rounded bars, gradient fills, glow on active
- CompactPanel: modern toggle switch, stat cards, config rows, gradient status card
- CommandsPanel: segmented tab bar with gradient active, pill-style category filters,
  collapsible accordion for all commands with chevron animation, kbd-styled shortcuts
- QuickCommands: hover cards with border highlight, slide animation, pill categories
- Placeholder panels: clock icon with gradient circle, phase badge pills
- Terminal: updated to match new palette, cursor width 2, increased scrollback
- CSS: design tokens (--radius-*, --shadow-*, --transition-*), fadeIn/slideIn
  animations, refined scrollbar, selection color
Purple, Blue, Emerald, Rose, Amber, Cyan themes. Each changes all accent
colors, gradients, glows, and gauge colors across the entire UI. Selection
persists in localStorage. Settings also shows terminal config and app info.
…nuity

Debounced ResizeObserver (50ms) prevents xterm.js reflow glitches when the
right sidebar opens/closes. HANDOFF.md documents current state (Phases 1-3
complete, Settings + Commands panels done), known issues, setup instructions
for home machine, and remaining Phase 4-7 work.
- src/main/git-service.ts: detect repo from cwd, branch/upstream/ahead/behind/dirty,
  parse GitHub owner/repo from origin URL (https, ssh, ssh://)
- src/main/github-service.ts: Octokit wrapper for repo info, commits, branches,
  PRs, issues. PAT validated on save (users.getAuthenticated), encrypted via
  Electron safeStorage (DPAPI), persisted as JSON in userData
- IPC: new git:* and github:* channels wired through preload
- Renderer: GitHubPanel with WorkingDir card, ConnectGitHub setup flow,
  tabbed Repo/Commits/Branches/PRs/Issues views, click-through to github.com
  via shell.openExternal
- App.tsx routes 'github' sidebar slot to GitHubPanel (removes placeholder)
Applies the Lincoln Manifold Method (RAW → NODES → REFLECT → SYNTHESIZE)
to every source file, config, and HANDOFF.md. One markdown per file in
journal/. Methodology: https://github.com/anjaustin/lmm

Cross-cluster findings worth acting on (queued for red-team pass):
- Silent capability degradation in three places: pty-manager falls back to
  child_process when node-pty fails to load, compact-controller overwrites
  ~/.claude/settings.json with {} on parse failure, github-service stores
  PATs in plaintext when safeStorage is unavailable
- ElectronAPI defined twice (stale unused export in shared/types.ts vs the
  ambient declaration in declarations.d.ts that's actually consumed)
- Dead 'settings' branch in App.tsx PlaceholderPanel.info (routed before)
- TerminalPanel hardcodes xterm colors outside the CSS-variable theme system
- PRBadge/IssueBadge dead-code branches (state hardcoded to 'open')
- HANDOFF.md date-stamped today but lists Phase 4 under "What's Next",
  and references C:\Users\mmrla path (different machine)
Red-team findings written to SECURITY_REVIEW.md. Fixes by severity:

C1 — compact-controller no longer overwrites ~/.claude/settings.json on
  parse error. readSettings now distinguishes ENOENT (ok, return {}) from
  parse failure (throw with actionable message). writeSettings creates a
  .bak alongside before atomic rename.

C2 — GitHub PAT plaintext fallback now requires explicit opt-in. setToken
  refuses to persist when safeStorage is unavailable unless allowPlaintext
  is true. GitHubAuthState exposes encryptionAvailable + encrypted booleans;
  ConnectGitHub UI shows real status and an "I accept the risk" checkbox
  instead of an unconditional "encrypted with OS keychain" claim.

C3 — Electron renderer hardening: CSP meta added to index.html
  (default-src 'self', GitHub img/connect allowlist, no object/frame/form),
  sandbox: true on the main window, app.on('web-contents-created') denies
  window.open and blocks navigation away from the dev/file origin.

H1 — GITHUB_OPEN_EXTERNAL whitelist: https only, hostname must be
  github.com / *.github.com / gist.github.com / docs.github.com /
  *.githubusercontent.com. Parsed via URL() not regex.

H2 — Default PAT scope dropped from 'repo,read:user' to 'public_repo'.
  UI now recommends fine-grained PAT for private repos.

H3 — GitService.setCwd hardened: rejects UNC paths on Windows, resolves
  symlinks via realpathSync, requires directory. Same for detect(startPath).

H4 — Preload subscription leak fixed. onData/onExit/onReady/onUpdate now
  return unsubscribe functions. TerminalPanel and ResourcePanel use them
  in useEffect cleanup so React StrictMode / HMR / unmount no longer
  multiplies listeners.

H5 — setToken writes the auth store in one atomic tmp+rename instead of
  two writes. In-memory state only mutates after disk write succeeds.

M3 — execFile('git', …) now has a 5s timeout + SIGTERM kill signal so a
  hung git on a flaky mount can't deadlock the renderer.

M4 — compact-controller hook detection upgraded from substring
  ('compact-controller' anywhere in command) to an exact-path match
  (~/claude-compact-controller/hooks/...). Won't false-positive on
  unrelated user projects.

M8 — Removed stale ElectronAPI export from shared/types.ts that
  shadowed the real ambient declaration in declarations.d.ts.

Cleanup — Removed dead 'settings' branch from App.tsx PlaceholderPanel.info
  (the switch already routed it to the real SettingsPanel).
New sidebar panel walks the user through the Lincoln Manifold Method
(RAW → NODES → REFLECT → SYNTH) with one textarea per phase, dot-graph
progress, and a recent-cycles list. Settings persist across sessions.
No Claude Code hooks — pure UI per user spec.

Files:
- src/main/lmm-service.ts: settings + cycle markdown file management
- src/renderer/components/lmm/LMMPanel.tsx: toggle, settings, editor
- IPC: lmm:* channels (get/set-settings, list/get/create/save-phase/
  delete-cycle, pick-journal-dir) with dialog.showOpenDialog for picker
- Sidebar: added LMM icon between Compact and GitHub
- App.tsx: routes 'lmm' to LMMPanel

Phase 4.5 red-team pass (SECURITY_REVIEW_PHASE4_5.md) found 1 critical +
3 highs — all remediated in this commit:

C1 — Renderer-supplied cycle id flowed unsanitized into path.join for
  getCycle/savePhase/deleteCycle, enabling traversal to read/delete/write
  any .lmm.md file on disk. Now ids must match ^[a-z0-9][a-z0-9-]{0,79}$
  and cyclePath verifies path.dirname(target) === resolved journalDir.

H1 — setSettings({journalDir}) bypassed the directory-picker user gesture.
  journalDir is now ONLY mutable via pickJournalDir (which requires the
  OS dialog). setSettings validates enabled and variant types.

H2 — listCycles synchronously read every .lmm.md, no caps. Now bounded
  to 500 entries scanned, skips files >1MB, validates id shape per entry.

H3 — savePhase had no content-length cap. Now enforces 256KB per phase
  and 1MB total per cycle.

M4 — readSettings now distinguishes ENOENT (use defaults) from JSON
  parse failure (throw, refuse to clobber).
…P contract)

New Account panel with "Continue without login" as the primary CTA.
register/login/logout via AuthService. Two backends behind one contract:

- local-stub (default): scrypt-hashed passwords + safeStorage-encrypted
  session tokens in userData JSON files. No network.
- http: register/login/logout + GET/PUT /settings against a configured
  https:// baseUrl. Contract documented inline in auth-service.ts for
  a future Cloudflare Worker drop-in.

GitHub PAT explicitly excluded from sync (encryption key is device-local;
syncing the token breaks its security model). Theme + LMM settings only.

Files:
- src/main/auth-service.ts: AuthService with two-mode backend, scrypt
  password hashing, safeStorage tokens, atomic JSON writes, fetch with
  AbortController timeout, NFKC email normalization
- src/renderer/components/auth/AuthPanel.tsx: panel UI with signed-in
  profile, register/login tabs, backend picker, plaintext-consent UI
- IPC: AUTH_GET_BACKEND, AUTH_SET_BACKEND, AUTH_PULL_SETTINGS,
  AUTH_PUSH_SETTINGS (existing AUTH_LOGIN/REGISTER/LOGOUT/STATE wired up)
- App.tsx routes 'auth' to AuthPanel (removes placeholder)

Phase 5 red-team pass (SECURITY_REVIEW_PHASE5.md) found 2 criticals + 3
highs — all remediated in this commit:

C1 — Local-stub pullSettings/pushSettings now key the sync file by
  userId (auth-synced-settings.<uuid>.json) so a second local account
  can't read/overwrite the first account's "synced" settings. Legacy
  shared file deleted on startup.

C2 — Constructor expiry check uses Number.isFinite(Date.parse(exp))
  before comparing, so a malformed/missing expiresAt no longer keeps
  the session valid forever.

H1 — scryptVerify pins keylen to SCRYPT_KEYLEN (not attacker-controlled
  expected.length), validates hex shape and exact length of stored hash
  and salt. Closes the hash="" backdoor and the giant-hex DoS paths.

H2 — readSession now validates StoredSession shape (UUID userId, valid
  email regex, finite ISO timestamps, optional string token fields). In
  local-stub mode also requires this.users[email]?.id === session.userId
  so a planted session that doesn't match a real local user is rejected.
  Constructor reorders config-then-session so the local-stub check works.

H3 — Plaintext session-token fallback now requires explicit
  allowPlaintextToken consent (mirrors Phase-4 C2 PAT pattern). AuthPanel
  shows a checkbox + warning when safeStorage is unavailable.

M1 — Email normalized via NFKC before lowercase+trim, so unicode-
  composition variants of the same human email don't create ghost
  accounts.

M2 — Register collision now throws generic 'Could not create account'
  instead of leaking which emails exist. Renderer softens the message
  for users who legitimately forgot.

M4 (part 2) — httpRequest clears the local session on 401 so a backend
  that revokes the bearer doesn't leave the UI showing "Signed in"
  indefinitely. acceptHttpSession also honors backend-supplied expiresAt
  if present.
New Sync panel. Watches ~/.claude/compact-controller/vault/ and pushes
vault-*.json files to deviceName/vault-*.json in a user-chosen private
GitHub repo. Setup wizard handles create-new or use-existing flow with
scope check, private-repo verification, and explicit "I understand my
transcripts will be uploaded" consent. Off by default.

Files:
- src/main/cloud-sync.ts: CloudSyncService with watcher, debounced
  syncNow, createOrUpdateFileContents push, delete-remote helper,
  per-file failure tracking with backoff
- src/main/github-service.ts: getClientOrNull() accessor for other
  main-process services
- src/renderer/components/sync/SyncPanel.tsx: panel with stats, local
  vault list (click to preview), remote viewer with delete button
- src/renderer/components/sync/SyncWizard.tsx: 3-step setup
  (choose → create/existing → consent)
- src/renderer/components/sync/VaultPreviewModal.tsx: shows what's
  actually in a vault before it ships
- IPC: SYNC_GET_SETTINGS, SYNC_SET_SETTINGS, SYNC_STATUS, SYNC_SYNC_NOW,
  SYNC_LIST_LOCAL, SYNC_LIST_REMOTE, SYNC_PREVIEW_VAULT, SYNC_CREATE_REPO,
  SYNC_VERIFY_REPO, SYNC_DELETE_REMOTE

Phase 6 red-team pass (SECURITY_REVIEW_PHASE6.md) found 0 criticals + 4
highs + 7 mediums. Remediated in this commit:

H1 — syncNow now wraps each pushVault in try/catch so a single bad file
  (oversized, malformed) doesn't abort the loop and silently strand
  newer valid vaults. Errors aggregated into lastError.

H2 — Permanently-failing vaults no longer hot-loop. After 3 attempts a
  failure record holds the file out of the queue for 15 minutes. Counter
  resets on success.

H3 — verifyRepo now calls getCollaboratorPermissionLevel and requires
  admin/write/maintain, so users can't accidentally point sync at a
  read-only collaborator repo where transcripts would leak into someone
  else's private repo (or fail confusingly post-verify).

H4 — Consent screen now warns that uploads are append-only and survive
  in git history. deleteRemoteVault method + UI button added so users
  can at least remove the file from the working tree.

M2 — writeJsonAtomic uses random tmp suffix (pid + 4 random bytes) so
  concurrent writes don't clobber each other; tmp cleaned on error.

M3 — fs.watch reconnects on error/close events with 5s backoff, so
  Windows quirks (dir delete+recreate) don't silently kill sync.

M4 — Sequential pushes spaced by 500ms to soften secondary rate limits.

M5 — Branch regex tightened (no slashes, no .., no leading dot).

M6 — readSettings forces enabled=false when owner/repo/consentAt is
  missing or corrupted (defense in depth — enabled-without-config
  should never persist).

M7 — Scope-missing error no longer echoes the user's other PAT scopes.

Deferred (filed as known tech debt): M1 (renderer-controlled consentAt
is cosmetic from a defense-in-depth view — move to dialog.showMessageBox
in v2), L1-L11 UX nits.
New global Ctrl+Shift+P palette aggregating actions across panels:
- Open: Terminal/Commands/Resources/Compact/LMM/GitHub/Sync/Account/Settings
- Theme: Purple/Blue/Emerald/Rose/Amber/Cyan
- Snippets: insert into terminal, new/edit
- Actions: Terminal restart, Send test notification

New services:
- src/main/snippets-service.ts: CRUD with validation (name <= 120 chars,
  body <= 64KB, cap 500 snippets). Persisted JSON in userData.
- src/main/notifications-service.ts: Electron Notification wrapper with
  per-kind throttling. Fires on PTY exit + vault sync error, toggleable
  in SettingsPanel.

Other changes:
- src/renderer/theme-presets.ts: extracted from SettingsPanel so palette
  can apply themes without dupe.
- src/main/cloud-sync.ts: constructor now takes an onSyncError callback;
  CloudSyncService calls it when syncNow finishes with a non-null error.
- SettingsPanel: new Notifications + Shortcuts sections.

Phase 7a red-team pass (SECURITY_REVIEW_PHASE7A.md) found 0 criticals +
3 highs. Remediated in this commit:

H1 — handleSendToTerminal strips \r from snippet bodies before insert,
  so a snippet containing a stray carriage return no longer auto-submits.
  Only the explicit `submit` flag adds \r.

H2 — Notifications throttle is now per-kind (pty-exit / sync-error /
  test / other), so a vault-sync error within 1s of a PTY exit no longer
  gets silently dropped.

H3 — Palette-initiated terminal restart sets a one-shot
  suppressNextPtyExitNotification flag in main, so user-driven restarts
  don't trigger the "Claude exited" notification they meant to enable
  only for actual crashes.

Deferred (filed as known tech debt): M-tier UX nits — palette doesn't
auto-refresh active theme indicator in SettingsPanel after applying via
palette; CommandPalette kbd handler re-registers on every active-idx
change; no error toasts when notification settings updates fail silently.
…r + Squirrel)

- src/main/updater-service.ts: wraps update-electron-app for GitHub Releases.
  Skips in dev (MAIN_WINDOW_VITE_DEV_SERVER_URL), skips on Linux, skips when
  user disables. JSON-backed settings in userData with atomic writes.
- src/main/notifications-service.ts: new notifyOnUpdateAvailable toggle +
  notifyUpdateAvailable(version) with per-version dedup.
- forge.config.ts: PublisherGithub (draft mode), executableName, Squirrel
  branding fields, commented placeholders for signing/icons/loadingGif.
- StatusBar: 'Update vX.Y.Z ready' badge.
- SettingsPanel: Updates section (version, status, last-checked, channel,
  'Check now', auto-update toggle, error display).
- 5 new IPC channels: UPDATER_GET_STATE, UPDATER_SET_SETTINGS, UPDATER_CHECK,
  UPDATER_QUIT_AND_INSTALL, UPDATER_AVAILABLE (event).

Self-red-team (SECURITY_REVIEW_PHASE7B.md): 0 criticals + 3 highs remediated
(beta-channel toggle disclaimer, per-version dedup, 5s floor on checkNow to
defang renderer spam) + 5 mediums deferred as tech debt.

Deps added: update-electron-app, @electron-forge/publisher-github.
- react-resizable-panels for horizontal/vertical split with multiple PTYs
- src/main/pty-registry.ts: paneId-keyed PTY registry (cap 16), reattach-if-alive
- src/main/session-service.ts: persists layout tree to <userData>/session.json
  with atomic writes, depth/node caps, duplicate-id detection, sanitization
- All TERMINAL_* IPC paneId-scoped, preload subscriptions filter per-pane with
  proper disposers (no regression vs Phase 4 H4 listener-leak fix)
- ResourceMonitor aggregates CPU/RAM across all live panes
- SplitLayout + palette actions: Split horizontal/vertical, Close pane,
  Focus next/prev pane, Reset layout

Self-red-team (SECURITY_REVIEW_PHASE7C.md): 0 criticals, 2 highs remediated
(H1 split was destroying existing PTY via component-unmount kill — fixed by
moving kill into explicit App handlers + reattach-if-alive; H2 restart-suppress
flag leaked across new PTY's future exits — fixed with 1500ms TTL). Mediums
deferred (cwd recovery, version migration, per-pane input throttle).

Deps added: react-resizable-panels@^3.0.6
- src/main/tray-service.ts: tray icon (hardcoded 16x16 purple-circle base64
  PNG with createEmpty fallback), settings persistence, attach/dispose
  lifecycle. Tray menu: Show Window / Toggle Compact / Quit.
- src/main/hotkeys-service.ts: persisted chord→action store with validation
  (modifier required, conflict detection), defaults for palette/restart/
  compact/lmm/github.
- src/renderer/hotkeys.ts: chordFromEvent, buildChordMap, ACTION_LABELS.
- src/renderer/App.tsx: bindings-driven keydown dispatcher (replaces the
  hardcoded Ctrl+Shift+P), tray-action subscription.
- src/main/index.ts: minimize-to-tray-aware close handler. Cleanup moved
  from window 'close' into 'before-quit' as the single shutdown path —
  otherwise hiding the window would still kill Claude. before-quit handles
  PTY + resource-monitor + tray teardown.
- SettingsPanel: System tray toggle + Hotkeys section (click to record,
  reset-defaults).

Self-red-team (SECURITY_REVIEW_PHASE7D.md): no C/H. One M remediated inline
(console.warn breadcrumbs when hotkeys.json is unreadable/corrupt instead of
silent fallback). Mediums deferred: tray icon decode instrumentation, global
accelerators, HiDPI icon variants, cross-device binding sync.

No new deps.
- src/main/cost-service.ts: 30s sampler reading ~/.claude/compact-controller
  state + vault files. Per-session dedup. Aggregates daily totals. Per-model
  rate table (placeholders, marked editable). Atomic JSON persistence in
  <userData>/cost-history.json with 4MB read cap + quarantine, 500-vault
  scan cap + mtime cache, 5000-session map with oldest-eviction.
- src/main/notifications-service.ts: notifyCostBudget(estUSD, budgetUSD)
  with new notifyOnCostBudget toggle.
- src/renderer/components/cost/CostPanel.tsx: stat cards, inline-SVG 30-day
  sparkline, budget/model controls, reset history. In-panel disclaimer:
  vault files lack per-session output counts, so the dollar number is a
  lower bound, not an estimate.
- Sidebar: Cost icon between Resources and Compact (slice 0..7 / 7..).
- App.tsx: panel route. CommandPalette: Open: Cost + Cost: reset history.
- SettingsPanel: daily budget toggle + USD input.

Self-red-team (SECURITY_REVIEW_PHASE7E.md): 0 criticals, 3 highs remediated
(file-size cap + quarantine, vault scan cap, session map cap). Mediums on
multi-instance write race deferred; heuristic-accuracy concern surfaced via
the in-panel disclaimer.

No new deps.
# Conflicts:
#	package.json
#	src/main/index.ts
- pty-registry.ts: rename private `listeners` field to `paneListeners` to
  avoid shadowing the inherited EventEmitter.listeners() method (TS2416).
- shared/types.ts: add 'cost' to SessionPanelId so the 7c session persistence
  accepts the 7e sidebar panel.
- package-lock.json: regenerated for the three new deps:
  react-resizable-panels (7c), update-electron-app (7b),
  @electron-forge/publisher-github (7b).

Typecheck clean. The integrated branch contains:
- Phase 7a: command palette + snippets + notifications (base)
- Phase 7b: auto-updater + Windows installer publisher
- Phase 7c: split panes + session persistence (multi-PTY)
- Phase 7d: system tray + custom hotkeys
- Phase 7e: token cost tracker + budget alert

Notification kinds extended to cover all four toggles:
pty-exit / sync-error / update-available / cost-budget / test / other,
each with its own throttle bucket.
…NEL_IDS

H1 (SECURITY_REVIEW_PHASE7_INTEGRATED.md): the 7c session-service panel
allowlist was not extended when 7e added the Cost sidebar entry, so users
who left the Cost panel active on quit were silently bounced back to
Terminal on next launch. Single line, no migration.

Mediums (M1 hotkeys-empty-during-cold-start, M2 unattended-toasts-in-tray)
documented in the review as known UX tech debt — defer to a follow-up
ergonomics pass.
…p electron-store

HANDOFF.md was dated 2026-05-21 and stopped at Phase 3 ("What's Next:
Phase 4: GitHub Integration"). Rewrote to reflect the actual shipped
state across Phases 1-7e plus the integrated branch, with up-to-date
project structure, branch layout, security review index, npm scripts,
and an explicit "What's Next" list seeded from deferred Mediums.

Integration-review M1 fixed: global hotkey dispatcher now has a
hardcoded Ctrl/Cmd+Shift+P fallback that opens the palette even when
the user's bindings haven't loaded yet. Prevents the ~50ms cold-start
window where the user could not summon the palette.

Phase-4 SECURITY_REVIEW M8 ("electron-store ESM landmine"): removed
the unused electron-store dep entirely. It was listed in package.json
+ Vite externals but never imported anywhere in src/ — the GitHub PAT
store (and every JSON store since) uses node:fs directly. Closes the
"future use breaks the CJS main bundle" surface.

Build smoke test: `npm run package` exits 0 and the Vite production
bundles for main/preload/renderer all build cleanly. The Electron Forge
post-package step did not produce out/ in this shell — likely a child-
process detach in npm.cmd; flagged in HANDOFF "What's Next" for the
maintainer to verify on a normal Windows shell.
…d, tray copy

Three deferred Mediums closed for v1 readiness.

1. UpdaterSettings UI no longer advertises a beta channel toggle that
   doesn't actually route to a beta feed. The publisher pipeline only
   produces stable Releases today; showing a clickable "beta" button
   was misleading. SettingsPanel now displays "Channel: stable" as a
   static row. The UpdateChannel type stays in shared/types.ts so a
   future beta pipeline can re-enable the picker without a schema bump.

2. SessionService gained a forward-migration scaffold: read() now
   distinguishes (a) missing/non-int version → defaults, (b) version
   from the future → defaults (refuse to mis-sanitize), (c) older
   version → step-by-step migrate() call. migrate() is empty today
   (v1 is the only shipped version) but the structure is in place so
   the next schema bump doesn't have to re-architect the load path.

3. Tray "Minimize to tray on close" helper text now warns that
   background services (cost sampler, vault sync, auto-updater) keep
   running while hidden, and notifications accumulate until the window
   comes back. Addresses integration-review M2.

Typecheck clean.
Final shipping-certification red-team produced SHIPPING_CERTIFICATION.md.
Verdict: SHIP. No Blockers / Criticals / Highs found.

The certification verified:
- Built bundle matches runtime contract (.vite/build/index.js
  + preload.js exist, update-electron-app + Octokit inlined, zero
  electron-store references, MAIN_WINDOW_VITE_NAME inlined to
  'main_window' matching the Forge VitePlugin output target).
- Service boot order safe (11 lazy singletons, no circular init).
- Notification kinds wired end-to-end across all 4 toggles
  (pty-exit / sync-error / update-available / cost-budget).
- Cost-panel session persistence (PHASE7_INTEGRATED H1 fix confirmed).
- Hotkey cold-start fallback (App.tsx hardcoded Ctrl/Cmd+Shift+P).

HANDOFF.md updated:
- New "Shipping Status" section pointing at SHIPPING_CERTIFICATION.md.
- "What's Next" pruned of items shipped in the polish pass
  (hotkey cold-start, session migration, electron-store, tray copy).
- Renumbered the post-v1.0 backlog (5 open items: tray HiDPI, cost
  model awareness, updater beta pipeline, multi-pane resource UI,
  macOS port, plus an explicit installer-verification reminder).
Adds a Conversations section to the CostPanel showing per-session
(per-conversation) token totals + estimated cost, sorted with the
active conversation pinned to the top and the rest by last-activity
date descending. Collapsed to 5 rows by default with a "Show all N"
toggle.

No new persistence — re-uses the existing per-session map that
CostService already maintains for daily-total dedup. Surfaces it as
SessionTotal[] over a new COST_LIST_SESSIONS IPC call.

Files:
- shared/types.ts: new SessionTotal type
- shared/ipc-channels.ts: COST_LIST_SESSIONS
- main/cost-service.ts: listSessions() method + currentSessionId
  tracking so the live state.json conversation is flagged in the UI
- main/index.ts + preload.ts + declarations.d.ts: wire the IPC
- renderer/components/cost/CostPanel.tsx: ConversationsSection +
  ConversationRow components

Self-red-team (mental pass, no new SECURITY_REVIEW file because this
is a single-IPC view-only extension of an already-reviewed service):
- No new disk surface — reads from the same history.sessions map.
- listSessions() output bounded by MAX_SESSIONS_TRACKED (5000) which
  CostService already enforces in recordSession; no DoS amplifier.
- session_id rendered as a React text node (escaped); full id in
  title attr; no innerHTML.
- Cost estimate uses estimateCost(), inheriting Phase 7e's per-model
  rate table + clampTokens hardening.
- currentSessionId is set ONLY from readStateSample() with the same
  length/type validation Phase 7e already applied.

Typecheck clean.
LxveAce and others added 19 commits May 26, 2026 21:02
- Drops the "Generated with Claude Code" tag from RELEASE_NOTES_v3.0.0.md
  (user removed it from the draft release manually; this keeps source +
  draft in sync if the workflow ever re-syncs the body).
- Adds docs/SESSION_LOG_2026-05-26_v3.0.0_release.md — the in-depth
  "pick up cold tomorrow" doc the user asked for. Covers: feature list,
  deferred items, build infrastructure (7za wrapper, OneDrive lock
  workaround, Node-not-on-PATH), branches + remotes layout, folder
  layout, files added/modified, backup snapshots, saved memories, known
  issues to verify, and a cold-start checklist for resuming work.
- README.md feature bullets rewritten to drop "v3.0 testing branch"
  wording (it's stable now), add the file-tree + danger-zone + per-
  bucket-resources + --dangerously-skip lines, and bump the platform
  support line from v2.0 to v3.0.

Verified: all 3 CI matrix jobs (Windows / macOS / Linux) completed
successfully — the v3.0.0 draft release on GitHub has 5 installer files
attached and is ready for the user to publish manually.
The actual whole-repo update the user asked for after pushing v3 to
master. Pre-existing docs were still talking about "v2.0" and "v1.1
in progress."

README.md changes:
- Quick install + Installing v3.0 sections now reference the actual
  v3.0.0 asset names (Claude-Code-Studio-3.0.0-Windows.exe etc.)
- macOS install section: "until v2.1 notarization" → "until notarization
  is added in a future release"
- Sign-in step description updated to reflect the /login (slash-command)
  flow — was still talking about `claude login` being typed into the
  terminal.
- Build-from-source dist section: drops the "v1.1 NSIS" version label
  and explains the Dev Mode / 7za wrapper requirement properly.
- Linux install commands use the actual published file names
  (-Linux-Universal.AppImage, -Linux-Debian.deb, -Linux-Fedora.rpm).
- v1 migration note clarified: same path for v1 → v2 OR v1 → v3.

CHANGELOG.md (new file):
- Standard at-a-glance per-release summary. v1.0 / v2.0 / v3.0 entries
  with Added / Changed / Removed / Known deferred per release. Points
  at the per-release notes files in docs/ for the long-form version.

BACKLOG.md changes:
- Header retitled from "post-v1.0" to "post-v3.0.0".
- New "★ v3.0.1+ — open ideas" section at the top with the actual
  work queue (per-provider API keys, mac signing, comparison view,
  embedding-RAG, VRAM tracking, updater test, POSIX onboarding
  parity, FileTreePanel external-open wiring, Squirrel pipeline
  removal). Each item has a one-line "why it matters."
- The historical "★ v3.0.0-beta.3 SHIPPED" + "v3.0.0-beta.4 queued"
  sections collapsed: beta.4 entry shortened to a "→ shipped as 3.0.0"
  pointer since both queued items landed before the stable cut.
- Old beta entries kept verbatim below a "Historical record" banner
  so the trail from each beta-test screenshot to its fix remains
  searchable.

HANDOFF.md changes:
- Added a stale-banner at the top pointing readers to
  SESSION_LOG_2026-05-26_v3.0.0_release.md / CHANGELOG / BACKLOG for
  current state. Body preserved as historical context (it describes
  the v1 phased dev plan accurately for that era).

Verified no other docs reference stale version numbers in a
load-bearing way (RELEASE_NOTES_v2.0.0.md and the v2 session log are
correct historical artifacts; MIGRATING_FROM_V1.md applies equally
to v1→v2 and v1→v3).
Strip journal/, security-reviews/, session logs, and one-off dev docs
from the public release repo. Full archive lives in claude-code-studio-
testing going forward.

Removed:
- journal/ (entire LMM journal tree, 40 files)
- docs/security-reviews/ (21 phase-by-phase security audit files)
- docs/SESSION_LOG_2026-05-24_v2.0_release.md
- docs/SESSION_LOG_2026-05-26_v3.0.0_release.md
- docs/SHIPPING_CERTIFICATION.md
- docs/FRESH_VM_TEST.md
- docs/INSTALLER_REDESIGN.md

Kept (end-user-facing): CHANGELOG, README, LICENSE, SECURITY,
CONTRIBUTING, docs/MULTI_MODEL.md, docs/MIGRATING_FROM_V1.md,
docs/RELEASE_NOTES_v*.md, docs/HANDOFF.md, docs/BACKLOG.md.
… GPU routing

First public update since v3.0.0. v3.1.0 existed only as a testing
release; v3.2.0 brings the full set of v3.1.0 + v3.2.0 features to
the public repo in a single promotion commit.

Headline features (full detail in docs/RELEASE_NOTES_v3.2.0.md and
CHANGELOG.md):

  - Terminal Tabs replaces SplitLayout — Windows-Terminal-style strip,
    profile picker (Claude / Ollama / Aider / Gemini / BitNet),
    per-tab popout, session schema v1→v2 migration.
  - Claude (Chat) profile + JSONL parser route Claude CLI events
    through structured rendering (tool_use / tool_result / thinking).
  - Stop button replaces Send while chat-mode streams (SIGINT).
  - Commands sidebar mirrors active tab's CLI profile (6 curated families).
  - GPU routing for Ollama daemon — fixes "my dedicated GPU is ignored".
  - Auth auto-detect — surfaces CLI OAuth + env var sources.
  - Chat-skin v2 with markdown + Prism syntax highlighting.
  - BitNet / Liquid LFM2.5 / Jetson Thor catalog additions.
  - Runtime verifier extended 12→30 assertions.

Source promoted from claude-code-studio-testing@v3.2.0. Dev
artifacts (journal/, security-reviews/, session logs, plans, status +
verification docs) intentionally NOT promoted — per the repo split
established 2026-05-27.

Underlying stacked PRs on the testing repo: #18, #19, #20, #21, #22,
#23, #24, #25, #26, #27.
Promotion overlay from testing-master v3.2.1 to public master.  Lands
8 items from docs/PLAN_2026-05-28_10-items.md (drafted in the testing
repo); Phase B items (Hugging Face integration + rename) stay
deferred until v4.0.0.

Polish:
  - openExternal allowlist for OpenAI / Gemini / OpenRouter / Anthropic
    key portal hosts (Item 1)
  - Auto-updater 404 demoted to a console warn; CI release workflow now
    uploads latest.yml / latest-mac.yml / latest-linux.yml so the
    updater can actually find a manifest (Item 2)
  - SEED_VERSION 2->3 + FORCE_REFRESH_DISPLAY_IDS so the API tab pulls
    in all providers on existing installs; new GPT-4o-mini entry;
    Aider entry renamed to "OpenAI GPT-4o (via Aider)"; reliable Copy
    command via main-process clipboard IPC with a green "Copied!"
    toast (Item 3)
  - Models search bar bumped to 280/13/8-12, visible on both Local and
    API tabs, new Ctrl+F hotkey to focus it (Item 4)
  - LMMPanel + CompactPanel are focus-aware via an activeFamily prop
    threaded from App.tsx; LMM "+ New cycle" replaced its
    window.prompt with an in-app modal (Item 6)
  - Pop-out windows thread the profile id through the URL so chat-mode
    profiles render correctly in popouts; soft retry on "paneId not
    found" before declaring the PTY dead; chat-skin toggle syncs
    across windows via the storage event (Item 7)
  - "+" tab button opens the same profile picker as the down arrow;
    new Ctrl+Shift+T hotkey opens the picker; Enter on empty search
    picks Claude (Item 8)

New:
  - Accessibility section under Settings with ten persisted toggles:
    high contrast, font scale, reduce motion, large focus ring, large
    click targets, dyslexia font, screen reader mode, keyboard hints
    overlay, color-blind palettes, audio captions placeholder.
    Defaults all OFF — no behavior change for existing users until
    they opt in.  (Item 10)

See docs/RELEASE_NOTES_v3.2.1.md and CHANGELOG.md for the full
per-item detail.
Promotion overlay from testing-master to public master.  Lands the
Phase B work captured under docs/PLAN_2026-05-28_10-items.md (Items
#5, #9, plus the right-panel-resize polish).

Headline: app renamed from Claude Code Studio to Catalyst UI;
Hugging Face Hub panel added with Browse / Cached / Research
sub-tabs; GGUF -> Ollama import bridge; resizable right panel
defaulting to 420 px.

Identity preservation:
  - Windows appId stays com.lxveace.claude-code-studio so v3.2.1
    auto-update is an in-place upgrade.
  - userData dir pinned to %APPDATA%/Claude Code Studio via
    app.setPath() so settings, snippets, GitHub PAT, model
    registry, LMM journal, cost history all carry forward.
  - NSIS uninstaller candidate list still tries the v3 spelling.

GitHub repo rename completed in lockstep:
  LxveAce/claude-code-studio -> LxveAce/catalyst-ui
  LxveAce/claude-code-studio-testing -> LxveAce/catalyst-ui-testing

GitHub permanent redirects keep v3.2.1 binaries' baked-in updater
endpoint resolving after the rename.

See docs/RELEASE_NOTES_v4.0.0.md for the full per-item detail and
docs/MIGRATING_FROM_CCS.md for the user-facing walk-through.
…tusBar (#13)

Single-overlay promotion of v4.0.1 hotfix from testing-master.

Fixes 4 bugs found in v4.0.0 once it was installed and smoke-tested:
  - cli-resolver missing 'claude' case (Claude (Chat) profile
    failed to launch with "File not found" via MODELS_LAUNCH)
  - @huggingface/hub additionalFields collision with default
    expand list (HF search rejected with "expand[N] contains a
    duplicate value")
  - panelEnter CSS keyframe ended at width: 320px with
    fill-mode: both — locked right panel resize at the old default
  - StatusBar + window title still read "Claude Code Studio"
    (missed in #43 / PR #12)

First v4.x build users will see as an auto-update offer.

Full detail: CHANGELOG.md v4.0.1 entry.
Promotion overlay from testing-master to public master.  Lands the
HF deep-iteration cycle on top of v4.0.1.

Headline: rebuilt the HF integration end-to-end against the API's
actual measured behaviour, added hardware-aware FitBadge + ★ rec
quant picker, ⬇ Download with cancel + speed/ETA + skip-if-cached,
chat-template viewer, license / tag / author chip filters, and
expanded the curated research-catalog list to 18 verified repos.

Full per-area detail in CHANGELOG.md v4.0.2 entry.
Promotion overlay from testing-master to public master.  Lands the
four bug fixes the user surfaced via screenshots in the live v4.0.2
dev build.

1. PTY resize "Cannot resize a pty that has already exited" crash
   that popped a JavaScript-error modal dialog.  PtyManager now
   nulls ptyProcess/childProcess in onExit + defensive try/catch
   in resize(); PtyRegistry.resize wraps as defense-in-depth.

2. Claude (Chat) yellow stream-json diagnostic was invisible because
   ModelsPanel mounted EmbeddedTerminal without the profile prop.
   Now passes profile from running.modelId.  Side effect: the
   generic fast-exit hint fires for any non-claude profile too —
   covering the curated-research Ollama-not-running case.

3. Commands panel "Stream-JSON mode" empty-state had no actionable
   affordance under Claude (Chat).  Added a "+ Switch to a plain
   Claude tab" CTA wired to App.handleNewClaudeTab.

Verification on testing:
- TypeScript clean
- All 5 audits 132/132 green
- CI built all 8 release assets

Full per-area detail in CHANGELOG.md v4.0.3 entry.
Promoted from catalyst-ui-testing (code-only overlay, no release).

1) Open any detected system shell (CMD/PowerShell/pwsh/Git Bash/WSL on Windows; login shell + bash/zsh/fish/sh on POSIX) as a tab via a new 'Terminals' group in the + profile picker. New shell-profiles.ts detection + TERMINAL_LIST_SHELLS/TERMINAL_LAUNCH_SHELL IPC; shells render via EmbeddedTerminal in the 'other' resource bucket.

2) 'Claude (skip permissions)' picker entry launches a Claude tab with per-launch --dangerously-skip-permissions (Claude PTYs only, OR-combined with the global toggle, de-duped). Tab shows a warning glyph; choice persists.

PtyRegistry.restart() now respawns panes with their original launch params + category (fixes skip-perms/model command being dropped on restart). Verified: tsc + vite build clean. Full notes + red-team in the testing repo.
Promoted from catalyst-ui-testing (code-only overlay onto the terminal-complete public master; additive, terminal features untouched).

Native Obsidian-compatible knowledge layer (no Obsidian binary shipped — ToS): Brain Folder Service (scoped .md/YAML/wikilink read+write, diff-before-write, atomic, hash-conflict safety); 🧠 panel; canonical schema + Brain Writer mirroring journaling streams; RAG over the notes via Ollama embeddings + semantic search; wikilink backlinks graph; obsidian:// open + Local REST API client (loopback-only self-signed cert) to drive a live vault; copy/send retrieved context to any model; and a first-party Obsidian plugin scaffold (obsidian-plugin/).

Verified: tsc clean on the promote branch; full feature set tsc+vite+logic-tested + live CDP runtime on testing. Red-team: docs/security-reviews/SECURITY_REVIEW_BRAIN_{P1,P2_P4,P5}.md (testing repo).
Promoted from catalyst-ui-testing (code-only overlay onto the Brain-complete
public master; additive, existing features untouched).

New panels: Notes (CRUD, markdown, tags, search, pin/sort) with notes-service
IPC; Blind Model Compare (2-4 Ollama models side-by-side, blind/reveal mode)
with compare-service IPC + input validation (regex, count cap).

Theming: animated background canvas (dots/grid/rain/particles), layout density
(compact/comfortable/spacious), font family picker, frosted glass toggle.
Theme extras persisted via localStorage with range-clamped intensity.

UX: toast notification system (event-driven, 4s auto-dismiss, max 5);
keyboard shortcuts overlay (? key, platform-aware, focus-trapped);
escape menu stack (LIFO overlay dismissal); command palette history
(arrow-up recall on empty input, localStorage, max 20);
incognito tabs (ephemeral sessions not persisted across restarts,
visual indicator, profile picker + palette entry).

Security: XSS fixes in Notes + Compare markdown renderers (escapeAttr for
hrefs + code blocks); aria-live/role=dialog/focus trap/button semantics
across Toast + Shortcuts + Notes; race condition guard in ComparePanel.
…ci.yml slug + doc drift

- docs/RELEASE_NOTES_v4.0.3.md: created. The v4.0.3 GitHub release body links to this file but it
  did not exist (404). Content mirrors the CHANGELOG [4.0.3] entry.
- .github/dependabot.yml: added (npm + github-actions, weekly, grouped). The "Dependabot Updates"
  infra job was failing every run because this config was missing.
- .github/workflows/ci.yml: fixed the stale `claude-code-studio` repo slug in the ci-logs raw URL,
  the failure Run-URL, and the upload-artifact name -> catalyst-ui. (The appId
  com.lxveace.claude-code-studio and CHANGELOG history keep the old name deliberately; untouched.)
- scripts/build-vite.mjs: corrected a stale source-comment line reference (now line-number-agnostic).
- README.md: the Auto-updater feature line now states macOS auto-update is currently disabled
  pending code-signing (honest; Windows/Linux unaffected).

Deferred (needs Node 22 + npm install; local Node is 24, which breaks electron-builder): full
build/typecheck, the v4.1.0 tag decision (8 untagged terminal-profiles/Brain commits on master),
and the code-level backlog bugs. NOTE: the v4.0.3 tag and master share no common ancestor (CI tags a
detached build history) — confirm the release flow before cutting v4.1.
Bumps [actions/setup-node](https://github.com/actions/setup-node) from 4 to 6.
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](actions/setup-node@v4...v6)

---
updated-dependencies:
- dependency-name: actions/setup-node
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
@dependabot dependabot Bot added dependencies Pull requests that update a dependency file github_actions Pull requests that update GitHub Actions code labels Jun 27, 2026
@LxveAce

LxveAce commented Jul 1, 2026

Copy link
Copy Markdown
Owner

Triage note (automated maintenance pass): this is a major GitHub Actions version bump. Type-check + vite build is green, but major bumps of checkout / setup-node / upload-artifact can change checkout, Node-runtime, and artifact-upload semantics (upload-artifact v4->v7 in particular changed artifact naming/immutability behavior that the ci.yml installer-artifact + release steps rely on). Holding for an owner policy decision (accept the behavior change vs. pin) rather than auto-merging — the build pipeline is an owner-scoped area. The green dev-dependency bumps (#16-#19) are safe to batch-merge on CI-green independently.

@dependabot @github

dependabot Bot commented on behalf of github Jul 1, 2026

Copy link
Copy Markdown
Author

OK, I won't notify you again about this release, but will get in touch when a new version is available. If you'd rather skip all updates until the next major or minor version, let me know by commenting @dependabot ignore this major version or @dependabot ignore this minor version. You can also ignore all major, minor, or patch releases for a dependency by adding an ignore condition with the desired update_types to your config file.

If you change your mind, just re-open this PR and I'll resolve any conflicts on it.

@dependabot dependabot Bot deleted the dependabot/github_actions/actions/setup-node-6 branch July 1, 2026 16:42
LxveAce added a commit that referenced this pull request Jul 1, 2026
… GPU routing

First public update since v3.0.0. v3.1.0 existed only as a testing
release; v3.2.0 brings the full set of v3.1.0 + v3.2.0 features to
the public repo in a single promotion commit.

Headline features (full detail in docs/RELEASE_NOTES_v3.2.0.md and
CHANGELOG.md):

  - Terminal Tabs replaces SplitLayout — Windows-Terminal-style strip,
    profile picker (Claude / Ollama / Aider / Gemini / BitNet),
    per-tab popout, session schema v1→v2 migration.
  - Claude (Chat) profile + JSONL parser route Claude CLI events
    through structured rendering (tool_use / tool_result / thinking).
  - Stop button replaces Send while chat-mode streams (SIGINT).
  - Commands sidebar mirrors active tab's CLI profile (6 curated families).
  - GPU routing for Ollama daemon — fixes "my dedicated GPU is ignored".
  - Auth auto-detect — surfaces CLI OAuth + env var sources.
  - Chat-skin v2 with markdown + Prism syntax highlighting.
  - BitNet / Liquid LFM2.5 / Jetson Thor catalog additions.
  - Runtime verifier extended 12→30 assertions.

Source promoted from claude-code-studio-testing@v3.2.0. Dev
artifacts (journal/, security-reviews/, session logs, plans, status +
verification docs) intentionally NOT promoted — per the repo split
established 2026-05-27.

Underlying stacked PRs on the testing repo: #18, #19, #20, #21, #22,
#23, #24, #25, #26, #27.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
LxveAce added a commit that referenced this pull request Jul 2, 2026
… GPU routing

First public update since v3.0.0. v3.1.0 existed only as a testing
release; v3.2.0 brings the full set of v3.1.0 + v3.2.0 features to
the public repo in a single promotion commit.

Headline features (full detail in docs/RELEASE_NOTES_v3.2.0.md and
CHANGELOG.md):

  - Terminal Tabs replaces SplitLayout — Windows-Terminal-style strip,
    profile picker (Claude / Ollama / Aider / Gemini / BitNet),
    per-tab popout, session schema v1→v2 migration.
  - Claude (Chat) profile + JSONL parser route Claude CLI events
    through structured rendering (tool_use / tool_result / thinking).
  - Stop button replaces Send while chat-mode streams (SIGINT).
  - Commands sidebar mirrors active tab's CLI profile (6 curated families).
  - GPU routing for Ollama daemon — fixes "my dedicated GPU is ignored".
  - Auth auto-detect — surfaces CLI OAuth + env var sources.
  - Chat-skin v2 with markdown + Prism syntax highlighting.
  - BitNet / Liquid LFM2.5 / Jetson Thor catalog additions.
  - Runtime verifier extended 12→30 assertions.

Source promoted from claude-code-studio-testing@v3.2.0. Dev
artifacts (journal/, security-reviews/, session logs, plans, status +
verification docs) intentionally NOT promoted — per the repo split
established 2026-05-27.

Underlying stacked PRs on the testing repo: #18, #19, #20, #21, #22,
#23, #24, #25, #26, #27.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependencies Pull requests that update a dependency file github_actions Pull requests that update GitHub Actions code

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants