Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
570 commits
Select commit Hold shift + click to select a range
20a6211
refactor(tests): 按功能领域重组 Tests/ 目录
qiuyuzhou Oct 5, 2026
3f581d3
chore(lint): 排除 xcodebuild 落在项目内的 build/ 目录
qiuyuzhou Oct 5, 2026
aa9d831
fix(tasks): add dependency on project generation for build and test t…
qiuyuzhou Oct 5, 2026
9b6d73e
build(signing): 签名身份按 config 注入,Debug 免证书构建
qiuyuzhou Oct 5, 2026
7ab774f
chore(legacy): 移除 Legacy/ 旧版源码,归档到 legacy-v1 分支
qiuyuzhou Oct 5, 2026
a335e00
chore(agents): 同步 docs/agents 配置到当前 skills 并去掉仓库硬编码
qiuyuzhou Oct 5, 2026
be30f64
docs(design): 移除 to-spec 产物,去掉 user-plugin 文档的 -spec 后缀
qiuyuzhou Oct 5, 2026
7cbd451
refactor(servers): SidebarRow 更名 ServerSidebarRow,避免与外层窗口 sidebar 混淆
qiuyuzhou Oct 5, 2026
0ba9b16
ui: 修正服务器列表导入引导文案
qiuyuzhou Oct 5, 2026
77c33e5
fix: 移除有bug的移除当前选择的机制
qiuyuzhou Oct 5, 2026
e44a834
chore: add config.toml to .gitignore
qiuyuzhou Oct 6, 2026
bdcbc6c
feat(servers): separate details from edit forms
qiuyuzhou Oct 6, 2026
bb8d768
refactor(servers): compact form field layout
qiuyuzhou Oct 6, 2026
308d988
fix(home): disable server list keyboard focus
qiuyuzhou Oct 6, 2026
0dc8775
feat(servers): duplicate servers and groups
qiuyuzhou Oct 6, 2026
ac476d3
fix(servers): number existing duplicate names
qiuyuzhou Oct 6, 2026
1d69a3d
feat(servers): add creation location picker
qiuyuzhou Oct 6, 2026
4e3a76d
fix(servers): remove location menu indentation
qiuyuzhou Oct 6, 2026
f7f608b
refactor(ui): replace workspace sidebar with tabs
qiuyuzhou Oct 6, 2026
d06c042
feat: move diagnostics to a standalone window
qiuyuzhou Oct 6, 2026
c5e1c87
refactor(ui): clean up StatusCardView layout and remove unused invali…
qiuyuzhou Oct 6, 2026
4a918f6
feat(rules): move custom rule deletion to toolbar and context menu
qiuyuzhou Oct 6, 2026
5e89c02
refactor(servers): drop group name editing from group detail view
qiuyuzhou Oct 6, 2026
c4bbcb0
refactor(servers): replace group rename alert with a sheet
qiuyuzhou Oct 6, 2026
87a90a5
feat(servers): make sidebar and detail panes resizable via HSplitView
qiuyuzhou Oct 7, 2026
0cd86be
ui: simplify ServerSidebarRow layout and remove unused elements
qiuyuzhou Oct 7, 2026
64f99f2
chore: add build:release task in Taskfile
qiuyuzhou Oct 9, 2026
1a6af3d
refactor(home): drop server list card from home page
qiuyuzhou Oct 9, 2026
f23a24f
feat(servers): add node creation and modification timestamps
qiuyuzhou Oct 9, 2026
801348c
refactor(servers): use three-column table navigation
qiuyuzhou Oct 9, 2026
7ad7ede
refactor(servers): use HSplitView for three columns
qiuyuzhou Oct 9, 2026
2296143
fix(servers): focus table on mouse click
qiuyuzhou Oct 9, 2026
a7c5d80
refactor: unify server and group detail presentation
qiuyuzhou Oct 9, 2026
80ae129
fix: preserve detail pane width when switching nodes
qiuyuzhou Oct 9, 2026
e50f671
feat(servers): add ordered favorites
qiuyuzhou Oct 9, 2026
45ebd00
ui: 调整服务器详情视图的内容padding
qiuyuzhou Oct 9, 2026
e950f99
fix(servers): preserve width when switching lists
qiuyuzhou Oct 9, 2026
245ed3c
fix(servers): restore native group drag and drop
qiuyuzhou Oct 9, 2026
1390449
fix(plugins): 安全检查详情整行响应点击展开
qiuyuzhou Oct 11, 2026
84c292e
feat(plugin): support aliases and local startup arguments
qiuyuzhou Oct 11, 2026
1559345
fix(plugin): align argument editor button heights
qiuyuzhou Oct 11, 2026
b8fb419
fix(plugin): align settings button styles
qiuyuzhou Oct 11, 2026
b205913
style(plugin): improve editor field spacing
qiuyuzhou Oct 11, 2026
87a5e48
docs: prohibit fork issue references in code comments
qiuyuzhou Oct 11, 2026
f72c50d
feat(plugins): configure plugin transport mode
qiuyuzhou Oct 11, 2026
523cba3
fix(plugins): give plugin paths the full row width
qiuyuzhou Oct 11, 2026
686fa4c
docs: require English Conventional Commit messages
qiuyuzhou Oct 11, 2026
dc64349
feat(plugins): bundle Cloak v2 client
qiuyuzhou Oct 12, 2026
c49d605
chore(ng2): remove fork issue references from comments
qiuyuzhou Oct 12, 2026
2f0c0d7
feat: separate local and LAN proxy listeners
qiuyuzhou Oct 12, 2026
0efd2e4
fix: add padding to LANListeningEditorSheet for better layout
qiuyuzhou Oct 13, 2026
4920ec5
feat(ui): improve LAN credential inputs
qiuyuzhou Oct 13, 2026
64f3dca
refactor(settings): extract localhost listener editor
qiuyuzhou Oct 13, 2026
c61cfe2
fix(settings): preserve local and LAN listener port semantics
qiuyuzhou Oct 13, 2026
3a6d143
refactor(settings): separate LAN enablement from listener mode
qiuyuzhou Oct 13, 2026
ebcd7ab
feat(connectivity): add manual server connectivity tests
qiuyuzhou Oct 13, 2026
8098bf4
docs(connectivity): define latency terms
qiuyuzhou Oct 13, 2026
a5206c7
fix(connectivity): simplify toolbar progress
qiuyuzhou Oct 13, 2026
790e2a2
feat(home): add target catalog and connectivity testing
qiuyuzhou Oct 14, 2026
a5a341e
fix(home): improve selected target contrast
qiuyuzhou Oct 14, 2026
a619a82
fix(connectivity): leave untested results blank
qiuyuzhou Oct 14, 2026
1353dc6
fix(localization): disable automatic string catalog extraction
qiuyuzhou Oct 14, 2026
7cf0454
feat(ng2): add Nushell and Windows proxy environment commands
qiuyuzhou Oct 14, 2026
520c459
fix(home): rebalance dashboard column layout
qiuyuzhou Oct 14, 2026
0d95a0e
refactor(home): split card views into separate files
qiuyuzhou Oct 14, 2026
0903c0b
refactor(home): extract dashboard card views
qiuyuzhou Oct 14, 2026
fc3ecd5
fix(home): clarify runtime control labels
qiuyuzhou Oct 14, 2026
1219049
chore(presentation): update status copy and simplify assertions
qiuyuzhou Oct 14, 2026
03f996b
fix(home): refine target card layout
qiuyuzhou Oct 14, 2026
100795f
fix(connectivity): rename test button to latency test
qiuyuzhou Oct 14, 2026
6bf2f76
style(servers): emphasize activation action
qiuyuzhou Oct 14, 2026
2a0ac4d
fix(connectivity): move latency test into node actions
qiuyuzhou Oct 14, 2026
d5f32ec
fix(servers): compact connectivity table layout
qiuyuzhou Oct 14, 2026
287cc5d
refactor(servers): remove timestamp table columns
qiuyuzhou Oct 14, 2026
ea66ead
feat(servers): show subscription details in server view
qiuyuzhou Oct 14, 2026
fba9e02
feat(servers): add subscription update with inline feedback
qiuyuzhou Oct 14, 2026
e535e31
fix(connectivity): show latency test progress
qiuyuzhou Oct 14, 2026
9adbdcc
refactor(servers): move activation hints into detail feedback
qiuyuzhou Oct 14, 2026
41ed96f
fix(servers): use standard node detail action buttons
qiuyuzhou Oct 14, 2026
9aeff16
feat(servers): add activation icon to catalog detail
qiuyuzhou Oct 14, 2026
9bccdf4
feat(servers): manage subscription root links
qiuyuzhou Oct 14, 2026
a8fedac
fix(servers): show subscription creation in subscription toolbar
qiuyuzhou Oct 14, 2026
ea064a5
refactor(servers): remove list sorting
qiuyuzhou Oct 14, 2026
82672d6
refactor(ui): remove top-level subscriptions page
qiuyuzhou Oct 14, 2026
297fc30
feat(connectivity): measure warmed HTTP latency phases
qiuyuzhou Oct 15, 2026
7bf46eb
feat(settings): add application language selection
qiuyuzhou Oct 15, 2026
8319aa8
fix(servers): separate detail actions into two rows
qiuyuzhou Oct 15, 2026
4a85cf4
feat(localization): cover all app-facing text in Chinese and English
qiuyuzhou Oct 15, 2026
3f900b7
fix: remove bulk connectivity test controls
qiuyuzhou Oct 15, 2026
3044ca7
feat(settings): redesign connectivity test link row
qiuyuzhou Oct 15, 2026
ab5479a
fix(ui): clarify proxy mode server requirement
qiuyuzhou Oct 15, 2026
309e81c
feat(ng2): add icon to subscription update button
qiuyuzhou Oct 15, 2026
45bba13
feat(app): use paperplane.fill in app icon
qiuyuzhou Oct 15, 2026
d3fc15d
refactor(ui): remove home quick action card
qiuyuzhou Oct 15, 2026
cc0f0a9
style(home): refine control card presentation
qiuyuzhou Oct 15, 2026
d123497
refactor(ui): reorganize server node context menu
qiuyuzhou Oct 15, 2026
1be0976
feat: show subscription usage in detail properties footer
qiuyuzhou Oct 15, 2026
7bd0cb4
refactor(ui): share detail feedback timing lifecycle
qiuyuzhou Oct 15, 2026
b14b935
refactor(settings): centralize listener occupancy lifecycle
qiuyuzhou Oct 15, 2026
9cd1bd1
fix(home): rename terminal proxy command card
qiuyuzhou Oct 15, 2026
4c6f0f6
fix(project): exclude .xcstrings-mcp.lock files from resources
qiuyuzhou Oct 16, 2026
27b91d6
refactor(settings): drop listen-settings ghost path and error-type mi…
qiuyuzhou Oct 17, 2026
346af7f
refactor(activation): collapse leaf validate-derive into one preparation
qiuyuzhou Oct 17, 2026
8ca2da4
refactor(runtime): drop ProxyModeError guards and silent desired-prox…
qiuyuzhou Oct 17, 2026
ee195c4
refactor(settings): enforce validity only at the store seam
qiuyuzhou Oct 17, 2026
3ea1518
refactor(domain): drop test-only helpers and unreachable probe fallbacks
qiuyuzhou Oct 17, 2026
74a2e06
refactor(plugin): remove redundant inspection snapshot checks
qiuyuzhou Oct 17, 2026
5fc5ddf
refactor(runtime): remove redundant mode guard
qiuyuzhou Oct 17, 2026
d8a11f7
feat: encrypt persistent server library
qiuyuzhou Oct 17, 2026
6cbef4e
refactor(connectivity): store test URL in user defaults
qiuyuzhou Oct 18, 2026
e8e4a33
docs: document server library encryption format
qiuyuzhou Oct 18, 2026
507917a
refactor(ng2): store secrets directly in server library records
qiuyuzhou Oct 18, 2026
f944133
docs(ng2): update server library encryption format to v2
qiuyuzhou Oct 18, 2026
b1b00d7
test(ng2): isolate import workflow key storage
qiuyuzhou Oct 18, 2026
85197d8
docs(research): assess age encryption for sslocal runtime
qiuyuzhou Oct 18, 2026
e0db8b1
refactor(runtime): publish isolated supervision generations
qiuyuzhou Oct 18, 2026
b8c6f4d
build: add fail-fast validation task with retained evidence
qiuyuzhou Oct 18, 2026
e5b4187
test: stabilize parallel readiness and deadline checks
qiuyuzhou Oct 18, 2026
f1214c4
test: bound asynchronous fixture waits
qiuyuzhou Oct 18, 2026
985153c
refactor(rules): separate rule values from storage models
qiuyuzhou Oct 19, 2026
d39b896
fix(ui): avoid feedback state isolation warnings
qiuyuzhou Oct 19, 2026
0f34546
refactor: separate proxy preferences from listening configuration
qiuyuzhou Oct 19, 2026
003e40d
refactor(ng2): encrypt proxy listening configuration
qiuyuzhou Oct 19, 2026
12ae000
refactor(runtime): separate sslocal output from GUI intent
qiuyuzhou Oct 19, 2026
a159ce4
docs: maintain NG2 validation skill in repo
qiuyuzhou Oct 19, 2026
b6d4c2d
docs: guide scoped source searches
qiuyuzhou Oct 19, 2026
8a53575
docs: shorten READMEs and extract topic guides
qiuyuzhou Oct 19, 2026
766d1a3
refactor(runtime): make deployment metadata references explicit
qiuyuzhou Oct 19, 2026
e0e2814
refactor: separate configuration, runtime, and log directories
qiuyuzhou Oct 19, 2026
ba01e30
feat(servers): mark groups containing the active target with a hollow…
qiuyuzhou Oct 19, 2026
ec09d79
feat(runtime): route runtime events to the unified log
qiuyuzhou Oct 20, 2026
d099239
feat(agent): route sslocal output through a dual-destination intake
qiuyuzhou Oct 20, 2026
b681756
docs(adr): record unified log routing decision
qiuyuzhou Oct 20, 2026
1541e97
test(runtime): silence unified-log writes during test runs
qiuyuzhou Oct 20, 2026
1d85e86
feat(diagnostics): unify log lines into one filtered view
qiuyuzhou Oct 20, 2026
94ef128
feat(system-proxy): emit privileged helper events to unified log
qiuyuzhou Oct 20, 2026
f2424af
fix(logging): preserve line boundaries and chronology
qiuyuzhou Oct 20, 2026
6f33260
chore(sslocal): pin fork v1.26.0
qiuyuzhou Oct 20, 2026
8508080
fix: observe agent deployment failures without port probes
qiuyuzhou Oct 20, 2026
2c75ee6
feat(runtime): hot reload ACL rules with signals
qiuyuzhou Oct 20, 2026
26ecc5a
test: drop assertions that cannot fail and the doubles they exercised
qiuyuzhou Oct 20, 2026
28c6e82
test: drop cases whose injected failure can never fire
qiuyuzhou Oct 20, 2026
d63d04c
test: drop matrix and ACL cases whose inputs never reach the unit
qiuyuzhou Oct 20, 2026
e7116a5
test: merge duplicated cases into the stronger one
qiuyuzhou Oct 20, 2026
78bafea
test: drop assertions that restate the language or a fixture
qiuyuzhou Oct 20, 2026
5872015
test: drop dead scaffolding assertions
qiuyuzhou Oct 20, 2026
7977daa
refactor: keep test doubles and test-only wrappers out of production
qiuyuzhou Oct 20, 2026
f9e9547
refactor: adopt age configuration storage
qiuyuzhou Oct 21, 2026
ad73668
style(home): emphasize activation action
qiuyuzhou Oct 21, 2026
987a238
fix(window): activate app when presented
qiuyuzhou Oct 21, 2026
1a98f0e
feat(plugins): show plugin versions and links
qiuyuzhou Oct 21, 2026
7a01167
test: clean up Keychain test identities
qiuyuzhou Oct 21, 2026
f847c01
chore(deps): update v2ray-plugin to v1.4.0
qiuyuzhou Oct 21, 2026
17c9f15
fix(window): bring presented window reliably to front at launch
qiuyuzhou Oct 21, 2026
9cca9f9
build: add signed and notarized DMG packaging
qiuyuzhou Oct 22, 2026
4426d0b
fix(packaging): support prerelease version labels
qiuyuzhou Oct 22, 2026
7b7d572
fix(packaging): require explicit release versions
qiuyuzhou Oct 22, 2026
48aa04b
chore: add .env file to .gitignore
qiuyuzhou Oct 22, 2026
0101366
fix(signing): timestamp all Release executables
qiuyuzhou Oct 22, 2026
0028254
fix(packaging): reject duplicate releases before build
qiuyuzhou Oct 22, 2026
ff93e6e
docs: add SIP-008 subscription provider guide
qiuyuzhou Oct 22, 2026
faf31a2
docs: add English documentation versions
qiuyuzhou Oct 22, 2026
51667f4
docs: rename Chinese docs suffix to zh
qiuyuzhou Oct 22, 2026
d940e4e
docs: add bilingual end-user readmes
qiuyuzhou Oct 22, 2026
c76832b
feat(release): add Taskfile publish workflow
qiuyuzhou Oct 22, 2026
ad9942d
docs: update release download links
qiuyuzhou Oct 22, 2026
a7ad08b
docs: update project status in readmes
qiuyuzhou Oct 22, 2026
b6b9349
style: resolve SwiftLint violations
qiuyuzhou Oct 22, 2026
a3d53e5
chore(hooks): adopt pre-commit framework
qiuyuzhou Oct 22, 2026
3baee57
fix: restore compilation after file extraction
qiuyuzhou Oct 22, 2026
17848b6
ci: add NG2 validation workflow and format checks
qiuyuzhou Oct 22, 2026
09e4d2e
fix(tests): avoid blocking async test workers
qiuyuzhou Oct 22, 2026
fd1ffd2
ci: omit xcresult from validation artifact
qiuyuzhou Oct 22, 2026
b5aa827
ci: stream lint, test, and build logs
qiuyuzhou Oct 22, 2026
d3f01ce
ci: cache Homebrew tool downloads
qiuyuzhou Oct 22, 2026
d48a21b
fix(agent): extend listener readiness deadline
qiuyuzhou Oct 22, 2026
69a1257
fix: resolve non-deprecation unit test build warnings
qiuyuzhou Oct 22, 2026
71d3330
chore: suppress intentional classic keychain deprecation warnings
qiuyuzhou Oct 22, 2026
888d184
ci: enforce strict compiler warnings
qiuyuzhou Oct 22, 2026
3a6225e
docs: clarify prerequisites and bundled plugins
qiuyuzhou Oct 23, 2026
d3faf61
feat(diagnostics): add selectable log table
qiuyuzhou Oct 23, 2026
c3a5ccc
feat(home): add runtime status dots
qiuyuzhou Oct 23, 2026
e88eb33
refactor(diagnostics): remove status cards
qiuyuzhou Oct 23, 2026
c602ca3
feat(menu): add diagnostics window entry
qiuyuzhou Oct 23, 2026
4845cbf
fix(logging): detect upstream levels case-insensitively
qiuyuzhou Oct 23, 2026
1262d17
feat(agent): omit sslocal log timestamps
qiuyuzhou Oct 23, 2026
2fdcb5a
refactor(test): drop source-scanning openWindow guard
qiuyuzhou Oct 23, 2026
c708cd8
feat(ui): debounce transient status rows via shared display gate
qiuyuzhou Oct 23, 2026
366bb43
test(agent): replace timed reload integration test
qiuyuzhou Oct 23, 2026
ca92150
fix(tests): restore strict test compilation
qiuyuzhou Oct 23, 2026
b7648ce
test(smoke): stop on missing deployment receipt
qiuyuzhou Oct 23, 2026
2365bef
ci: run smoke tests and retain failure evidence
qiuyuzhou Oct 23, 2026
2e5c159
docs: streamline agent guidance in English
qiuyuzhou Oct 23, 2026
1003b90
test(doh): remove CI timing assumptions
qiuyuzhou Oct 23, 2026
5d6b8f4
test: move process lifecycle checks to smoke
qiuyuzhou Oct 23, 2026
aaa16eb
test(http): shorten first-byte timeout check
qiuyuzhou Oct 23, 2026
768c925
chore: add .gitignore for skills and include hooks.json in codex
qiuyuzhou Oct 24, 2026
48c1a95
docs: make issue tracker configuration contributor-local
qiuyuzhou Oct 24, 2026
3dbc754
docs: add contribution guidelines
qiuyuzhou Oct 24, 2026
0757af9
docs: explain NG2 process architecture
qiuyuzhou Oct 24, 2026
e3d3871
test: make HTTP and plugin checks deterministic
qiuyuzhou Oct 24, 2026
f6abd43
feat(rules)!: add isolated routing presets
qiuyuzhou Oct 24, 2026
813ae99
style(ui): refine picker presentation
qiuyuzhou Oct 24, 2026
168ff2e
feat(rules): reorder presets and default to GFWList
qiuyuzhou Oct 25, 2026
3270933
refactor(rules): require explicit preset selection
qiuyuzhou Oct 25, 2026
06e9fdd
test(rules): align fixtures with preset ownership
qiuyuzhou Oct 25, 2026
86909be
refactor(rules): centralize document commits
qiuyuzhou Oct 25, 2026
59ce386
test(rules): strengthen isolation and remove redundant checks
qiuyuzhou Oct 25, 2026
171e889
fix: align subscription sheet styling
qiuyuzhou Oct 25, 2026
0fade3a
fix: use semantic subscription prompt style
qiuyuzhou Oct 25, 2026
2241d3f
fix(window): stop policy bouncing during launch activation
qiuyuzhou Oct 25, 2026
34caebf
feat: add GUI-scoped subscription automatic updates (#1516)
qiuyuzhou Oct 25, 2026
f3ba330
refactor: centralize subscription automatic update transitions
qiuyuzhou Oct 25, 2026
3a10b75
refactor: consolidate subscription update execution ownership
qiuyuzhou Oct 25, 2026
cb771e6
fix(subscription): namespace SIP008 custom date fields
qiuyuzhou Oct 25, 2026
a01be54
fix: preserve weak release check without mutable local
qiuyuzhou Oct 25, 2026
e38d333
build: enforce strict checks across taskfile tasks
qiuyuzhou Oct 25, 2026
3ace468
ci: split style, build-test, and smoke jobs
qiuyuzhou Oct 25, 2026
232c2a3
chore(deps): update v2ray-plugin to v1.5.0
qiuyuzhou Oct 25, 2026
a84f9c4
feat(plugin): disable v2ray-plugin access logs
qiuyuzhou Oct 25, 2026
56bae99
docs: clarify subscription extension protocol
qiuyuzhou Oct 25, 2026
47206c9
test(plugin): verify argument behavior across overrides and activation
qiuyuzhou Oct 25, 2026
8d1c126
fix(l10n): use natural Chinese rule preset label
qiuyuzhou Oct 25, 2026
e8aaf86
fix(plugin): align v2ray-plugin version
qiuyuzhou Oct 25, 2026
3d9aac6
chore(gitignore): ignore .omx
qiuyuzhou Oct 26, 2026
2857da3
chore(vendor): consolidate transitive license notices
qiuyuzhou Oct 26, 2026
35c74d4
feat: bundle offline dependency provenance and license metadata
qiuyuzhou Oct 26, 2026
923f004
feat: add third-party components and licenses window
qiuyuzhou Oct 26, 2026
e9c13c9
feat: add About entry to status menu
qiuyuzhou Oct 26, 2026
9ccee1f
refactor(servers): simplify latency details
qiuyuzhou Oct 26, 2026
b1b9fcf
fix(sip008): emit UUID identifiers in lowercase
qiuyuzhou Oct 28, 2026
3e3749e
feat: show runtime status dots in menu bar
qiuyuzhou Oct 28, 2026
eca913f
style: emphasize system proxy action buttons
qiuyuzhou Oct 28, 2026
2c4343a
docs: refresh README features
qiuyuzhou Oct 28, 2026
8d8fe22
docs: highlight client-only scope
qiuyuzhou Oct 28, 2026
3e64743
fix(runtime): allow initial balancer startup
qiuyuzhou Oct 30, 2026
32f1d54
build(deps): bump actions/upload-artifact from 4.6.2 to 7.0.2 (#1517)
dependabot[bot] Oct 30, 2026
9788ffe
feat(rules): fix custom rule actions to their scheme
qiuyuzhou Oct 30, 2026
fbd0ab8
feat: add status bar runtime dots toggle
qiuyuzhou Oct 31, 2026
27d455f
docs: remove issue references from rule snapshot guides
qiuyuzhou Oct 31, 2026
5e55adf
fix(connectivity): remove automatic result expiry
qiuyuzhou Oct 31, 2026
83106a1
refactor(menu): remove status card
qiuyuzhou Nov 14, 2026
47c8bf5
feat: add feedback menu item
qiuyuzhou Nov 14, 2026
24e013d
ci: configure manual CodeQL build
qiuyuzhou Nov 14, 2026
56fc770
ci: use supported CodeQL build environment
qiuyuzhou Nov 14, 2026
728e6b1
ci: use generic destination for CodeQL
qiuyuzhou Nov 14, 2026
bacd810
fix: guard Swift 6.4 diagnostic attributes
qiuyuzhou Nov 14, 2026
ccd7503
ci: allow deprecation warnings in CodeQL
qiuyuzhou Nov 14, 2026
c04da8f
fix: restore CodeQL analysis
qiuyuzhou Nov 14, 2026
01f9288
ci: scope NG2 workflows to project changes
qiuyuzhou Nov 14, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
5 changes: 5 additions & 0 deletions .agents/skills/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
*
!.gitignore
!/xcodegen/
!/shadowsocksx-ng2-local-validation/

43 changes: 43 additions & 0 deletions .agents/skills/shadowsocksx-ng2-local-validation/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
---
name: shadowsocksx-ng2-local-validation
description: Validate ShadowsocksX-NG2 changes and diagnose retained local validation results.
---

# ShadowsocksX-NG2 local validation

This repository copy is the maintained skill. Copies under `~/.codex/memories/skills/` are historical snapshots. Paths below are relative to the repository root unless stated otherwise.

## Select the evidence

1. Inspect the request, staged and unstaged diffs, `ShadowsocksX-NG2/AGENTS.md`, and relevant ADRs. Read `ShadowsocksX-NG2/README.md` for build/signing conventions and `ShadowsocksX-NG2/Taskfile.dist.yml` for current gate definitions.
2. Identify the requested level: focused tests, full hostless suite, real-process smoke, Debug/Release build, native/manual UI, or real system-proxy behavior. Retain that scope; documentation-only changes do not require repeating full suites.
3. For structural/resource changes, update authoritative `project.yml` and run `task gen:prj` from `ShadowsocksX-NG2/`; never hand-edit the generated project.

## Run the selected checks

- Work from `ShadowsocksX-NG2/`. For combined validation use `task --exit-code validate`. From another directory use `task --exit-code --taskfile /absolute/path/to/ShadowsocksX-NG2/Taskfile.dist.yml validate`.
- Default gates are `lint test test:smoke build`, executed in order with fail-fast behavior. To select a non-duplicated subset, append e.g. `-- lint test`. Diagnose the first failure; later selected gates are `not_run`, not skipped tests.
- `test` runs offline binary/rule checks before the hostless arm64 Xcode suite. Its Xcode test counts do not count those earlier checks. `test:smoke` uses the separate `ShadowsocksX-NG2Smoke` scheme and real processes. `build` is Debug; Release is a separate `task build:release` and is outside `validate`.
- Run focused tests when appropriate using the existing Xcode scheme and test selection; a focused Xcode run does not cover the preceding Taskfile checks. Use isolated derived data when needed. Follow the repository Debug ad-hoc signing baseline; Release requires Developer ID signing and has no unsigned fallback.
- `task format` and `task lint:fix` mutate source; use when requested or needed for the change, then inspect the diff. Current commands and options belong in Taskfile, not this skill.

## Read retained evidence

`validate` prints its run directory, `ShadowsocksX-NG2/.build/validation/<UTC>-<random>/`. Gate directories use the gate name with `:` replaced by `-` (`test:smoke` → `test-smoke/`). `task clean` removes these artifacts; copy them elsewhere if long-term retention is needed.

1. Read the run's `summary.txt` first. It records the overall exit code, selected gates, gate status/exit codes, test counts and evidence warnings. Per-gate `status.txt` supplies the same gate summary.
2. For failed Xcode tests, read that gate's `test-summary.json`, especially `testFailures`. Report each failing case using `testIdentifierString` (or `testName`) and its `failureText`. For example, `plutil -extract testFailures json -o - <gate-dir>/test-summary.json` reads the retained failures without reopening the result bundle.
3. If the summary is absent, unreadable, or insufficient, read the relevant diagnostics: `test-summary.stderr.log` for extraction failure, `count-reader.log` for invalid counts, and `raw.log` for gate output, pre-Xcode failures, build/lint errors, or missing context. Query `result.xcresult` only for unresolved detail. When retained summaries answer the question, do not repeat `xcresulttool` extraction.
4. Keep command outcome and evidence completeness separate. `validate:result` writes the original gate exit code; summary extraction does not replace it. A missing result bundle or unreadable/invalid test summary means `evidence incomplete` and unknown counts, never zero counts or an inferred pass. `validate:summary` preserves the overall exit code and marks unexecuted selected gates `not_run`. Build has no test-count summary; lint has no xcresult requirement.

## Diagnose within the evidence boundary

- If XcodeGen reports `No project spec found`, check cwd. Permission failures in Xcode, macros, signing or Git may be environment boundaries: retry the unchanged command through authorized macOS execution before changing source. Distinguish missing Release signing configuration from source failure.
- Preserve assertions and default parallel execution when investigating flakes. Prefer deterministic readiness and explicit fixture release, cancellation and drainage over extra sleeps or increased timeouts. For parallelism claims, inspect runner evidence; configuration alone does not prove concurrent execution.
- For connectivity/latency smoke, verify listener ownership by the spawned process (`RuntimeSocketOwnershipProbe` or its current equivalent), response-header deadlines, and process-group/temp-environment cleanup. Use local DNS/loopback fixtures and proxy-egress observations where routing assertions require them.
- Keep inherited XCTest `test*` methods out of shared fixture bases to avoid duplicate execution. Measure slow rule/runtime segments before adding delay injection.
- Hostless tests, real-process smoke, native/manual UI, and real system-proxy acceptance are separate evidence levels. Hostless/smoke success does not establish SystemConfiguration writes, helper approval, notification behavior, or visual acceptance.

## Finish

Inspect staged and unstaged diffs and run `git diff --check`. Report the actual commands, run directory, exit codes, counts in Xcode's summary convention (parameterized executions may differ), warnings, evidence gaps, and omitted acceptance levels. Commit locally only when requested; push only with explicit authorization.
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
policy:
allow_implicit_invocation: false
76 changes: 76 additions & 0 deletions .agents/skills/xcodegen/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
---
name: xcodegen
description: Generate and manage Xcode projects with XcodeGen — write project.yml as the source of truth and produce .xcodeproj from it instead of hand-editing pbxproj files. Use this skill whenever creating or modifying an Xcode project's structure (targets, schemes, build settings, Info.plist, entitlements, dependencies like SPM packages or frameworks), when the user mentions xcodegen / project.yml / regenerating or fixing a .xcodeproj, or when asked to add files or targets to an Xcode project — even if they don't name XcodeGen explicitly. Also applies to CI project generation and migrating a repo to a generated-project workflow.
---

# XcodeGen

XcodeGen generates `.xcodeproj` files from a declarative `project.yml` spec.

**Core mental model: `project.yml` is the source of truth; `.xcodeproj` is a disposable build artifact.** Never hand-edit the `.xcodeproj` and never tell the user to add files through Xcode's UI — every structural change (new target, new source directory, new dependency) goes through `project.yml` + regeneration. That is the entire point of the tool: no pbxproj merge conflicts, and the project structure becomes reviewable YAML in git.

## The workflow

1. Check the tool exists: `which xcodegen` (install with `brew install xcodegen`). If the spec uses newer features, note them in `options.minimumXcodeGenVersion`.
2. Write or edit `project.yml` at the repo/project root.
3. Generate: `xcodegen generate` (add `--use-cache` in scripts/CI so unchanged specs skip regeneration).
4. Verify the result — a generated project that doesn't build is not done:
- `xcodebuild -list -project <Name>.xcodeproj` — schemes and configurations are as expected.
- `xcodebuild -project <Name>.xcodeproj -scheme <Scheme> build` — the real gate.
- `xcodegen dump --spec project.yml` prints the fully-resolved spec; use it to debug `include:` merges or surprising settings presets.

## Minimal working example

macOS app + unit tests + scheme — the shape most projects need; adapt platform, paths, and deployment target:

```yaml
name: MyApp
options:
bundleIdPrefix: com.example # targets without PRODUCT_BUNDLE_IDENTIFIER get com.example.<TargetName>
deploymentTarget:
macOS: "13.0"
createIntermediateGroups: true
targets:
MyApp:
type: application
platform: macOS
sources:
- path: MyApp # a directory: everything under it is picked up
info:
path: MyApp/Info.plist # generated and written to disk; CFBundle* keys auto-filled
properties:
LSMinimumSystemVersion: "13.0"
scheme:
testTargets:
- MyAppTests # scheme "MyApp" builds app + runs tests
MyAppTests:
type: bundle.unit-test
platform: macOS
sources:
- path: MyAppTests
dependencies:
- target: MyApp # TEST_HOST is set automatically for unit tests
```

```bash
xcodegen generate
xcodebuild -project MyApp.xcodeproj -scheme MyApp build
```

## Rules that prevent most mistakes

- **Regenerate after adding/removing source files.** Source globs are resolved when `xcodegen generate` runs, not live by Xcode — a new `.swift` file on disk is invisible to the project until then. "My file isn't in the target" almost always means: run `xcodegen generate`. (Xcode auto-reloads a regenerated project that's already open.)
- **Never mix settings styles.** In a `settings:` block, if you use `base:`, `configs:`, or `groups:`, a sibling plain map (e.g. `MARKETING_VERSION: 1.0` at the same level) is *silently ignored*. Pick one style per block; the plain-map style only works alone.
- **Quote deployment targets**: `deploymentTarget: "14.0"`, not `14.0` (YAML parses the latter as a float and trailing zeros vanish).
- **Prefer `info:` / `entitlements:` blocks** over committing static plists: XcodeGen writes the files and sets `INFOPLIST_FILE` / `CODE_SIGN_ENTITLEMENTS` for you, and fills `CFBundleIdentifier`, `CFBundleExecutable`, `CFBundleShortVersionString` etc. automatically. Anything you put in `properties:` wins. Info.plist files found in sources are never added to build phases.
- **Mark generated/optional paths** with `optional: true` on a source, or generation fails when the directory doesn't exist yet.
- **Test targets**: declare the app as a `dependencies: - target:` of the test target — that alone wires up `TEST_HOST` (unit tests) or `TEST_TARGET_NAME` (UI tests, type `bundle.ui-testing`).
- **Extensions embed themselves**: a dependency of an `application` target defaults to `embed: true`, so `- target: MyExtension` is usually all an app needs — no copy-files phase to write.
- **Extension bundle IDs must live under the app's bundle ID.** macOS/iOS validate that an embedded extension's bundle ID starts with the parent app's — `com.example.MyProxy.Tunnel`, not `com.example.Tunnel`. Since `bundleIdPrefix` auto-derivation gives every target `prefix.TargetName`, extensions fail a *build-validation* step (not compilation) with "Embedded binary's bundle identifier is not prefixed with the parent app's bundle identifier". Always set `PRODUCT_BUNDLE_IDENTIFIER` explicitly on extension targets (see recipes.md #2).
- **`.gitignore` the generated project** (`*.xcodeproj`) so no one edits it by accident. If the repo currently tracks one, flag the migration step (remove from index, regenerate locally) rather than doing it silently.
- **`xcodegen generate` is idempotent.** When in doubt, re-run it; there is no state to corrupt.

## Choosing between the reference files

- `references/project-spec.md` — syntax cheat sheet: every section of `project.yml` with exact key names. Read when you need a field you don't remember precisely (source exclude patterns, dependency options, scheme fields, SPM version constraints).
- `references/recipes.md` — complete copy-pasteable `project.yml` examples: app + unit/UI tests, app extension (e.g. network extension) with entitlements, SPM remote/local packages, per-config xcconfig, vendored pre-built binaries/frameworks, build-script phases, splitting a spec with `include:`. Read before writing any non-trivial spec — reuse a recipe rather than assembling from memory.
Loading