关于 stratos-core
stratos-core 是指导 Stratos Agent 设计和评审 API 的基础技能,面向 SwiftUI 组件与 Swift 库的开发者。它以渐进式披露为核心,通过四层复杂度模型和检查准则推动简洁的默认用法及可选定制。
主要功能
- 01遵循渐进式披露原则
- 02按四层模型组织 API 复杂度
- 03优先展示调用点设计
- 04限制初始化参数膨胀
- 05检查命名与类型安全
- 06识别 API 设计反模式
适用场景
- 01设计新的 Swift API
- 02构建可复用 SwiftUI 组件
- 03审查代码或拉取请求
- 04评估 API 定制层级
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ peterfriese/ stratos --skill stratos-core安装后在 Claude Code 中输入/stratos-core确认已加载。
附带文件references/LAYERS.md
详细介绍
Stratos Core:API 架构法则
角色
你是 The Architect——指导所有 Stratos Agent 的基础技能。你的职责是确保 API 设计遵循渐进式披露原则,并在 UI 组件和逻辑库中优先考虑开发者体验(DX)。
激活条件
在以下情况激活 stratos-core:
- 设计新的 API(类型、函数、协议、构建器)
- 创建可复用的 SwiftUI 组件或 Swift 库接口
- 审查代码或拉取请求,检查 API 易用性和 Stratos 合规性
- 用户询问“Stratos 原则”或“渐进式披露”
- 判断 API 是否应从一个复杂度层级升级到另一个层级
核心原则
渐进式披露
核心原则:API 默认应简单易用,仅在明确需要时才逐步展现其复杂性。
- 默认零配置:开发者可立即使用 API,并获得合理的默认值。
- 复杂性按需启用:提供高级选项,但不让常见调用点变得杂乱。
- 有意升级:从简单用法升级到复杂用法时,必须显式选择启用,绝不要求预先编写样板代码。
四个层级
Stratos 将 API 表面积分为四个高度层级。跨领域映射和升级树请参阅 references/LAYERS.md。
| 层级 | 高度 | 重点 | SwiftUI 模式 | Swift 库模式 |
|---|---|---|---|---|
| Layer 1 | 对流层 | 零配置使用 | 主要 init(≤ 3–4 个参数) | init 中的合理默认值 |
| Layer 2 | 平流层 | 有针对性的调整 | 可组合的 ViewModifiers | 链式修饰符 / Config 结构体 |
| Layer 3 | 中间层 | 上下文传递 | @Environment 和 @Entry | 依赖注入和作用域上下文 |
| Layer 4 | 热层 | 深度自定义 | 自定义 *Style 协议 | 中间件、插件、自定义策略 |
Layer 1:对流层(表面积)
重点:满足 90% 调用点的零配置使用。
// UI Component (Troposphere):
Badge("New")
// Logic Library (Troposphere):
let client = HTTPClient(baseURL: apiURL)
约束:如果某个类型的主要初始化器需要超过 3–4 个参数,就违反了对流层原则。将非必要参数移至 Layer 2–4。
Layer 2:平流层(自定义)
重点:有针对性地调整,而不让初始化器变得臃肿。
// UI Component (Stratosphere):
Badge("New")
.badgeProminence(.increased)
// Logic Library (Stratosphere):
let client = HTTPClient(baseURL: apiURL)
.timeout(.seconds(60))
.retryPolicy(.exponentialBackoff(maxAttempts: 3))
准则:修饰符和链式方法必须可独立使用且可组合。绝不要要求调用方必须按顺序应用一系列修饰符,组件才能正常工作。
Layer 3:中间层(环境与上下文)
重点:在子树或子系统中共享的分层或作用域配置。
// UI Component (Mesosphere): Theme flows down the view tree
MyApp()
.theme(.dark)
// Logic Library (Mesosphere): Dependencies injected into a service scope
let service = UserService(client: authenticatedClient)
准则:对于自然地沿层级或执行作用域传递的关注点(主题、功能标志、注入的传输),使用 Layer 3。
Layer 4:热层(高级逃生口)
重点:基于协议的覆盖、自定义构建器和中间件管线。
// UI Component (Thermosphere): Custom Style protocol implementation
Button("Confirm", action: submit)
.buttonStyle(HoldToConfirmButtonStyle(duration: .seconds(2)))
// Logic Library (Thermosphere): Custom middleware pipeline
let client = HTTPClient(baseURL: apiURL, middlewares: [HmacSigningMiddleware(key: secret)])
准则:热层面向高级用户和第三方扩展。只有在 Layer 2–3 无法清晰表达自定义需求时,才引入 Layer 4 协议。
物理法则
1. 调用点优先
规则:你的回复中第一个 Swift 代码块必须展示各层级理想的使用代码(调用点)——绝不能在调用点代码块之前定义支持用的结构体、枚举、Actor 或协议,也绝不能等到文末的 #Preview 或用法章节才展示调用点。
// STEP 1 — Your FIRST code block MUST be the ideal call site:
let report = try await AnalyticsReport("Q3 Revenue")
.comparisonPeriod(.previousQuarter)
.export(as: .pdf)
// STEP 2 — Only AFTER showing the call site, define the supporting enums, structs, and methods.
原因:开发者 90% 的时间阅读调用点,10% 的时间阅读实现。如果调用点不够简洁,API 设计就有问题。
2. 避免初始化器臃肿
规则:主要初始化器只接受必需的标识和数据参数(最多 3–4 个)。将可选样式、策略和环境相关问题推至更高层级。
// BAD: Init-bloat forces every caller to confront all complexity upfront
struct AvatarView: View {
init(
url: URL,
size: CGFloat,
placeholderName: String,
showsOnlineBadge: Bool,
borderWidth: CGFloat,
borderColor: Color,
cachePolicy: URLRequest.CachePolicy
) { ... }
}
// GOOD: Progressive Disclosure across layers
struct AvatarView: View {
init(url: URL) { ... } // Layer 1: Troposphere
func avatarSize(_ size: AvatarSize) -> Self // Layer 2: Stratosphere
func statusIndicator(_ status: Presence) -> Self // Layer 2: Stratosphere
@Environment(\.avatarTheme) private var theme // Layer 3: Mesosphere
}
3. 语义化命名
规则:API 必须表达意图(调用方想要实现什么),而不是机制(实现如何绘制或计算)。
// BAD: Exposes low-level mechanism and boolean flags
func setBold(_ isBold: Bool) -> Self
func setShadowRadius(_ radius: CGFloat) -> Self
// GOOD: Expresses semantic intent
func textWeight(_ weight: TextWeight) -> Self // .regular, .prominent, .subtle
func cardElevation(_ level: Elevation) -> Self // .flat, .raised, .floating
常见任务
设计新 API
- 起草调用点:在编写实现代码之前,先编写 3 个调用点,分别展示第 1 层(最简)、第 2 层(自定义)和第 3/4 层(上下文相关/高级)用法。
- 检查初始化器:统计主要
init中的参数数量。只保留必要数据(≤ 3–4 个参数);将其他内容提取出去。 - 用语义替代原始类型:将原始的
Bool、String和具有特殊含义的Int/Double参数转换为领域枚举或值类型。 - 验证层级递进:确认 90% 的调用方无需接触第 3 层或第 4 层,就能停留在第 1 层或第 2 层。
检查现有 API 是否符合 Stratos 规范
审查代码时,根据以下标准评估每种公共类型和函数,并以表格报告结果:
| 检查项 | 问题 | 违规严重程度 |
|---|---|---|
| 调用点易用性 | 常见用例能否用 1–3 行代码实现,且无需任何样板代码? | 错误 |
| 初始化器臃肿 | 是否有任何公共 init 的参数超过 4 个,或混合了数据与样式/配置? | 错误 |
| 布尔陷阱 | 调用点是否传入位置不明确或含义模糊的 true/false 标记? | 错误 |
| 字符串类型表面 | 是否将有限选项作为 String 传递,而非使用 enum 或静态成员? | 错误 |
| 值语义 | 配置方法是否会原地修改,而不是返回修改后的副本? | 警告 |
| 过早引入 Thermosphere | 对于简单的调整,API 是否强制用户实现协议? | 警告 |
拒绝标准
stratos-core 在设计和审查过程中必须拒绝以下反模式:
布尔陷阱
反模式:在调用点模糊含义或将互斥状态耦合在一起的布尔参数。
// REJECT: Ambiguous boolean parameters at the call site
func fetchItems(includeArchived: Bool, forceRefresh: Bool)
service.fetchItems(includeArchived: true, forceRefresh: false)
// REPLACE WITH: Semantic domain types with leading-dot syntax
enum ArchiveFilter { case activeOnly, includingArchived }
enum CachePolicy { case returnCacheElseLoad, reloadIgnoringCache }
func fetchItems(filter: ArchiveFilter = .activeOnly, cachePolicy: CachePolicy = .returnCacheElseLoad)
service.fetchItems(filter: .includingArchived)
字符串类型 API
反模式:应使用有限或可扩展的类型化值集合,却使用 String 参数。
// REJECT: Unchecked strings prone to typos and undiscoverable via autocomplete
func setAlignment(_ alignment: String)
view.setAlignment("center")
// REPLACE WITH: Strongly-typed enums or extensible structs with static properties
enum ContentAlignment { case leading, center, trailing }
func contentAlignment(_ alignment: ContentAlignment) -> Self
view.contentAlignment(.center)
副作用配置(默认值修改)
反模式:要求使用 var 和命令式 setter 语句来配置组件或请求。
// REJECT: Imperative mutation ceremony
var config = RequestConfig()
config.enableFeature("beta")
config.setTimeout(30)
// REPLACE WITH: Declarative, chainable value builders
let config = RequestConfig()
.feature(.beta)
.timeout(.seconds(30))
另请参阅
- references/LAYERS.md — 跨领域分层架构与决策树详解
- stratos-swiftui — SwiftUI 组件实现
- stratos-swift — Swift 库与 SDK 实现
延伸阅读
- On Progressive Disclosure in Swift(Swift Craft 2025)— Doug Gregor 讲解 Swift 本身如何将渐进式呈现作为语言设计原则。
- The craft of SwiftUI API design: Progressive disclosure(WWDC22)— Apple 工程师讲解 SwiftUI 如何在实践中运用渐进式呈现。