[English](CONTRIBUTING_EN.md) · 中文
# 贡献指南(dsh-tui-vscode)
感谢你考虑为 dsh-tui-vscode 做贡献!以下是参与开发的流程与约定,**均由 CI 服务端强制**(贡献者无法通过修改仓库文件削弱检查)。
## 开发环境
- Node.js 24(开发默认;CI 测试矩阵为 Node 22/24);包管理用 **npm**(`npm ci` 安装)。
- e2e 的"真实 dsh-tui 恢复测试"需要本机全局安装 `dsh` CLI 与 `dsh-tui`(无则自动跳过该用例)。
- 开发时建议安装本地钩子:`node scripts/install-commit-hook.mjs`(拦截提交消息格式等快速可逆问题)。
## 运行测试
```bash
npm run typecheck # tsc --noEmit
npm test # 编译 + 数据层单元测试(node:test)
npm run test:e2e # 真实扩展宿主测试(@vscode/test-electron;Linux 用 xvfb-run -a)
npm run package # 编译 + 生成 .vsix
```
## 变更流程
1. 从 `main` 创建功能分支,**分支前缀**必须是 `feat/` `fix/` `docs/` `chore/` `hotfix/` `ci/` `test/`(CI pr-policy 强制,`feature/` 会被拒绝)。
2. 提交消息遵循 **Conventional Commits**:`fix: ...` / `feat: ...` / `docs: ...` / `ci: ...`(CI 逐个提交审计)。
3. 发起 Pull Request:**标题同样遵循 Conventional Commits**;正文使用 `.github/PULL_REQUEST_TEMPLATE.md` 的五段结构(摘要 / 改动范围 / 验证 / 自查 / 审查注意点),**删除或省略任何段落或勾选项即失败**。
4. 行为变化**必须记入 `CHANGELOG.md` 的 Unreleased 段**(中英同步);勾选"行为变化已记入 CHANGELOG"时,分支必须相对基线有实际的 CHANGELOG diff(防虚假自查)。
5. 文档改动必须**中英双语同步**(CI 强制行数差 ≤ 10,CoC 除外)。
## 代码约定
- 与 VS Code API 无关的纯逻辑放 `src/session.ts` / `src/sessions.ts`,**不带 `vscode` import**,便于单元测试。
- **断言平台无关**:路径分隔符用 `join()` 构造期望值;CI 在 Linux 与 Windows 双平台运行,Windows 风格硬编码断言会在 Linux 失败(已有前车之鉴)。
- 只暂存显式路径,不用 `git add -A` 大杂烩;提交前自查 `git diff --check`。
- 不提交凭据、密钥、个人路径或本地产物(`.vsix`、`.e2e-workspace` 等已在 `.gitignore`)。
## 提交规范
- 每个变更单独提交,勿混入无关改动。
- 提交信息:`(): `,如 `fix(sessions): projectNameOf 双分隔符解析`。
## 提交流程
1. Fork 本仓库,从 `main` 建分支(`git checkout -b fix/your-change`)。
2. 提交改动(`git commit -m 'fix: describe the change'`)。
3. 推送到分支(`git push origin fix/your-change`)。
4. 发起 Pull Request(标题同样遵循 Conventional Commits 前缀)。
本地预检:安装 pre-commit 钩子(`node scripts/install-commit-hook.mjs`),CI 服务端兜底其余检查。
## 发布 / Publishing
- 当前发布方式:`npm run package` 生成 vsix → https://marketplace.visualstudio.com/manage 网页上传(官方"手动发布"路径,无需 PAT)。
- 版本流程:改 `package.json` version → 同步 README 徽章与 CHANGELOG(release-consistency CI 强制五处一致)→ 打 `v*` tag → 网页上传新版本。
- 注意:Azure DevOps 全局 PAT 将于 2026-12-01 退休;届时如需 CLI/CI 自动化发布,改用 Entra ID(`vsce publish --azure-credential`,vsce ≥ 2.26.1)。
- 切勿使用"移除(Remove)":扩展名移除后**永久保留不可复用**;下架请用"Unpublish"。
### 更新发布(新版本)清单 / Publishing an update (new version)
1. **新版本号强制**:Marketplace 的版本**不可覆盖、删除后不可复用**——每次发布必须用**递增的新版本号**(同版本号网页上传会被拒绝)。
2. **CHANGELOG**:把 `Unreleased` 内容转为新版本段 `## [x.y.z] - 日期`,段内**链接本批已合并的 PR**(release-consistency CI 强制每版本段含 PR 链接或 direct-push 标记)。
3. **五处一致**:`package.json` version = README 徽章(中/英)= CHANGELOG 首个版本段(中/英),CI 验证。
4. `npm run package` → 在 manage 页面**上传新 vsix**(自动成为该扩展的新版本,保留安装统计)。
5. 打 `v*` tag + 创建 GitHub Release(附 vsix 附件),与商店版本保持一致。
6. 发布后:`Unreleased` 重置为空段;如版本同步中改了 README/CHANGELOG,随 tag 一起推送。