QuentinHsu
@quentinhsu
Joined on 21 August 2016
A ship in harbor is safe, but that is not what ships are built for.
GitHub Stats
106
Followers
84
Repositories
0
Organizations
0
Gists
115
Pull Requests
40
Issues
202
Commits
0
Sponsors
12
Contributed To
40
Star Earned
Most Used Languages
67.89%
HTML
10.55%
CSS
8.22%
Go
4.88%
TypeScript
3.83%
JavaScript
2.33%
Shell
2.10%
Vue
0.20%
Makefile
Popular Projects
Document-Page
以 issue 页面为文档记录/阅读的仓库,亦方便讨论
Unknown
25
1
12
0
oh-cloudflare-r2
Manage your Cloudflare R2 Blob Storage
Vue
10
2
0
0
print-your-target
Print your target, such as variables, in JavaScript/TypeScript/Go files
TypeScript
2
0
1
8
Awesome
Everything‘s Awesome
TypeScript
1
0
0
0
awesome-raycast
No description
TypeScript
1
0
0
0
quentinhsu.github.io
https://quentinhsu.github.io/
HTML
1
0
0
0
Top Contributions
Top contributions made by the user in the last year.
Charts
Follow Up
Activity Graph
Contributions Calendar
Contributions made by the user in the last 365 days.
Recent Activity
10/5/2025, 8:28:41 AM
10/5/2025, 8:22:36 AM
10/5/2025, 7:30:30 AM
- feat(ssot): backfill live config and write from in-memory settings during switch\n\n- Stop relying on provider backup files for switching (Claude/Codex)\n- Backfill current live config into the active provider before switching\n- Write target provider settings directly to app main config\n- Avoid writing provider copies when importing default provider
- feat(fs): atomic writes for JSON and TOML saves\n\n- Introduce atomic_write utility and use it in write_json_file\n- Add write_text_file for TOML/strings and use in Codex paths\n- Reduce risk of partial writes and ensure directory creation
- refactor(ssot): stop writing per-provider backup files on add/update/import\n\n- Add/update no longer write vendor copy files for Claude and Codex\n- Keep all state in memory (persisted via app config) to enforce SSOT\n- Import default provider now only reads from live config
- feat(backup): archive current live config before switching\n\n- Archive Claude settings.json and Codex auth.json/config.toml to ~/.cc-switch/archive/<ts>\n- Preserve user edits while centralizing SSOT in cc-switch config.json\n- Uses atomic writes for all subsequent updates
- feat(migration): import provider copy files into cc-switch config on first run\n\n- Scan Claude settings-*.json and Codex auth-*.json/config-*.toml\n- Merge into ~/.cc-switch/config.json, de-dupe by provider name (override with copies)\n- Backup old config.json and archive all scanned copy files\n- Add migration marker to avoid re-importing\n- Stop writing provider copy files in ProviderManager::add_provider
- feat(edit-current): allow editing current provider and sync to live on save\n\n- Enable Edit button for current provider in UI\n- On update_provider, if updating current provider, write changes to live config (Claude/Codex)\n- Maintain SSOT in cc-switch/config.json with atomic writes
- feat(migration-live): import current live settings on first run and set as current if empty\n\n- Read Claude ~/.claude/settings.json and Codex ~/.codex/auth.json + config.toml\n- Merge with priority: live > copies > existing\n- Set manager.current to the live-imported provider when empty
- chore(migration): use 'current' as the name for live-imported providers\n\n- Rename live-imported provider name from 'default' to 'current' for Claude/Codex\n- Keeps current selection logic intact when setting manager.current
- refactor(import): rename default imported provider to 'current'\n\n- import_default_config now creates provider id/name 'current'\n- Avoid duplicate import by checking 'current' key\n- Set manager.current to 'current' when empty
- docs: update plan to use 'current' instead of 'default' for initial import\n\n- Aligns documentation with implementation across migration and import flows
- refactor(migration): dedupe by (name + raw key) without hashing\n\n- Compare API key strings directly for Claude/Codex during migration\n- Remove sha2/hex deps and hashing helpers\n- Keep O(N^2) matching acceptable for small provider sets
- fix(tauri): correct window config and CSP\n\n- Set titleBarStyle to "Transparent" to match v2 schema\n- Add ipc: and http://ipc.localhost to connect-src for IPC\n- Add label: "main" for the primary window\n
- chore(rust): revert Cargo edition to 2021\n\n- Lower edition from "2024" to "2021" for broader toolchain compatibility\n- Keep rust-version and deps unchanged\n
- refactor(rust): remove unused code/imports to silence warnings\n\n- Drop unused backup/import helpers and redundant imports\n- Remove unnecessary mut parameter\n- Remove unused ProviderManager::add_provider\n
- feat(tauri): sync current provider edits to live config and archive before overwrite\n\n- Update: when editing the current provider, persist changes to live files (Claude settings.json; Codex auth.json + config.toml) and archive previous versions first.\n- Align add_provider behavior: archive live files before overwriting if the added provider is current.\n- Hardening: when deleting a Claude provider, also attempt removing legacy copy path by id (settings-{id}.json).\n\nThis keeps switching, adding and editing consistent with SSOT design and improves safety via archival.
- fix(provider): prevent case-insensitive name + key duplicates; migrate and startup dedupe - Use case-insensitive compare for name + API key in migration - Add runtime uniqueness checks in add/update commands - Startup dedupe prefers current provider; archives others - Keep original display casing; only normalize for comparisons - Validate Codex config.toml as before; archive before overwrite
- chore(migration): remove legacy copy files after successful archive - During copies→config migration, delete original legacy files only if archived - Applies to Claude settings-* and Codex auth-*/config-* pairs - Keep archive_file non-destructive for live backups
- refactor(migration): run dedupe only during first-time migration; remove startup dedupe - Remove per-startup dedupe; keep it limited to migration - Call dedupe at end of migrate_copies_into_config, then write marker - Avoid unintended changes on every app launch
- feat(init): only import from live when providers are empty; create a single 'default' entry and set as current - Remove special handling for 'current' entry - Import default only when manager.providers is empty - Name/id the initial entry 'default' and mark it current
- refactor(provider): remove runtime duplicate checks in add/update; dedupe only during initial migration per product decision
10/4/2025, 7:17:32 PM
10/1/2025, 8:58:00 PM
9/29/2025, 3:45:20 PM
9/29/2025, 1:32:17 PM
9/18/2025, 3:02:35 PM
9/18/2025, 2:43:17 PM
9/17/2025, 5:30:23 AM
9/7/2025, 5:37:31 PM