49 Commits
Author SHA1 Message Date
Qiu Yuzhou fbd0ab8680 feat: add status bar runtime dots toggle 2026-10-31 17:30:53 +08:00
Qiu Yuzhou 9788ffe484 feat(rules): fix custom rule actions to their scheme 2026-10-30 20:40:20 +08:00
Qiu Yuzhou 9ccee1fc53 refactor(servers): simplify latency details 2026-10-27 01:19:35 +08:00
Qiu Yuzhou 923f004527 feat: add third-party components and licenses window 2026-10-26 19:53:38 +08:00
Qiu Yuzhou 35c74d40c5 feat: bundle offline dependency provenance and license metadata 2026-10-26 19:06:38 +08:00
Qiu Yuzhou 8d1c1260ee fix(l10n): use natural Chinese rule preset label 2026-10-26 02:12:53 +08:00
Qiu Yuzhou 34caebf322 feat: add GUI-scoped subscription automatic updates (#1516)
* feat: add GUI-scoped subscription automatic updates

* fix: drain newly due subscription updates during a batch

* style: use segmented subscription update pickers
2026-10-25 20:21:06 +08:00
Qiu Yuzhou f6abd4343e feat(rules)!: add isolated routing presets
Add Mainland China proxy routing with independent rule workspaces.
Preserve existing routing choices through equivalent preset mappings.

BREAKING CHANGE: existing custom rules and enablement settings are
not migrated. Recreate them in the appropriate preset.
2026-10-25 14:32:12 +08:00
Qiu Yuzhou ba01e305c5 feat(servers): mark groups containing the active target with a hollow bolt
Ancestor groups of the active target now show a hollow bolt beside the
existing filled bolt on the target itself, in the servers tree, the
favorites table and the home target browser; the node detail subtitle
shows "含活动目标". The derivation lives in
CatalogTreeSnapshot.ancestors(of:) so every surface shares one rule
while activeTargetID stays a runtime fact outside the catalog
projection. Groups activated directly keep the filled bolt and leave
their member rows unmarked.
2026-10-20 01:03:54 +08:00
Qiu Yuzhou 003e40d809 refactor(ng2): encrypt proxy listening configuration 2026-10-19 14:31:18 +08:00
Qiu Yuzhou 6cbef4e57a refactor(connectivity): store test URL in user defaults 2026-10-18 08:31:13 +08:00
Qiu Yuzhou d8a11f7b6b feat: encrypt persistent server library 2026-10-18 07:57:10 +08:00
Qiu Yuzhou 8ca2da494d refactor(runtime): drop ProxyModeError guards and silent desired-proxy skip
Make systemProxyConfiguration total so a runtime document can no longer
swallow derivation via try? and silently skip desired system proxy
convergence. Delete the unreachable ProxyModeError / .mode failure fact
and its presentation; port validity stays at the settings store and the
document contract.
2026-10-17 15:30:47 +08:00
Qiu Yuzhou 27b91d60e1 refactor(settings): drop listen-settings ghost path and error-type mirrors 2026-10-17 14:34:57 +08:00
Qiu Yuzhou 9cd1bd1961 fix(home): rename terminal proxy command card 2026-10-16 03:40:17 +08:00
Qiu Yuzhou cc0f0a9513 style(home): refine control card presentation 2026-10-16 00:10:15 +08:00
Qiu Yuzhou d3fc15dfdf refactor(ui): remove home quick action card 2026-10-15 23:03:15 +08:00
Qiu Yuzhou 45bba13156 feat(app): use paperplane.fill in app icon 2026-10-15 22:45:18 +08:00
Qiu Yuzhou ab5479a7e7 fix(ui): clarify proxy mode server requirement 2026-10-15 22:15:30 +08:00
Qiu Yuzhou 3044ca72d1 feat(settings): redesign connectivity test link row 2026-10-15 21:48:58 +08:00
Qiu Yuzhou 3f900b7b03 fix: remove bulk connectivity test controls 2026-10-15 21:08:29 +08:00
Qiu Yuzhou 4a85cf41f7 feat(localization): cover all app-facing text in Chinese and English 2026-10-15 20:03:37 +08:00
Qiu Yuzhou 7bf46eb173 feat(settings): add application language selection 2026-10-15 19:07:25 +08:00
Qiu Yuzhou 297fc30c41 feat(connectivity): measure warmed HTTP latency phases 2026-10-15 17:39:13 +08:00
Qiu Yuzhou ea064a5c8a refactor(servers): remove list sorting 2026-10-15 00:45:52 +08:00
Qiu Yuzhou a8fedace16 fix(servers): show subscription creation in subscription toolbar 2026-10-14 23:30:40 +08:00
Qiu Yuzhou 9adbdccd5c refactor(servers): move activation hints into detail feedback 2026-10-14 22:18:15 +08:00
Qiu Yuzhou e535e31b16 fix(connectivity): show latency test progress 2026-10-14 21:47:51 +08:00
Qiu Yuzhou fba9e0250f feat(servers): add subscription update with inline feedback 2026-10-14 21:37:20 +08:00
Qiu Yuzhou ea66ead10b feat(servers): show subscription details in server view 2026-10-14 17:39:44 +08:00
Qiu Yuzhou d5f32ec83d fix(servers): compact connectivity table layout 2026-10-14 17:11:34 +08:00
Qiu Yuzhou 100795fd15 fix(connectivity): rename test button to latency test 2026-10-14 16:20:00 +08:00
Qiu Yuzhou 1353dc6292 fix(localization): disable automatic string catalog extraction 2026-10-14 11:52:21 +08:00
Qiu Yuzhou 790e2a26fa feat(home): add target catalog and connectivity testing 2026-10-14 11:19:07 +08:00
Qiu Yuzhou ebcd7ab2e2 feat(connectivity): add manual server connectivity tests 2026-10-14 00:53:52 +08:00
Qiu Yuzhou 3a6d143b17 refactor(settings): separate LAN enablement from listener mode 2026-10-13 21:46:04 +08:00
Qiu Yuzhou 2f0c0d7676 feat: separate local and LAN proxy listeners 2026-10-13 03:58:03 +08:00
Qiu Yuzhou f72c50dceb feat(plugins): configure plugin transport mode 2026-10-11 23:58:47 +08:00
Qiu Yuzhou b8fb419d22 fix(plugin): align settings button styles 2026-10-11 21:32:06 +08:00
Qiu Yuzhou 84c292eb7f feat(plugin): support aliases and local startup arguments 2026-10-11 21:04:59 +08:00
Qiu Yuzhou e50f671975 feat(servers): add ordered favorites 2026-10-09 23:20:11 +08:00
Qiu Yuzhou a7c5d80309 refactor: unify server and group detail presentation
Render saved node details through a shared property view with injected link actions. Keep metadata, activation feedback, and plugin parameter loading outside the renderer; retain specific plugin failures and scope command feedback to its target.

Preserve ordered and repeated plugin parameters, distinguish flags and empty values, and retain opaque raw text. Add bilingual detail copy and conversion coverage.

Validation: 981 hostless tests and 21 offline rule checks passed; Debug build passed. Native renderer checked at 720 and 360 point widths using synthetic data. Existing 22 lint warnings remain.
2026-10-09 20:05:03 +08:00
Qiu Yuzhou 801348c5b6 refactor(servers): use three-column table navigation 2026-10-09 19:07:44 +08:00
Qiu Yuzhou c4bbcb022e refactor(servers): replace group rename alert with a sheet
The pre-filled current name in the rename alert only showed on the
first presentation: SwiftUI on macOS recycles the alert panel and its
TextField does not pick up binding changes made in the same update as
re-presenting. Swap the alert for a RenameGroupSheet modeled on
NewGroupSheet, presented via sheet(item:) so content state is rebuilt
each time and the prefill always matches the target group.

As with the creation form, a failed rename now keeps the sheet open
with the entered name instead of closing the alert first and losing
the input. The NodeContext adapter previously used by the move sheet
is shared by both presentations.

Add the manual catalog keys 重命名分组 (Rename Group) and 名称 (Name);
保存/取消 already existed.
2026-10-06 20:41:01 +08:00
Qiu Yuzhou 4a918f69cb feat(rules): move custom rule deletion to toolbar and context menu
Replace the inline RulesDeletionButton with a toolbar delete button
(trash icon next to the add button). It is enabled only when the
custom-rules source is selected on the left and the selection contains
deletable custom rules; the collection must also be complete and not
committing.

The table context menu gains a destructive "删除 (N)" item after a
divider when the custom-rules source is selected, with the same
enablement conditions. Both entries share one confirmation alert now
held by RulesView.

Also inline the operation status view into the filter row and tighten
filter-area padding.
2026-10-06 19:19:57 +08:00
Qiu Yuzhou d06c04246d feat: move diagnostics to a standalone window 2026-10-06 15:20:39 +08:00
Qiu Yuzhou 1d69a3d538 feat(servers): add creation location picker 2026-10-06 14:08:12 +08:00
Qiu Yuzhou 0dc8775641 feat(servers): duplicate servers and groups 2026-10-06 13:36:12 +08:00
Qiu Yuzhou fb428f12bc refactor(app): 按分层重组 App/ 源码目录
App/ 根目录原有 73 个散落源文件,已无法从目录读出任何分组信息。

按「目录即分层」重组为 Composition / Application / Presentation / UI /
PlatformEffects / Resources 六个目录,UI 层再按子视图分目录(Workspace、
Home、Servers(含 Plugin)、Subscriptions、Rules、Settings、Diagnostics、
StatusMenu)。纯移动:类型名、模块名与 import 均未改动,App/ 根层不再有
散落文件。

配套改动:

- project.yml:Core 测试镜像的 excludes 由裸文件名改为 `**/` 递归形式。
  XcodeGen 的 exclude 不跨 `/`,裸名只匹配 App 根层;MainApp.swift 下移后
  旧写法会静默失效,把 @main 组合根编进测试镜像。info.path 与
  entitlements.path 指向 App/Resources/;并排除 `**/*.md`——App/ 下任何
  非源码文件都会被 XcodeGen 收进 Resources 阶段并封进签名后的 bundle。
- SkeletonTests 的架构守卫由「默认扫描全部 App/ + 7 个豁免文件 + 1 个豁免
  前缀 + 4 个豁免目录」改为正面圈定 App/UI/,豁免登记全部删除;新增运行时
  适配器放进 Application/ 即自动落在扫描范围外,无需再登记。
- README 工程结构说明同步;根 .gitignore 的生成物路径随 Resources/ 归位。

验证:clean build 0 error;task test 1022 用例全通过(含两个架构守卫);
task format 无改动(证明纯移动);task lint 与移动前同为 21 条内容型
warning;packaging-gate.sh ALL CHECKS PASSED,确认 plist/entitlements 归位
后签名与 entitlements 语义不变。

注意:迁移时须先删旧的生成物再 xcodegen generate,否则遗留的 App/Info.plist
会被当作普通资源扫进 Resources 阶段。
2026-10-05 19:56:18 +08:00