mcpField
S
stratos-core

stratos-core

github.com/peterfriese开发7240 次安装3 周前更新
代码仓库

关于 stratos-core

stratos-core 是指导 Stratos Agent 设计和评审 API 的基础技能,面向 SwiftUI 组件与 Swift 库的开发者。它以渐进式披露为核心,通过四层复杂度模型和检查准则推动简洁的默认用法及可选定制。

主要功能

  1. 01遵循渐进式披露原则
  2. 02按四层模型组织 API 复杂度
  3. 03优先展示调用点设计
  4. 04限制初始化参数膨胀
  5. 05检查命名与类型安全
  6. 06识别 API 设计反模式

适用场景

  1. 01设计新的 Swift API
  2. 02构建可复用 SwiftUI 组件
  3. 03审查代码或拉取请求
  4. 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
  1. 起草调用点:在编写实现代码之前,先编写 3 个调用点,分别展示第 1 层(最简)、第 2 层(自定义)和第 3/4 层(上下文相关/高级)用法。
  2. 检查初始化器:统计主要 init 中的参数数量。只保留必要数据(≤ 3–4 个参数);将其他内容提取出去。
  3. 用语义替代原始类型:将原始的 Bool、String 和具有特殊含义的 Int/Double 参数转换为领域枚举或值类型。
  4. 验证层级递进:确认 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))

另请参阅

延伸阅读

评论

支持 Markdown