[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-flutter-dart-skills-lint-validation":3,"mdc--ffnyya-key":32,"related-org-flutter-dart-skills-lint-validation":842,"related-repo-flutter-dart-skills-lint-validation":971},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":22,"repoUrl":23,"updatedAt":24,"license":25,"forks":26,"topics":27,"repo":28,"sourceUrl":30,"mdContent":31},"dart-skills-lint-validation","validate agent skills with dart_skills_lint","Use this skill when you need to validate AI agent skills with dart_skills_lint — running the linter, interpreting failures, fixing violations, and authoring custom rules.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"flutter","Flutter (Google)","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fflutter.png",[12,16,19],{"name":13,"slug":14,"type":15},"QA","qa","tag",{"name":17,"slug":18,"type":15},"Plugin Development","plugin-development",{"name":20,"slug":21,"type":15},"Dart","dart",2664,"https:\u002F\u002Fgithub.com\u002Fflutter\u002Fagent-plugins","2026-07-21T05:38:34.451024",null,155,[],{"repoUrl":23,"stars":22,"forks":26,"topics":29,"description":25},[],"https:\u002F\u002Fgithub.com\u002Fflutter\u002Fagent-plugins\u002Ftree\u002FHEAD\u002Ftool\u002Fdart_skills_lint\u002Fskills\u002Fdart-skills-lint-validation","---\nname: dart-skills-lint-validation\ndescription: |-\n  Use this skill when you need to validate AI agent skills with dart_skills_lint — running the linter, interpreting failures, fixing violations, and authoring custom rules.\nmetadata:\n  internal: true\n---\n\n# Validating Skills with dart_skills_lint\n\nThis skill covers **day-to-day use**: running the linter, walking\nthrough a failing run, and writing a custom rule when defaults\naren't enough. For first-time wiring (adding the dep, creating the\nconfig file, generating a baseline) see\n[`dart-skills-lint-setup`](..\u002Fdart-skills-lint-setup\u002FSKILL.md). The\nfull rule reference (default severities, diagnostic shapes,\nfixability) lives in [`RULES.md`](..\u002F..\u002FRULES.md).\n\n## Running the linter\n\nIf `dart_skills_lint` is in `pubspec.yaml`:\n\n```bash\ndart run dart_skills_lint:cli -d .agents\u002Fskills\n```\n\nIf it's installed globally with `dart pub global activate`:\n\n```bash\ndart pub global run dart_skills_lint:cli -d .agents\u002Fskills\n```\n\nRun `dart run dart_skills_lint:cli --help` for the full flag list\n(skip the inline duplicate so it never goes stale).\n\n## Workflow for a failing run\n\n1. **Run the validator.**\n2. **Read the errors.** Each diagnostic names the rule that fired,\n   the offending value, and a suggested fix when one applies.\n3. **Fix the violations.** For fixable rules\n   (`check-absolute-paths`, `check-trailing-whitespace`,\n   `invalid-skill-name`), pass `--fix` to write the corrections\n   to disk; add `--dry-run` to preview the diff first.\n4. **Re-run** to confirm the run is clean.\n\n### Task progress\n\n- [ ] Run validator\n- [ ] Read errors\n- [ ] Fix violations (manual or `--fix` \u002F `--fix --dry-run`)\n- [ ] Verify clean run\n\n## Authoring a custom rule\n\nExtend `SkillRule` and pass the rule into `validateSkills`:\n\n```dart\nimport 'package:dart_skills_lint\u002Fdart_skills_lint.dart';\n\nclass DeprecatedSkillRule extends SkillRule {\n  @override\n  final String name = 'deprecated-skill';\n\n  @override\n  final AnalysisSeverity severity = AnalysisSeverity.warning;\n\n  @override\n  Future\u003CList\u003CValidationError>> validate(SkillContext context) async {\n    final errors = \u003CValidationError>[];\n    final yaml = context.parsedYaml;\n    if (yaml == null) return errors;\n\n    if (yaml['metadata']?['deprecated'] == true) {\n      errors.add(ValidationError(\n        ruleId: name,\n        severity: severity,\n        file: 'SKILL.md',\n        message: 'This skill is marked as deprecated.',\n      ));\n    }\n    return errors;\n  }\n}\n```\n\nWire it up in a Dart test:\n\n```dart\nimport 'package:dart_skills_lint\u002Fdart_skills_lint.dart';\nimport 'package:test\u002Ftest.dart';\n\nvoid main() {\n  test('skills pass with deprecated-skill custom rule', () async {\n    final config = await ConfigParser.loadConfig();\n    expect(\n      config.directoryConfigs,\n      isNotEmpty,\n      reason: 'Configuration directoryConfigs should not be empty.',\n    );\n    await validateSkills(\n      config: config,\n      customRules: [DeprecatedSkillRule()],\n    );\n  });\n}\n```\n\n## Related\n\n- [`dart-skills-lint-setup`](..\u002Fdart-skills-lint-setup\u002FSKILL.md) —\n  first-time wiring.\n- [`RULES.md`](..\u002F..\u002FRULES.md) — canonical rule reference.\n- [`README.md`](..\u002F..\u002FREADME.md) — installation, configuration,\n  integration recipes.\n",{"data":33,"body":36},{"name":4,"description":6,"metadata":34},{"internal":35},true,{"type":37,"children":38},"root",[39,48,88,95,116,159,171,211,224,230,313,320,380,386,406,642,647,786,792,836],{"type":40,"tag":41,"props":42,"children":44},"element","h1",{"id":43},"validating-skills-with-dart_skills_lint",[45],{"type":46,"value":47},"text","Validating Skills with dart_skills_lint",{"type":40,"tag":49,"props":50,"children":51},"p",{},[52,54,60,62,74,76,86],{"type":46,"value":53},"This skill covers ",{"type":40,"tag":55,"props":56,"children":57},"strong",{},[58],{"type":46,"value":59},"day-to-day use",{"type":46,"value":61},": running the linter, walking\nthrough a failing run, and writing a custom rule when defaults\naren't enough. For first-time wiring (adding the dep, creating the\nconfig file, generating a baseline) see\n",{"type":40,"tag":63,"props":64,"children":66},"a",{"href":65},"..\u002Fdart-skills-lint-setup\u002FSKILL.md",[67],{"type":40,"tag":68,"props":69,"children":71},"code",{"className":70},[],[72],{"type":46,"value":73},"dart-skills-lint-setup",{"type":46,"value":75},". The\nfull rule reference (default severities, diagnostic shapes,\nfixability) lives in ",{"type":40,"tag":63,"props":77,"children":79},{"href":78},"..\u002F..\u002FRULES.md",[80],{"type":40,"tag":68,"props":81,"children":83},{"className":82},[],[84],{"type":46,"value":85},"RULES.md",{"type":46,"value":87},".",{"type":40,"tag":89,"props":90,"children":92},"h2",{"id":91},"running-the-linter",[93],{"type":46,"value":94},"Running the linter",{"type":40,"tag":49,"props":96,"children":97},{},[98,100,106,108,114],{"type":46,"value":99},"If ",{"type":40,"tag":68,"props":101,"children":103},{"className":102},[],[104],{"type":46,"value":105},"dart_skills_lint",{"type":46,"value":107}," is in ",{"type":40,"tag":68,"props":109,"children":111},{"className":110},[],[112],{"type":46,"value":113},"pubspec.yaml",{"type":46,"value":115},":",{"type":40,"tag":117,"props":118,"children":123},"pre",{"className":119,"code":120,"language":121,"meta":122,"style":122},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","dart run dart_skills_lint:cli -d .agents\u002Fskills\n","bash","",[124],{"type":40,"tag":68,"props":125,"children":126},{"__ignoreMap":122},[127],{"type":40,"tag":128,"props":129,"children":132},"span",{"class":130,"line":131},"line",1,[133,138,144,149,154],{"type":40,"tag":128,"props":134,"children":136},{"style":135},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[137],{"type":46,"value":21},{"type":40,"tag":128,"props":139,"children":141},{"style":140},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[142],{"type":46,"value":143}," run",{"type":40,"tag":128,"props":145,"children":146},{"style":140},[147],{"type":46,"value":148}," dart_skills_lint:cli",{"type":40,"tag":128,"props":150,"children":151},{"style":140},[152],{"type":46,"value":153}," -d",{"type":40,"tag":128,"props":155,"children":156},{"style":140},[157],{"type":46,"value":158}," .agents\u002Fskills\n",{"type":40,"tag":49,"props":160,"children":161},{},[162,164,170],{"type":46,"value":163},"If it's installed globally with ",{"type":40,"tag":68,"props":165,"children":167},{"className":166},[],[168],{"type":46,"value":169},"dart pub global activate",{"type":46,"value":115},{"type":40,"tag":117,"props":172,"children":174},{"className":119,"code":173,"language":121,"meta":122,"style":122},"dart pub global run dart_skills_lint:cli -d .agents\u002Fskills\n",[175],{"type":40,"tag":68,"props":176,"children":177},{"__ignoreMap":122},[178],{"type":40,"tag":128,"props":179,"children":180},{"class":130,"line":131},[181,185,190,195,199,203,207],{"type":40,"tag":128,"props":182,"children":183},{"style":135},[184],{"type":46,"value":21},{"type":40,"tag":128,"props":186,"children":187},{"style":140},[188],{"type":46,"value":189}," pub",{"type":40,"tag":128,"props":191,"children":192},{"style":140},[193],{"type":46,"value":194}," global",{"type":40,"tag":128,"props":196,"children":197},{"style":140},[198],{"type":46,"value":143},{"type":40,"tag":128,"props":200,"children":201},{"style":140},[202],{"type":46,"value":148},{"type":40,"tag":128,"props":204,"children":205},{"style":140},[206],{"type":46,"value":153},{"type":40,"tag":128,"props":208,"children":209},{"style":140},[210],{"type":46,"value":158},{"type":40,"tag":49,"props":212,"children":213},{},[214,216,222],{"type":46,"value":215},"Run ",{"type":40,"tag":68,"props":217,"children":219},{"className":218},[],[220],{"type":46,"value":221},"dart run dart_skills_lint:cli --help",{"type":46,"value":223}," for the full flag list\n(skip the inline duplicate so it never goes stale).",{"type":40,"tag":89,"props":225,"children":227},{"id":226},"workflow-for-a-failing-run",[228],{"type":46,"value":229},"Workflow for a failing run",{"type":40,"tag":231,"props":232,"children":233},"ol",{},[234,243,253,303],{"type":40,"tag":235,"props":236,"children":237},"li",{},[238],{"type":40,"tag":55,"props":239,"children":240},{},[241],{"type":46,"value":242},"Run the validator.",{"type":40,"tag":235,"props":244,"children":245},{},[246,251],{"type":40,"tag":55,"props":247,"children":248},{},[249],{"type":46,"value":250},"Read the errors.",{"type":46,"value":252}," Each diagnostic names the rule that fired,\nthe offending value, and a suggested fix when one applies.",{"type":40,"tag":235,"props":254,"children":255},{},[256,261,263,269,271,277,279,285,287,293,295,301],{"type":40,"tag":55,"props":257,"children":258},{},[259],{"type":46,"value":260},"Fix the violations.",{"type":46,"value":262}," For fixable rules\n(",{"type":40,"tag":68,"props":264,"children":266},{"className":265},[],[267],{"type":46,"value":268},"check-absolute-paths",{"type":46,"value":270},", ",{"type":40,"tag":68,"props":272,"children":274},{"className":273},[],[275],{"type":46,"value":276},"check-trailing-whitespace",{"type":46,"value":278},",\n",{"type":40,"tag":68,"props":280,"children":282},{"className":281},[],[283],{"type":46,"value":284},"invalid-skill-name",{"type":46,"value":286},"), pass ",{"type":40,"tag":68,"props":288,"children":290},{"className":289},[],[291],{"type":46,"value":292},"--fix",{"type":46,"value":294}," to write the corrections\nto disk; add ",{"type":40,"tag":68,"props":296,"children":298},{"className":297},[],[299],{"type":46,"value":300},"--dry-run",{"type":46,"value":302}," to preview the diff first.",{"type":40,"tag":235,"props":304,"children":305},{},[306,311],{"type":40,"tag":55,"props":307,"children":308},{},[309],{"type":46,"value":310},"Re-run",{"type":46,"value":312}," to confirm the run is clean.",{"type":40,"tag":314,"props":315,"children":317},"h3",{"id":316},"task-progress",[318],{"type":46,"value":319},"Task progress",{"type":40,"tag":321,"props":322,"children":325},"ul",{"className":323},[324],"contains-task-list",[326,338,347,371],{"type":40,"tag":235,"props":327,"children":330},{"className":328},[329],"task-list-item",[331,336],{"type":40,"tag":332,"props":333,"children":335},"input",{"disabled":35,"type":334},"checkbox",[],{"type":46,"value":337}," Run validator",{"type":40,"tag":235,"props":339,"children":341},{"className":340},[329],[342,345],{"type":40,"tag":332,"props":343,"children":344},{"disabled":35,"type":334},[],{"type":46,"value":346}," Read errors",{"type":40,"tag":235,"props":348,"children":350},{"className":349},[329],[351,354,356,361,363,369],{"type":40,"tag":332,"props":352,"children":353},{"disabled":35,"type":334},[],{"type":46,"value":355}," Fix violations (manual or ",{"type":40,"tag":68,"props":357,"children":359},{"className":358},[],[360],{"type":46,"value":292},{"type":46,"value":362}," \u002F ",{"type":40,"tag":68,"props":364,"children":366},{"className":365},[],[367],{"type":46,"value":368},"--fix --dry-run",{"type":46,"value":370},")",{"type":40,"tag":235,"props":372,"children":374},{"className":373},[329],[375,378],{"type":40,"tag":332,"props":376,"children":377},{"disabled":35,"type":334},[],{"type":46,"value":379}," Verify clean run",{"type":40,"tag":89,"props":381,"children":383},{"id":382},"authoring-a-custom-rule",[384],{"type":46,"value":385},"Authoring a custom rule",{"type":40,"tag":49,"props":387,"children":388},{},[389,391,397,399,405],{"type":46,"value":390},"Extend ",{"type":40,"tag":68,"props":392,"children":394},{"className":393},[],[395],{"type":46,"value":396},"SkillRule",{"type":46,"value":398}," and pass the rule into ",{"type":40,"tag":68,"props":400,"children":402},{"className":401},[],[403],{"type":46,"value":404},"validateSkills",{"type":46,"value":115},{"type":40,"tag":117,"props":407,"children":410},{"className":408,"code":409,"language":21,"meta":122,"style":122},"language-dart shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import 'package:dart_skills_lint\u002Fdart_skills_lint.dart';\n\nclass DeprecatedSkillRule extends SkillRule {\n  @override\n  final String name = 'deprecated-skill';\n\n  @override\n  final AnalysisSeverity severity = AnalysisSeverity.warning;\n\n  @override\n  Future\u003CList\u003CValidationError>> validate(SkillContext context) async {\n    final errors = \u003CValidationError>[];\n    final yaml = context.parsedYaml;\n    if (yaml == null) return errors;\n\n    if (yaml['metadata']?['deprecated'] == true) {\n      errors.add(ValidationError(\n        ruleId: name,\n        severity: severity,\n        file: 'SKILL.md',\n        message: 'This skill is marked as deprecated.',\n      ));\n    }\n    return errors;\n  }\n}\n",[411],{"type":40,"tag":68,"props":412,"children":413},{"__ignoreMap":122},[414,422,431,440,449,458,466,474,483,491,499,508,517,526,535,543,552,561,570,579,588,597,606,615,624,633],{"type":40,"tag":128,"props":415,"children":416},{"class":130,"line":131},[417],{"type":40,"tag":128,"props":418,"children":419},{},[420],{"type":46,"value":421},"import 'package:dart_skills_lint\u002Fdart_skills_lint.dart';\n",{"type":40,"tag":128,"props":423,"children":425},{"class":130,"line":424},2,[426],{"type":40,"tag":128,"props":427,"children":428},{"emptyLinePlaceholder":35},[429],{"type":46,"value":430},"\n",{"type":40,"tag":128,"props":432,"children":434},{"class":130,"line":433},3,[435],{"type":40,"tag":128,"props":436,"children":437},{},[438],{"type":46,"value":439},"class DeprecatedSkillRule extends SkillRule {\n",{"type":40,"tag":128,"props":441,"children":443},{"class":130,"line":442},4,[444],{"type":40,"tag":128,"props":445,"children":446},{},[447],{"type":46,"value":448},"  @override\n",{"type":40,"tag":128,"props":450,"children":452},{"class":130,"line":451},5,[453],{"type":40,"tag":128,"props":454,"children":455},{},[456],{"type":46,"value":457},"  final String name = 'deprecated-skill';\n",{"type":40,"tag":128,"props":459,"children":461},{"class":130,"line":460},6,[462],{"type":40,"tag":128,"props":463,"children":464},{"emptyLinePlaceholder":35},[465],{"type":46,"value":430},{"type":40,"tag":128,"props":467,"children":469},{"class":130,"line":468},7,[470],{"type":40,"tag":128,"props":471,"children":472},{},[473],{"type":46,"value":448},{"type":40,"tag":128,"props":475,"children":477},{"class":130,"line":476},8,[478],{"type":40,"tag":128,"props":479,"children":480},{},[481],{"type":46,"value":482},"  final AnalysisSeverity severity = AnalysisSeverity.warning;\n",{"type":40,"tag":128,"props":484,"children":486},{"class":130,"line":485},9,[487],{"type":40,"tag":128,"props":488,"children":489},{"emptyLinePlaceholder":35},[490],{"type":46,"value":430},{"type":40,"tag":128,"props":492,"children":494},{"class":130,"line":493},10,[495],{"type":40,"tag":128,"props":496,"children":497},{},[498],{"type":46,"value":448},{"type":40,"tag":128,"props":500,"children":502},{"class":130,"line":501},11,[503],{"type":40,"tag":128,"props":504,"children":505},{},[506],{"type":46,"value":507},"  Future\u003CList\u003CValidationError>> validate(SkillContext context) async {\n",{"type":40,"tag":128,"props":509,"children":511},{"class":130,"line":510},12,[512],{"type":40,"tag":128,"props":513,"children":514},{},[515],{"type":46,"value":516},"    final errors = \u003CValidationError>[];\n",{"type":40,"tag":128,"props":518,"children":520},{"class":130,"line":519},13,[521],{"type":40,"tag":128,"props":522,"children":523},{},[524],{"type":46,"value":525},"    final yaml = context.parsedYaml;\n",{"type":40,"tag":128,"props":527,"children":529},{"class":130,"line":528},14,[530],{"type":40,"tag":128,"props":531,"children":532},{},[533],{"type":46,"value":534},"    if (yaml == null) return errors;\n",{"type":40,"tag":128,"props":536,"children":538},{"class":130,"line":537},15,[539],{"type":40,"tag":128,"props":540,"children":541},{"emptyLinePlaceholder":35},[542],{"type":46,"value":430},{"type":40,"tag":128,"props":544,"children":546},{"class":130,"line":545},16,[547],{"type":40,"tag":128,"props":548,"children":549},{},[550],{"type":46,"value":551},"    if (yaml['metadata']?['deprecated'] == true) {\n",{"type":40,"tag":128,"props":553,"children":555},{"class":130,"line":554},17,[556],{"type":40,"tag":128,"props":557,"children":558},{},[559],{"type":46,"value":560},"      errors.add(ValidationError(\n",{"type":40,"tag":128,"props":562,"children":564},{"class":130,"line":563},18,[565],{"type":40,"tag":128,"props":566,"children":567},{},[568],{"type":46,"value":569},"        ruleId: name,\n",{"type":40,"tag":128,"props":571,"children":573},{"class":130,"line":572},19,[574],{"type":40,"tag":128,"props":575,"children":576},{},[577],{"type":46,"value":578},"        severity: severity,\n",{"type":40,"tag":128,"props":580,"children":582},{"class":130,"line":581},20,[583],{"type":40,"tag":128,"props":584,"children":585},{},[586],{"type":46,"value":587},"        file: 'SKILL.md',\n",{"type":40,"tag":128,"props":589,"children":591},{"class":130,"line":590},21,[592],{"type":40,"tag":128,"props":593,"children":594},{},[595],{"type":46,"value":596},"        message: 'This skill is marked as deprecated.',\n",{"type":40,"tag":128,"props":598,"children":600},{"class":130,"line":599},22,[601],{"type":40,"tag":128,"props":602,"children":603},{},[604],{"type":46,"value":605},"      ));\n",{"type":40,"tag":128,"props":607,"children":609},{"class":130,"line":608},23,[610],{"type":40,"tag":128,"props":611,"children":612},{},[613],{"type":46,"value":614},"    }\n",{"type":40,"tag":128,"props":616,"children":618},{"class":130,"line":617},24,[619],{"type":40,"tag":128,"props":620,"children":621},{},[622],{"type":46,"value":623},"    return errors;\n",{"type":40,"tag":128,"props":625,"children":627},{"class":130,"line":626},25,[628],{"type":40,"tag":128,"props":629,"children":630},{},[631],{"type":46,"value":632},"  }\n",{"type":40,"tag":128,"props":634,"children":636},{"class":130,"line":635},26,[637],{"type":40,"tag":128,"props":638,"children":639},{},[640],{"type":46,"value":641},"}\n",{"type":40,"tag":49,"props":643,"children":644},{},[645],{"type":46,"value":646},"Wire it up in a Dart test:",{"type":40,"tag":117,"props":648,"children":650},{"className":408,"code":649,"language":21,"meta":122,"style":122},"import 'package:dart_skills_lint\u002Fdart_skills_lint.dart';\nimport 'package:test\u002Ftest.dart';\n\nvoid main() {\n  test('skills pass with deprecated-skill custom rule', () async {\n    final config = await ConfigParser.loadConfig();\n    expect(\n      config.directoryConfigs,\n      isNotEmpty,\n      reason: 'Configuration directoryConfigs should not be empty.',\n    );\n    await validateSkills(\n      config: config,\n      customRules: [DeprecatedSkillRule()],\n    );\n  });\n}\n",[651],{"type":40,"tag":68,"props":652,"children":653},{"__ignoreMap":122},[654,661,669,676,684,692,700,708,716,724,732,740,748,756,764,771,779],{"type":40,"tag":128,"props":655,"children":656},{"class":130,"line":131},[657],{"type":40,"tag":128,"props":658,"children":659},{},[660],{"type":46,"value":421},{"type":40,"tag":128,"props":662,"children":663},{"class":130,"line":424},[664],{"type":40,"tag":128,"props":665,"children":666},{},[667],{"type":46,"value":668},"import 'package:test\u002Ftest.dart';\n",{"type":40,"tag":128,"props":670,"children":671},{"class":130,"line":433},[672],{"type":40,"tag":128,"props":673,"children":674},{"emptyLinePlaceholder":35},[675],{"type":46,"value":430},{"type":40,"tag":128,"props":677,"children":678},{"class":130,"line":442},[679],{"type":40,"tag":128,"props":680,"children":681},{},[682],{"type":46,"value":683},"void main() {\n",{"type":40,"tag":128,"props":685,"children":686},{"class":130,"line":451},[687],{"type":40,"tag":128,"props":688,"children":689},{},[690],{"type":46,"value":691},"  test('skills pass with deprecated-skill custom rule', () async {\n",{"type":40,"tag":128,"props":693,"children":694},{"class":130,"line":460},[695],{"type":40,"tag":128,"props":696,"children":697},{},[698],{"type":46,"value":699},"    final config = await ConfigParser.loadConfig();\n",{"type":40,"tag":128,"props":701,"children":702},{"class":130,"line":468},[703],{"type":40,"tag":128,"props":704,"children":705},{},[706],{"type":46,"value":707},"    expect(\n",{"type":40,"tag":128,"props":709,"children":710},{"class":130,"line":476},[711],{"type":40,"tag":128,"props":712,"children":713},{},[714],{"type":46,"value":715},"      config.directoryConfigs,\n",{"type":40,"tag":128,"props":717,"children":718},{"class":130,"line":485},[719],{"type":40,"tag":128,"props":720,"children":721},{},[722],{"type":46,"value":723},"      isNotEmpty,\n",{"type":40,"tag":128,"props":725,"children":726},{"class":130,"line":493},[727],{"type":40,"tag":128,"props":728,"children":729},{},[730],{"type":46,"value":731},"      reason: 'Configuration directoryConfigs should not be empty.',\n",{"type":40,"tag":128,"props":733,"children":734},{"class":130,"line":501},[735],{"type":40,"tag":128,"props":736,"children":737},{},[738],{"type":46,"value":739},"    );\n",{"type":40,"tag":128,"props":741,"children":742},{"class":130,"line":510},[743],{"type":40,"tag":128,"props":744,"children":745},{},[746],{"type":46,"value":747},"    await validateSkills(\n",{"type":40,"tag":128,"props":749,"children":750},{"class":130,"line":519},[751],{"type":40,"tag":128,"props":752,"children":753},{},[754],{"type":46,"value":755},"      config: config,\n",{"type":40,"tag":128,"props":757,"children":758},{"class":130,"line":528},[759],{"type":40,"tag":128,"props":760,"children":761},{},[762],{"type":46,"value":763},"      customRules: [DeprecatedSkillRule()],\n",{"type":40,"tag":128,"props":765,"children":766},{"class":130,"line":537},[767],{"type":40,"tag":128,"props":768,"children":769},{},[770],{"type":46,"value":739},{"type":40,"tag":128,"props":772,"children":773},{"class":130,"line":545},[774],{"type":40,"tag":128,"props":775,"children":776},{},[777],{"type":46,"value":778},"  });\n",{"type":40,"tag":128,"props":780,"children":781},{"class":130,"line":554},[782],{"type":40,"tag":128,"props":783,"children":784},{},[785],{"type":46,"value":641},{"type":40,"tag":89,"props":787,"children":789},{"id":788},"related",[790],{"type":46,"value":791},"Related",{"type":40,"tag":321,"props":793,"children":794},{},[795,808,821],{"type":40,"tag":235,"props":796,"children":797},{},[798,806],{"type":40,"tag":63,"props":799,"children":800},{"href":65},[801],{"type":40,"tag":68,"props":802,"children":804},{"className":803},[],[805],{"type":46,"value":73},{"type":46,"value":807}," —\nfirst-time wiring.",{"type":40,"tag":235,"props":809,"children":810},{},[811,819],{"type":40,"tag":63,"props":812,"children":813},{"href":78},[814],{"type":40,"tag":68,"props":815,"children":817},{"className":816},[],[818],{"type":46,"value":85},{"type":46,"value":820}," — canonical rule reference.",{"type":40,"tag":235,"props":822,"children":823},{},[824,834],{"type":40,"tag":63,"props":825,"children":827},{"href":826},"..\u002F..\u002FREADME.md",[828],{"type":40,"tag":68,"props":829,"children":831},{"className":830},[],[832],{"type":46,"value":833},"README.md",{"type":46,"value":835}," — installation, configuration,\nintegration recipes.",{"type":40,"tag":837,"props":838,"children":839},"style",{},[840],{"type":46,"value":841},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":843,"total":970},[844,855,866,878,889,898,910,922,934,946,955,961],{"slug":845,"name":845,"fn":846,"description":847,"org":848,"tags":849,"stars":22,"repoUrl":23,"updatedAt":854},"dart-add-unit-test","write unit tests for Dart code","Write and organize unit tests for functions, methods, and classes using `package:test`. Use when creating new logic or fixing bugs to ensure code remains correct and regression-free.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[850,851],{"name":20,"slug":21,"type":15},{"name":852,"slug":853,"type":15},"Testing","testing","2026-07-15T05:22:40.104823",{"slug":856,"name":856,"fn":857,"description":858,"org":859,"tags":860,"stars":22,"repoUrl":23,"updatedAt":865},"dart-build-cli-app","build Dart command line applications","Entrypoint structure, exit codes, cross-platform scripts. Use when building command line utilities, scripts, or applications.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[861,864],{"name":862,"slug":863,"type":15},"CLI","cli",{"name":20,"slug":21,"type":15},"2026-07-15T05:22:18.863572",{"slug":867,"name":867,"fn":868,"description":869,"org":870,"tags":871,"stars":22,"repoUrl":23,"updatedAt":877},"dart-collect-coverage","collect Dart test coverage reports","Collect coverage using the coverage packge and create an LCOV report",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[872,873,876],{"name":20,"slug":21,"type":15},{"name":874,"slug":875,"type":15},"Reporting","reporting",{"name":852,"slug":853,"type":15},"2026-07-15T05:22:21.38636",{"slug":879,"name":879,"fn":880,"description":881,"org":882,"tags":883,"stars":22,"repoUrl":23,"updatedAt":888},"dart-fix-runtime-errors","debug and fix Dart runtime errors","Uses get_runtime_errors and lsp to fetch an active stack trace, locate the failing line, apply a fix, and verify resolution via hot_reload.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[884,885],{"name":20,"slug":21,"type":15},{"name":886,"slug":887,"type":15},"Debugging","debugging","2026-07-15T05:22:22.622501",{"slug":890,"name":890,"fn":891,"description":892,"org":893,"tags":894,"stars":22,"repoUrl":23,"updatedAt":897},"dart-generate-test-mocks","generate mock objects for Dart tests","Define and generate mock objects for external dependencies using `package:mockito` and `build_runner`. Use when unit testing classes that depend on complex external services like APIs or databases.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[895,896],{"name":20,"slug":21,"type":15},{"name":852,"slug":853,"type":15},"2026-07-15T05:22:42.607449",{"slug":899,"name":899,"fn":900,"description":901,"org":902,"tags":903,"stars":22,"repoUrl":23,"updatedAt":909},"dart-migrate-to-checks-package","migrate test matchers to checks package","Replace the usage of `expect` and similar functions from `package:matcher`\nto `package:checks` equivalents.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[904,905,908],{"name":20,"slug":21,"type":15},{"name":906,"slug":907,"type":15},"Migration","migration",{"name":852,"slug":853,"type":15},"2026-07-15T05:22:31.276564",{"slug":911,"name":911,"fn":912,"description":913,"org":914,"tags":915,"stars":22,"repoUrl":23,"updatedAt":921},"dart-resolve-package-conflicts","resolve Dart package version conflicts","Workflow for fixing package version conflicts. Use this when `pub get` fails due to incompatible package versions.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[916,917,918],{"name":20,"slug":21,"type":15},{"name":886,"slug":887,"type":15},{"name":919,"slug":920,"type":15},"Engineering","engineering","2026-07-15T05:22:30.059335",{"slug":923,"name":923,"fn":924,"description":925,"org":926,"tags":927,"stars":22,"repoUrl":23,"updatedAt":933},"dart-run-static-analysis","run static analysis and apply fixes","Execute `dart analyze` to identify warnings and errors, and use `dart fix --apply` to automatically resolve mechanical lint issues. Use during development to ensure code quality and before committing changes.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[928,931,932],{"name":929,"slug":930,"type":15},"Code Analysis","code-analysis",{"name":20,"slug":21,"type":15},{"name":886,"slug":887,"type":15},"2026-07-15T05:22:23.861119",{"slug":935,"name":935,"fn":936,"description":937,"org":938,"tags":939,"stars":22,"repoUrl":23,"updatedAt":945},"dart-setup-ffi-assets","package C\u002FC++ assets for Dart","Guides agents in compiling and packaging C\u002FC++ source code into dynamic or static libraries (Code Assets) using Dart's Native Assets hook system (via hook\u002Fbuild.dart and hook\u002Flink.dart utilizing package:hooks and package:native_toolchain_c). Use when a user asks to: 'setup native assets', 'compile C\u002FC++ source code', 'bundle dynamic libraries', 'build native C code', 'link native assets', 'implement build.dart or link.dart hooks', or 'integrate C\u002FC++ interop in Dart\u002FFlutter'. Helps agents avoid manual toolchain orchestration and configures secure hash-validated binary downloads or advanced linker tree-shaking with package:record_use mapping.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[940,941,944],{"name":20,"slug":21,"type":15},{"name":942,"slug":943,"type":15},"Deployment","deployment",{"name":919,"slug":920,"type":15},"2026-07-15T05:22:20.138636",{"slug":73,"name":73,"fn":947,"description":948,"org":949,"tags":950,"stars":22,"repoUrl":23,"updatedAt":954},"configure dart_skills_lint for Dart projects","Use this skill when you need to set up validation for AI agent skills in a Dart project for the first time.\nAdds the linter as a dev_dependency, creates a configuration file, and generates a baseline for legacy repos.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[951,952,953],{"name":20,"slug":21,"type":15},{"name":17,"slug":18,"type":15},{"name":13,"slug":14,"type":15},"2026-07-15T05:22:47.488998",{"slug":4,"name":4,"fn":5,"description":6,"org":956,"tags":957,"stars":22,"repoUrl":23,"updatedAt":24},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[958,959,960],{"name":20,"slug":21,"type":15},{"name":17,"slug":18,"type":15},{"name":13,"slug":14,"type":15},{"slug":962,"name":962,"fn":963,"description":964,"org":965,"tags":966,"stars":22,"repoUrl":23,"updatedAt":969},"dart-use-ffigen","generate FFI bindings with ffigen","Guide agents to use `package:ffigen` to automatically generate FFI bindings instead of writing them manually. Use this skill when a task involves writing new FFI bindings, extending C\u002FObjective-C\u002FSwift integrations, or replacing hand-crafted `dart:ffi` setups.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[967,968],{"name":20,"slug":21,"type":15},{"name":919,"slug":920,"type":15},"2026-07-15T05:22:17.592351",27,{"items":972,"total":617},[973,978,983,989,994,999,1005],{"slug":845,"name":845,"fn":846,"description":847,"org":974,"tags":975,"stars":22,"repoUrl":23,"updatedAt":854},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[976,977],{"name":20,"slug":21,"type":15},{"name":852,"slug":853,"type":15},{"slug":856,"name":856,"fn":857,"description":858,"org":979,"tags":980,"stars":22,"repoUrl":23,"updatedAt":865},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[981,982],{"name":862,"slug":863,"type":15},{"name":20,"slug":21,"type":15},{"slug":867,"name":867,"fn":868,"description":869,"org":984,"tags":985,"stars":22,"repoUrl":23,"updatedAt":877},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[986,987,988],{"name":20,"slug":21,"type":15},{"name":874,"slug":875,"type":15},{"name":852,"slug":853,"type":15},{"slug":879,"name":879,"fn":880,"description":881,"org":990,"tags":991,"stars":22,"repoUrl":23,"updatedAt":888},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[992,993],{"name":20,"slug":21,"type":15},{"name":886,"slug":887,"type":15},{"slug":890,"name":890,"fn":891,"description":892,"org":995,"tags":996,"stars":22,"repoUrl":23,"updatedAt":897},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[997,998],{"name":20,"slug":21,"type":15},{"name":852,"slug":853,"type":15},{"slug":899,"name":899,"fn":900,"description":901,"org":1000,"tags":1001,"stars":22,"repoUrl":23,"updatedAt":909},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1002,1003,1004],{"name":20,"slug":21,"type":15},{"name":906,"slug":907,"type":15},{"name":852,"slug":853,"type":15},{"slug":911,"name":911,"fn":912,"description":913,"org":1006,"tags":1007,"stars":22,"repoUrl":23,"updatedAt":921},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1008,1009,1010],{"name":20,"slug":21,"type":15},{"name":886,"slug":887,"type":15},{"name":919,"slug":920,"type":15}]