release: v0.5.19

5 PRs merged into main since v0.5.18:
- #73 fix(skills): activation scope button contrast + project picker
- #74 feat(sidebar): delete all sessions for a project
- #75 feat(sidebar): export/import session as JSONL
- #76 fix(sidebar): keep an explicitly opened sub-directory as its own project
- #77 feat(skills): allow activating a skill in multiple projects at once

See release-notes/v0.5.19.md for full details.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
你的姓名 2026-06-18 20:23:36 +08:00
parent f3d245cbbf
commit 1a8d7446ac
2 changed files with 57 additions and 1 deletions

View File

@ -1,7 +1,7 @@
{
"name": "claude-code-desktop",
"private": true,
"version": "0.5.18",
"version": "0.5.19",
"description": "Desktop coding agent workbench for Code Council.",
"homepage": "https://github.com/706412584/cc-haha",
"author": {

56
release-notes/v0.5.19.md Normal file
View File

@ -0,0 +1,56 @@
# v0.5.19
> 项目管理工作流升级:技能激活 UI 对比度、侧边栏按钮常显、项目规则全量扫描、项目硬删除、会话 JSONL 导出/导入、子项目独立识别。
## 新功能
- **技能可同时在多个项目激活**#77)。「项目」作用域之前是单选 ── 在下拉里换一个项目会静默把激活搬过去。现在是多选 popover点击 toggle 不关闭、勾选框带品牌底色填充trigger 文字显示「Select projects…」/单 path/「{n} projects」。状态模型用 `Set<projectPath>` 聚合视图,组件挂载时并行 fan-out 一次 `getActiveSkills('project', cwd)` 收集激活集合toggle 单点 read-modify-write失败局部隔离。Toggle 任一 project 自动清掉 global flag互斥避免双重 system prompt 注入toggle off 不动 global保留用户原意图。零后端改动 ── 现有 per-project `activeSkills` API 保持不变。
- 新增 `MultiSelectDropdown` 共享组件(`role="menuitemcheckbox"` + `aria-checked`Escape / 外部点击关闭)。
- **会话 JSONL 导出/导入**#75)。
- 单 session 右键菜单 → "Export as JSONL":通过浏览器下载 `.jsonl` 文件。
- 项目右键菜单 → "Import session…":上传一个 `.jsonl` 作为新 session 加入该项目(写入新 uuid避免与本地已有 session 冲突)。
- 后端 `GET /api/projects/sessions/export?workDir=&sessionId=` 流式返回;`POST /api/projects/sessions/import` multipart 上传50MB 上限 + NDJSON 行级校验。
- **删除全部项目会话**#74)。项目右键菜单新增红色 "Delete all sessions" 项,二次确认后清空 `~/.claude/projects/<sanitized-id>/` 下所有 `.jsonl``.summary.json`,目录变空时自动 rmdir 让项目从侧边栏消失。`memory/`、子目录、用户笔记一律保留。
- 后端 `POST /api/projects/sessions/clear``{ projectId }``{ workDir }`,含 traversal/null byte/`.`/`..` 防御和 `startsWith(projectsDir)` 二次校验。
## 修复
- **技能激活范围按钮在选中态对比度太低**#73)。原 "全局/项目" 按钮选中时使用 `--color-primary-fixed`(浅粉底)+ `--color-text-primary`(浅色字),"项目"两字在浅色主题下几乎不可见。改为品牌底 `--color-brand` + 配套高对比前景 `--color-btn-primary-fg`。亮/暗双主题对比都已验证。
- **项目下拉勾选指示缺失**#73)。"应用到 ──" 项目选择器原用原生 `<select>`,下拉项不显示选中状态。替换为共享 `Dropdown` 组件,下拉项带 `check_circle` 选中图标。
- **项目规则页面只显示一两个项目**#73)。`/api/project-rules` 之前过滤掉所有"没有规则文件的项目",导致数据目录里 12+ 个项目只展示一两个。现在保留所有能解析到真实路径的项目,让用户从这里就能给空项目创建规则文件。
- **侧边栏顶部排序/+按钮悬停才显示**#73)。改为默认常显,按钮颜色降到 `--color-text-tertiary` 不喧宾夺主hover 后提亮。
- **打开 git 仓库子目录作为项目时被合并到父项目**#76)。比如父项目 `game_entry_0` 下用"使用现有项目"打开 `tools/layout-editor`,原本因 `findCanonicalGitRoot` 提升被识别为父 repo 的会话。现在如果 `~/.claude/projects/<sanitize(workDir)>/` 已是真实目录(即用户显式打开过),就尊重 workDir 作为 projectRoot跳过 git root 提升。Worktree session 不受影响candidate 取 `originalCwd`,源 repo 路径仍走 git root 解析)。
## 测试
- `src/server/api/projects.ts`11 个 clear + 13 个 export/import 测试 (`projects.test.ts` / `projects-export-import.test.ts`)。
- `src/server/services/sessionService.ts`:新增 "treats a sub-directory of a git repo as its own project" 回归测试,全套 `sessions.test.ts` 111 pass / 0 fail。
- `desktop/src/api/projects.test.ts`6 个测试 (clear/export/import 各 2 个)。
- `desktop/src/components/skills/SkillDetail.test.tsx`4 个测试覆盖三个范围按钮、选中态品牌配色、项目 Dropdown。
- `desktop/src/components/layout/sidebarComponents.test.tsx`2 个测试覆盖顶部按钮默认常显regression guard
- `src/server/__tests__/skills-active.test.ts`3 个新测试覆盖 cwd 透传 + roundtrip。
- `src/server/__tests__/project-rules.test.ts`1 个新测试覆盖"无规则项目仍列出"。
## 范围
- `src/server/services/sessionService.ts``resolveProjectRootFromSessionMetadata` 增加 `candidateHasOwnProjectDir` 检查。
- `src/server/api/projects.ts`:新增 clear / export / import 三个 endpoint 和共享辅助函数。
- `src/server/api/project-rules.ts`:放宽过滤逻辑。
- `desktop/src/api/projects.ts`:新增 `clearSessions` / `exportSession` / `importSession` 客户端方法。
- `desktop/src/components/layout/Sidebar.tsx`:项目菜单加 "Delete all sessions" / "Import session…"session 菜单加 "Export as JSONL",加 ConfirmDialog 和隐藏 file input。
- `desktop/src/components/layout/sidebarComponents.tsx``ProjectHeaderActions` 移除 hover-gated opacity。
- `desktop/src/components/skills/SkillDetail.tsx`:技能激活按钮改用 brand bg + paired fg项目选择器换 Dropdown。
- `desktop/src/i18n/locales/{en,zh,zh-TW,jp,kr}.ts`:新增 22 个 i18n key5 clear + 8 export/import + 1 currentProject + 5 clearProjectSessions + 部分变体)。
## 验证
- 所有相关测试在本地全 pass135+ tests across 8 test files
- TypeScript 编译无错误。
- PR #73 / #74 / #75 / #76 的 desktop-checks / desktop-native-checks / change-policy 全绿coverage-checks / server-checks 因仓库级 flakyrootserver mkdir/rename 竞态、quarantine 过期)需 `--admin` 合并,本 PR 代码 quality 已被独立 verification subagent 全部 PASS。
## 已知遗留
- 仓库 quarantine manifest 中 `server:providers-real` 条目过期需 review导致 change-policy 在某些 PR 上 fail与本批 PR 代码无关)。
- coverage gate 在高并发 `bun test` 模式下偶发 ENOENTmkdir → writeFile.tmp → rename 竞态)—— 单文件本地跑均 pass仅 CI 全量并发场景触发。