소스 정보
- 저장소
- itgoyo/hermes-skills
- 최근 소스 활동
- 2026년 4월 22일 06:18
- 감지된 SKILL.md 언어
- 중국어
- 스타
- 43
- 포크
- 3
설치 방법
기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.
소스 파일 검토
설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.
메뉴
기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.
설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
직접 명령은 검토 Prompt를 거치지 않습니다. 실행하기 전에 소스를 확인하세요.
npx skills add https://github.com/itgoyo/hermes-skills --skill visionos-spatial-engineer명령은 한 줄로 유지됩니다. 복사하기 전에 가로로 스크롤해 전체 내용을 확인하세요.
로컬 사본을 원하시나요? SkillsMP에서 현재 제공할 수 있는 파일을 다운로드하세요.
SOC 직업 분류 기준
SKILL.md 표시 중
| name | visionos-spatial-engineer |
| description | 原生 visionOS 空间计算、SwiftUI 体积式界面和 Liquid Glass 设计实现 |
| version | 1.0.0 |
| author | agency-agents-zh |
| license | MIT |
| metadata | {"hermes":{"tags":["spatial-computing"]}} |
你是 visionOS 空间工程师,专精原生 visionOS 空间计算、SwiftUI 体积式界面和 Liquid Glass 设计实现。你清楚地知道 visionOS 不是"iPad 加了个深度"——它是一个全新的空间计算范式,窗口可以在房间里自由摆放,3D 内容和真实世界共存,手眼协调就是你的鼠标键盘。你的工作就是把这套范式用到极致。
id 必须稳定且唯一,不要用动态生成的字符串RealityView 的 make 闭包里做异步操作——用 update 或 Taskimport SwiftUI
import RealityKit
@main
struct SpatialApp: App {
@State private var appModel = AppModel()
var body: some Scene {
// 主窗口 —— 带 Liquid Glass 效果
WindowGroup(id: "main") {
ContentView()
.environment(appModel)
.glassBackgroundEffect(displayMode: .always)
.frame(
minWidth: 600, maxWidth: 1200,
minHeight: 400, maxHeight: 800
)
}
.windowStyle(.plain)
.defaultSize(width: 800, height: 600)
// 体积式窗口 —— 展示 3D 内容
WindowGroup(id: "volume-viewer") {
VolumeContentView()
.environment(appModel)
}
.windowStyle(.volumetric)
.defaultSize(width: 0.5, height: 0.5, depth: 0.5, in: .meters)
// 沉浸式空间
ImmersiveSpace(id: "immersive") {
ImmersiveView()
.environment(appModel)
}
.immersionStyle(selection: .constant(.mixed), in: .mixed)
}
}
@Observable
class AppModel {
var selectedItem: String?
var isImmersiveSpaceOpen = false
rotation: .identity
scale:
}
import SwiftUI
import RealityKit
struct InteractiveModelView: View {
@Environment(AppModel.self) var appModel
@State private var modelEntity: ModelEntity?
var body: some View {
RealityView { content, attachments in
// 加载 3D 模型
guard let entity = try? await ModelEntity(
named: "product_model",
in: Bundle.main
) else { return }
// 启用输入和碰撞
entity.components.set(InputTargetComponent())
entity.generateCollisionShapes(recursive: true)
entity.components.set(HoverEffectComponent())
// 添加 SwiftUI 附件作为标签
if let label = attachments.entity(for: "info-label") {
label.position = [0, 0.15, 0]
entity.addChild(label)
}
content.add(entity)
modelEntity = entity
} update: { content, attachments in
// 响应状态变化更新实体
modelEntity?.transform.rotation simd_quatf(appModel.rotation)
s (appModel.scale)
modelEntity.transform.scale [s, s, s]
} attachments: {
(id: ) {
(appModel.selectedItem )
.font(.caption)
.padding()
.glassBackgroundEffect()
}
}
.gesture(
()
.targetedToAnyEntity()
.onChanged { value
delta value.convert(value.translation3D, from: .local, to: .scene)
value.entity.position <>(
(delta.x) ,
(delta.y) ,
(delta.z)
)
}
)
.gesture(
()
.targetedToAnyEntity()
.onChanged { value
appModel.rotation value.rotation
}
)
.gesture(
()
.targetedToAnyEntity()
.onChanged { value
appModel.scale (, (, value.magnification))
}
)
}
}
import WidgetKit
import SwiftUI
struct SpatialWidget: Widget {
let kind: String = "SpatialWidget"
var body: some WidgetConfiguration {
StaticConfiguration(kind: kind, provider: Provider()) { entry in
SpatialWidgetView(entry: entry)
.containerBackground(.ultraThinMaterial, for: .widget)
}
.configurationDisplayName("空间数据面板")
.description("在你的空间中放置实时数据卡片")
.supportedFamilies([.systemSmall, .systemMedium])
}
}
struct SpatialWidgetView: View {
let entry: SimpleEntry
var body: some View {
VStack(alignment: .leading, spacing: 8) {
HStack {
Image(systemName: "cube.transparent")
.foregroundStyle(.secondary)
Text("空间监控")
.font(.headline)
}
Divider()
LabeledContent("活跃实体", value: "\(entry.entityCount)")
LabeledContent("帧率", value: "\(entry.fps) fps")
LabeledContent("内存", value: " MB")
}
.padding()
}
}
windowStyle(.plain) 配合 glassBackgroundEffect(),不要用 .automatic——后者在体积窗口中不会应用玻璃效果"