mirror of
https://github.com/shadowsocks/ShadowsocksX-NG.git
synced 2026-10-29 21:53:43 +00:00
docs: rename Chinese docs suffix to zh
This commit is contained in:
@@ -2,14 +2,14 @@
|
||||
|
||||
> 🚧 重新实现进行中 —— 本仓库正在使用现代技术栈重写 ShadowsocksX-NG macOS 客户端。
|
||||
|
||||
新实现位于 [`ShadowsocksX-NG2/`](ShadowsocksX-NG2/README.zh-CN.md),面向 macOS 15+ / Apple Silicon(arm64)。外部二进制使用上游发布产物,不再通过 git 子模块在仓库内构建。
|
||||
新实现位于 [`ShadowsocksX-NG2/`](ShadowsocksX-NG2/README.zh.md),面向 macOS 15+ / Apple Silicon(arm64)。外部二进制使用上游发布产物,不再通过 git 子模块在仓库内构建。
|
||||
|
||||
## 开发入口
|
||||
|
||||
- [首次构建与常用命令](ShadowsocksX-NG2/README.zh-CN.md#开发构建与测试)
|
||||
- [开发指南](docs/development.zh-CN.md):统一验证、测试证据、代码风格工具与 Git hooks。
|
||||
- [工程与专题文档](ShadowsocksX-NG2/README.zh-CN.md#文档导航):源码布局、供应链与签名、规则快照、配置说明。
|
||||
- [术语表](GLOSSARY.md)与[架构决策记录(ADR)](docs/adr/);文档语言约定见[开发指南](docs/development.zh-CN.md#领域文档语言)。
|
||||
- [首次构建与常用命令](ShadowsocksX-NG2/README.zh.md#开发构建与测试)
|
||||
- [开发指南](docs/development.zh.md):统一验证、测试证据、代码风格工具与 Git hooks。
|
||||
- [工程与专题文档](ShadowsocksX-NG2/README.zh.md#文档导航):源码布局、供应链与签名、规则快照、配置说明。
|
||||
- [术语表](GLOSSARY.md)与[架构决策记录(ADR)](docs/adr/);文档语言约定见[开发指南](docs/development.zh.md#领域文档语言)。
|
||||
|
||||
## 旧版归档
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# ShadowsocksX-NG2
|
||||
|
||||
English | [简体中文](README.zh-CN.md)
|
||||
English | [简体中文](README.zh.md)
|
||||
|
||||
ShadowsocksX-NG2 is a modern rewrite of ShadowsocksX-NG for macOS 15+ and Apple Silicon (arm64). Its source code and build configuration are in this directory. The archived legacy version is described on the [repository home page](../README.md#旧版归档).
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ ShadowsocksX-NG 的现代化重写版本,面向 macOS 15+ / Apple Silicon(ar
|
||||
|
||||
## 开发、构建与测试
|
||||
|
||||
准备 Xcode/Swift 工具链、[Task](https://taskfile.dev/)、[XcodeGen](https://github.com/yonaskolb/XcodeGen) 和 SwiftLint;工具基线与安装说明见[开发指南](../docs/development.zh-CN.md#代码风格工具)。
|
||||
准备 Xcode/Swift 工具链、[Task](https://taskfile.dev/)、[XcodeGen](https://github.com/yonaskolb/XcodeGen) 和 SwiftLint;工具基线与安装说明见[开发指南](../docs/development.zh.md#代码风格工具)。
|
||||
|
||||
从本目录执行首次构建,先获取外部二进制,再生成工程:
|
||||
|
||||
@@ -18,7 +18,7 @@ task gen:prj
|
||||
task build
|
||||
```
|
||||
|
||||
Debug 默认使用 ad-hoc 签名,无需证书;Developer ID 配置与发布门槛见[签名与分发](../docs/distribution.zh-CN.md)。工程配置以 `project.yml` 为准,生成的 `.xcodeproj` 不入库。
|
||||
Debug 默认使用 ad-hoc 签名,无需证书;Developer ID 配置与发布门槛见[签名与分发](../docs/distribution.zh.md)。工程配置以 `project.yml` 为准,生成的 `.xcodeproj` 不入库。
|
||||
|
||||
从仓库根目录运行统一验证:
|
||||
|
||||
@@ -28,17 +28,17 @@ task --exit-code --taskfile ShadowsocksX-NG2/Taskfile.dist.yml validate
|
||||
task --exit-code --taskfile ShadowsocksX-NG2/Taskfile.dist.yml validate -- lint test
|
||||
```
|
||||
|
||||
默认顺序为 `lint → test → test:smoke → build`,失败即停止,日志与结果保存在 `ShadowsocksX-NG2/.build/validation/`。在本目录内可直接运行 `task --exit-code validate`。单项任务、证据读取与测试边界见[开发指南](../docs/development.zh-CN.md)。
|
||||
默认顺序为 `lint → test → test:smoke → build`,失败即停止,日志与结果保存在 `ShadowsocksX-NG2/.build/validation/`。在本目录内可直接运行 `task --exit-code validate`。单项任务、证据读取与测试边界见[开发指南](../docs/development.zh.md)。
|
||||
|
||||
## 文档导航
|
||||
|
||||
| 文档 | 内容 |
|
||||
| --- | --- |
|
||||
| [开发、构建与测试](../docs/development.zh-CN.md) | 验证入口与产物、单项任务、代码风格工具、Git hooks、文档语言 |
|
||||
| [工程结构与源码搜索](../docs/project-structure.zh-CN.md) | 源码分层、测试目录、跨 target 文件约束、搜索方法 |
|
||||
| [外部二进制、签名与分发](../docs/distribution.zh-CN.md) | 供应链校验、Debug/Release 签名、发布门槛、依赖升级 |
|
||||
| [内置规则快照](../docs/rule-snapshots.zh-CN.md) | 来源、转换语义、维护脚本与离线检查 |
|
||||
| [订阅、插件与监听配置](../docs/configuration.zh-CN.md) | 订阅资料、用户插件、Cloak、本地与局域网监听、配置恢复 |
|
||||
| [服务器库加密格式](../docs/server-library-encryption-format.zh-CN.md) | 加密文件格式与外部解密约定([English](../docs/server-library-encryption-format.md)) |
|
||||
| [开发、构建与测试](../docs/development.zh.md) | 验证入口与产物、单项任务、代码风格工具、Git hooks、文档语言 |
|
||||
| [工程结构与源码搜索](../docs/project-structure.zh.md) | 源码分层、测试目录、跨 target 文件约束、搜索方法 |
|
||||
| [外部二进制、签名与分发](../docs/distribution.zh.md) | 供应链校验、Debug/Release 签名、发布门槛、依赖升级 |
|
||||
| [内置规则快照](../docs/rule-snapshots.zh.md) | 来源、转换语义、维护脚本与离线检查 |
|
||||
| [订阅、插件与监听配置](../docs/configuration.zh.md) | 订阅资料、用户插件、Cloak、本地与局域网监听、配置恢复 |
|
||||
| [服务器库加密格式](../docs/server-library-encryption-format.zh.md) | 加密文件格式与外部解密约定([English](../docs/server-library-encryption-format.md)) |
|
||||
|
||||
领域术语与已定设计见[术语表](../GLOSSARY.md)和[架构决策记录](../docs/adr/)。`docs/design/` 与 `docs/research/` 为历史设计和研究记录,判断当前实现时以代码为准。
|
||||
@@ -6,7 +6,7 @@ Status: Accepted (2026-10-05)
|
||||
|
||||
边界由 `Tests/SkeletonTests.swift` 的守卫断言,且一律**正面圈定**而非禁令加豁免登记:视图层的守卫只扫 `App/UI/`(不得引用运行时控制器、工作流实现协作者、原始目录/凭据存储类型),`Domain/` 的守卫只断言根下无平铺 `.swift`、树下只有 `.swift`。把文件放进 `Application/`、`PlatformEffects/` 或某个主题目录,即自动落在扫描范围之外,无需登记豁免;新增主题目录也不需要改断言。
|
||||
|
||||
各目录的划分与各自职责由 [工程结构文档](../project-structure.zh-CN.md)维护——本 ADR 只固定组织原则,不维护清单。
|
||||
各目录的划分与各自职责由 [工程结构文档](../project-structure.zh.md)维护——本 ADR 只固定组织原则,不维护清单。
|
||||
|
||||
## Considered options
|
||||
|
||||
@@ -24,4 +24,4 @@ XcodeGen 带来两条**在代码里不可见**的约束:
|
||||
|
||||
跨进程契约按**文件**引用而非按目录:wrapper 与 system proxy helper 两个 target 各自显式列出所需的 `Domain/` 文件,因为它们只该拿到跨进程契约,而不是整个领域层。代价是目录内移动文件必须同步 `project.yml`;漏改时 xcodegen 以 `missing source directory` 直接失败,不静默。
|
||||
|
||||
在目录内移动文件因此是低代价操作:模块名、类型名与 import 均不变,`task format` 与 lint 基线不变,版本历史可继续追溯。这条约定分散记录在 `project.yml` 的分层注释、[工程结构文档](../project-structure.zh-CN.md)与本 ADR;新增主题目录时只需同步前两处(`DomainLayoutTests` 失败信息里列举的目录名会过期,断言本身不会失败)。
|
||||
在目录内移动文件因此是低代价操作:模块名、类型名与 import 均不变,`task format` 与 lint 基线不变,版本历史可继续追溯。这条约定分散记录在 `project.yml` 的分层注释、[工程结构文档](../project-structure.zh.md)与本 ADR;新增主题目录时只需同步前两处(`DomainLayoutTests` 失败信息里列举的目录名会过期,断言本身不会失败)。
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Subscriptions, Plugins, and Listener Configuration
|
||||
|
||||
[Project home](../ShadowsocksX-NG2/README.md) | [简体中文](configuration.zh-CN.md)
|
||||
[Project home](../ShadowsocksX-NG2/README.md) | [简体中文](configuration.zh.md)
|
||||
|
||||
## Subscription information
|
||||
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
# 订阅、插件与监听配置
|
||||
|
||||
[English](configuration.md) | [返回工程首页](../ShadowsocksX-NG2/README.zh-CN.md)
|
||||
[English](configuration.md) | [返回工程首页](../ShadowsocksX-NG2/README.zh.md)
|
||||
|
||||
## 订阅资料
|
||||
|
||||
面向订阅服务提供方的字段格式、嵌套分组扩展和响应要求见 [SIP-008 订阅扩展说明](subscription-provider-extension.zh-CN.md)。
|
||||
面向订阅服务提供方的字段格式、嵌套分组扩展和响应要求见 [SIP-008 订阅扩展说明](subscription-provider-extension.zh.md)。
|
||||
|
||||
订阅可在 SIP-008 JSON 根级提供 `bytes_used`、`bytes_remaining`(非负整数,最大为 UInt64),以及自定义的 `expires_at`(服务到期时间)、`traffic_reset_at`(流量重置时间)。日期值使用 RFC 3339 字符串,省略或 `null` 表示未提供;无效资料仅忽略该项,不影响有效服务器或分组资料。
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
# Development, Build, and Testing
|
||||
|
||||
[Project home](../ShadowsocksX-NG2/README.md) | [简体中文](development.zh-CN.md)
|
||||
[Project home](../ShadowsocksX-NG2/README.md) | [简体中文](development.zh.md)
|
||||
|
||||
Unless noted otherwise, run commands from `ShadowsocksX-NG2/`; paths in this document are relative to that directory.
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# 开发、构建与测试
|
||||
|
||||
[English](development.md) | [返回工程首页](../ShadowsocksX-NG2/README.zh-CN.md)
|
||||
[English](development.md) | [返回工程首页](../ShadowsocksX-NG2/README.zh.md)
|
||||
|
||||
除特别说明外,命令从 `ShadowsocksX-NG2/` 执行,文中工程路径也相对于该目录。
|
||||
|
||||
@@ -24,7 +24,7 @@ task --exit-code --taskfile ShadowsocksX-NG2/Taskfile.dist.yml validate -- lint
|
||||
|
||||
测试关通过本机 `xcrun xcresulttool get test-results summary` 和系统 `plutil` 尽力读取计数,无需新增脚本或工具依赖。`test-summary.json` 保存原始摘要,`test-summary.stderr.log` 保存 xcresulttool 错误,`count-reader.log` 保存计数读取错误。汇总展示通过、失败、跳过、预期失败及总数(Xcode 汇总口径,参数化测试的实际执行次数可能不同)。关卡与总体退出码由原命令决定,命令失败始终保留失败。结果包缺失或摘要不可读时显著标注 `evidence incomplete`(证据不完整)、计数未知,不改变命令结果,也不把缺失计数写成零。构建关不读取测试计数;未执行的关卡不等同于测试跳过。
|
||||
|
||||
统一入口成功表示所选关卡的命令通过,仍需核对证据是否完整;hostless、真实进程 smoke、原生 UI 和真实系统代理的验收边界仍分别成立,发布打包门槛见[签名与分发](distribution.zh-CN.md#发布门槛)。
|
||||
统一入口成功表示所选关卡的命令通过,仍需核对证据是否完整;hostless、真实进程 smoke、原生 UI 和真实系统代理的验收边界仍分别成立,发布打包门槛见[签名与分发](distribution.zh.md#发布门槛)。
|
||||
|
||||
`task test` 与 `task test:smoke` 显式启用 Xcode 单测试超时:默认 120 秒,上限 300 秒。这是 runner 兜底,不保证测试任务正常清理,也不是性能门槛。规则阶段等待失败会抛错退出测试体;受保护的测试任务先释放夹具,再取消并等待结束。规则延迟 gate 和同步阻塞夹具的默认等待上限为 10 秒,超时必须报告失败。共享 `AsyncGate` 保留由用例控制的取消语义。Swift Testing 的 detached worker 超时报告保留创建用例名称和源码位置;应同时核对命令退出码与测试计数,不能仅凭单例通过数判断成功。
|
||||
|
||||
@@ -53,9 +53,9 @@ Scripts/fetch-external-binaries.sh
|
||||
task gen:prj
|
||||
```
|
||||
|
||||
Swift Package Manager 从 `project.yml` 固定的正式版本解析 AgeSwift,并校验其发布 XCFramework。首次解析需要网络,消费者无需安装 Rust。`Vendor/AgeSwift/LICENSE-MIT` 来自固定版本,随应用打包到 `Resources/ThirdParty/AgeSwift/`。加密存储互操作测试还需要 `brew install age` 和可访问的登录钥匙串;测试使用 UUID 隔离的 service 并清理,不修改真实应用配置。命令行调试方法见[加密格式文档](server-library-encryption-format.zh-CN.md)。
|
||||
Swift Package Manager 从 `project.yml` 固定的正式版本解析 AgeSwift,并校验其发布 XCFramework。首次解析需要网络,消费者无需安装 Rust。`Vendor/AgeSwift/LICENSE-MIT` 来自固定版本,随应用打包到 `Resources/ThirdParty/AgeSwift/`。加密存储互操作测试还需要 `brew install age` 和可访问的登录钥匙串;测试使用 UUID 隔离的 service 并清理,不修改真实应用配置。命令行调试方法见[加密格式文档](server-library-encryption-format.zh.md)。
|
||||
|
||||
无证书也能构建与跑单测:Debug 基线是 ad-hoc,不需要 `Configs/Signing.local.xcconfig`。只有要做 Developer ID 签名(发布,或让本机 Debug 产物过打包门槛)时才写该文件,内容见[签名与运行形态基线](distribution.zh-CN.md#签名与运行形态基线)。
|
||||
无证书也能构建与跑单测:Debug 基线是 ad-hoc,不需要 `Configs/Signing.local.xcconfig`。只有要做 Developer ID 签名(发布,或让本机 Debug 产物过打包门槛)时才写该文件,内容见[签名与运行形态基线](distribution.zh.md#签名与运行形态基线)。
|
||||
|
||||
`Tests/Smoke/` 是真实进程冒烟(经 wrapper 拉起真实 sslocal 验证启动、握手、
|
||||
ACL 路由与插件监管),不在默认 `task test` 内,由独立 scheme 按需运行。
|
||||
@@ -1,6 +1,6 @@
|
||||
# External Binaries, Signing, and Distribution
|
||||
|
||||
[Project home](../ShadowsocksX-NG2/README.md) | [简体中文](distribution.zh-CN.md)
|
||||
[Project home](../ShadowsocksX-NG2/README.md) | [简体中文](distribution.zh.md)
|
||||
|
||||
Unless noted otherwise, run commands from `ShadowsocksX-NG2/`; paths in this document are relative to that directory.
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# 外部二进制、签名与分发
|
||||
|
||||
[English](distribution.md) | [返回工程首页](../ShadowsocksX-NG2/README.zh-CN.md)
|
||||
[English](distribution.md) | [返回工程首页](../ShadowsocksX-NG2/README.zh.md)
|
||||
|
||||
除特别说明外,命令从 `ShadowsocksX-NG2/` 执行,文中工程路径也相对于该目录。
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Project Structure and Source Search
|
||||
|
||||
[Project home](../ShadowsocksX-NG2/README.md) | [简体中文](project-structure.zh-CN.md)
|
||||
[Project home](../ShadowsocksX-NG2/README.md) | [简体中文](project-structure.zh.md)
|
||||
|
||||
Unless noted otherwise, run commands from `ShadowsocksX-NG2/`; paths in this document are relative to that directory.
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# 工程结构与源码搜索
|
||||
|
||||
[English](project-structure.md) | [返回工程首页](../ShadowsocksX-NG2/README.zh-CN.md)
|
||||
[English](project-structure.md) | [返回工程首页](../ShadowsocksX-NG2/README.zh.md)
|
||||
|
||||
除特别说明外,命令从 `ShadowsocksX-NG2/` 执行,文中工程路径也相对于该目录。
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
- `Vendor/rules/geolocation-cn/` — 内置中国域名规则快照(issue #63):`snapshot.json`(规范化规则 + 元数据 + 损失报告)、`manifest.json`(上游版本与快照 SHA-256)、`NOTICE`(许可证与归属)。普通构建只读本地快照,绝不抓取或转换。
|
||||
- `Vendor/rules/china-ipv4/` — 内置中国 IPv4 CIDR 直连候选快照(issue #64):同上三件套,来源为 [gaoyifan/china-operator-ip](https://github.com/gaoyifan/china-operator-ip) `china.txt` 固定 commit。规则模式的 `proxy_all` ACL 同时编入中国域名与 IPv4 CIDR 直连候选。
|
||||
- `Vendor/rules/gfwlist/` — 内置 GFWList 代理候选快照(issue #65):同上三件套,来源为 [gfwlist/gfwlist](https://github.com/gfwlist/gfwlist) 官方 Base64 AutoProxy `gfwlist.txt` 固定 commit。域名锚点转换为后缀匹配,满足条件的空路径或根路径 URL 前缀转换为精确域名匹配;「未匹配时直连」的 `bypass_all` ACL 编入这些代理候选。
|
||||
- `Scripts/` — 供应链脚本(见[外部二进制供应链](distribution.zh-CN.md#外部二进制供应链))与打包门槛断言;另有 `update-geolocation-cn.sh` / `update-china-ipv4.sh` / `update-gfwlist.sh`(显式维护动作,抓取固定版上游并转换)与 `verify-rule-snapshots.sh`(构建前离线校验快照完整性)。
|
||||
- `Scripts/` — 供应链脚本(见[外部二进制供应链](distribution.zh.md#外部二进制供应链))与打包门槛断言;另有 `update-geolocation-cn.sh` / `update-china-ipv4.sh` / `update-gfwlist.sh`(显式维护动作,抓取固定版上游并转换)与 `verify-rule-snapshots.sh`(构建前离线校验快照完整性)。
|
||||
|
||||
### 源码搜索
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Bundled Rule Snapshots
|
||||
|
||||
[Project home](../ShadowsocksX-NG2/README.md) | [简体中文](rule-snapshots.zh-CN.md)
|
||||
[Project home](../ShadowsocksX-NG2/README.md) | [简体中文](rule-snapshots.zh.md)
|
||||
|
||||
Bundled snapshots used by rule mode are explicitly maintained artifacts:
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# 内置规则快照
|
||||
|
||||
[English](rule-snapshots.md) | [返回工程首页](../ShadowsocksX-NG2/README.zh-CN.md)
|
||||
[English](rule-snapshots.md) | [返回工程首页](../ShadowsocksX-NG2/README.zh.md)
|
||||
|
||||
除特别说明外,命令从 `ShadowsocksX-NG2/` 执行,文中工程路径也相对于该目录。
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Sensitive Configuration Encryption with age
|
||||
|
||||
English | [简体中文](server-library-encryption-format.zh-CN.md)
|
||||
English | [简体中文](server-library-encryption-format.zh.md)
|
||||
|
||||
The server library and proxy listening configuration use standard [age v1](https://age-encryption.org/v1) files through [AgeSwift](https://github.com/qiuyuzhou/AgeSwift). See [ADR-0050](adr/0050-age-encrypted-configuration-storage.md) for the decision and recovery boundaries.
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
This guide describes the SIP-008 fields and private extensions currently supported by ShadowsocksX-NG. It is intended for subscription providers generating compatible responses. It reflects the current implementation.
|
||||
|
||||
[简体中文](subscription-provider-extension.zh-CN.md)
|
||||
[简体中文](subscription-provider-extension.zh.md)
|
||||
|
||||
`x_shadowsocksx_ng`, `expires_at`, and `traffic_reset_at` are private extensions recognized by ShadowsocksX-NG; they are not SIP-008 standard fields. Ordinary SIP-008 clients may not recognize them, and clients without extension support should still read the servers from the standard `servers` array. SIP-008 allows custom fields but does not guarantee that all clients support them. See the [SIP-008 Online Configuration Delivery specification](https://shadowsocks.org/doc/sip008.html).
|
||||
|
||||
|
||||
+1
-1
@@ -128,4 +128,4 @@ SIP-008 订阅 URL 通常包含访问令牌。请使用不可猜测的令牌,
|
||||
- 流量字段使用 SIP-008 标准字段;到期与重置日期使用本文规定的 RFC 3339 字符串。
|
||||
- 以不支持 `x_shadowsocksx_ng` 的普通 SIP-008 客户端验证时,扁平 `servers` 列表仍包含全部服务器。
|
||||
|
||||
订阅字段的应用内呈现与刷新行为见[配置文档中的“订阅资料”](configuration.zh-CN.md#订阅资料)。
|
||||
订阅字段的应用内呈现与刷新行为见[配置文档中的“订阅资料”](configuration.zh.md#订阅资料)。
|
||||
Reference in New Issue
Block a user