[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6HSF38AFT18A88YS3DNJ71X":3,"skill-same:01M6HSF38AFT18A88YS3DNJ71X":104},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":22,"publishedAt":44,"linkOnly":45,"markdownContent":46,"markdownBody":47,"frontMatter":48,"refName":78,"commitSha":79,"skillDirectory":80,"forksCount":81,"repositoryHtmlUrl":82,"repositoryHomepageUrl":6,"ownerHtmlUrl":83,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":84,"install":85,"resources":97},"01M6HSF38AFT18A88YS3DNJ71X","config-generator",null,"配置表生成技能。生成符合 JSON Schema 规范的配置文件， 支持物品、关卡、角色等游戏数据的结构化配置。","welflau\u002Fai-dev-system","welflau","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F7010385?v=4","01M6HPTDGF18RFY07M229P8CTM","01M6HPTDMRMZCJPYBFEA9XVVYT",3,"MIT","https:\u002F\u002Fgithub.com\u002Fwelflau\u002Fai-dev-system\u002Fblob\u002Fmain\u002Fbackend\u002Fskills\u002Fmarketplace\u002Fcodebuddy-plugins-official\u002Fplugins\u002Fgodot-mcp\u002Fskills\u002Fgodot-dev\u002Flevel-1-generators\u002Fconfig-generator\u002FSKILL.md",[17],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000033","数据分析师","PROFESSION","适用职业",[23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43],"config generator","generator","config","godot","characters","数据","path","manager","true","quests","文件","STRING","false","type","entries","schema","生成","json","file","core","json schema","2026-11-10 10:12:30",false,"---\nname: config-generator\ndescription: >\n  配置表生成技能。生成符合 JSON Schema 规范的配置文件，\n  支持物品、关卡、角色等游戏数据的结构化配置。\nversion: 1.0.0\ndependencies:\n  - godot-core\n  - file-manager\ntriggers:\n  - pattern: \"配置表|配置文件|JSON配置|数据表|物品表|关卡配置\"\ninputs:\n  - name: config_type\n    type: string\n    enum: [\"items\", \"levels\", \"characters\", \"enemies\", \"skills\", \"dialogues\", \"quests\", \"shops\"]\n    required: true\n  - name: entries\n    type: array\n    required: false\noutputs:\n  - name: config_path\n    type: string\n    description: 生成的配置文件路径\n  - name: schema_path\n    type: string\n    description: 对应的 Schema 文件路径\n---\n\n# 配置表生成技能\n\n生成结构化的 JSON 配置文件，实现逻辑与数值分离。\n\n## 配置表系统架构\n\n```\nconfig\u002F\n├── schemas\u002F                  # JSON Schema 定义\n│   ├── base_schema.json      # 基础类型定义\n│   ├── items.schema.json\n│   ├── levels.schema.json\n│   ├── characters.schema.json\n│   ├── enemies.schema.json\n│   ├── skills.schema.json\n│   ├── dialogues.schema.json\n│   └── quests.schema.json\n│\n├── data\u002F                     # 实际配置数据\n│   ├── items.json\n│   ├── levels.json\n│   ├── characters.json\n│   ├── enemies.json\n│   ├── skills.json\n│   ├── dialogues.json\n│   └── quests.json\n│\n└── validator\u002F                # 验证工具\n    └── config_validator.gd\n```\n\n---\n\n## Schema 定义\n\n### 基础 Schema (base_schema.json)\n\n```json\n{\n  \"$schema\": \"http:\u002F\u002Fjson-schema.org\u002Fdraft-07\u002Fschema#\",\n  \"$id\": \"base_schema.json\",\n  \"definitions\": {\n    \"id\": {\n      \"type\": \"string\",\n      \"pattern\": \"^[a-z][a-z0-9_]*$\",\n      \"minLength\": 1,\n      \"maxLength\": 64\n    },\n    \"localized_string\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"key\": { \"type\": \"string\" },\n        \"default\": { \"type\": \"string\" }\n      },\n      \"required\": [\"key\", \"default\"]\n    },\n    \"resource_path\": {\n      \"type\": \"string\",\n      \"pattern\": \"^res:\u002F\u002F.*$\"\n    },\n    \"color\": {\n      \"type\": \"string\",\n      \"pattern\": \"^#[0-9a-fA-F]{6}([0-9a-fA-F]{2})?$\"\n    },\n    \"vector2\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"x\": { \"type\": \"number\" },\n        \"y\": { \"type\": \"number\" }\n      },\n      \"required\": [\"x\", \"y\"]\n    },\n    \"vector3\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"x\": { \"type\": \"number\" },\n        \"y\": { \"type\": \"number\" },\n        \"z\": { \"type\": \"number\" }\n      },\n      \"required\": [\"x\", \"y\", \"z\"]\n    },\n    \"range\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"min\": { \"type\": \"number\" },\n        \"max\": { \"type\": \"number\" }\n      },\n      \"required\": [\"min\", \"max\"]\n    }\n  }\n}\n```\n\n### 物品配置 Schema (items.schema.json)\n\n```json\n{\n  \"$schema\": \"http:\u002F\u002Fjson-schema.org\u002Fdraft-07\u002Fschema#\",\n  \"$id\": \"items.schema.json\",\n  \"title\": \"Items Configuration\",\n  \"type\": \"array\",\n  \"items\": {\n    \"type\": \"object\",\n    \"required\": [\"id\", \"name\", \"type\"],\n    \"properties\": {\n      \"id\": {\n        \"$ref\": \"base_schema.json#\u002Fdefinitions\u002Fid\",\n        \"description\": \"唯一标识符\"\n      },\n      \"name\": {\n        \"$ref\": \"base_schema.json#\u002Fdefinitions\u002Flocalized_string\",\n        \"description\": \"物品名称\"\n      },\n      \"description\": {\n        \"$ref\": \"base_schema.json#\u002Fdefinitions\u002Flocalized_string\",\n        \"description\": \"物品描述\"\n      },\n      \"type\": {\n        \"type\": \"string\",\n        \"enum\": [\"consumable\", \"equipment\", \"material\", \"quest\", \"key\"],\n        \"description\": \"物品类型\"\n      },\n      \"subtype\": {\n        \"type\": \"string\",\n        \"description\": \"子类型（如装备的部位：weapon, helmet, armor...）\"\n      },\n      \"rarity\": {\n        \"type\": \"integer\",\n        \"minimum\": 1,\n        \"maximum\": 5,\n        \"default\": 1,\n        \"description\": \"稀有度 1-5\"\n      },\n      \"icon\": {\n        \"$ref\": \"base_schema.json#\u002Fdefinitions\u002Fresource_path\",\n        \"description\": \"图标路径\"\n      },\n      \"model\": {\n        \"$ref\": \"base_schema.json#\u002Fdefinitions\u002Fresource_path\",\n        \"description\": \"3D 模型路径\"\n      },\n      \"stackable\": {\n        \"type\": \"boolean\",\n        \"default\": true\n      },\n      \"max_stack\": {\n        \"type\": \"integer\",\n        \"minimum\": 1,\n        \"maximum\": 9999,\n        \"default\": 99\n      },\n      \"price\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"buy\": { \"type\": \"integer\", \"minimum\": 0 },\n          \"sell\": { \"type\": \"integer\", \"minimum\": 0 }\n        }\n      },\n      \"effects\": {\n        \"type\": \"array\",\n        \"items\": { \"$ref\": \"#\u002Fdefinitions\u002Feffect\" }\n      },\n      \"requirements\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"level\": { \"type\": \"integer\", \"minimum\": 1 },\n          \"stats\": { \"type\": \"object\" }\n        }\n      },\n      \"stats\": {\n        \"type\": \"object\",\n        \"description\": \"装备提供的属性加成\"\n      },\n      \"tags\": {\n        \"type\": \"array\",\n        \"items\": { \"type\": \"string\" }\n      }\n    },\n    \"allOf\": [\n      {\n        \"if\": { \"properties\": { \"type\": { \"const\": \"consumable\" } } },\n        \"then\": { \"required\": [\"effects\"] }\n      },\n      {\n        \"if\": { \"properties\": { \"type\": { \"const\": \"equipment\" } } },\n        \"then\": { \"required\": [\"subtype\", \"stats\"] }\n      }\n    ]\n  },\n  \"definitions\": {\n    \"effect\": {\n      \"type\": \"object\",\n      \"required\": [\"type\", \"value\"],\n      \"properties\": {\n        \"type\": {\n          \"type\": \"string\",\n          \"enum\": [\"heal_hp\", \"heal_mp\", \"buff\", \"debuff\", \"damage\", \"teleport\", \"summon\"]\n        },\n        \"value\": { \"type\": \"number\" },\n        \"duration\": { \"type\": \"number\", \"default\": 0 },\n        \"target\": {\n          \"type\": \"string\",\n          \"enum\": [\"self\", \"enemy\", \"ally\", \"all\"],\n          \"default\": \"self\"\n        }\n      }\n    }\n  }\n}\n```\n\n### 关卡配置 Schema (levels.schema.json)\n\n```json\n{\n  \"$schema\": \"http:\u002F\u002Fjson-schema.org\u002Fdraft-07\u002Fschema#\",\n  \"$id\": \"levels.schema.json\",\n  \"title\": \"Levels Configuration\",\n  \"type\": \"array\",\n  \"items\": {\n    \"type\": \"object\",\n    \"required\": [\"id\", \"name\", \"scene_path\"],\n    \"properties\": {\n      \"id\": {\n        \"$ref\": \"base_schema.json#\u002Fdefinitions\u002Fid\"\n      },\n      \"name\": {\n        \"$ref\": \"base_schema.json#\u002Fdefinitions\u002Flocalized_string\"\n      },\n      \"description\": {\n        \"$ref\": \"base_schema.json#\u002Fdefinitions\u002Flocalized_string\"\n      },\n      \"scene_path\": {\n        \"$ref\": \"base_schema.json#\u002Fdefinitions\u002Fresource_path\"\n      },\n      \"chapter\": {\n        \"type\": \"integer\",\n        \"minimum\": 1\n      },\n      \"order\": {\n        \"type\": \"integer\",\n        \"minimum\": 1\n      },\n      \"unlock_requirements\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"previous_level\": { \"type\": \"string\" },\n          \"player_level\": { \"type\": \"integer\" },\n          \"items_required\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"object\",\n              \"properties\": {\n                \"item_id\": { \"type\": \"string\" },\n                \"amount\": { \"type\": \"integer\" }\n              }\n            }\n          }\n        }\n      },\n      \"enemies\": {\n        \"type\": \"array\",\n        \"items\": {\n          \"type\": \"object\",\n          \"properties\": {\n            \"enemy_id\": { \"type\": \"string\" },\n            \"count\": { \"$ref\": \"base_schema.json#\u002Fdefinitions\u002Frange\" },\n            \"spawn_points\": {\n              \"type\": \"array\",\n              \"items\": { \"$ref\": \"base_schema.json#\u002Fdefinitions\u002Fvector3\" }\n            }\n          }\n        }\n      },\n      \"rewards\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"exp\": { \"type\": \"integer\" },\n          \"gold\": { \"$ref\": \"base_schema.json#\u002Fdefinitions\u002Frange\" },\n          \"items\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"object\",\n              \"properties\": {\n                \"item_id\": { \"type\": \"string\" },\n                \"amount\": { \"type\": \"integer\" },\n                \"drop_rate\": { \"type\": \"number\", \"minimum\": 0, \"maximum\": 1 }\n              }\n            }\n          }\n        }\n      },\n      \"time_limit\": {\n        \"type\": \"integer\",\n        \"description\": \"时间限制（秒），0 表示无限制\"\n      },\n      \"objectives\": {\n        \"type\": \"array\",\n        \"items\": {\n          \"type\": \"object\",\n          \"properties\": {\n            \"type\": {\n              \"type\": \"string\",\n              \"enum\": [\"kill_all\", \"kill_count\", \"survive\", \"collect\", \"reach_point\", \"protect\"]\n            },\n            \"target\": { \"type\": \"string\" },\n            \"count\": { \"type\": \"integer\" },\n            \"optional\": { \"type\": \"boolean\", \"default\": false }\n          }\n        }\n      },\n      \"environment\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"music\": { \"$ref\": \"base_schema.json#\u002Fdefinitions\u002Fresource_path\" },\n          \"ambience\": { \"$ref\": \"base_schema.json#\u002Fdefinitions\u002Fresource_path\" },\n          \"lighting\": { \"type\": \"string\", \"enum\": [\"day\", \"night\", \"dungeon\", \"custom\"] }\n        }\n      }\n    }\n  }\n}\n```\n\n### 角色配置 Schema (characters.schema.json)\n\n```json\n{\n  \"$schema\": \"http:\u002F\u002Fjson-schema.org\u002Fdraft-07\u002Fschema#\",\n  \"$id\": \"characters.schema.json\",\n  \"title\": \"Characters Configuration\",\n  \"type\": \"array\",\n  \"items\": {\n    \"type\": \"object\",\n    \"required\": [\"id\", \"name\", \"class\", \"base_stats\"],\n    \"properties\": {\n      \"id\": { \"$ref\": \"base_schema.json#\u002Fdefinitions\u002Fid\" },\n      \"name\": { \"$ref\": \"base_schema.json#\u002Fdefinitions\u002Flocalized_string\" },\n      \"class\": {\n        \"type\": \"string\",\n        \"enum\": [\"warrior\", \"mage\", \"archer\", \"rogue\", \"healer\"]\n      },\n      \"description\": { \"$ref\": \"base_schema.json#\u002Fdefinitions\u002Flocalized_string\" },\n      \"portrait\": { \"$ref\": \"base_schema.json#\u002Fdefinitions\u002Fresource_path\" },\n      \"model\": { \"$ref\": \"base_schema.json#\u002Fdefinitions\u002Fresource_path\" },\n      \"base_stats\": {\n        \"type\": \"object\",\n        \"required\": [\"hp\", \"mp\", \"attack\", \"defense\", \"speed\"],\n        \"properties\": {\n          \"hp\": { \"type\": \"integer\", \"minimum\": 1 },\n          \"mp\": { \"type\": \"integer\", \"minimum\": 0 },\n          \"attack\": { \"type\": \"integer\", \"minimum\": 1 },\n          \"defense\": { \"type\": \"integer\", \"minimum\": 0 },\n          \"speed\": { \"type\": \"integer\", \"minimum\": 1 },\n          \"critical_rate\": { \"type\": \"number\", \"minimum\": 0, \"maximum\": 1 },\n          \"critical_damage\": { \"type\": \"number\", \"minimum\": 1 }\n        }\n      },\n      \"growth_rates\": {\n        \"type\": \"object\",\n        \"description\": \"每级成长率\",\n        \"properties\": {\n          \"hp\": { \"type\": \"number\" },\n          \"mp\": { \"type\": \"number\" },\n          \"attack\": { \"type\": \"number\" },\n          \"defense\": { \"type\": \"number\" },\n          \"speed\": { \"type\": \"number\" }\n        }\n      },\n      \"skills\": {\n        \"type\": \"array\",\n        \"items\": {\n          \"type\": \"object\",\n          \"properties\": {\n            \"skill_id\": { \"type\": \"string\" },\n            \"unlock_level\": { \"type\": \"integer\" }\n          }\n        }\n      },\n      \"equipment_slots\": {\n        \"type\": \"array\",\n        \"items\": {\n          \"type\": \"string\",\n          \"enum\": [\"weapon\", \"helmet\", \"armor\", \"gloves\", \"boots\", \"accessory1\", \"accessory2\"]\n        }\n      }\n    }\n  }\n}\n```\n\n### 敌人配置 Schema (enemies.schema.json)\n\n```json\n{\n  \"$schema\": \"http:\u002F\u002Fjson-schema.org\u002Fdraft-07\u002Fschema#\",\n  \"$id\": \"enemies.schema.json\",\n  \"title\": \"Enemies Configuration\",\n  \"type\": \"array\",\n  \"items\": {\n    \"type\": \"object\",\n    \"required\": [\"id\", \"name\", \"type\", \"stats\"],\n    \"properties\": {\n      \"id\": { \"$ref\": \"base_schema.json#\u002Fdefinitions\u002Fid\" },\n      \"name\": { \"$ref\": \"base_schema.json#\u002Fdefinitions\u002Flocalized_string\" },\n      \"type\": {\n        \"type\": \"string\",\n        \"enum\": [\"normal\", \"elite\", \"boss\", \"miniboss\"]\n      },\n      \"model\": { \"$ref\": \"base_schema.json#\u002Fdefinitions\u002Fresource_path\" },\n      \"stats\": {\n        \"type\": \"object\",\n        \"required\": [\"hp\", \"attack\", \"defense\"],\n        \"properties\": {\n          \"hp\": { \"type\": \"integer\" },\n          \"attack\": { \"type\": \"integer\" },\n          \"defense\": { \"type\": \"integer\" },\n          \"speed\": { \"type\": \"integer\" },\n          \"exp_reward\": { \"type\": \"integer\" },\n          \"gold_reward\": { \"$ref\": \"base_schema.json#\u002Fdefinitions\u002Frange\" }\n        }\n      },\n      \"level_scaling\": {\n        \"type\": \"object\",\n        \"description\": \"属性随等级的缩放系数\"\n      },\n      \"behavior\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"ai_type\": {\n            \"type\": \"string\",\n            \"enum\": [\"aggressive\", \"defensive\", \"passive\", \"patrol\", \"guard\"]\n          },\n          \"detection_range\": { \"type\": \"number\" },\n          \"attack_range\": { \"type\": \"number\" },\n          \"attack_interval\": { \"type\": \"number\" }\n        }\n      },\n      \"skills\": {\n        \"type\": \"array\",\n        \"items\": {\n          \"type\": \"object\",\n          \"properties\": {\n            \"skill_id\": { \"type\": \"string\" },\n            \"cooldown\": { \"type\": \"number\" },\n            \"use_condition\": { \"type\": \"string\" }\n          }\n        }\n      },\n      \"drops\": {\n        \"type\": \"array\",\n        \"items\": {\n          \"type\": \"object\",\n          \"properties\": {\n            \"item_id\": { \"type\": \"string\" },\n            \"amount\": { \"$ref\": \"base_schema.json#\u002Fdefinitions\u002Frange\" },\n            \"drop_rate\": { \"type\": \"number\", \"minimum\": 0, \"maximum\": 1 }\n          }\n        }\n      },\n      \"resistances\": {\n        \"type\": \"object\",\n        \"description\": \"元素\u002F状态抗性\"\n      },\n      \"weaknesses\": {\n        \"type\": \"array\",\n        \"items\": { \"type\": \"string\" }\n      }\n    }\n  }\n}\n```\n\n### 技能配置 Schema (skills.schema.json)\n\n```json\n{\n  \"$schema\": \"http:\u002F\u002Fjson-schema.org\u002Fdraft-07\u002Fschema#\",\n  \"$id\": \"skills.schema.json\",\n  \"title\": \"Skills Configuration\",\n  \"type\": \"array\",\n  \"items\": {\n    \"type\": \"object\",\n    \"required\": [\"id\", \"name\", \"type\", \"effects\"],\n    \"properties\": {\n      \"id\": { \"$ref\": \"base_schema.json#\u002Fdefinitions\u002Fid\" },\n      \"name\": { \"$ref\": \"base_schema.json#\u002Fdefinitions\u002Flocalized_string\" },\n      \"description\": { \"$ref\": \"base_schema.json#\u002Fdefinitions\u002Flocalized_string\" },\n      \"icon\": { \"$ref\": \"base_schema.json#\u002Fdefinitions\u002Fresource_path\" },\n      \"type\": {\n        \"type\": \"string\",\n        \"enum\": [\"active\", \"passive\", \"ultimate\"]\n      },\n      \"element\": {\n        \"type\": \"string\",\n        \"enum\": [\"physical\", \"fire\", \"ice\", \"lightning\", \"holy\", \"dark\", \"none\"]\n      },\n      \"target_type\": {\n        \"type\": \"string\",\n        \"enum\": [\"self\", \"single_enemy\", \"single_ally\", \"all_enemies\", \"all_allies\", \"area\"]\n      },\n      \"cost\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"mp\": { \"type\": \"integer\" },\n          \"hp\": { \"type\": \"integer\" },\n          \"special\": { \"type\": \"integer\" }\n        }\n      },\n      \"cooldown\": {\n        \"type\": \"number\",\n        \"minimum\": 0\n      },\n      \"cast_time\": {\n        \"type\": \"number\",\n        \"minimum\": 0\n      },\n      \"range\": {\n        \"type\": \"number\"\n      },\n      \"area_of_effect\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"shape\": { \"type\": \"string\", \"enum\": [\"circle\", \"cone\", \"line\", \"rectangle\"] },\n          \"size\": { \"type\": \"number\" }\n        }\n      },\n      \"effects\": {\n        \"type\": \"array\",\n        \"items\": {\n          \"type\": \"object\",\n          \"properties\": {\n            \"type\": {\n              \"type\": \"string\",\n              \"enum\": [\"damage\", \"heal\", \"buff\", \"debuff\", \"dot\", \"hot\", \"knockback\", \"stun\", \"summon\"]\n            },\n            \"value\": { \"type\": \"number\" },\n            \"scaling\": {\n              \"type\": \"object\",\n              \"properties\": {\n                \"stat\": { \"type\": \"string\" },\n                \"ratio\": { \"type\": \"number\" }\n              }\n            },\n            \"duration\": { \"type\": \"number\" },\n            \"tick_interval\": { \"type\": \"number\" }\n          }\n        }\n      },\n      \"animation\": { \"$ref\": \"base_schema.json#\u002Fdefinitions\u002Fresource_path\" },\n      \"sound_effect\": { \"$ref\": \"base_schema.json#\u002Fdefinitions\u002Fresource_path\" },\n      \"visual_effect\": { \"$ref\": \"base_schema.json#\u002Fdefinitions\u002Fresource_path\" }\n    }\n  }\n}\n```\n\n---\n\n## 配置数据示例\n\n### items.json 示例\n\n```json\n[\n  {\n    \"id\": \"potion_health_small\",\n    \"name\": { \"key\": \"ITEM_HEALTH_POTION_SMALL\", \"default\": \"小型生命药水\" },\n    \"description\": { \"key\": \"ITEM_HEALTH_POTION_SMALL_DESC\", \"default\": \"恢复少量生命值\" },\n    \"type\": \"consumable\",\n    \"rarity\": 1,\n    \"icon\": \"res:\u002F\u002Fassets\u002Ftextures\u002Fitems\u002Fpotion_health_small.png\",\n    \"stackable\": true,\n    \"max_stack\": 99,\n    \"price\": { \"buy\": 50, \"sell\": 25 },\n    \"effects\": [\n      { \"type\": \"heal_hp\", \"value\": 50, \"target\": \"self\" }\n    ],\n    \"tags\": [\"consumable\", \"healing\", \"common\"]\n  },\n  {\n    \"id\": \"sword_iron\",\n    \"name\": { \"key\": \"ITEM_SWORD_IRON\", \"default\": \"铁剑\" },\n    \"description\": { \"key\": \"ITEM_SWORD_IRON_DESC\", \"default\": \"普通的铁制长剑\" },\n    \"type\": \"equipment\",\n    \"subtype\": \"weapon\",\n    \"rarity\": 2,\n    \"icon\": \"res:\u002F\u002Fassets\u002Ftextures\u002Fitems\u002Fsword_iron.png\",\n    \"model\": \"res:\u002F\u002Fassets\u002Fmodels\u002Fitems\u002Fsword_iron.glb\",\n    \"stackable\": false,\n    \"price\": { \"buy\": 200, \"sell\": 100 },\n    \"requirements\": { \"level\": 5 },\n    \"stats\": {\n      \"attack\": 15,\n      \"critical_rate\": 0.05\n    },\n    \"tags\": [\"weapon\", \"sword\", \"iron\"]\n  }\n]\n```\n\n---\n\n## 配置验证器\n\n### GDScript 验证器\n\n```gdscript\n## 配置表验证器\nclass_name ConfigValidator\nextends RefCounted\n\nvar _schemas: Dictionary = {}\nvar _errors: Array = []\n\nfunc load_schemas(schema_dir: String = \"res:\u002F\u002Fconfig\u002Fschemas\u002F\") -> void:\n    var dir = DirAccess.open(schema_dir)\n    if dir:\n        dir.list_dir_begin()\n        var file_name = dir.get_next()\n        while file_name != \"\":\n            if file_name.ends_with(\".schema.json\"):\n                var schema_path = schema_dir.path_join(file_name)\n                var schema_name = file_name.replace(\".schema.json\", \"\")\n                _schemas[schema_name] = _load_json(schema_path)\n            file_name = dir.get_next()\n        dir.list_dir_end()\n\nfunc validate_config(config_name: String, data: Array) -> Dictionary:\n    _errors.clear()\n    \n    if not _schemas.has(config_name):\n        return {\"valid\": false, \"errors\": [\"Schema not found: \" + config_name]}\n    \n    var schema = _schemas[config_name]\n    \n    for i in range(data.size()):\n        var item = data[i]\n        _validate_item(item, schema, \"[%d]\" % i)\n    \n    return {\n        \"valid\": _errors.is_empty(),\n        \"errors\": _errors.duplicate()\n    }\n\nfunc _validate_item(item: Dictionary, schema: Dictionary, path: String) -> void:\n    var item_schema = schema.get(\"items\", {})\n    var required = item_schema.get(\"required\", [])\n    var properties = item_schema.get(\"properties\", {})\n    \n    # 检查必需字段\n    for field in required:\n        if not item.has(field):\n            _errors.append(\"%s: Missing required field '%s'\" % [path, field])\n    \n    # 检查每个字段的类型和约束\n    for key in item.keys():\n        if properties.has(key):\n            var prop_schema = properties[key]\n            _validate_property(item[key], prop_schema, \"%s.%s\" % [path, key])\n\nfunc _validate_property(value: Variant, schema: Dictionary, path: String) -> void:\n    var expected_type = schema.get(\"type\", \"\")\n    \n    # 类型检查\n    match expected_type:\n        \"string\":\n            if typeof(value) != TYPE_STRING:\n                _errors.append(\"%s: Expected string, got %s\" % [path, type_string(typeof(value))])\n            elif schema.has(\"pattern\"):\n                var regex = RegEx.new()\n                regex.compile(schema.pattern)\n                if not regex.search(value):\n                    _errors.append(\"%s: Value does not match pattern\" % path)\n            if schema.has(\"enum\") and value not in schema.enum:\n                _errors.append(\"%s: Value must be one of %s\" % [path, schema.enum])\n        \"integer\", \"number\":\n            if typeof(value) not in [TYPE_INT, TYPE_FLOAT]:\n                _errors.append(\"%s: Expected number, got %s\" % [path, type_string(typeof(value))])\n            else:\n                if schema.has(\"minimum\") and value \u003C schema.minimum:\n                    _errors.append(\"%s: Value must be >= %s\" % [path, schema.minimum])\n                if schema.has(\"maximum\") and value > schema.maximum:\n                    _errors.append(\"%s: Value must be \u003C= %s\" % [path, schema.maximum])\n        \"boolean\":\n            if typeof(value) != TYPE_BOOL:\n                _errors.append(\"%s: Expected boolean\" % path)\n        \"array\":\n            if typeof(value) != TYPE_ARRAY:\n                _errors.append(\"%s: Expected array\" % path)\n        \"object\":\n            if typeof(value) != TYPE_DICTIONARY:\n                _errors.append(\"%s: Expected object\" % path)\n\nfunc _load_json(path: String) -> Variant:\n    var file = FileAccess.open(path, FileAccess.READ)\n    if file:\n        var json = JSON.new()\n        json.parse(file.get_as_text())\n        file.close()\n        return json.data\n    return null\n```\n\n---\n\n## 配置管理器\n\n```gdscript\n## 配置管理器 - Autoload\nclass_name ConfigManager\nextends Node\n\nvar _configs: Dictionary = {}\nvar _validator: ConfigValidator\n\nfunc _ready() -> void:\n    _validator = ConfigValidator.new()\n    _validator.load_schemas()\n    _load_all_configs()\n\nfunc _load_all_configs() -> void:\n    var config_files = [\n        \"items\",\n        \"levels\", \n        \"characters\",\n        \"enemies\",\n        \"skills\"\n    ]\n    \n    for config_name in config_files:\n        var path = \"res:\u002F\u002Fconfig\u002Fdata\u002F%s.json\" % config_name\n        if FileAccess.file_exists(path):\n            var data = _load_json(path)\n            if data:\n                var result = _validator.validate_config(config_name, data)\n                if result.valid:\n                    _configs[config_name] = _index_by_id(data)\n                else:\n                    push_error(\"Config validation failed for %s: %s\" % [config_name, result.errors])\n\nfunc _index_by_id(data: Array) -> Dictionary:\n    var indexed = {}\n    for item in data:\n        if item.has(\"id\"):\n            indexed[item.id] = item\n    return indexed\n\nfunc get_item(id: String) -> Dictionary:\n    return _configs.get(\"items\", {}).get(id, {})\n\nfunc get_level(id: String) -> Dictionary:\n    return _configs.get(\"levels\", {}).get(id, {})\n\nfunc get_character(id: String) -> Dictionary:\n    return _configs.get(\"characters\", {}).get(id, {})\n\nfunc get_enemy(id: String) -> Dictionary:\n    return _configs.get(\"enemies\", {}).get(id, {})\n\nfunc get_skill(id: String) -> Dictionary:\n    return _configs.get(\"skills\", {}).get(id, {})\n\nfunc get_all(config_name: String) -> Dictionary:\n    return _configs.get(config_name, {})\n\nfunc _load_json(path: String) -> Variant:\n    var file = FileAccess.open(path, FileAccess.READ)\n    if file:\n        var json = JSON.new()\n        if json.parse(file.get_as_text()) == OK:\n            file.close()\n            return json.data\n        file.close()\n    return null\n```\n\n---\n\n## 使用示例\n\n### 生成物品配置\n\n```\n生成一组 RPG 物品配置：\n- 3 种恢复药水（小\u002F中\u002F大）\n- 2 把武器（铁剑、魔法杖）\n- 1 套防具（皮甲）\n```\n\n### 生成关卡配置\n\n```\n生成第一章的 5 个关卡配置，难度递增：\n- 第 1 关：新手教程，3 只史莱姆\n- 第 2 关：森林入口，5 只哥布林\n- ...\n```\n","# 配置表生成技能\n\n生成结构化的 JSON 配置文件，实现逻辑与数值分离。\n\n## 配置表系统架构\n\n```\nconfig\u002F\n├── schemas\u002F                  # JSON Schema 定义\n│   ├── base_schema.json      # 基础类型定义\n│   ├── items.schema.json\n│   ├── levels.schema.json\n│   ├── characters.schema.json\n│   ├── enemies.schema.json\n│   ├── skills.schema.json\n│   ├── dialogues.schema.json\n│   └── quests.schema.json\n│\n├── data\u002F                     # 实际配置数据\n│   ├── items.json\n│   ├── levels.json\n│   ├── characters.json\n│   ├── enemies.json\n│   ├── skills.json\n│   ├── dialogues.json\n│   └── quests.json\n│\n└── validator\u002F                # 验证工具\n    └── config_validator.gd\n```\n\n---\n\n## Schema 定义\n\n### 基础 Schema (base_schema.json)\n\n```json\n{\n  \"$schema\": \"http:\u002F\u002Fjson-schema.org\u002Fdraft-07\u002Fschema#\",\n  \"$id\": \"base_schema.json\",\n  \"definitions\": {\n    \"id\": {\n      \"type\": \"string\",\n      \"pattern\": \"^[a-z][a-z0-9_]*$\",\n      \"minLength\": 1,\n      \"maxLength\": 64\n    },\n    \"localized_string\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"key\": { \"type\": \"string\" },\n        \"default\": { \"type\": \"string\" }\n      },\n      \"required\": [\"key\", \"default\"]\n    },\n    \"resource_path\": {\n      \"type\": \"string\",\n      \"pattern\": \"^res:\u002F\u002F.*$\"\n    },\n    \"color\": {\n      \"type\": \"string\",\n      \"pattern\": \"^#[0-9a-fA-F]{6}([0-9a-fA-F]{2})?$\"\n    },\n    \"vector2\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"x\": { \"type\": \"number\" },\n        \"y\": { \"type\": \"number\" }\n      },\n      \"required\": [\"x\", \"y\"]\n    },\n    \"vector3\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"x\": { \"type\": \"number\" },\n        \"y\": { \"type\": \"number\" },\n        \"z\": { \"type\": \"number\" }\n      },\n      \"required\": [\"x\", \"y\", \"z\"]\n    },\n    \"range\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"min\": { \"type\": \"number\" },\n        \"max\": { \"type\": \"number\" }\n      },\n      \"required\": [\"min\", \"max\"]\n    }\n  }\n}\n```\n\n### 物品配置 Schema (items.schema.json)\n\n```json\n{\n  \"$schema\": \"http:\u002F\u002Fjson-schema.org\u002Fdraft-07\u002Fschema#\",\n  \"$id\": \"items.schema.json\",\n  \"title\": \"Items Configuration\",\n  \"type\": \"array\",\n  \"items\": {\n    \"type\": \"object\",\n    \"required\": [\"id\", \"name\", \"type\"],\n    \"properties\": {\n      \"id\": {\n        \"$ref\": \"base_schema.json#\u002Fdefinitions\u002Fid\",\n        \"description\": \"唯一标识符\"\n      },\n      \"name\": {\n        \"$ref\": \"base_schema.json#\u002Fdefinitions\u002Flocalized_string\",\n        \"description\": \"物品名称\"\n      },\n      \"description\": {\n        \"$ref\": \"base_schema.json#\u002Fdefinitions\u002Flocalized_string\",\n        \"description\": \"物品描述\"\n      },\n      \"type\": {\n        \"type\": \"string\",\n        \"enum\": [\"consumable\", \"equipment\", \"material\", \"quest\", \"key\"],\n        \"description\": \"物品类型\"\n      },\n      \"subtype\": {\n        \"type\": \"string\",\n        \"description\": \"子类型（如装备的部位：weapon, helmet, armor...）\"\n      },\n      \"rarity\": {\n        \"type\": \"integer\",\n        \"minimum\": 1,\n        \"maximum\": 5,\n        \"default\": 1,\n        \"description\": \"稀有度 1-5\"\n      },\n      \"icon\": {\n        \"$ref\": \"base_schema.json#\u002Fdefinitions\u002Fresource_path\",\n        \"description\": \"图标路径\"\n      },\n      \"model\": {\n        \"$ref\": \"base_schema.json#\u002Fdefinitions\u002Fresource_path\",\n        \"description\": \"3D 模型路径\"\n      },\n      \"stackable\": {\n        \"type\": \"boolean\",\n        \"default\": true\n      },\n      \"max_stack\": {\n        \"type\": \"integer\",\n        \"minimum\": 1,\n        \"maximum\": 9999,\n        \"default\": 99\n      },\n      \"price\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"buy\": { \"type\": \"integer\", \"minimum\": 0 },\n          \"sell\": { \"type\": \"integer\", \"minimum\": 0 }\n        }\n      },\n      \"effects\": {\n        \"type\": \"array\",\n        \"items\": { \"$ref\": \"#\u002Fdefinitions\u002Feffect\" }\n      },\n      \"requirements\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"level\": { \"type\": \"integer\", \"minimum\": 1 },\n          \"stats\": { \"type\": \"object\" }\n        }\n      },\n      \"stats\": {\n        \"type\": \"object\",\n        \"description\": \"装备提供的属性加成\"\n      },\n      \"tags\": {\n        \"type\": \"array\",\n        \"items\": { \"type\": \"string\" }\n      }\n    },\n    \"allOf\": [\n      {\n        \"if\": { \"properties\": { \"type\": { \"const\": \"consumable\" } } },\n        \"then\": { \"required\": [\"effects\"] }\n      },\n      {\n        \"if\": { \"properties\": { \"type\": { \"const\": \"equipment\" } } },\n        \"then\": { \"required\": [\"subtype\", \"stats\"] }\n      }\n    ]\n  },\n  \"definitions\": {\n    \"effect\": {\n      \"type\": \"object\",\n      \"required\": [\"type\", \"value\"],\n      \"properties\": {\n        \"type\": {\n          \"type\": \"string\",\n          \"enum\": [\"heal_hp\", \"heal_mp\", \"buff\", \"debuff\", \"damage\", \"teleport\", \"summon\"]\n        },\n        \"value\": { \"type\": \"number\" },\n        \"duration\": { \"type\": \"number\", \"default\": 0 },\n        \"target\": {\n          \"type\": \"string\",\n          \"enum\": [\"self\", \"enemy\", \"ally\", \"all\"],\n          \"default\": \"self\"\n        }\n      }\n    }\n  }\n}\n```\n\n### 关卡配置 Schema (levels.schema.json)\n\n```json\n{\n  \"$schema\": \"http:\u002F\u002Fjson-schema.org\u002Fdraft-07\u002Fschema#\",\n  \"$id\": \"levels.schema.json\",\n  \"title\": \"Levels Configuration\",\n  \"type\": \"array\",\n  \"items\": {\n    \"type\": \"object\",\n    \"required\": [\"id\", \"name\", \"scene_path\"],\n    \"properties\": {\n      \"id\": {\n        \"$ref\": \"base_schema.json#\u002Fdefinitions\u002Fid\"\n      },\n      \"name\": {\n        \"$ref\": \"base_schema.json#\u002Fdefinitions\u002Flocalized_string\"\n      },\n      \"description\": {\n        \"$ref\": \"base_schema.json#\u002Fdefinitions\u002Flocalized_string\"\n      },\n      \"scene_path\": {\n        \"$ref\": \"base_schema.json#\u002Fdefinitions\u002Fresource_path\"\n      },\n      \"chapter\": {\n        \"type\": \"integer\",\n        \"minimum\": 1\n      },\n      \"order\": {\n        \"type\": \"integer\",\n        \"minimum\": 1\n      },\n      \"unlock_requirements\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"previous_level\": { \"type\": \"string\" },\n          \"player_level\": { \"type\": \"integer\" },\n          \"items_required\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"object\",\n              \"properties\": {\n                \"item_id\": { \"type\": \"string\" },\n                \"amount\": { \"type\": \"integer\" }\n              }\n            }\n          }\n        }\n      },\n      \"enemies\": {\n        \"type\": \"array\",\n        \"items\": {\n          \"type\": \"object\",\n          \"properties\": {\n            \"enemy_id\": { \"type\": \"string\" },\n            \"count\": { \"$ref\": \"base_schema.json#\u002Fdefinitions\u002Frange\" },\n            \"spawn_points\": {\n              \"type\": \"array\",\n              \"items\": { \"$ref\": \"base_schema.json#\u002Fdefinitions\u002Fvector3\" }\n            }\n          }\n        }\n      },\n      \"rewards\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"exp\": { \"type\": \"integer\" },\n          \"gold\": { \"$ref\": \"base_schema.json#\u002Fdefinitions\u002Frange\" },\n          \"items\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"object\",\n              \"properties\": {\n                \"item_id\": { \"type\": \"string\" },\n                \"amount\": { \"type\": \"integer\" },\n                \"drop_rate\": { \"type\": \"number\", \"minimum\": 0, \"maximum\": 1 }\n              }\n            }\n          }\n        }\n      },\n      \"time_limit\": {\n        \"type\": \"integer\",\n        \"description\": \"时间限制（秒），0 表示无限制\"\n      },\n      \"objectives\": {\n        \"type\": \"array\",\n        \"items\": {\n          \"type\": \"object\",\n          \"properties\": {\n            \"type\": {\n              \"type\": \"string\",\n              \"enum\": [\"kill_all\", \"kill_count\", \"survive\", \"collect\", \"reach_point\", \"protect\"]\n            },\n            \"target\": { \"type\": \"string\" },\n            \"count\": { \"type\": \"integer\" },\n            \"optional\": { \"type\": \"boolean\", \"default\": false }\n          }\n        }\n      },\n      \"environment\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"music\": { \"$ref\": \"base_schema.json#\u002Fdefinitions\u002Fresource_path\" },\n          \"ambience\": { \"$ref\": \"base_schema.json#\u002Fdefinitions\u002Fresource_path\" },\n          \"lighting\": { \"type\": \"string\", \"enum\": [\"day\", \"night\", \"dungeon\", \"custom\"] }\n        }\n      }\n    }\n  }\n}\n```\n\n### 角色配置 Schema (characters.schema.json)\n\n```json\n{\n  \"$schema\": \"http:\u002F\u002Fjson-schema.org\u002Fdraft-07\u002Fschema#\",\n  \"$id\": \"characters.schema.json\",\n  \"title\": \"Characters Configuration\",\n  \"type\": \"array\",\n  \"items\": {\n    \"type\": \"object\",\n    \"required\": [\"id\", \"name\", \"class\", \"base_stats\"],\n    \"properties\": {\n      \"id\": { \"$ref\": \"base_schema.json#\u002Fdefinitions\u002Fid\" },\n      \"name\": { \"$ref\": \"base_schema.json#\u002Fdefinitions\u002Flocalized_string\" },\n      \"class\": {\n        \"type\": \"string\",\n        \"enum\": [\"warrior\", \"mage\", \"archer\", \"rogue\", \"healer\"]\n      },\n      \"description\": { \"$ref\": \"base_schema.json#\u002Fdefinitions\u002Flocalized_string\" },\n      \"portrait\": { \"$ref\": \"base_schema.json#\u002Fdefinitions\u002Fresource_path\" },\n      \"model\": { \"$ref\": \"base_schema.json#\u002Fdefinitions\u002Fresource_path\" },\n      \"base_stats\": {\n        \"type\": \"object\",\n        \"required\": [\"hp\", \"mp\", \"attack\", \"defense\", \"speed\"],\n        \"properties\": {\n          \"hp\": { \"type\": \"integer\", \"minimum\": 1 },\n          \"mp\": { \"type\": \"integer\", \"minimum\": 0 },\n          \"attack\": { \"type\": \"integer\", \"minimum\": 1 },\n          \"defense\": { \"type\": \"integer\", \"minimum\": 0 },\n          \"speed\": { \"type\": \"integer\", \"minimum\": 1 },\n          \"critical_rate\": { \"type\": \"number\", \"minimum\": 0, \"maximum\": 1 },\n          \"critical_damage\": { \"type\": \"number\", \"minimum\": 1 }\n        }\n      },\n      \"growth_rates\": {\n        \"type\": \"object\",\n        \"description\": \"每级成长率\",\n        \"properties\": {\n          \"hp\": { \"type\": \"number\" },\n          \"mp\": { \"type\": \"number\" },\n          \"attack\": { \"type\": \"number\" },\n          \"defense\": { \"type\": \"number\" },\n          \"speed\": { \"type\": \"number\" }\n        }\n      },\n      \"skills\": {\n        \"type\": \"array\",\n        \"items\": {\n          \"type\": \"object\",\n          \"properties\": {\n            \"skill_id\": { \"type\": \"string\" },\n            \"unlock_level\": { \"type\": \"integer\" }\n          }\n        }\n      },\n      \"equipment_slots\": {\n        \"type\": \"array\",\n        \"items\": {\n          \"type\": \"string\",\n          \"enum\": [\"weapon\", \"helmet\", \"armor\", \"gloves\", \"boots\", \"accessory1\", \"accessory2\"]\n        }\n      }\n    }\n  }\n}\n```\n\n### 敌人配置 Schema (enemies.schema.json)\n\n```json\n{\n  \"$schema\": \"http:\u002F\u002Fjson-schema.org\u002Fdraft-07\u002Fschema#\",\n  \"$id\": \"enemies.schema.json\",\n  \"title\": \"Enemies Configuration\",\n  \"type\": \"array\",\n  \"items\": {\n    \"type\": \"object\",\n    \"required\": [\"id\", \"name\", \"type\", \"stats\"],\n    \"properties\": {\n      \"id\": { \"$ref\": \"base_schema.json#\u002Fdefinitions\u002Fid\" },\n      \"name\": { \"$ref\": \"base_schema.json#\u002Fdefinitions\u002Flocalized_string\" },\n      \"type\": {\n        \"type\": \"string\",\n        \"enum\": [\"normal\", \"elite\", \"boss\", \"miniboss\"]\n      },\n      \"model\": { \"$ref\": \"base_schema.json#\u002Fdefinitions\u002Fresource_path\" },\n      \"stats\": {\n        \"type\": \"object\",\n        \"required\": [\"hp\", \"attack\", \"defense\"],\n        \"properties\": {\n          \"hp\": { \"type\": \"integer\" },\n          \"attack\": { \"type\": \"integer\" },\n          \"defense\": { \"type\": \"integer\" },\n          \"speed\": { \"type\": \"integer\" },\n          \"exp_reward\": { \"type\": \"integer\" },\n          \"gold_reward\": { \"$ref\": \"base_schema.json#\u002Fdefinitions\u002Frange\" }\n        }\n      },\n      \"level_scaling\": {\n        \"type\": \"object\",\n        \"description\": \"属性随等级的缩放系数\"\n      },\n      \"behavior\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"ai_type\": {\n            \"type\": \"string\",\n            \"enum\": [\"aggressive\", \"defensive\", \"passive\", \"patrol\", \"guard\"]\n          },\n          \"detection_range\": { \"type\": \"number\" },\n          \"attack_range\": { \"type\": \"number\" },\n          \"attack_interval\": { \"type\": \"number\" }\n        }\n      },\n      \"skills\": {\n        \"type\": \"array\",\n        \"items\": {\n          \"type\": \"object\",\n          \"properties\": {\n            \"skill_id\": { \"type\": \"string\" },\n            \"cooldown\": { \"type\": \"number\" },\n            \"use_condition\": { \"type\": \"string\" }\n          }\n        }\n      },\n      \"drops\": {\n        \"type\": \"array\",\n        \"items\": {\n          \"type\": \"object\",\n          \"properties\": {\n            \"item_id\": { \"type\": \"string\" },\n            \"amount\": { \"$ref\": \"base_schema.json#\u002Fdefinitions\u002Frange\" },\n            \"drop_rate\": { \"type\": \"number\", \"minimum\": 0, \"maximum\": 1 }\n          }\n        }\n      },\n      \"resistances\": {\n        \"type\": \"object\",\n        \"description\": \"元素\u002F状态抗性\"\n      },\n      \"weaknesses\": {\n        \"type\": \"array\",\n        \"items\": { \"type\": \"string\" }\n      }\n    }\n  }\n}\n```\n\n### 技能配置 Schema (skills.schema.json)\n\n```json\n{\n  \"$schema\": \"http:\u002F\u002Fjson-schema.org\u002Fdraft-07\u002Fschema#\",\n  \"$id\": \"skills.schema.json\",\n  \"title\": \"Skills Configuration\",\n  \"type\": \"array\",\n  \"items\": {\n    \"type\": \"object\",\n    \"required\": [\"id\", \"name\", \"type\", \"effects\"],\n    \"properties\": {\n      \"id\": { \"$ref\": \"base_schema.json#\u002Fdefinitions\u002Fid\" },\n      \"name\": { \"$ref\": \"base_schema.json#\u002Fdefinitions\u002Flocalized_string\" },\n      \"description\": { \"$ref\": \"base_schema.json#\u002Fdefinitions\u002Flocalized_string\" },\n      \"icon\": { \"$ref\": \"base_schema.json#\u002Fdefinitions\u002Fresource_path\" },\n      \"type\": {\n        \"type\": \"string\",\n        \"enum\": [\"active\", \"passive\", \"ultimate\"]\n      },\n      \"element\": {\n        \"type\": \"string\",\n        \"enum\": [\"physical\", \"fire\", \"ice\", \"lightning\", \"holy\", \"dark\", \"none\"]\n      },\n      \"target_type\": {\n        \"type\": \"string\",\n        \"enum\": [\"self\", \"single_enemy\", \"single_ally\", \"all_enemies\", \"all_allies\", \"area\"]\n      },\n      \"cost\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"mp\": { \"type\": \"integer\" },\n          \"hp\": { \"type\": \"integer\" },\n          \"special\": { \"type\": \"integer\" }\n        }\n      },\n      \"cooldown\": {\n        \"type\": \"number\",\n        \"minimum\": 0\n      },\n      \"cast_time\": {\n        \"type\": \"number\",\n        \"minimum\": 0\n      },\n      \"range\": {\n        \"type\": \"number\"\n      },\n      \"area_of_effect\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"shape\": { \"type\": \"string\", \"enum\": [\"circle\", \"cone\", \"line\", \"rectangle\"] },\n          \"size\": { \"type\": \"number\" }\n        }\n      },\n      \"effects\": {\n        \"type\": \"array\",\n        \"items\": {\n          \"type\": \"object\",\n          \"properties\": {\n            \"type\": {\n              \"type\": \"string\",\n              \"enum\": [\"damage\", \"heal\", \"buff\", \"debuff\", \"dot\", \"hot\", \"knockback\", \"stun\", \"summon\"]\n            },\n            \"value\": { \"type\": \"number\" },\n            \"scaling\": {\n              \"type\": \"object\",\n              \"properties\": {\n                \"stat\": { \"type\": \"string\" },\n                \"ratio\": { \"type\": \"number\" }\n              }\n            },\n            \"duration\": { \"type\": \"number\" },\n            \"tick_interval\": { \"type\": \"number\" }\n          }\n        }\n      },\n      \"animation\": { \"$ref\": \"base_schema.json#\u002Fdefinitions\u002Fresource_path\" },\n      \"sound_effect\": { \"$ref\": \"base_schema.json#\u002Fdefinitions\u002Fresource_path\" },\n      \"visual_effect\": { \"$ref\": \"base_schema.json#\u002Fdefinitions\u002Fresource_path\" }\n    }\n  }\n}\n```\n\n---\n\n## 配置数据示例\n\n### items.json 示例\n\n```json\n[\n  {\n    \"id\": \"potion_health_small\",\n    \"name\": { \"key\": \"ITEM_HEALTH_POTION_SMALL\", \"default\": \"小型生命药水\" },\n    \"description\": { \"key\": \"ITEM_HEALTH_POTION_SMALL_DESC\", \"default\": \"恢复少量生命值\" },\n    \"type\": \"consumable\",\n    \"rarity\": 1,\n    \"icon\": \"res:\u002F\u002Fassets\u002Ftextures\u002Fitems\u002Fpotion_health_small.png\",\n    \"stackable\": true,\n    \"max_stack\": 99,\n    \"price\": { \"buy\": 50, \"sell\": 25 },\n    \"effects\": [\n      { \"type\": \"heal_hp\", \"value\": 50, \"target\": \"self\" }\n    ],\n    \"tags\": [\"consumable\", \"healing\", \"common\"]\n  },\n  {\n    \"id\": \"sword_iron\",\n    \"name\": { \"key\": \"ITEM_SWORD_IRON\", \"default\": \"铁剑\" },\n    \"description\": { \"key\": \"ITEM_SWORD_IRON_DESC\", \"default\": \"普通的铁制长剑\" },\n    \"type\": \"equipment\",\n    \"subtype\": \"weapon\",\n    \"rarity\": 2,\n    \"icon\": \"res:\u002F\u002Fassets\u002Ftextures\u002Fitems\u002Fsword_iron.png\",\n    \"model\": \"res:\u002F\u002Fassets\u002Fmodels\u002Fitems\u002Fsword_iron.glb\",\n    \"stackable\": false,\n    \"price\": { \"buy\": 200, \"sell\": 100 },\n    \"requirements\": { \"level\": 5 },\n    \"stats\": {\n      \"attack\": 15,\n      \"critical_rate\": 0.05\n    },\n    \"tags\": [\"weapon\", \"sword\", \"iron\"]\n  }\n]\n```\n\n---\n\n## 配置验证器\n\n### GDScript 验证器\n\n```gdscript\n## 配置表验证器\nclass_name ConfigValidator\nextends RefCounted\n\nvar _schemas: Dictionary = {}\nvar _errors: Array = []\n\nfunc load_schemas(schema_dir: String = \"res:\u002F\u002Fconfig\u002Fschemas\u002F\") -> void:\n    var dir = DirAccess.open(schema_dir)\n    if dir:\n        dir.list_dir_begin()\n        var file_name = dir.get_next()\n        while file_name != \"\":\n            if file_name.ends_with(\".schema.json\"):\n                var schema_path = schema_dir.path_join(file_name)\n                var schema_name = file_name.replace(\".schema.json\", \"\")\n                _schemas[schema_name] = _load_json(schema_path)\n            file_name = dir.get_next()\n        dir.list_dir_end()\n\nfunc validate_config(config_name: String, data: Array) -> Dictionary:\n    _errors.clear()\n    \n    if not _schemas.has(config_name):\n        return {\"valid\": false, \"errors\": [\"Schema not found: \" + config_name]}\n    \n    var schema = _schemas[config_name]\n    \n    for i in range(data.size()):\n        var item = data[i]\n        _validate_item(item, schema, \"[%d]\" % i)\n    \n    return {\n        \"valid\": _errors.is_empty(),\n        \"errors\": _errors.duplicate()\n    }\n\nfunc _validate_item(item: Dictionary, schema: Dictionary, path: String) -> void:\n    var item_schema = schema.get(\"items\", {})\n    var required = item_schema.get(\"required\", [])\n    var properties = item_schema.get(\"properties\", {})\n    \n    # 检查必需字段\n    for field in required:\n        if not item.has(field):\n            _errors.append(\"%s: Missing required field '%s'\" % [path, field])\n    \n    # 检查每个字段的类型和约束\n    for key in item.keys():\n        if properties.has(key):\n            var prop_schema = properties[key]\n            _validate_property(item[key], prop_schema, \"%s.%s\" % [path, key])\n\nfunc _validate_property(value: Variant, schema: Dictionary, path: String) -> void:\n    var expected_type = schema.get(\"type\", \"\")\n    \n    # 类型检查\n    match expected_type:\n        \"string\":\n            if typeof(value) != TYPE_STRING:\n                _errors.append(\"%s: Expected string, got %s\" % [path, type_string(typeof(value))])\n            elif schema.has(\"pattern\"):\n                var regex = RegEx.new()\n                regex.compile(schema.pattern)\n                if not regex.search(value):\n                    _errors.append(\"%s: Value does not match pattern\" % path)\n            if schema.has(\"enum\") and value not in schema.enum:\n                _errors.append(\"%s: Value must be one of %s\" % [path, schema.enum])\n        \"integer\", \"number\":\n            if typeof(value) not in [TYPE_INT, TYPE_FLOAT]:\n                _errors.append(\"%s: Expected number, got %s\" % [path, type_string(typeof(value))])\n            else:\n                if schema.has(\"minimum\") and value \u003C schema.minimum:\n                    _errors.append(\"%s: Value must be >= %s\" % [path, schema.minimum])\n                if schema.has(\"maximum\") and value > schema.maximum:\n                    _errors.append(\"%s: Value must be \u003C= %s\" % [path, schema.maximum])\n        \"boolean\":\n            if typeof(value) != TYPE_BOOL:\n                _errors.append(\"%s: Expected boolean\" % path)\n        \"array\":\n            if typeof(value) != TYPE_ARRAY:\n                _errors.append(\"%s: Expected array\" % path)\n        \"object\":\n            if typeof(value) != TYPE_DICTIONARY:\n                _errors.append(\"%s: Expected object\" % path)\n\nfunc _load_json(path: String) -> Variant:\n    var file = FileAccess.open(path, FileAccess.READ)\n    if file:\n        var json = JSON.new()\n        json.parse(file.get_as_text())\n        file.close()\n        return json.data\n    return null\n```\n\n---\n\n## 配置管理器\n\n```gdscript\n## 配置管理器 - Autoload\nclass_name ConfigManager\nextends Node\n\nvar _configs: Dictionary = {}\nvar _validator: ConfigValidator\n\nfunc _ready() -> void:\n    _validator = ConfigValidator.new()\n    _validator.load_schemas()\n    _load_all_configs()\n\nfunc _load_all_configs() -> void:\n    var config_files = [\n        \"items\",\n        \"levels\", \n        \"characters\",\n        \"enemies\",\n        \"skills\"\n    ]\n    \n    for config_name in config_files:\n        var path = \"res:\u002F\u002Fconfig\u002Fdata\u002F%s.json\" % config_name\n        if FileAccess.file_exists(path):\n            var data = _load_json(path)\n            if data:\n                var result = _validator.validate_config(config_name, data)\n                if result.valid:\n                    _configs[config_name] = _index_by_id(data)\n                else:\n                    push_error(\"Config validation failed for %s: %s\" % [config_name, result.errors])\n\nfunc _index_by_id(data: Array) -> Dictionary:\n    var indexed = {}\n    for item in data:\n        if item.has(\"id\"):\n            indexed[item.id] = item\n    return indexed\n\nfunc get_item(id: String) -> Dictionary:\n    return _configs.get(\"items\", {}).get(id, {})\n\nfunc get_level(id: String) -> Dictionary:\n    return _configs.get(\"levels\", {}).get(id, {})\n\nfunc get_character(id: String) -> Dictionary:\n    return _configs.get(\"characters\", {}).get(id, {})\n\nfunc get_enemy(id: String) -> Dictionary:\n    return _configs.get(\"enemies\", {}).get(id, {})\n\nfunc get_skill(id: String) -> Dictionary:\n    return _configs.get(\"skills\", {}).get(id, {})\n\nfunc get_all(config_name: String) -> Dictionary:\n    return _configs.get(config_name, {})\n\nfunc _load_json(path: String) -> Variant:\n    var file = FileAccess.open(path, FileAccess.READ)\n    if file:\n        var json = JSON.new()\n        if json.parse(file.get_as_text()) == OK:\n            file.close()\n            return json.data\n        file.close()\n    return null\n```\n\n---\n\n## 使用示例\n\n### 生成物品配置\n\n```\n生成一组 RPG 物品配置：\n- 3 种恢复药水（小\u002F中\u002F大）\n- 2 把武器（铁剑、魔法杖）\n- 1 套防具（皮甲）\n```\n\n### 生成关卡配置\n\n```\n生成第一章的 5 个关卡配置，难度递增：\n- 第 1 关：新手教程，3 只史莱姆\n- 第 2 关：森林入口，5 只哥布林\n- ...\n```\n",{"name":5,"inputs":49,"outputs":63,"version":70,"triggers":71,"description":74,"dependencies":75},[50,61],{"enum":51,"name":58,"type":59,"required":60},[52,53,27,54,55,56,32,57],"items","levels","enemies","skills","dialogues","shops","config_type","string",true,{"name":37,"type":62,"required":45},"array",[64,67],{"name":65,"type":59,"description":66},"config_path","生成的配置文件路径",{"name":68,"type":59,"description":69},"schema_path","对应的 Schema 文件路径","1.0.0",[72],{"pattern":73},"配置表|配置文件|JSON配置|数据表|物品表|关卡配置","配置表生成技能。生成符合 JSON Schema 规范的配置文件， 支持物品、关卡、角色等游戏数据的结构化配置。\n",[76,77],"godot-core","file-manager","main","18d0e63d1313ca87098f614aa7c1e2dcf6de79c7","backend\u002Fskills\u002Fmarketplace\u002Fcodebuddy-plugins-official\u002Fplugins\u002Fgodot-mcp\u002Fskills\u002Fgodot-dev\u002Flevel-1-generators\u002Fconfig-generator",1,"https:\u002F\u002Fgithub.com\u002Fwelflau\u002Fai-dev-system","https:\u002F\u002Fgithub.com\u002Fwelflau","2026-11-12 14:55:20",{"source":8,"skillName":5,"commands":86,"prompt":96,"zipAvailable":60},[87,90,93],{"tool":88,"command":89},"npx","npx skills add welflau\u002Fai-dev-system --skill config-generator",{"tool":91,"command":92},"bunx","bunx skills add welflau\u002Fai-dev-system --skill config-generator",{"tool":94,"command":95},"pnpm","pnpm dlx skills add welflau\u002Fai-dev-system --skill config-generator","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fwelflau\u002Fai-dev-system\u002Fblob\u002Fmain\u002Fbackend\u002Fskills\u002Fmarketplace\u002Fcodebuddy-plugins-official\u002Fplugins\u002Fgodot-mcp\u002Fskills\u002Fgodot-dev\u002Flevel-1-generators\u002Fconfig-generator\u002FSKILL.md",[98],{"path":99,"resourceType":100,"resourceTypeDesc":101,"sizeBytes":102,"sourceHtmlUrl":103},"templates\u002FTEMPLATES.md","REFERENCE","参考文档",15294,"https:\u002F\u002Fgithub.com\u002Fwelflau\u002Fai-dev-system\u002Fblob\u002Fmain\u002Fbackend\u002Fskills\u002Fmarketplace\u002Fcodebuddy-plugins-official\u002Fplugins\u002Fgodot-mcp\u002Fskills\u002Fgodot-dev\u002Flevel-1-generators\u002Fconfig-generator\u002Ftemplates\u002FTEMPLATES.md",[105,139,169,194,220,244],{"skillNo":106,"name":107,"nameZh":6,"description":108,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":109,"licenseFileUrl":110,"sourceHtmlUrl":111,"categories":112,"keywords":118,"publishedAt":44},"01M6HSTDP4M3JFXEBK91VFB4PA","web-artifacts-builder","Suite of tools for creating elaborate, multi-component claude.ai HTML artifacts using modern frontend web technologies (React, Tailwind CSS, shadcn\u002Fui). Use for complex artifacts requiring state management, routing, or shadcn\u002Fui components - not for simple single-file HTML\u002FJSX artifacts.","Apache-2.0","https:\u002F\u002Fgithub.com\u002Fwelflau\u002Fai-dev-system\u002Fblob\u002Fmain\u002Fbackend\u002Fskills\u002Fmarketplace\u002Fcodebuddy-plugins-official\u002Fplugins\u002Fweb-artifacts-builder\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fwelflau\u002Fai-dev-system\u002Fblob\u002Fmain\u002Fbackend\u002Fskills\u002Fmarketplace\u002Fcodebuddy-plugins-official\u002Fplugins\u002Fweb-artifacts-builder\u002FSKILL.md",[113],{"categoryNo":114,"categoryName":115,"taxonomyType":116,"taxonomyTypeDesc":117},"01JBSEEDCAT000000000000009","前端开发","SCENARIO","使用场景",[119,120,121,122,123,124,125,126,127,128,129,130,41,131,132,133,134,135,136,137,138],"web artifacts builder","web","artifacts","artifacts builder","builder","frontend","css","components","react","routing","state management","state","Tailwind","use","single-file","simple","ui components","multi","for","single",{"skillNo":140,"name":141,"nameZh":6,"description":142,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":109,"licenseFileUrl":143,"sourceHtmlUrl":144,"categories":145,"keywords":153,"publishedAt":44},"01M6HSDXH0JSP8R3QTNY9XZ8HN","frontend-design","Create distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, artifacts, posters, or applications (examples include websites, landing pages, dashboards, React components, HTML\u002FCSS layouts, or when styling\u002Fbeautifying any web UI). Generates creative, polished code and UI design that avoids generic AI aesthetics.","https:\u002F\u002Fgithub.com\u002Fwelflau\u002Fai-dev-system\u002Fblob\u002Fmain\u002Fbackend\u002Fskills\u002Fmarketplace\u002Fcodebuddy-plugins-official\u002Fplugins\u002Ffrontend-design\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fwelflau\u002Fai-dev-system\u002Fblob\u002Fmain\u002Fbackend\u002Fskills\u002Fmarketplace\u002Fcodebuddy-plugins-official\u002Fplugins\u002Ffrontend-design\u002FSKILL.md",[146,147,150],{"categoryNo":114,"categoryName":115,"taxonomyType":116,"taxonomyTypeDesc":117},{"categoryNo":148,"categoryName":149,"taxonomyType":116,"taxonomyTypeDesc":117},"01JBSEEDCAT000000000000015","视觉设计",{"categoryNo":151,"categoryName":152,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000032","设计师",[124,154,155,125,120,126,127,156,157,158,121,159,160,161,132,162,163,164,165,166,167,168],"design","frontend design","react components","create","code","examples","applications","landing","ui design","pages","aesthetics","web ui","with","generic","when",{"skillNo":170,"name":171,"nameZh":6,"description":172,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":109,"licenseFileUrl":173,"sourceHtmlUrl":174,"categories":175,"keywords":177,"publishedAt":44},"01M6HSA77QYVP7A72HREGTDN2C","algorithmic-art","Creating algorithmic art using p5.js with seeded randomness and interactive parameter exploration. Use this when users request creating art using code, generative art, algorithmic art, flow fields, or particle systems. Create original algorithmic art rather than copying existing artists' work to avoid copyright violations.","https:\u002F\u002Fgithub.com\u002Fwelflau\u002Fai-dev-system\u002Fblob\u002Fmain\u002Fbackend\u002Fskills\u002Fmarketplace\u002Fcodebuddy-plugins-official\u002Fplugins\u002Falgorithmic-art\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fwelflau\u002Fai-dev-system\u002Fblob\u002Fmain\u002Fbackend\u002Fskills\u002Fmarketplace\u002Fcodebuddy-plugins-official\u002Fplugins\u002Falgorithmic-art\u002FSKILL.md",[176],{"categoryNo":148,"categoryName":149,"taxonomyType":116,"taxonomyTypeDesc":117},[178,179,180,157,158,181,182,183,184,132,185,186,187,188,166,189,190,191,192,193,168],"algorithmic art","Art","algorithmic","flow","js","work","interactive","generative art","exploration","systems","users","Existing","request","generative","copyright","fields",{"skillNo":195,"name":196,"nameZh":6,"description":197,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":109,"licenseFileUrl":198,"sourceHtmlUrl":199,"categories":200,"keywords":202,"publishedAt":44},"01M6HS9HE0X390Y6RQKTY1YNGJ","theme-factory","Toolkit for styling artifacts with a theme. These artifacts can be slides, docs, reportings, HTML landing pages, etc. There are 10 pre-set themes with colors\u002Ffonts that you can apply to any artifact that has been creating, or can generate a new theme on-the-fly.","https:\u002F\u002Fgithub.com\u002Fwelflau\u002Fai-dev-system\u002Fblob\u002Fmain\u002Fbackend\u002Fskills\u002Fmarketplace\u002Fcodebuddy-plugins-official\u002Fexternal_plugins\u002Ftheme-factory\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fwelflau\u002Fai-dev-system\u002Fblob\u002Fmain\u002Fbackend\u002Fskills\u002Fmarketplace\u002Fcodebuddy-plugins-official\u002Fexternal_plugins\u002Ftheme-factory\u002FSKILL.md",[201],{"categoryNo":148,"categoryName":149,"taxonomyType":116,"taxonomyTypeDesc":117},[203,204,205,206,207,208,121,209,210,211,161,212,213,163,214,166,215,216,217,137,218,219],"theme factory","factory","theme","docs","toolkit","generate","SET","fly","slides","styling","artifact","themes","you","fonts","can","apply","new",{"skillNo":221,"name":222,"nameZh":6,"description":223,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":224,"categories":225,"keywords":229,"publishedAt":44},"01M6HS74GASM6FJ77F83EY679E","browsing","Use when you need direct browser control - teaches Chrome DevTools Protocol for controlling existing browser sessions, multi-tab management, form automation, and content extraction via use_browser MCP tool","https:\u002F\u002Fgithub.com\u002Fwelflau\u002Fai-dev-system\u002Fblob\u002Fmain\u002Fbackend\u002Fskills\u002Fmarketplace\u002Fcodebuddy-plugins-official\u002Fexternal_plugins\u002Fsuperpowers-chrome\u002Fskills\u002Fbrowsing\u002FSKILL.md",[226],{"categoryNo":227,"categoryName":228,"taxonomyType":116,"taxonomyTypeDesc":117},"01JBSEEDCAT000000000000023","Skill与智能体开发",[222,230,231,232,233,234,235,236,237,238,239,132,240,241,242,243,136,215,137,189],"MCP","automation","chrome","sessions","protocol","browser","devtools","chrome devtools","tool","direct","browser control","control","via","form",{"skillNo":245,"name":246,"nameZh":6,"description":247,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":109,"licenseFileUrl":248,"sourceHtmlUrl":249,"categories":250,"keywords":257,"publishedAt":44},"01M6HS6BZT2CKDNQ6YF20DXN4T","slack-gif-creator","Knowledge and utilities for creating animated GIFs optimized for Slack. Provides constraints, validation tools, and animation concepts. Use when users request animated GIFs for Slack like \"make me a GIF of X doing Y for Slack.\"","https:\u002F\u002Fgithub.com\u002Fwelflau\u002Fai-dev-system\u002Fblob\u002Fmain\u002Fbackend\u002Fskills\u002Fmarketplace\u002Fcodebuddy-plugins-official\u002Fexternal_plugins\u002Fslack-gif-creator\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fwelflau\u002Fai-dev-system\u002Fblob\u002Fmain\u002Fbackend\u002Fskills\u002Fmarketplace\u002Fcodebuddy-plugins-official\u002Fexternal_plugins\u002Fslack-gif-creator\u002FSKILL.md",[251,254],{"categoryNo":252,"categoryName":253,"taxonomyType":116,"taxonomyTypeDesc":117},"01JBSEEDCAT000000000000005","邮件与沟通",{"categoryNo":255,"categoryName":256,"taxonomyType":116,"taxonomyTypeDesc":117},"01JBSEEDCAT000000000000016","图像与多媒体",[258,259,260,261,262,263,264,265,266,132,267,188,268,269,270,137,190,168],"slack gif creator","slack","gif","creator","validation","Tools","constraints","Animation","knowledge","me","make","Utilities","concepts"]