Skip to content

chore: sync upstream doctly/switchboard (v0.0.29)#1

Merged
ivandobskygithub merged 10 commits into
mainfrom
chore/upstream-sync
May 6, 2026
Merged

chore: sync upstream doctly/switchboard (v0.0.29)#1
ivandobskygithub merged 10 commits into
mainfrom
chore/upstream-sync

Conversation

@ivandobskygithub

Copy link
Copy Markdown
Owner

Summary

Merge doctly/switchboard:main (upstream) into the fork. Picks up bug fixes and improvements from v0.0.26 → v0.0.29.

Notable upstream changes pulled in

Conflict resolution notes

  • package.json: kept fork's pinned-version style; added @xterm/[email protected] and [email protected]; preserved fork-only deps (dompurify) and scripts (apply-branding, build:win:portable, preinstall-guard).
  • package-lock.json: regenerated against the merged package.json via npm install --package-lock-only.
  • schedule-ipc.js: kept BOTH assertPathAllowed (fork's path-guard hardening) AND encodeProjectPath (upstream's CLI-compatible folder naming). Defence-in-depth + correct behaviour.
  • .github/workflows/build.yml: kept deleted (fork has its own release flow).

Open upstream PRs intentionally NOT pulled

Test plan

🤖 Generated with Claude Code

navedr and others added 10 commits April 26, 2026 14:28
xterm.js defaults to Unicode 6.1 width tables which treat emoji as
single-width, causing all subsequent characters on the line to shift.
The unicode-graphemes addon uses UAX #29 grapheme clustering (Unicode 15)
for correct cell-width calculation.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
…race

All 4 matrix jobs were running electron-builder with --publish always in
parallel, racing to find-or-create the draft release for the tag. Each
non-winner created its own duplicate draft, scattering mac/win assets
(latest-mac.yml, .dmg, .zip, .exe) across drafts that no one publishes.
Result on v0.0.27: the "Latest" release shipped with only Linux assets,
and electron-updater 404s on latest-mac.yml.

Now matrix jobs always run --publish never and upload artifacts (now
including latest*.yml and .blockmap files needed by electron-updater).
A single publish job, gated on tag push, downloads all artifacts and
creates one draft release with gh release create. One publisher, one
release, no race.

Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
v0.0.27's release was missing the macOS and Windows artifacts due to a
race in the publish pipeline — all 4 matrix jobs ran electron-builder
with --publish always in parallel, each creating its own duplicate draft
release. The "Latest" release that won the race only contained the Linux
assets, breaking electron-updater for mac/win clients (404 on
latest-mac.yml).

No app-code changes from 0.0.27. The pipeline is now split: the matrix
builds with --publish never and a single follow-up job creates one draft
release with all artifacts.

Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
5 idle terminals with cursorBlink: true cause ~28% CPU from
constant WebGL repaint cycles. With blink disabled, idle
terminals drop to near-zero.

Co-authored-by: Claude Opus 4.6 (1M context) <[email protected]>
…sidebar entries (doctly#41)

Switchboard's folder-name regex only replaced `/` and `_`, while the Claude
CLI replaces every non-alphanumeric character (and applies a 200-char cap
with a hash suffix on overflow). For project paths containing spaces, dots,
backslashes, colons, etc., the two sides produced different folder names
under ~/.claude/projects/, surfacing as undismissable duplicate projects in
the sidebar.

- Add encode-project-path.js mirroring the CLI's algorithm exactly
  (reverse-engineered from claude 2.1.126: /[^a-zA-Z0-9]/g, 200-char cap,
  (h<<5)-h+c|0 hash suffix on overflow). Deterministic and pure.
- Mirror the encoder in public/utils.js for the renderer.
- Route all 10 call sites through encodeProjectPath().
- Fix session-cache.js phantom-project bug: only insert a project entry
  after the archive filter passes, so folders whose sessions are all
  archived don't appear as empty undismissable projects in the sidebar.

Fixes doctly#38. Supersedes doctly#37 (also covers Windows drive paths).

Co-authored-by: Claude Opus 4.7 (1M context) <[email protected]>
Claude Code writes auto-generated titles as type:"ai-title"/aiTitle
entries, but readSessionFile only parsed type:"custom-title". Sessions
with an AI title but no user-set title fell back to the raw first
prompt. User-set customTitle still takes precedence.

Fixes #33

Co-authored-by: Claude Opus 4.7 (1M context) <[email protected]>
# Conflicts:
#	.github/workflows/build.yml
#	package-lock.json
#	package.json
#	schedule-ipc.js
@ivandobskygithub ivandobskygithub merged commit 4d5ec4b into main May 6, 2026
@ivandobskygithub ivandobskygithub deleted the chore/upstream-sync branch May 6, 2026 08:09
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants