axiom-cloud-sync-diag by charleswiltgen/axiom
npx skills add https://github.com/charleswiltgen/axiom --skill axiom-cloud-sync-diag核心原则 90% 的云同步问题源于账户/权限问题、网络连接或对同步时机的误解——而非 iCloud 基础设施的 bug。
iCloud(包括 CloudKit 和 iCloud Drive)每天处理着所有 Apple 设备间数十亿的同步操作。如果你的数据没有同步,问题几乎总是配置、连接性或时机预期方面的。
如果你看到以下任何一种情况:
❌ 禁止 "iCloud 坏了,我们应该自己构建同步系统"
务必首先检查这些(在更改代码之前):
// 1. 检查 iCloud 账户状态
func checkICloudStatus() async {
let status = FileManager.default.ubiquityIdentityToken
if status == nil {
print("❌ 未登录 iCloud")
print("设置 → [姓名] → iCloud → 登录")
return
}
print("✅ 已登录 iCloud")
// 针对 CloudKit 特别检查
let container = CKContainer.default()
do {
let status = try await container.accountStatus()
switch status {
case .available:
print("✅ CloudKit 可用")
case .noAccount:
print("❌ 无 iCloud 账户")
case .restricted:
print("❌ iCloud 受限(家长控制?)")
case .couldNotDetermine:
print("⚠️ 无法确定状态")
case .temporarilyUnavailable:
print("⚠️ 暂时不可用(请重试)")
@unknown default:
print("⚠️ 未知状态")
}
} catch {
print("检查 CloudKit 时出错: \(error)")
}
}
// 2. 检查权限
func checkEntitlements() {
// 验证 iCloud 容器是否存在
if let containerURL = FileManager.default.url(
forUbiquityContainerIdentifier: nil
) {
print("✅ iCloud 容器: \(containerURL)")
} else {
print("❌ 无 iCloud 容器")
print("检查 Xcode → Signing & Capabilities → iCloud")
}
}
// 3. 检查网络连接
func checkConnectivity() {
// 使用 NWPathMonitor 或类似工具
print("网络: 检查设备是否有互联网连接")
print("尝试不同的网络(WiFi、蜂窝网络)")
}
// 4. 检查设备存储空间
func checkStorage() {
let homeURL = FileManager.default.homeDirectoryForCurrentUser
if let values = try? homeURL.resourceValues(forKeys: [
.volumeAvailableCapacityKey
]) {
let available = values.volumeAvailableCapacity ?? 0
print("可用空间: \(available / 1_000_000) MB")
if available < 100_000_000 { // <100 MB
print("⚠️ 存储空间不足可能阻止同步")
}
}
}
广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
CloudKit 数据未同步?
├─ 账户不可用?
│ ├─ 检查: await container.accountStatus()
│ ├─ .noAccount → 用户未登录 iCloud
│ ├─ .restricted → 家长控制或企业限制
│ └─ .temporarilyUnavailable → 网络问题或 iCloud 服务中断
│
├─ CKError.quotaExceeded?
│ └─ 用户超出 iCloud 存储配额
│ → 提示用户购买更多存储空间
│ → 或删除旧数据
│
├─ CKError.networkUnavailable?
│ └─ 无互联网连接
│ → 检查 WiFi/蜂窝网络
│ → 在不同网络上测试
│
├─ CKError.serverRecordChanged (冲突)?
│ └─ 并发修改
│ → 实现冲突解决
│ → 正确使用 savePolicy
│
└─ SwiftData 未同步?
├─ 检查 ModelConfiguration CloudKit 设置
├─ 验证仅使用私有数据库(非公共/共享)
└─ 检查 @Attribute(.unique)(CloudKit 不支持)
iCloud Drive 文件未同步?
├─ 文件未上传?
│ ├─ 检查: url.resourceValues(.ubiquitousItemIsUploadingKey)
│ ├─ 检查: url.resourceValues(.ubiquitousItemUploadingErrorKey)
│ └─ 错误详情将指示问题
│
├─ 文件未下载?
│ ├─ 未请求? → startDownloadingUbiquitousItem(at:)
│ ├─ 检查: url.resourceValues(.ubiquitousItemDownloadingErrorKey)
│ └─ 可能需要手动触发下载
│
├─ 文件存在冲突?
│ ├─ 检查: url.resourceValues(.ubiquitousItemHasUnresolvedConflictsKey)
│ └─ 使用 NSFileVersion 解决
│
└─ 文件未出现在其他设备上?
├─ 检查两台设备上的 iCloud 账户(同一账户?)
├─ 检查两端的权限是否匹配
├─ 等待(同步非即时,可能需要几分钟)
└─ 检查 设置 → iCloud → iCloud Drive → [App] 已启用
原因 : iCloud 服务器暂时不可用或用户已登出
修复 :
if error.code == .accountTemporarilyUnavailable {
// 使用指数退避重试
try await Task.sleep(for: .seconds(5))
try await retryOperation()
}
原因 : 用户的 iCloud 存储空间已满
修复 :
if error.code == .quotaExceeded {
// 向用户显示警告
showAlert(
title: "iCloud 存储空间已满",
message: "请在 设置 → [姓名] → iCloud → 管理存储空间 中释放空间"
)
}
原因 : 自你上次获取后,服务器上的记录已被修改。最常见根本原因 : 在获取最新版本之前保存了过时的记录。
诊断 — 首先检查简单的修复方法 :
// ❌ 错误: 未获取最新版本就保存
// 这会导致每次并发编辑都出现 serverRecordChanged
let record = CKRecord(recordType: "Note", recordID: existingID)
record["title"] = "Updated"
try await database.save(record) // 覆盖服务器版本 → 冲突
// ✅ 修复: 获取-然后-修改-然后-保存(解决 80% 的情况)
let record = try await database.record(for: existingID) // 获取最新
record["title"] = "Updated" // 修改获取到的记录
try await database.save(record) // 使用正确的 changeTag 保存
如果获取-然后-保存无法修复(来自多台设备的真正并发编辑):
if error.code == .serverRecordChanged,
let serverRecord = error.serverRecord,
let clientRecord = error.clientRecord {
// 合并记录 — 仅用于真正的多设备冲突
let merged = mergeRecords(server: serverRecord, client: clientRecord)
try await database.save(merged)
}
原因 : 无互联网连接
修复 :
if error.code == .networkUnavailable {
// 在线时排队重试
queueOperation(for: .whenOnline)
// 或显示离线指示器
showOfflineIndicator()
}
症状 : 同步似乎工作,但记录静默消失或保存失败。
常见原因 :
| 原因 | 症状 | 修复 |
|---|---|---|
| 记录大小 > 1 MB | 单个记录从批量中静默丢弃 | 将大数据拆分为 CKAsset |
| 批量部分失败 | 部分记录保存,其他静默失败 | 检查 perRecordSaveBlock 获取每条记录的错误 |
| 冲突自动解决 | 最后写入者获胜,覆盖有效数据 | 实现基于合并的冲突解决 |
| Asset 下载未触发 | 记录同步但 CKAsset 内容缺失 | 使用 desiredKeys 调用 fetchRecordZoneChanges |
诊断 :
// ❌ 错误: 批量保存,无每条记录的错误处理
let operation = CKModifyRecordsOperation(recordsToSave: records)
operation.modifyRecordsResultBlock = { result in
// 仅捕获操作级别的失败 — 遗漏每条记录的错误
}
// ✅ 正确: 单独检查每条记录
let operation = CKModifyRecordsOperation(recordsToSave: records)
operation.perRecordSaveBlock = { recordID, result in
switch result {
case .success(let record):
print("✅ 已保存: \(recordID)")
case .failure(let error):
print("❌ 失败: \(recordID) — \(error)")
// 记录以便重试 — 否则此记录会静默丢失
}
}
// ✅ 检查上传错误
func checkUploadError(url: URL) {
let values = try? url.resourceValues(forKeys: [
.ubiquitousItemUploadingErrorKey
])
if let error = values?.ubiquitousItemUploadingError {
print("上传错误: \(error.localizedDescription)")
if (error as NSError).code == NSFileWriteOutOfSpaceError {
print("iCloud 存储空间已满")
}
}
}
// ✅ 检查下载错误
func checkDownloadError(url: URL) {
let values = try? url.resourceValues(forKeys: [
.ubiquitousItemDownloadingErrorKey
])
if let error = values?.ubiquitousItemDownloadingError {
print("下载错误: \(error.localizedDescription)")
// 常见错误:
// - 网络不可用
// - 账户不可用
// - 服务器上的文件已删除
}
}
症状 : 保存/获取从未完成,无错误
诊断 :
// 添加超时
Task {
try await withTimeout(seconds: 30) {
try await database.save(record)
}
}
// 记录操作生命周期
operation.database = database
operation.completionBlock = {
print("操作已完成")
}
operation.qualityOfService = .userInitiated
// 检查操作是否被取消
if operation.isCancelled {
print("操作已被取消")
}
常见原因 :
症状 : SwiftData 在本地保存但不同步
诊断 :
// 1. 验证 CloudKit 配置
let config = ModelConfiguration(
cloudKitDatabase: .private("iCloud.com.example.app")
)
// 2. 检查不兼容的属性
// ❌ @Attribute(.unique) 不支持 CloudKit
@Model
class Task {
@Attribute(.unique) var id: UUID // ← 移除此项
var title: String
}
// 3. 检查所有属性都有默认值或是可选的
@Model
class Task {
var title: String = "" // ✅ 有默认值
var dueDate: Date? // ✅ 可选
}
症状 : 文件操作挂起
诊断 :
// ❌ 错误: 嵌套协调可能导致死锁
coordinator.coordinate(writingItemAt: url, options: [], error: nil) { newURL in
// 不要在这里创建另一个协调器!
anotherCoordinator.coordinate(...) // ← 死锁风险
}
// ✅ 正确: 每个操作使用单个协调器
coordinator.coordinate(writingItemAt: url, options: [], error: nil) { newURL in
// 仅进行直接文件操作
try data.write(to: newURL)
}
症状 : 即使在解决后冲突仍然存在
诊断 :
// ❌ 错误: 未标记为已解决
let conflicts = NSFileVersion.unresolvedConflictVersionsOfItem(at: url)
for conflict in conflicts ?? [] {
// 缺失: conflict.isResolved = true
}
// ✅ 正确: 标记为已解决并移除
for conflict in conflicts ?? [] {
conflict.isResolved = true
}
try NSFileVersion.removeOtherVersionsOfItem(at: url)
症状 : 用户报告应用更新后数据不同步
诊断步骤(按顺序运行):
检查账户状态(2 分钟):
// 在受影响的设备上
let status = FileManager.default.ubiquityIdentityToken
// nil? → 未登录
验证权限未更改(5 分钟):
检查破坏性变更(10 分钟):
在干净设备上测试(15 分钟):
根本原因(90% 的情况):
修复 :
监控 :
设置警报 :
// ✅ 记录所有 CloudKit 操作
extension CKDatabase {
func saveWithLogging(_ record: CKRecord) async throws {
print("正在保存记录: \(record.recordID)")
let start = Date()
do {
try await self.save(record)
let duration = Date().timeIntervalSince(start)
print("✅ 在 \(duration)s 内保存")
} catch let error as CKError {
print("❌ 保存失败: \(error.code), \(error.localizedDescription)")
throw error
}
}
}
func diagnoseCloudSyncIssue() async {
print("=== 云同步诊断 ===")
// 1. 账户
await checkICloudStatus()
// 2. 权限
checkEntitlements()
// 3. 网络
checkConnectivity()
// 4. 存储空间
checkStorage()
// 5. 针对 CloudKit
let container = CKContainer.default()
do {
let status = try await container.accountStatus()
print("CloudKit 状态: \(status)")
} catch {
print("CloudKit 错误: \(error)")
}
// 6. 针对 iCloud Drive
if let url = getICloudContainerURL() {
let values = try? url.resourceValues(forKeys: [
.ubiquitousItemDownloadingErrorKey,
.ubiquitousItemUploadingErrorKey
])
print("下载错误: \(values?.ubiquitousItemDownloadingError?.localizedDescription ?? "无")")
print("上传错误: \(values?.ubiquitousItemUploadingError?.localizedDescription ?? "无")")
}
print("=== 诊断结束 ===")
}
axiom-cloudkit-ref — CloudKit 实现细节axiom-icloud-drive-ref — iCloud Drive 实现细节axiom-storage — 选择同步方法最后更新 : 2025-12-12 技能类型 : 诊断
每周安装数
99
代码仓库
GitHub 星标数
590
首次出现
Jan 21, 2026
安全审计
安装于
opencode84
codex78
claude-code78
gemini-cli77
cursor77
github-copilot73
Core principle 90% of cloud sync problems stem from account/entitlement issues, network connectivity, or misunderstanding sync timing—not iCloud infrastructure bugs.
iCloud (both CloudKit and iCloud Drive) handles billions of sync operations daily across all Apple devices. If your data isn't syncing, the issue is almost always configuration, connectivity, or timing expectations.
If you see ANY of these:
❌ FORBIDDEN "iCloud is broken, we should build our own sync"
ALWAYS check these FIRST (before changing code):
// 1. Check iCloud account status
func checkICloudStatus() async {
let status = FileManager.default.ubiquityIdentityToken
if status == nil {
print("❌ Not signed into iCloud")
print("Settings → [Name] → iCloud → Sign in")
return
}
print("✅ Signed into iCloud")
// For CloudKit specifically
let container = CKContainer.default()
do {
let status = try await container.accountStatus()
switch status {
case .available:
print("✅ CloudKit available")
case .noAccount:
print("❌ No iCloud account")
case .restricted:
print("❌ iCloud restricted (parental controls?)")
case .couldNotDetermine:
print("⚠️ Could not determine status")
case .temporarilyUnavailable:
print("⚠️ Temporarily unavailable (retry)")
@unknown default:
print("⚠️ Unknown status")
}
} catch {
print("Error checking CloudKit: \(error)")
}
}
// 2. Check entitlements
func checkEntitlements() {
// Verify iCloud container exists
if let containerURL = FileManager.default.url(
forUbiquityContainerIdentifier: nil
) {
print("✅ iCloud container: \(containerURL)")
} else {
print("❌ No iCloud container")
print("Check Xcode → Signing & Capabilities → iCloud")
}
}
// 3. Check network connectivity
func checkConnectivity() {
// Use NWPathMonitor or similar
print("Network: Check if device has internet")
print("Try on different networks (WiFi, cellular)")
}
// 4. Check device storage
func checkStorage() {
let homeURL = FileManager.default.homeDirectoryForCurrentUser
if let values = try? homeURL.resourceValues(forKeys: [
.volumeAvailableCapacityKey
]) {
let available = values.volumeAvailableCapacity ?? 0
print("Available space: \(available / 1_000_000) MB")
if available < 100_000_000 { // <100 MB
print("⚠️ Low storage may prevent sync")
}
}
}
CloudKit data not syncing?
├─ Account unavailable?
│ ├─ Check: await container.accountStatus()
│ ├─ .noAccount → User not signed into iCloud
│ ├─ .restricted → Parental controls or corporate restrictions
│ └─ .temporarilyUnavailable → Network issue or iCloud outage
│
├─ CKError.quotaExceeded?
│ └─ User exceeded iCloud storage quota
│ → Prompt user to purchase more storage
│ → Or delete old data
│
├─ CKError.networkUnavailable?
│ └─ No internet connection
│ → Check WiFi/cellular
│ → Test on different network
│
├─ CKError.serverRecordChanged (conflict)?
│ └─ Concurrent modifications
│ → Implement conflict resolution
│ → Use savePolicy correctly
│
└─ SwiftData not syncing?
├─ Check ModelConfiguration CloudKit setup
├─ Verify private database only (no public/shared)
└─ Check for @Attribute(.unique) (not supported with CloudKit)
iCloud Drive files not syncing?
├─ File not uploading?
│ ├─ Check: url.resourceValues(.ubiquitousItemIsUploadingKey)
│ ├─ Check: url.resourceValues(.ubiquitousItemUploadingErrorKey)
│ └─ Error details will indicate issue
│
├─ File not downloading?
│ ├─ Not requested? → startDownloadingUbiquitousItem(at:)
│ ├─ Check: url.resourceValues(.ubiquitousItemDownloadingErrorKey)
│ └─ May need manual download trigger
│
├─ File has conflicts?
│ ├─ Check: url.resourceValues(.ubiquitousItemHasUnresolvedConflictsKey)
│ └─ Resolve with NSFileVersion
│
└─ Files not appearing on other device?
├─ Check iCloud account on both devices (same account?)
├─ Check entitlements match on both
├─ Wait (sync not instant, can take minutes)
└─ Check Settings → iCloud → iCloud Drive → [App] is enabled
Cause : iCloud servers temporarily unavailable or user signed out
Fix :
if error.code == .accountTemporarilyUnavailable {
// Retry with exponential backoff
try await Task.sleep(for: .seconds(5))
try await retryOperation()
}
Cause : User's iCloud storage full
Fix :
if error.code == .quotaExceeded {
// Show alert to user
showAlert(
title: "iCloud Storage Full",
message: "Please free up space in Settings → [Name] → iCloud → Manage Storage"
)
}
Cause : Record modified on server since your last fetch. Most common root cause : saving a stale record without fetching the latest version first.
Diagnosis — check the simple fix FIRST :
// ❌ WRONG: Saving without fetching latest version
// This causes serverRecordChanged on EVERY concurrent edit
let record = CKRecord(recordType: "Note", recordID: existingID)
record["title"] = "Updated"
try await database.save(record) // Overwrites server version → conflict
// ✅ FIX: Fetch-then-modify-then-save (fixes 80% of cases)
let record = try await database.record(for: existingID) // Get latest
record["title"] = "Updated" // Modify the fetched record
try await database.save(record) // Save with correct changeTag
If fetch-then-save doesn't fix it (true concurrent edits from multiple devices):
if error.code == .serverRecordChanged,
let serverRecord = error.serverRecord,
let clientRecord = error.clientRecord {
// Merge records — only needed for real multi-device conflicts
let merged = mergeRecords(server: serverRecord, client: clientRecord)
try await database.save(merged)
}
Cause : No internet connection
Fix :
if error.code == .networkUnavailable {
// Queue for retry when online
queueOperation(for: .whenOnline)
// Or show offline indicator
showOfflineIndicator()
}
Symptom : Sync appears to work but records silently disappear or fail to save.
Common causes :
| Cause | Symptom | Fix |
|---|---|---|
| Record size > 1 MB | Individual records silently dropped from batch | Split large data into CKAsset |
| Batch partial failure | Some records save, others fail silently | Check perRecordSaveBlock for per-record errors |
| Conflict auto-resolution | Last-writer-wins overwrites valid data | Implement merge-based conflict resolution |
| Asset download not triggered | Record syncs but CKAsset content missing | Call fetchRecordZoneChanges with desiredKeys |
Diagnosis :
// ❌ WRONG: Batch save with no per-record error handling
let operation = CKModifyRecordsOperation(recordsToSave: records)
operation.modifyRecordsResultBlock = { result in
// Only catches operation-level failures — misses per-record errors
}
// ✅ CORRECT: Check each record individually
let operation = CKModifyRecordsOperation(recordsToSave: records)
operation.perRecordSaveBlock = { recordID, result in
switch result {
case .success(let record):
print("✅ Saved: \(recordID)")
case .failure(let error):
print("❌ Failed: \(recordID) — \(error)")
// Log for retry — this record was silently lost otherwise
}
}
// ✅ Check upload error
func checkUploadError(url: URL) {
let values = try? url.resourceValues(forKeys: [
.ubiquitousItemUploadingErrorKey
])
if let error = values?.ubiquitousItemUploadingError {
print("Upload error: \(error.localizedDescription)")
if (error as NSError).code == NSFileWriteOutOfSpaceError {
print("iCloud storage full")
}
}
}
// ✅ Check download error
func checkDownloadError(url: URL) {
let values = try? url.resourceValues(forKeys: [
.ubiquitousItemDownloadingErrorKey
])
if let error = values?.ubiquitousItemDownloadingError {
print("Download error: \(error.localizedDescription)")
// Common errors:
// - Network unavailable
// - Account unavailable
// - File deleted on server
}
}
Symptom : Save/fetch never completes, no error
Diagnosis :
// Add timeout
Task {
try await withTimeout(seconds: 30) {
try await database.save(record)
}
}
// Log operation lifecycle
operation.database = database
operation.completionBlock = {
print("Operation completed")
}
operation.qualityOfService = .userInitiated
// Check if operation was cancelled
if operation.isCancelled {
print("Operation was cancelled")
}
Common causes :
Symptom : SwiftData saves locally but doesn't sync
Diagnosis :
// 1. Verify CloudKit configuration
let config = ModelConfiguration(
cloudKitDatabase: .private("iCloud.com.example.app")
)
// 2. Check for incompatible attributes
// ❌ @Attribute(.unique) not supported with CloudKit
@Model
class Task {
@Attribute(.unique) var id: UUID // ← Remove this
var title: String
}
// 3. Check all properties have defaults or are optional
@Model
class Task {
var title: String = "" // ✅ Has default
var dueDate: Date? // ✅ Optional
}
Symptom : File operations hang
Diagnosis :
// ❌ WRONG: Nested coordination can deadlock
coordinator.coordinate(writingItemAt: url, options: [], error: nil) { newURL in
// Don't create another coordinator here!
anotherCoordinator.coordinate(...) // ← Deadlock risk
}
// ✅ CORRECT: Single coordinator per operation
coordinator.coordinate(writingItemAt: url, options: [], error: nil) { newURL in
// Direct file operations only
try data.write(to: newURL)
}
Symptom : Conflicts persist even after resolution
Diagnosis :
// ❌ WRONG: Not marking as resolved
let conflicts = NSFileVersion.unresolvedConflictVersionsOfItem(at: url)
for conflict in conflicts ?? [] {
// Missing: conflict.isResolved = true
}
// ✅ CORRECT: Mark resolved and remove
for conflict in conflicts ?? [] {
conflict.isResolved = true
}
try NSFileVersion.removeOtherVersionsOfItem(at: url)
SYMPTOM : Users report data not syncing after app update
DIAGNOSIS STEPS (run in order):
Check account status (2 min):
// On affected device
let status = FileManager.default.ubiquityIdentityToken
// nil? → Not signed in
Verify entitlements unchanged (5 min):
Check for breaking changes (10 min):
Test on clean device (15 min):
ROOT CAUSES (90% of cases):
FIX :
Access : https://icloud.developer.apple.com/dashboard
Monitor :
Set alerts for :
// ✅ Log all CloudKit operations
extension CKDatabase {
func saveWithLogging(_ record: CKRecord) async throws {
print("Saving record: \(record.recordID)")
let start = Date()
do {
try await self.save(record)
let duration = Date().timeIntervalSince(start)
print("✅ Saved in \(duration)s")
} catch let error as CKError {
print("❌ Save failed: \(error.code), \(error.localizedDescription)")
throw error
}
}
}
func diagnoseCloudSyncIssue() async {
print("=== Cloud Sync Diagnosis ===")
// 1. Account
await checkICloudStatus()
// 2. Entitlements
checkEntitlements()
// 3. Network
checkConnectivity()
// 4. Storage
checkStorage()
// 5. For CloudKit
let container = CKContainer.default()
do {
let status = try await container.accountStatus()
print("CloudKit status: \(status)")
} catch {
print("CloudKit error: \(error)")
}
// 6. For iCloud Drive
if let url = getICloudContainerURL() {
let values = try? url.resourceValues(forKeys: [
.ubiquitousItemDownloadingErrorKey,
.ubiquitousItemUploadingErrorKey
])
print("Download error: \(values?.ubiquitousItemDownloadingError?.localizedDescription ?? "none")")
print("Upload error: \(values?.ubiquitousItemUploadingError?.localizedDescription ?? "none")")
}
print("=== End Diagnosis ===")
}
axiom-cloudkit-ref — CloudKit implementation detailsaxiom-icloud-drive-ref — iCloud Drive implementation detailsaxiom-storage — Choose sync approachLast Updated : 2025-12-12 Skill Type : Diagnostic
Weekly Installs
99
Repository
GitHub Stars
590
First Seen
Jan 21, 2026
Security Audits
Gen Agent Trust HubPassSocketPassSnykPass
Installed on
opencode84
codex78
claude-code78
gemini-cli77
cursor77
github-copilot73
Supabase Postgres 最佳实践指南 - 8大类别性能优化规则与SQL示例
70,900 周安装
Turso数据库调试指南:SQLite兼容性、字节码对比与Rust日志记录
449 周安装
CI/CD流水线专家指南:GitHub Actions、GitLab CI、Jenkins安全高效部署
449 周安装
macOS开发专家指南:SwiftUI、SwiftData、AppKit与macOS 26(Tahoe)开发实践
451 周安装
AI产品开发实战指南:LLM生产部署、提示词优化与安全防护最佳实践
457 周安装
性能剖析指南:Lighthouse审计、核心网页指标优化与运行时性能分析
458 周安装
skill-creator:AI CLI技能自动化创建工具,遵循Anthropic最佳实践,支持Copilot/Claude/Codex
458 周安装