Commit Graph
1098 Commits
Author SHA1 Message Date
Qiu Yuzhou 1003b904dc test(doh): remove CI timing assumptions
CI scheduling can exhaust the fallback budget or exceed the elapsed-time
assertion. Separate record filtering and control deadline delivery so
tests verify fallback and request cancellation directly.
2026-10-24 03:14:03 +08:00
Qiu Yuzhou 2e5c159d51 docs: streamline agent guidance in English 2026-10-24 02:56:36 +08:00
Qiu Yuzhou 2365befbfe ci: run smoke tests and retain failure evidence 2026-10-24 02:51:51 +08:00
Qiu Yuzhou b7648ceecd test(smoke): stop on missing deployment receipt 2026-10-24 02:51:39 +08:00
Qiu Yuzhou ca9215099b fix(tests): restore strict test compilation 2026-10-24 02:51:27 +08:00
Qiu Yuzhou 366bb43711 test(agent): replace timed reload integration test 2026-10-24 02:51:15 +08:00
Qiu Yuzhou c708cd8d19 feat(ui): debounce transient status rows via shared display gate
The home run-control card and the menu-bar status card render the agent
and system-proxy status rows straight from snapshot replacements, so fast
operations (e.g. proxy mode switches) flash transient states like
"applying" before settling.

Add a presentation-layer debounce shared by both surfaces:

- TransientDelayGate: per-stream gate where stable values display
  immediately, transient values (starting/applying/repairing) display
  after 400 ms and are dropped when superseded, and displayed transients
  are held for at least 400 ms.
- StatusDisplayModel: app-level shared model deriving agent and
  system-proxy payloads (row + detail + hint) from workflow snapshots
  through two independent gates; domain facts keep their cadence.
- Wire the model through the composition root into RuntimeControlCard
  and StatusCardView; toggles, approval actions, the difference view and
  target/mode rows keep reading the raw snapshot.
2026-10-24 02:22:39 +08:00
Qiu Yuzhou 2fdcb5ab93 refactor(test): drop source-scanning openWindow guard 2026-10-24 00:50:07 +08:00
Qiu Yuzhou 1262d17d61 feat(agent): omit sslocal log timestamps 2026-10-24 00:13:58 +08:00
Qiu Yuzhou 4845cbf673 fix(logging): detect upstream levels case-insensitively 2026-10-23 23:54:54 +08:00
Qiu Yuzhou c602ca334a feat(menu): add diagnostics window entry 2026-10-23 19:43:25 +08:00
Qiu Yuzhou e88eb335b8 refactor(diagnostics): remove status cards 2026-10-23 19:39:53 +08:00
Qiu Yuzhou c3a5cccb09 feat(home): add runtime status dots 2026-10-23 19:31:30 +08:00
Qiu Yuzhou d3faf610c1 feat(diagnostics): add selectable log table 2026-10-23 19:25:33 +08:00
Qiu Yuzhou 3a6225e9a6 docs: clarify prerequisites and bundled plugins 2026-10-23 16:23:32 +08:00
Qiu Yuzhou 888d184c69 ci: enforce strict compiler warnings 2026-10-23 05:42:37 +08:00
Qiu Yuzhou 71d333090e chore: suppress intentional classic keychain deprecation warnings 2026-10-23 05:36:43 +08:00
Qiu Yuzhou 69a1257430 fix: resolve non-deprecation unit test build warnings 2026-10-23 05:32:38 +08:00
Qiu Yuzhou d48a21b2c8 fix(agent): extend listener readiness deadline 2026-10-23 05:15:17 +08:00
Qiu Yuzhou d3f01ce708 ci: cache Homebrew tool downloads 2026-10-23 05:15:06 +08:00
Qiu Yuzhou b5aa827958 ci: stream lint, test, and build logs 2026-10-23 05:09:51 +08:00
Qiu Yuzhou fd1ffd2433 ci: omit xcresult from validation artifact 2026-10-23 03:49:28 +08:00
Qiu Yuzhou 09e4d2e097 fix(tests): avoid blocking async test workers 2026-10-23 03:46:19 +08:00
Qiu Yuzhou 17848b6fde ci: add NG2 validation workflow and format checks 2026-10-23 03:05:14 +08:00
Qiu Yuzhou 3baee572ac fix: restore compilation after file extraction 2026-10-23 02:50:13 +08:00
Qiu Yuzhou a3d53e5813 chore(hooks): adopt pre-commit framework 2026-10-23 01:27:32 +08:00
Qiu Yuzhou b6b9349d64 style: resolve SwiftLint violations 2026-10-23 01:10:40 +08:00
Qiu Yuzhou a7ad08b5b1 docs: update project status in readmes 2026-10-23 00:11:24 +08:00
Qiu Yuzhou ad9942d4d4 docs: update release download links 2026-10-22 21:16:14 +08:00
Qiu Yuzhou c76832b5e8 feat(release): add Taskfile publish workflow v2.0.0-alpha.1 2026-10-22 20:49:48 +08:00
Qiu Yuzhou d940e4ef94 docs: add bilingual end-user readmes 2026-10-22 19:18:56 +08:00
Qiu Yuzhou 51667f4839 docs: rename Chinese docs suffix to zh 2026-10-22 17:24:49 +08:00
Qiu Yuzhou faf31a2a78 docs: add English documentation versions 2026-10-22 17:21:17 +08:00
Qiu Yuzhou ff93e6eeeb docs: add SIP-008 subscription provider guide 2026-10-22 17:10:35 +08:00
Qiu Yuzhou 0028254b40 fix(packaging): reject duplicate releases before build 2026-10-22 16:35:33 +08:00
Qiu Yuzhou 0101366096 fix(signing): timestamp all Release executables 2026-10-22 16:28:27 +08:00
Qiu Yuzhou 48aa04b0a2 chore: add .env file to .gitignore 2026-10-22 16:17:42 +08:00
Qiu Yuzhou 7b7d572fb5 fix(packaging): require explicit release versions 2026-10-22 16:16:05 +08:00
Qiu Yuzhou 4426d0b331 fix(packaging): support prerelease version labels 2026-10-22 15:02:15 +08:00
Qiu Yuzhou 9cca9f9a0a build: add signed and notarized DMG packaging 2026-10-22 14:32:47 +08:00
Qiu Yuzhou 17c9f15928 fix(window): bring presented window reliably to front at launch
Keyboard-launcher launches (Raycast/Spotlight Enter) left the
LSUIElement app unforegrounded with a missing Dock icon until Mission
Control forced a refresh. Investigation across real-machine rounds
(recorded in the ADR-0017 supplements) pinned three cooperating causes:

- The launch activation retry never started at launch: the workspace
  window's participation events (anchor attach / occlusion / key) could
  all miss the launch moment when content installed before the window
  became visible and the visibility notification fired before the
  anchor attached. A deferred visibility rescan plus re-armable chain
  (until truly settled) close this gap.
- NSApp.isActive can report an activation illusion while the menu bar
  still belongs to the previous frontmost app, so the settle check now
  requires both isActive and menu bar ownership.
- A same-turn accessory->regular bounce is coalesced away by the
  system; forced activation is a three-hop sequence with real settle
  delays (accessory -> 0.1s -> regular -> 0.15s -> activate), which
  re-registers the app with WindowServer/Dock and reclaims the menu
  bar. Each acting attempt also re-asserts makeKeyAndOrderFront and
  orderFrontRegardless as a visible-layer fallback.

Diagnostics: launchActivationRetry and windowAnchorAttached events
(unified-log category "window") record per-attempt facts (activation,
local policy, frontmost app, menu bar owner, space, window visibility);
user-environment facts stay out of shared diagnostic reports.
2026-10-22 03:24:14 +08:00
Qiu Yuzhou f847c01e70 chore(deps): update v2ray-plugin to v1.4.0 2026-10-22 00:49:56 +08:00
Qiu Yuzhou 7a01167719 test: clean up Keychain test identities 2026-10-21 19:34:18 +08:00
Qiu Yuzhou 1a98f0e7f5 feat(plugins): show plugin versions and links 2026-10-21 17:22:50 +08:00
Qiu Yuzhou 987a23812a fix(window): activate app when presented 2026-10-21 16:25:42 +08:00
Qiu Yuzhou ad73668732 style(home): emphasize activation action 2026-10-21 16:19:59 +08:00
Qiu Yuzhou f9e95474e5 refactor: adopt age configuration storage
Replace the custom encrypted container with AgeSwift 0.1.0 so standard
age tools can inspect sensitive configuration independently of the app.

Use independent Keychain X25519 identities for catalog.age and
proxy-listening.age. Preserve atomic commits and confirmed recovery;
reject historical NG2 formats without migration or cleanup.
2026-10-21 14:31:32 +08:00
Qiu YuzhouandDeepSeek Harness 7977daafea refactor: keep test doubles and test-only wrappers out of production
Move InMemoryDiagnosticReportExporter and InMemoryConfigurationGroupFileExporter
from App/PlatformEffects to Tests/Support: both are test doubles with no
production caller, and production composition wires only the AppKit adapters.

Delete RuleRuntimeCompiler.validation, a wrapper whose only callers were two
assertion blocks in the controller deployment test; those restated
custom-to-custom shadowing and validation order-independence, both pinned by
CustomRuleValidatorTests and RuleAnalysisTests. RuleRuntimeCompiler.compile
stays and keeps its production caller.

Co-Authored-By: DeepSeek Harness <noreply@deepseek.com>
2026-10-21 02:44:35 +08:00
Qiu YuzhouandDeepSeek Harness 5872015ca0 test: drop dead scaffolding assertions
Six sites re-asserted the predicate waitUntilRuntimeSettles already checks,
with no suspension point in between, so they could never fail; their intent
messages are folded into comments where one was not already stated.

Two commit-failure cases asserted the fake's bookkeeping (updateCalls stays
empty) which the fake guarantees by throwing before recording; the outcome
and committed-snapshot assertions already prove the real behavior.

Also drop a no-op loop that mutated a discarded struct copy, a duplicated
isWellFormed line, two WorkspaceRoute cases subsumed by the constructor and
the publish-count case, a duplicated presentation-message assertion, and the
round-trip halves of two payload-shape cases already covered case-by-case.

Co-Authored-By: DeepSeek Harness <noreply@deepseek.com>
2026-10-21 02:23:28 +08:00
Qiu YuzhouandDeepSeek Harness 78bafea90f test: drop assertions that restate the language or a fixture
Each removed assertion holds by construction and can never fail:

- jsonData() compared with itself cannot detect cross-run byte stability;
  bindAddress and mode are literal-returning computed properties
- RuleAction/RuleSourceKind allCases assertions pin synthesized enum order
  (neither allCases list is used in production); the persisted action tokens
  stay pinned by the kept rawValue assertions and source-kind tokens by
  fixture decoding through RuleSnapshotStore
- memberwise-constructor echo in RuleSourceIdentity, fixture-guaranteed
  name == id rows, a share draft field pair built from one string, and a
  local struct compared to its own assignment
- the synthesized-Codable round trip through literal JSONEncoder/JSONDecoder

The duplicate-import assertion becomes a real check: Set of node ids instead
of a count that restated roots.count, which is what its comment claims.

Co-Authored-By: DeepSeek Harness <noreply@deepseek.com>
2026-10-21 02:04:21 +08:00