资讯详情

Tinycast 贡献指南:从 Non-negotiables 到 PR 合入的全流程工程规范

📅 2026/9/19 10:23:07 | 华诺云谱 👁 阅读
Tinycast 贡献指南:从 Non-negotiables 到 PR 合入的全流程工程规范
桌面应用【免费下载链接】tinycastTinycast — a tiny, fully native macOS launcher, hotkeys, and clipboard history.项目地址https://gitcode.com/GitHub_Trending/ti/tinycast点击查看免费下载本指南基于 Tinycast 仓库根目录的 CONTRIBUTING.md 整理而成是进入这个纯原生 macOS 启动器、快捷键与剪贴板历史项目SwiftUI AppKit、以LSUIElement无 Dock 图标方式运行、零第三方依赖的贡献者手册。它规定了项目不可触碰的硬性底线内存、泄漏、设计一致性、一次合规提交前必须完成的验证动作、PR 的评审标准与代码风格并串联起 AGENTS.md、docs/standards.md、docs/testing.md、docs/development.md、docs/signing.md、docs/ui.md 这套相互咬合的工程文档体系。读完本文你将掌握 Tinycast 的环境搭建、开发循环、测试门槛与提交流程能够按项目标准提交一个合规的 patch。项目基调小而精质量为上Tinycast 是一个功能相当密集的菜单栏应用模糊应用启动器、全局与按应用快捷键、文本/图片剪贴板历史、内联计算器、浮动便签、代码片段、快捷链接、窗口管理与表情符号选择器同时还能在 JavaScriptCore 中原生运行 Raycast 扩展。项目刻意保持体量——Tinycast stays small on purpose, quality over quantity是 CONTRIBUTING.md 的原话。这意味着一个干净整洁的 patch 也可能因为功能不值得它的体量而被拒绝在动手写代码之前先开 issue 并把方案定下来这是贡献者要做的第一件事。官方建议在动手前先查看已有的 issue 与 pull request避免重复劳动。任何贡献都默认接受 CONTRIBUTOR_LICENSE_AND_FEEDBACK_AGREEMENT.md 的条款——打开 PR 即视为接受。Non-negotiables四条不可逾越的硬性底线CONTRIBUTING.md 用 Non-negotiables不可谈判条款命名了四条底线它们在 AGENTS.md 中有更完整的展开对应 AGENTS.md 的## Non-negotiables一节约 AGENTS.md内存RAM永远低于 100 MB。没有任何功能值得突破这条线。对应到代码层面docs/testing.md 记录了实测基线正常使用中常驻内存 40–80 MB硬上限 100 MB。启动是应用最保护的东西任何加到AppCore.start()或初始化器里的工作是代价最高的放置位置应当推迟进Task或改为首次使用时再做。零泄漏。提交前必须做泄漏测试不允许保留环retain cyclepalette 关闭后内存要回到基线。代码层面的配套约束包括长期存活的Task必须在stop()或deinit中存储并取消un-owned Task is a leak with extra stepsBlock 观察者走 RAII 的NotificationTokenTinycast/Platform/NotificationToken.swift而非裸addObserver所有捕获self的逃逸闭包使用[weak self]。设计一致。新 UI 必须看起来像本来就在这个应用里——间距、字体、圆角与动效全部取自现有 token见 docs/ui.md设计 token 的唯一来源是 Tinycast/DesignSystem/Theme.swift。如果确实需要新 token必须在 PR 中说明理由。无臃肿。功能值得其体量才会被合入因此先讨论再实现。此外还有一条总纲永远不要破坏 AGENTS.md 中的 Non-negotiables。这些条款对人类贡献者和 AI Agent 一视同仁。环境搭建与开发循环工具链要求依赖说明macOS 26项目只支持当前稳定版系统没有兼容性地板详见 docs/development.mdXcode 26提供 SwiftUI 宏插件与 SDKXcodeGen从 project.yml 生成工程brew install即可SwiftLintbrew install swiftlint供 Scripts/lint.sh 使用Node仅用于数据生成脚本与run-tests.sh驱动的两个 stub 服务器构建应用本身不需要 Node一次性签名设置首次开发需要按 docs/signing.md 第一节创建一次性的自签名代码签名身份Tinycast Self-Signed约 docs/signing.md 的命令序列用openssl生成 10 年期 codeSigning 用途的证书打包为.p12再security import进登录钥匙串。保持同一个身份是让 macOS 在每次重建后仍然记得 Accessibility 授权的关键——ad-hoc 签名每次构建都变macOS 会忘记授权。构建与运行open Tinycast.xcodeproj # 然后 ⌘R或命令行xcodebuild -project Tinycast.xcodeproj -scheme Tinycast -configuration Debug build两个关键工程事实Tinycast.xcodeproj是由 XcodeGen 从 project.yml 生成的且结果被提交。编辑project.yml后必须运行xcodegen generate并提交结果。项目不使用 SwiftPM也绝不使用Bundle.module。Debug 构建是独立通道Tinycast Dev.app/com.tinycast.app.dev。它拥有自己的偏好、缓存、TCC 授权与登录项本地运行永远不会与已安装副本互相污染。细节见 docs/development.md 的 The dev channel 一节。编辑器可选仓库不规定编辑器。Xcode 开箱即用VS Code 可通过 SourceKit-LSP 获得代码智能需要用xcode-build-server生成buildServer.json再由 Scripts/sync-lsp.sh 写入标志数据库。注意不要运行xcode-build-server config它写入kind: xcode会导致服务器忽略.compile文件符号解析会逐渐失效。新增测试 harness 后运行./Scripts/run-tests.sh --index合并编译命令再执行 Swift: Restart LSP Server。提交前的验证门槛CONTRIBUTING.md 的 Before submitting 一节列出了提交前必须完成的清单每一条都对应可执行的验证手段关联一个标记为approved的 issue并在 PR 描述中写Closes #number。没有关闭approvedissue 的 PR 会在打开瞬间被自动关闭issue 获批后 PR 会自动重开。任何人都可以开 PR不限于 issue 作者。纯文档修改*.md、docs/、website/跳过此检查。通过 docs/testing.md 的整个完成标准Definition of Done——harness、lint、纯度、干净构建。引擎改动必须带新用例。项目没有 CI所以必须本地运行./Scripts/run-tests.sh ./Scripts/lint.sh # 加一次 Debug 构建CodeRabbit 会评审每个 PR 并标记 diff 上的 lint 违规但它不运行 harness 也不构建应用。通过泄漏测试与内存测量并在 PR 中给出数字。真实使用过应用——在你自己的路径以及相邻路径上实际跑过。基于main变基压缩为逻辑提交。修复你的改动导致过时的任何 docs/ 文档。文档与代码矛盾视为缺陷。打开 PR 前把 diff 从头到尾读一遍。大多数评审意见是作者第二遍看就能自己发现的。同意贡献者许可与反馈协议打开 PR 即视为接受。完成标准Definition of Donedocs/testing.md 把机械性验收标准集中写在一处防止两份记录漂移对应 docs/testing.md检查项命令Harness./Scripts/run-tests.shLint./Scripts/lint.sh纯层纯度grep -rln import AppKit\|import SwiftUI\|import Cocoa Tinycast/Features/*/Model/必须无输出干净构建xcodebuild … -configuration Debug CODE_SIGNING_ALLOWEDNO零新增警告文档仍为真改动导致的过时文档在同一个提交中修复测试体系独立 Harness无 XCTestTinycast 没有 XCTest target、没有 UI 测试docs/testing.md 开篇即声明。自动化测试是一组独立 harness——Tests/ 下每个文件一个Scripts/run-tests.sh是唯一登记 harness 集合的地方。技术要点套件并行运行默认hw.ncpu个 harness 同时跑把约 140 秒压到约 15 秒TINYCAST_TEST_JOBS1强制串行TINYCAST_TEST_TIMEOUT控制超时默认 300 秒。每个 harness 把临时状态root在自己的独立空间UUID 后缀的temporaryDirectory、UserDefaults(suiteName:)、NSPasteboard.withUniqueName()绝不允许触碰共享的NSPasteboard.general——一个运行中的 Tinycast 会把每次写入当作真实复制记录进剪贴板历史。每个 harness 编译的是被守护的真实源码而非副本这正是纯层边界得以成立的机制harness 编译失败意味着 AppKit/SwiftUI 泄漏进了Model/目录或效果泄漏进了决策层。这比断言失败更常见、也更重要。run行支持-O优化编译如raycast-test的 scrypt 在-Onone下耗时 47 秒、-O下 1 秒与slow第一波派发两个可选标记。新增 harness 新增一行run行。harness 按功能守护对应模块例如calc-test守护全部Calculator/Model/、fuzz-test守护启动器排序相关文件、ext-test端到端启动真实扩展 bundle。代码风格与纯度纪律AGENTS.md 规定了类型后缀语义完整表格见 docs/standards.md 的## Naming一节约 docs/standards.mdStore拥有持久化状态并发布它、Coordinator是功能动作面、Controller拥有一个 AppKit 窗口、Manager拥有子系统的生命周期和策略全项目只有ClipboardManager和HotKeyManager两个……语义正确性永远优先于后缀一致性。注释规则docs/standards.md一行、讲为什么、硬上限 100 字符、绝不两行连排、宁删不更。这些规则刻意不做 lint靠第一遍写对。Swift 风格docs/standards.md早返回优于嵌套、默认let、命名不缩写、视图保持声明式且薄、错误通过DialogController/MessageHUDController呈现绝不用print、诊断走Logger与 Tinycast/Platform/Signposts.swift。Swift 6 语言模式是硬约束docs/standards.md数据竞争是编译错误。MainActor是默认跨 actor 模型类型必须Sendable重 IO 工作作为nonisolated static纯函数由Task.detached驱动全项目只有一个 actor是刻意为之。39 个类型使用Observable没有任何ObservableObject/Published。格式化与生成数据./Scripts/format.sh # 就地格式化 Tinycast/ 与 Tests/ ./Scripts/format.sh --check # 报告将改动的内容不写文件有差异则退出 1swift-format来自 Xcode 工具链与 sourcekit-lsp 是同一个二进制。三个*.generated.swift文件由脚本生成且禁止手改Tinycast/Features/Emoji/Model/EmojiData.generated.swiftnode Scripts/gen-emoji.js、Tinycast/Features/Calculator/Model/CurrencyData.generated.swiftnode Scripts/gen-currencies.js、Tinycast/Features/Calculator/Model/CountryZoneData.generated.swiftnode Scripts/gen-countries.js。格式化一个生成文件等于手改它下一次运行脚本就会还原。Pull Request 规范CONTRIBUTING.md 的 Pull requests 一节对 PR 本身提出明确要求填写 .github/PULL_REQUEST_TEMPLATE.md 的每一节或者说明为何不适用。视觉变更必须提供同尺寸、同操作的前后对比视频side-by-side——这是强制要求。只有 after 片段不算数静态截图不能替代。非视觉变更说明你测试了什么。附上内存数字空闲与峰值。标记任何意外之处以及你有意做出的权衡。两条只属于贡献流程、不写进常规文档的规则提交信息用祈使句如Add per-app hotkey toggle。没打算改的行为就不要改。如果确实改了要在 PR 中明确说明。架构与文档地图从哪里读起贡献者要建立读文档再动手的习惯AGENTS.md 提供了一张改什么之前读什么的表对应 AGENTS.md要改动的内容先读接线与所有权docs/architecture.md写 Swift命名/风格/并发/预算/注释docs/standards.md声称改动完成docs/testing.md构建、运行、重新生成数据docs/development.md新增或重排任何视图docs/ui.md触碰某个功能内部docs/features/每个文件都以## Invariants开头打包或发布docs/release.md文档全景见 docs/README.md。架构上要理解的核心是四层结构docs/architecture.md 的## The layering纯层Model/只允许 Foundation环境事实全部注入参数→ 效果层Service/平台 I/O→ 可观察状态39 个MainActor Observable类型→ 视图层UI//Settings/及每功能的 coordinator。单一所有者原则AppCoreTinycast/App/AppCore.swift是唯一所有者所有长期状态挂在AppCore.start()里视图通过Environment拿到功能 coordinator绝不越过 coordinator 直接改 store。Bug 报告与安全披露Bug 报告CONTRIBUTING.md 的 Bugs 一节需要macOS 版本、Tinycast 版本与通道、复现步骤、预期 vs 实际行为。一段录屏胜过一段文字。安全问题不进 issue 跟踪器走 SECURITY.md通过 GitHub 的 Security 标签页私下报告包含 macOS 版本、Tinycast 版本与通道、复现步骤与影响。特别关注的范围包括 Accessibility (TCC) 授权、剪贴板历史在磁盘上的缓存、未经同意的网络访问、热键栈与签名分发链路。许可项目以 AGPL-3.0 授权贡献同样按该协议许可。结语Tinycast 的贡献流程本质上是一套用代码和命令表达的质量契约内存 100 MB 上限、零泄漏、设计 token 单一来源、无 CI 条件下的本地全量验证。贡献者不需要迎合任何自动化流水线而是通过 Scripts/run-tests.sh、Scripts/lint.sh、Scripts/format.sh 与一次干净构建自己把住全部质量关。理解这套契约——尤其是Model/纯层边界与 Swift 6 并发纪律——是提交一个能被合入的 PR 的前提。赞分享桌面应用【免费下载链接】tinycastTinycast — a tiny, fully native macOS launcher, hotkeys, and clipboard history.项目地址https://gitcode.com/GitHub_Trending/ti/tinycast点击查看免费下载相关推荐TRL 开源贡献实战指南从 Issue、新 Trainer 到 PR 合入的全流程规范TRL 开源贡献实战指南从 Issue、新 Trainer 到 PR 合入的全流程规范 TRLTransformer Reinforcement Learn人工智能大模型强化学习RLHF预训练微调LoRATraefik Pull Request 贡献全流程指南从 PR 提交规范到 Lobicornis 合并机器人工作流Traefik Pull Request 贡献全流程指南从 PR 提交规范到 Lobicornis 合并机器人工作流 本文以 Traefik 仓库中的 Pul后端API网关负载均衡微服务网络云原生LitGPT 贡献指南从 Issue 到 PR 的完整开发流程与工程规范LitGPT 贡献指南从 Issue 到 PR 的完整开发流程与工程规范 本文基于 LitGPT 仓库的 CONTRIBUTING.md https://li大模型预训练微调模型推理服务创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。