Qiu Yuzhou
|
a00a93d5c0
|
docs: align domain docs with Chinese glossary
|
2026-10-04 15:19:54 +08:00 |
|
Qiu Yuzhou
|
7bb327ba1d
|
docs(domain): CONTEXT.md 改名 GLOSSARY.md 并对齐引用
domain-modeling skill 升级后单上下文约定文件名为 GLOSSARY.md:
git mv 保历史、内容零改动;AGENTS.md、docs/agents/domain.md 及
NG2 源码注释中的活引用随之对齐。docs/design、docs/research、ADR
中的旧名引用属历史记录,不改写。
|
2026-10-04 15:06:41 +08:00 |
|
Qiu Yuzhou
|
edaa492257
|
feat(ui): 服务器工具栏新增删除按钮
- 工具栏次序:新建服务器、新建分组、删除、分享;删除钮作用于当前
选中节点,确认弹窗与右键菜单共用 deleteTarget 流(档位见
deleteFacts)。
- 无选中、选择失效或选中项不可删除时禁用;资格判定新增政策缝
CatalogWorkflow.canDelete(节点存在且 manual),订阅节点结构只读
不经此口径,订阅删除仍留在订阅分区。
- CONTEXT.md Vocabulary 增补 Deletable node 术语;新增 canDelete
接口测试。
|
2026-10-04 14:56:48 +08:00 |
|
Qiu Yuzhou
|
fab2004aa5
|
feat(ui): 服务器分享上收为分区工具栏按钮
- 工具栏最右新增「分享」(square.and.arrow.up),行为复用原二维码弹窗
(220×220 QR + 内嵌复制 ss:// 链接,后台线程生成);详情区底部
「复制 ss:// 链接」「二维码…」两按钮删除
- disabled 单谓词 sharePayload()==nil:空选择/选中分组/凭据不可解析
一律不可用
- 弹窗锚在工具栏按钮;选中变化即收起,生成前清旧图防闪旧二维码
- ServerDetailView 失去 clipboard 参数;ServersView.errors 放宽
internal 供跨文件扩展呈现失败
- CONTEXT.md Vocabulary 新增 Server share 词条(_Avoid_: export,
export 保留给文件快照:分组 SIP-008 导出、诊断报告)
|
2026-10-04 14:08:56 +08:00 |
|
Qiu Yuzhou
|
b3fa498aaf
|
test(agent): LaunchAgent manifest 双份 artifact 一致性守卫
manifest 字典抽为 SMAppLaunchAgentService.manifestDictionary(programArguments:)
单一构造点,writeUserPlist 消费;新增测试解码 bundle 内打包 plist
(SMAppService 审批用)与代码重建字典,断言 Label/KeepAlive/
ThrottleInterval 逐键相等、ProgramArguments 形状等价(bundle 相对 vs
绝对路径是文档化的刻意差异)。
评审候选⑥ 6d:crash 重放协议的两份 artifact 从此有编译后守卫。
|
2026-10-04 13:08:09 +08:00 |
|
Qiu Yuzhou
|
4b2ddae99e
|
refactor(paths): App Support 目录命名权归 RuntimePaths
六个 GUI 配置文件位置(catalog/settings/listen-settings/custom-rules/
activation 与 silent-launch 遗留迁移源)自拼 applicationSupport 目录的
写法收敛为 RuntimePaths 的具名函数,各 store 的 defaultFileURL 改一行
委托。RuntimePaths 宪章从「跨进程运行时契约」扩为「App Support 目录
全部文件清单」——目录里有过哪些文件从此一处可答。
评审候选⑥ 6c:目录改名从动六个文件缩为动一处。
|
2026-10-04 13:02:31 +08:00 |
|
Qiu Yuzhou
|
c1e229c455
|
refactor(runtime): tmp 暂存命名单一主人归 AtomicFileWriter
AtomicFileWriter 暴露 temporaryURL(for:)(.\(name).tmp-<uuid> 约定唯一出处)
与 isResidueName(_:)(残留谓词):write 内部与 RuntimeFileStore 的两处
symlink 暂存(repointActiveLink/restoreLink)改吃 temporaryURL,
deleteRuntimeFiles 的残留识别改吃谓词。staging 泄漏由
deleteRuntimeFiles 兜底清理的隐性链条由此由构造保证。
评审候选⑥ 6b:命名约定一改、残留清理不再静默失效。
|
2026-10-04 13:00:26 +08:00 |
|
Qiu Yuzhou
|
945ea2b4db
|
refactor(runtime): 收据写者归一为 Agent wrapper
RuntimeFileStore.writeRuntimeReceipt 生产零调用(17 处调用全为测试夹具),
从生产 interface 删除;测试侧经 RuntimeReceiptFixture 的 extension 以同签名
承接,调用点零改动。收据格式知识仍由 RuntimeDeploymentReceipt 类型承载,
GUI 侧只保留 readRuntimeReceipt 读缝。
评审候选⑥ 6a:wrapper 是唯一收据写者,GUI 永不伪造收据。
|
2026-10-04 12:59:26 +08:00 |
|
Qiu Yuzhou
|
d9460c4d6d
|
fix(ui): 订阅 URL 预填失败经错误弹窗呈现真实原因
|
2026-10-04 12:37:56 +08:00 |
|
Qiu Yuzhou
|
bf23d03288
|
fix(ui): 订阅卡页脚改为现行快照表述
|
2026-10-04 12:37:51 +08:00 |
|
Qiu Yuzhou
|
6b2ee2dcbe
|
refactor(ui): 删除 Legacy 导入的死 catch 分支
|
2026-10-04 12:37:19 +08:00 |
|
Qiu Yuzhou
|
7f1dbc6d94
|
refactor(ui): 系统代理暂停与不可读文案收成单一呈现常量
|
2026-10-04 12:37:06 +08:00 |
|
Qiu Yuzhou
|
bcede88ea4
|
fix(ui): 规则过滤项启用筛选去掉「状态」措辞避免与状态列撞名
|
2026-10-04 12:26:07 +08:00 |
|
Qiu Yuzhou
|
53ebfd612a
|
feat(ui): 参数行顺序调整与表格单元格点击聚焦
重排(按已确认方案 B 落地——SwiftUI Table 无重排序 API,方案 A 的
onMove 前提经编译实测否定):操作列加上移/下移按钮,PluginOptionsDraft
新增 moveRow(_:by:)。移动只换行序不改行内容:未修改行仍逐字回写原文
片段,移动不算结构修改、既有末尾分号保留;末尾快速添加行不可移动,
也不得把行移到它之后;首行不可上移、末尾正式行不可下移(按钮同步
禁用)。重排改变拼装串顺序,hasChanges 自然点亮。
修复 Table 单元格输入框不可点击:macOS SwiftUI Table 的行视图会吃掉
mouse-down,单元格 TextField 抢不到 first responder——两个输入单元
加 simultaneousGesture 单击转 FocusState 程序化聚焦(不依赖字段自身
抢到点击),值列补挂对应焦点绑定。
|
2026-10-04 11:55:09 +08:00 |
|
Qiu Yuzhou
|
0847f9cf2c
|
refactor(ui): 参数表格列宽改用 TableColumn.width 方法
照评审示例补齐全部列:TableColumn 实例方法 width(min:ideal:max:)
不走初值重载决议,无排序 Table 亦可设置列宽。类型/操作列与只读
类型列定宽,参数名列限宽(编辑 72–140 / 只读 72–220),值列保持
无约束弹性吸收剩余宽度;同时移除先前经内容 frame 表达宽度的
补丁(选择器 .frame(width:)、参数名 .frame(maxWidth:))。
|
2026-10-04 11:45:18 +08:00 |
|
Qiu Yuzhou
|
2e24cdc752
|
chore: 关闭构建期字符串字面量自动抽取
LOCALIZED_STRING_SWIFTUI_SUPPORT(Use Compiler to Extract Swift
Strings)置 NO:IDE 构建不再把 SwiftUI 字面量写进
Localizable.xcstrings。该目录按仓库惯例手工维护少量 key(中英对照),
自动抽取会在 Xcode 打开构建时膨胀文件(#81 人工验收时实测 88+ key)。
|
2026-10-04 11:36:12 +08:00 |
|
Qiu Yuzhou
|
bf86b78422
|
refactor(ui): 插件参数编辑区按评审意见表格化重排
- 移除底部「添加参数」按钮(与末尾空行重复)
- 「值/开关」分段选择器移到行首;「无值开关」文案改「开关」
- 删除按钮文案改「删除」
- 编辑面与订阅只读面拆成两个独立视图,均改用 Table 控件布局;
编辑行输入框改无边框(plain),参数名列限宽、值列弹性
- 原始文本编辑区与长值编辑 sheet 补分隔线边框
- NewServerSheet 的 isEditable 恒真,提交期禁用由外层负责,
避免编辑视图闪换成只读视图
- 列宽不用 TableColumn width: 参数:无排序 Table 列泛型固定为
Never,width:/value: 变体编译不过(macOS 15 SDK 实测),改经
内容约束表达
|
2026-10-04 11:33:44 +08:00 |
|
Qiu Yuzhou
|
5cb6b773a0
|
refactor(ui): 新建表单插件区投影收进 workflow
NewServerSheet 不再自建 PluginSectionState(provided 恒真的政策断言
写死在视图),改经 CatalogWorkflow.newFormPluginSection(selection:) 与
编辑面共用同一投影缝。订阅只读规则随参数编辑器落地:只读面无编辑
单元格与增删入口、仍可切换查看模式。
|
2026-10-04 04:45:57 +08:00 |
|
Qiu Yuzhou
|
a955f5ecb8
|
feat(ui): 插件参数无损表格编辑会话
issue #81 第二部分:新 PluginOptionsDraft 会话草稿模块——带稳定行
身份的有序参数行(无值开关与空串值之分)+ 参数列表/原始文本双模式。
解析与拼装遵循受管 v2ray-plugin v1.3.2 的 SIP003 转义语义(未转义
分号分隔、首个未转义等号分键值、反斜杠转义);未修改行逐字回写原文
片段,仅显式编辑的行重新编码,既有末尾分号无结构修改时保留;不可
靠解析默认并留在原始文本模式,不强行转换。
编辑面:底部空白快速添加行(输入即提升、身份与焦点稳定)、行内
编辑与显式删除、键值⇄开关可逆且保留会话值草稿、长值「编辑值…」
独立 sheet(等宽多行、确认才写回)。未完成行(有值/开关形态却无
参数名)阻止拼装、保存与切向原始文本;模式切换与展开编辑不触发
hasChanges;原始串仍是持久化与运行时唯一载荷。CONTEXT.md 新增
Plugin parameter draft 词条;新文案入 Localizable.xcstrings(中英)。
|
2026-10-04 04:45:01 +08:00 |
|
Qiu Yuzhou
|
d2d20d27a6
|
feat(ui): 服务器表单输入限制与端口十进制草稿
issue #81 第一部分:手动表单产品上限(名称 128、地址 255、密码 1024
用户可见字符;插件参数 65,536 UTF-8 字节;端口最多五位十进制数字)。
校验收进 ServerFormFields 唯一入口 validateForSubmit(),字段错误
typed 呈现、修正即清除、首错按栅格顺序定位;validateName/hasNameError
退役。端口改十进制字符串草稿,draft 在草稿不可解析时为 nil、仅在
校验通过后消费,数值等价改写不算变更——无效输入不再悄悄提交旧绑定
值。与装载基线逐字相同的超长字段放行(历史数据兼容);导入与订阅
路径不受限。新错误文案入 Localizable.xcstrings(中英)。
|
2026-10-04 04:36:32 +08:00 |
|
Qiu Yuzhou
|
95c47195f1
|
fix(ui): 取消服务器密码字段自动填充语义
隐藏和明文密码输入共用空 textContentType,并关闭自动纠正。Debug 构建、格式和 lint 检查通过;系统密码弹窗行为待人工验证。
|
2026-10-04 03:38:02 +08:00 |
|
Qiu Yuzhou
|
163e9443f3
|
feat(ui): 按必填名称重排服务器表单
新建与编辑共用名称优先布局,地址与端口按 4:1 分配宽度,移除重复标签与插件构建信息。
名称为空时显示行内错误并聚焦;编辑支持重置、变更检测与提交防重复,保存后标题同步已保存名称。
验证:823 项 hostless 测试、21 项 Python 检查、Debug 构建及双轴源码审查通过;原生视觉与焦点行为待人工验收。
|
2026-10-04 03:31:35 +08:00 |
|
Qiu Yuzhou
|
d687c33fc5
|
feat(catalog): 要求服务器名称并按端点延续订阅身份
新建与编辑共用名称校验,导入缺名时保存地址端口名称。
无供应商 ID 的订阅指纹仅包含地址和端口;密码、加密方式、插件及名称更新保留身份。未发版且无存量用户,直接启用新指纹,不迁移旧身份。
订阅刷新只清理新目录不再引用的旧凭据,保留复用的密码和插件参数。
验证:823 项 hostless arm64 测试、21 项 Python 检查及 Debug 构建通过;人工验收完成。
|
2026-10-04 03:07:59 +08:00 |
|
Qiu Yuzhou
|
0aa0dc78c4
|
refactor(rules): 统一来源类型映射并移除测试专用加载参数
|
2026-10-04 02:41:25 +08:00 |
|
Qiu Yuzhou
|
759fbfbb8c
|
refactor(rules): 删除不可用走 commitFeedback,删分叉枚举与本地 alert
outcome 加 .superseded(事务门拒绝词汇,与 runtime「被取代」一致);
deleteCustomRules 改 Void,忙碌/超期发布反馈;CustomRuleDeletionResult
与 RulesDeletionButton 本地 alert 删除——同一确认手势的失败呈现归一。
|
2026-10-04 02:35:11 +08:00 |
|
Qiu Yuzhou
|
54c6e277ff
|
refactor(rules): 意图操作收成 RulesIntentTicket,每 await 一查
入口捕获事实快照(集合+版本+准入门槛),preview 双查折叠为一查;
testGeneration 吸收为整份 addressTest 状态捕获比对;CONTEXT.md 加
「Rules intent ticket」词条。
|
2026-10-04 02:32:48 +08:00 |
|
Qiu Yuzhou
|
a9a5c40d75
|
refactor(runtime): 事实发布收成 didChange 通道,每主队列轮合并一次
控制器 7 个与观察机 3 个无消费者的 @Published 退役为普通属性,didSet
汇集到 CoalescedFactSignal:同一主队列轮内多次写只在轮末发一次,冲洗
晚于同步轮——整快照重观察不再读到半程状态,原子性由构造保证而非
objectWillChange+主队列跳的时序与注释看守。adapter 合并两条通道后
直接交 workflow(无额外 hop);单次多写变更的快照重建次数随之下降
(如 activate 写三事实从 3 次重建降为 1 次)。三类退净 ObservableObject
(无任何订阅者),MainApp 的假消费者 @StateObject 降为 let,App body
不再随运行时事实变化重算。两个 $-投影测试改订通道(瞬态断言语义不变),
新增 CoalescedFactSignal 契约测试 3 例。
|
2026-10-04 02:14:06 +08:00 |
|
Qiu Yuzhou
|
1f8ec2e2f2
|
refactor(catalog): syncStatus 收敛单一事实源,workflow 只留透传读面
协调器退掉 @Published 与 ObservableObject:syncStatus 存储与发布单点在
协调器(写后经 syncStatusChanges 通知,didChange 语义);CatalogWorkflow
的 runtimeSync 从第二份 @Published 拷贝改为 computed 透传 + 变化通道
透传。App 侧本就无视图消费 runtimeSync,目录观察者不再被每次提交徒劳
失效;测试的轮询读面不变。
|
2026-10-04 02:09:30 +08:00 |
|
Qiu Yuzhou
|
f80018a260
|
test: 并发执行冒烟测试并隔离本地网络夹具
|
2026-10-04 01:46:21 +08:00 |
|
Qiu Yuzhou
|
f4bca82a14
|
test: 分离快照数量边界并缩短删除测试等待
|
2026-10-04 01:28:05 +08:00 |
|
Qiu Yuzhou
|
df4bbfc8ec
|
test: 缩小规则夹具并用阶段信号替代固定等待
|
2026-10-04 01:19:41 +08:00 |
|
Qiu Yuzhou
|
feb25de460
|
test: 注入规则应用与健康重试等待
|
2026-10-04 01:05:10 +08:00 |
|
Qiu Yuzhou
|
4f859886e2
|
test: 修复 wrapper 生命周期等待与清理并拆类
|
2026-10-04 00:56:51 +08:00 |
|
Qiu Yuzhou
|
72ee44411e
|
docs: 明确测试夹具与执行成本原则
|
2026-10-04 00:46:59 +08:00 |
|
Qiu Yuzhou
|
8b52c3b43c
|
test: 为运行时行为测试批量注入小规则夹具
|
2026-10-04 00:40:02 +08:00 |
|
Qiu Yuzhou
|
b7a2a6a524
|
test: 为 Agent 系统代理测试复用小规则夹具
|
2026-10-04 00:30:43 +08:00 |
|
Qiu Yuzhou
|
7fb736f53e
|
test: 为代理控制集成测试注入小规则夹具
|
2026-10-04 00:22:45 +08:00 |
|
Qiu Yuzhou
|
0235e64ad1
|
test: 拆分运行时测试类并缩短健康等待窗口
|
2026-10-04 00:06:47 +08:00 |
|
Qiu Yuzhou
|
210c677c1b
|
docs(ng2): 测试框架政策入 AGENTS.md,新测试默认 Swift Testing
|
2026-10-03 23:26:09 +08:00 |
|
Qiu Yuzhou
|
45b20d329b
|
test: 单测开启多 runner 并行执行
|
2026-10-03 23:26:08 +08:00 |
|
Qiu Yuzhou
|
56ad46bec0
|
refactor(ui): 分区自挂页级动作与编辑/导出流程,壳收成薄转发
|
2026-10-03 23:03:30 +08:00 |
|
Qiu Yuzhou
|
9322184310
|
refactor(ui): 状态卡呈现政策收进 StatusCardModel,壳只挂薄视图
|
2026-10-03 22:57:04 +08:00 |
|
Qiu Yuzhou
|
a504171c18
|
refactor(ui): 激活反馈收成共享状态模块,三入口单飞
|
2026-10-03 22:39:41 +08:00 |
|
Qiu Yuzhou
|
868cfe66ad
|
refactor(catalog): 激活拒绝结果自含 typed 原因
|
2026-10-03 22:08:37 +08:00 |
|
Qiu Yuzhou
|
b48e4158b6
|
refactor(sysproxy): 健康观察任务柄归属观察机,循环体经闭包注入
|
2026-10-03 20:35:36 +08:00 |
|
Qiu Yuzhou
|
31e9f6e95f
|
refactor(sysproxy): 观察机写面收成意图命令,字段退回实现
|
2026-10-03 20:29:15 +08:00 |
|
Qiu Yuzhou
|
f39e32ecd7
|
refactor(ui): 系统代理失败文案映射三份收成一份
|
2026-10-03 19:53:22 +08:00 |
|
Qiu Yuzhou
|
94a2873c1c
|
refactor(ui): 首页包装壳收进 MainWindowView,删 WorkspaceDestinations
|
2026-10-03 19:53:10 +08:00 |
|
Qiu Yuzhou
|
5c24b65227
|
refactor(rules): 删 RuleSet 死类型与 updateCustomRules 前文档时代缝
|
2026-10-03 19:11:30 +08:00 |
|
Qiu Yuzhou
|
edb2c08933
|
refactor(rules): outcome→文案映射移出视图文件,落回 outcome 类型旁
|
2026-10-03 19:04:40 +08:00 |
|