[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6EJ1TKQMB0AWDRVPPK2ZP8V":3,"skill-same:01M6EJ1TKQMB0AWDRVPPK2ZP8V":76},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":34,"linkOnly":35,"markdownContent":36,"markdownBody":37,"frontMatter":38,"refName":39,"commitSha":40,"skillDirectory":41,"forksCount":42,"repositoryHtmlUrl":43,"repositoryHomepageUrl":44,"ownerHtmlUrl":45,"ownerBlogUrl":6,"ownerDescription":46,"updatedAt":47,"install":48,"resources":61},"01M6EJ1TKQMB0AWDRVPPK2ZP8V","core-development",null,"Work on the core package (types, validation, normalization, diff). Use when modifying DSL processing logic or data flow.","ComeOnOliver\u002Fskillshub","ComeOnOliver","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F43215937?v=4","01M6E5JNFECJAAVFE0W7SMWWD2","Haoran Shu","01M6E5JNNDQS7AJZDYFQ8TPZCK",67,"MIT","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002F7nohe\u002Fcore-development\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33],"development","core","core development","validation","package","flow","data","normalization","work on","work","use","diff","logic","processing","types","2026-11-10 10:12:30",false,"---\nname: core-development\ndescription: Work on the core package (types, validation, normalization, diff). Use when modifying DSL processing logic or data flow.\n---\n\n# Core Package Development\n\nThe core package (`packages\u002Fcore\u002F`) is dependency-free and handles all DSL processing.\n\n## Data Flow\n\n```\nDSL (YAML input) → validate() → normalize() → IR → diff() → Patch\n```\n\n## Key Files\n\n| File | Purpose | Exports |\n|------|---------|---------|\n| `types.ts` | Type definitions | DSL*, IR*, Patch, WebSocket protocol |\n| `validate.ts` | YAML validation | `validate(dsl): ValidationResult` |\n| `normalize.ts` | DSL → IR conversion | `normalize(dsl): IRDocument` |\n| `diff.ts` | IR diff calculation | `diff(prev, next): Patch` |\n\n## Type Hierarchy\n\n```\nDSL Types (user input)      IR Types (normalized)\n─────────────────────       ────────────────────\nDSLDocument                 IRDocument\n  ├─ version: number          ├─ version: number\n  ├─ docId: string            ├─ docId: string\n  ├─ title?: string           ├─ title: string\n  ├─ nodes: DSLNode[]         ├─ nodes: Record\u003Cstring, IRNode>\n  └─ edges?: DSLEdge[]        └─ edges: Record\u003Cstring, IREdge>\n\nDSLNode                     IRNode\n  ├─ id: string               ├─ id: string\n  ├─ provider: string         ├─ provider: string\n  ├─ kind: string             ├─ kind: string\n  ├─ label?: string           ├─ label: string (default: id)\n  ├─ parent?: string          ├─ parent: string | null\n  └─ layout: DSLLayout        └─ layout: { x, y, w, h }\n\nDSLEdge                     IREdge\n  ├─ id: string               ├─ id: string\n  ├─ from: string             ├─ from: string\n  ├─ to: string               ├─ to: string\n  └─ label?: string           └─ label: string (default: \"\")\n```\n\n## Patch Operations\n\n```typescript\ntype PatchOp =\n  | { op: \"upsertNode\"; node: IRNode }\n  | { op: \"removeNode\"; id: string }\n  | { op: \"upsertEdge\"; edge: IREdge }\n  | { op: \"removeEdge\"; id: string };\n\ninterface Patch {\n  baseRev: number;\n  nextRev: number;\n  ops: PatchOp[];\n}\n```\n\n## WebSocket Protocol Types\n\n```typescript\n\u002F\u002F Plugin → CLI\ninterface HelloMessage {\n  type: \"hello\";\n  docId: string;\n  secret?: string;\n}\n\ninterface RequestFullMessage {\n  type: \"requestFull\";\n  docId: string;\n}\n\n\u002F\u002F CLI → Plugin\ninterface FullMessage {\n  type: \"full\";\n  rev: number;\n  ir: IRDocument;\n}\n\ninterface PatchMessage {\n  type: \"patch\";\n  baseRev: number;\n  nextRev: number;\n  ops: PatchOp[];\n}\n\ninterface ErrorMessage {\n  type: \"error\";\n  message: string;\n}\n```\n\n## Development Workflow\n\n1. **Modify types** → Update `types.ts`\n2. **Update validation** → Ensure `validate.ts` catches invalid input\n3. **Update normalization** → Handle new fields\u002Fdefaults in `normalize.ts`\n4. **Update diff** → Handle new patch scenarios in `diff.ts`\n5. **Add tests** → Co-located `*.test.ts` files\n6. **Run tests** → `bun test packages\u002Fcore\u002F`\n\n## Testing\n\n```bash\n# All core tests\nbun test packages\u002Fcore\u002F\n\n# Specific test file\nbun test packages\u002Fcore\u002Fsrc\u002Fdiff.test.ts\nbun test packages\u002Fcore\u002Fsrc\u002Fvalidate.test.ts\nbun test packages\u002Fcore\u002Fsrc\u002Fnormalize.test.ts\n\n# Watch mode\nbun test --watch packages\u002Fcore\u002F\n```\n\n## Common Patterns\n\n### Adding a new node property\n\n1. Add to `DSLNode` and `IRNode` in `types.ts`\n2. Add validation in `validate.ts`\n3. Add default value handling in `normalize.ts`\n4. Update diff logic if property affects equality\n5. Add test cases for validation, normalization, and diff\n\n### Adding a new edge property\n\n1. Add to `DSLEdge` and `IREdge` in `types.ts`\n2. Add validation in `validate.ts`\n3. Add default value handling in `normalize.ts`\n4. Update diff logic for edge equality check\n5. Add test cases\n","# Core Package Development\n\nThe core package (`packages\u002Fcore\u002F`) is dependency-free and handles all DSL processing.\n\n## Data Flow\n\n```\nDSL (YAML input) → validate() → normalize() → IR → diff() → Patch\n```\n\n## Key Files\n\n| File | Purpose | Exports |\n|------|---------|---------|\n| `types.ts` | Type definitions | DSL*, IR*, Patch, WebSocket protocol |\n| `validate.ts` | YAML validation | `validate(dsl): ValidationResult` |\n| `normalize.ts` | DSL → IR conversion | `normalize(dsl): IRDocument` |\n| `diff.ts` | IR diff calculation | `diff(prev, next): Patch` |\n\n## Type Hierarchy\n\n```\nDSL Types (user input)      IR Types (normalized)\n─────────────────────       ────────────────────\nDSLDocument                 IRDocument\n  ├─ version: number          ├─ version: number\n  ├─ docId: string            ├─ docId: string\n  ├─ title?: string           ├─ title: string\n  ├─ nodes: DSLNode[]         ├─ nodes: Record\u003Cstring, IRNode>\n  └─ edges?: DSLEdge[]        └─ edges: Record\u003Cstring, IREdge>\n\nDSLNode                     IRNode\n  ├─ id: string               ├─ id: string\n  ├─ provider: string         ├─ provider: string\n  ├─ kind: string             ├─ kind: string\n  ├─ label?: string           ├─ label: string (default: id)\n  ├─ parent?: string          ├─ parent: string | null\n  └─ layout: DSLLayout        └─ layout: { x, y, w, h }\n\nDSLEdge                     IREdge\n  ├─ id: string               ├─ id: string\n  ├─ from: string             ├─ from: string\n  ├─ to: string               ├─ to: string\n  └─ label?: string           └─ label: string (default: \"\")\n```\n\n## Patch Operations\n\n```typescript\ntype PatchOp =\n  | { op: \"upsertNode\"; node: IRNode }\n  | { op: \"removeNode\"; id: string }\n  | { op: \"upsertEdge\"; edge: IREdge }\n  | { op: \"removeEdge\"; id: string };\n\ninterface Patch {\n  baseRev: number;\n  nextRev: number;\n  ops: PatchOp[];\n}\n```\n\n## WebSocket Protocol Types\n\n```typescript\n\u002F\u002F Plugin → CLI\ninterface HelloMessage {\n  type: \"hello\";\n  docId: string;\n  secret?: string;\n}\n\ninterface RequestFullMessage {\n  type: \"requestFull\";\n  docId: string;\n}\n\n\u002F\u002F CLI → Plugin\ninterface FullMessage {\n  type: \"full\";\n  rev: number;\n  ir: IRDocument;\n}\n\ninterface PatchMessage {\n  type: \"patch\";\n  baseRev: number;\n  nextRev: number;\n  ops: PatchOp[];\n}\n\ninterface ErrorMessage {\n  type: \"error\";\n  message: string;\n}\n```\n\n## Development Workflow\n\n1. **Modify types** → Update `types.ts`\n2. **Update validation** → Ensure `validate.ts` catches invalid input\n3. **Update normalization** → Handle new fields\u002Fdefaults in `normalize.ts`\n4. **Update diff** → Handle new patch scenarios in `diff.ts`\n5. **Add tests** → Co-located `*.test.ts` files\n6. **Run tests** → `bun test packages\u002Fcore\u002F`\n\n## Testing\n\n```bash\n# All core tests\nbun test packages\u002Fcore\u002F\n\n# Specific test file\nbun test packages\u002Fcore\u002Fsrc\u002Fdiff.test.ts\nbun test packages\u002Fcore\u002Fsrc\u002Fvalidate.test.ts\nbun test packages\u002Fcore\u002Fsrc\u002Fnormalize.test.ts\n\n# Watch mode\nbun test --watch packages\u002Fcore\u002F\n```\n\n## Common Patterns\n\n### Adding a new node property\n\n1. Add to `DSLNode` and `IRNode` in `types.ts`\n2. Add validation in `validate.ts`\n3. Add default value handling in `normalize.ts`\n4. Update diff logic if property affects equality\n5. Add test cases for validation, normalization, and diff\n\n### Adding a new edge property\n\n1. Add to `DSLEdge` and `IREdge` in `types.ts`\n2. Add validation in `validate.ts`\n3. Add default value handling in `normalize.ts`\n4. Update diff logic for edge equality check\n5. Add test cases\n",{"name":5,"description":7},"main","def8531e65114c0fca8fb8551c1871ee0eed705c","skills\u002Faiskillstore\u002Fmarketplace\u002F7nohe\u002Fcore-development",24,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub","https:\u002F\u002Fskillshub.wtf","https:\u002F\u002Fgithub.com\u002FComeOnOliver","AI & Blockchain Engineer\r\n","2026-06-24 22:07:19",{"source":8,"skillName":5,"commands":49,"prompt":59,"zipAvailable":60},[50,53,56],{"tool":51,"command":52},"npx","npx skills add ComeOnOliver\u002Fskillshub --skill core-development",{"tool":54,"command":55},"bunx","bunx skills add ComeOnOliver\u002Fskillshub --skill core-development",{"tool":57,"command":58},"pnpm","pnpm dlx skills add ComeOnOliver\u002Fskillshub --skill core-development","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002F7nohe\u002Fcore-development\u002FSKILL.md",true,[62,68,72],{"path":63,"resourceType":64,"resourceTypeDesc":65,"sizeBytes":66,"sourceHtmlUrl":67},"CHANGELOG.md","REFERENCE","参考文档",5462,"https:\u002F\u002Fgithub.com\u002Fjaviertarazon\u002Fide-agente-free-jt7-\u002Fblob\u002Frelease\u002Fv4.2.11-panel-pro\u002F.github\u002Fskills\u002Faudio-transcriber\u002FCHANGELOG.md",{"path":69,"resourceType":64,"resourceTypeDesc":65,"sizeBytes":70,"sourceHtmlUrl":71},"README.md",9530,"https:\u002F\u002Fgithub.com\u002Fjaviertarazon\u002Fide-agente-free-jt7-\u002Fblob\u002Frelease\u002Fv4.2.11-panel-pro\u002F.github\u002Fskills\u002Faudio-transcriber\u002FREADME.md",{"path":73,"resourceType":64,"resourceTypeDesc":65,"sizeBytes":74,"sourceHtmlUrl":75},"skill-report.json",12330,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002F7nohe\u002Fcore-development\u002Fskill-report.json",[77,91,101,110,116,123],{"skillNo":78,"name":79,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":80,"categories":81,"keywords":87,"publishedAt":34},"01M6FKJN13GMG4KY57J3QD8GY5","model-hierarchy-skill","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzscole\u002Fmodel-hierarchy-skill\u002Fmodel-hierarchy-skill\u002FSKILL.md",[82],{"categoryNo":83,"categoryName":84,"taxonomyType":85,"taxonomyTypeDesc":86},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[88,89,90],"model","model hierarchy","model hierarchy skill",{"skillNo":92,"name":93,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":94,"categories":95,"keywords":97,"publishedAt":34},"01M6FKJJJ6GCAMR4PPPRD12M5X","zoom-mcp","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-mcp\u002FSKILL.md",[96],{"categoryNo":83,"categoryName":84,"taxonomyType":85,"taxonomyTypeDesc":86},[98,99,100],"MCP","zoom","zoom mcp",{"skillNo":102,"name":103,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":104,"categories":105,"keywords":106,"publishedAt":34},"01M6FKJE3KYT3KPEZMEEHYKA6K","zoom-apps-sdk","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-apps-sdk\u002FSKILL.md",[],[107,108,109,99],"sdk","zoom apps sdk","apps",{"skillNo":111,"name":112,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":113,"categories":114,"keywords":115,"publishedAt":34},"01M6FKJ9EDH9Q5VWDF8HAJRSP0","windows","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwindows\u002FSKILL.md",[],[112],{"skillNo":117,"name":118,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":119,"categories":120,"keywords":122,"publishedAt":34},"01M6FKJ666BEEFC3AE9GJ72Q93","whiteboard","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwhiteboard\u002FSKILL.md",[121],{"categoryNo":83,"categoryName":84,"taxonomyType":85,"taxonomyTypeDesc":86},[118],{"skillNo":124,"name":125,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":126,"categories":127,"keywords":128,"publishedAt":34},"01M6FKJ21WFCDGTJQ2Q91T9DVW","websockets","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwebsockets\u002FSKILL.md",[],[125]]