diff --git a/.github/workflows/dart_skills_lint_workflow.yaml b/.github/workflows/dart_skills_lint_workflow.yaml index 5cd74d0e..93c343cf 100644 --- a/.github/workflows/dart_skills_lint_workflow.yaml +++ b/.github/workflows/dart_skills_lint_workflow.yaml @@ -75,19 +75,6 @@ jobs: min_coverage: 73 exclude: '**/*.g.dart' - validate_skills: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v6 - - uses: dart-lang/setup-dart@v1 - with: - sdk: stable - - - run: dart pub get - - - name: Validate skills - run: dart run dart_skills_lint:cli - formatting: runs-on: ubuntu-latest steps: diff --git a/tool/dart_skills_lint/.agents/skills/check-downstream-consumers/resources/known_consumers.md b/tool/dart_skills_lint/.agents/skills/check-downstream-consumers/resources/known_consumers.md index 960ee266..c3fbb246 100644 --- a/tool/dart_skills_lint/.agents/skills/check-downstream-consumers/resources/known_consumers.md +++ b/tool/dart_skills_lint/.agents/skills/check-downstream-consumers/resources/known_consumers.md @@ -36,7 +36,7 @@ When evaluating the impact of pull requests on downstream repositories, check ag - **Primary Consumer Location**: Root skill sets or tooling harnesses. - **Tooling Engine**: `dart pub get` and `dart test` -### 6. `kevmoo/dart-best-practices` -- **Repository URL**: [kevmoo/dart-best-practices](https://github.com/kevmoo/dart-best-practices) -- **Primary Consumer Location**: Root tooling verification tests. +### 6. `kevmoo/dash_skills` +- **Repository URL**: [kevmoo/dash_skills](https://github.com/kevmoo/dash_skills) +- **Primary Consumer Location**: `tool/` - **Tooling Engine**: `dart pub get` and `dart test` diff --git a/tool/dart_skills_lint/.agents/skills/dart-skills-lint-integration/SKILL.md b/tool/dart_skills_lint/.agents/skills/dart-skills-lint-integration/SKILL.md index 4f8d6bc4..810a6218 100644 --- a/tool/dart_skills_lint/.agents/skills/dart-skills-lint-integration/SKILL.md +++ b/tool/dart_skills_lint/.agents/skills/dart-skills-lint-integration/SKILL.md @@ -94,6 +94,11 @@ test('Validate Repository Skills', () async { final Configuration config = await ConfigParser.loadConfig( path: path.join(repoRoot.path, 'path', 'to', _configFileName), ); + expect( + config.directoryConfigs, + isNotEmpty, + reason: 'Configuration directoryConfigs should not be empty.', + ); final bool isValid = await validateSkills( skillDirPaths: [skillsDirectory], // Explicit absolute targeting config: config, diff --git a/tool/dart_skills_lint/CONTRIBUTING.md b/tool/dart_skills_lint/CONTRIBUTING.md index 15e88647..5e27ea3f 100644 --- a/tool/dart_skills_lint/CONTRIBUTING.md +++ b/tool/dart_skills_lint/CONTRIBUTING.md @@ -58,6 +58,11 @@ void main() { // share configuration. Pass `customRules: [...]` to inject any // custom SkillRule implementations. final config = await ConfigParser.loadConfig(); + expect( + config.directoryConfigs, + isNotEmpty, + reason: 'Configuration directoryConfigs should not be empty.', + ); await validateSkills(config: config); }); } diff --git a/tool/dart_skills_lint/skills/dart-skills-lint-validation/SKILL.md b/tool/dart_skills_lint/skills/dart-skills-lint-validation/SKILL.md index 55ddbd40..e7036495 100644 --- a/tool/dart_skills_lint/skills/dart-skills-lint-validation/SKILL.md +++ b/tool/dart_skills_lint/skills/dart-skills-lint-validation/SKILL.md @@ -93,6 +93,11 @@ import 'package:test/test.dart'; void main() { test('skills pass with deprecated-skill custom rule', () async { final config = await ConfigParser.loadConfig(); + expect( + config.directoryConfigs, + isNotEmpty, + reason: 'Configuration directoryConfigs should not be empty.', + ); await validateSkills( config: config, customRules: [DeprecatedSkillRule()], diff --git a/tool/dart_skills_lint/test/dart_skills_lint_skills_test.dart b/tool/dart_skills_lint/test/dart_skills_lint_skills_test.dart index fc323757..f7002298 100644 --- a/tool/dart_skills_lint/test/dart_skills_lint_skills_test.dart +++ b/tool/dart_skills_lint/test/dart_skills_lint_skills_test.dart @@ -20,6 +20,11 @@ void main() { // Load configuration from the default file (dart_skills_lint.yaml) // to mirror what is configured in the repository. final Configuration config = await ConfigParser.loadConfig(); + expect( + config.directoryConfigs, + isNotEmpty, + reason: 'Configuration directoryConfigs should not be empty.', + ); final bool isValid = await validateSkills(config: config); expect(isValid, isTrue, reason: 'Skills validation failed. See above for details.'); diff --git a/tool/generator/dart_skills_lint.yaml b/tool/generator/dart_skills_lint.yaml new file mode 100644 index 00000000..32a0b91d --- /dev/null +++ b/tool/generator/dart_skills_lint.yaml @@ -0,0 +1,6 @@ +dart_skills_lint: + rules: + check-relative-paths: error + check-absolute-paths: error + directories: + - path: "../../skills" diff --git a/tool/generator/test/lint_skills_test.dart b/tool/generator/test/lint_skills_test.dart index f6fd3b93..01bb34bc 100644 --- a/tool/generator/test/lint_skills_test.dart +++ b/tool/generator/test/lint_skills_test.dart @@ -2,8 +2,11 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. +import 'dart:io'; + import 'package:dart_skills_lint/dart_skills_lint.dart'; import 'package:logging/logging.dart'; +import 'package:path/path.dart' as p; import 'package:test/test.dart'; import 'custom_skill_rules/last_modified_rule.dart'; @@ -15,19 +18,33 @@ void main() { printOnFailure('${record.level.name}: ${record.message}'); }); + final originalDir = Directory.current; + final parts = p.split(originalDir.path); + final isRoot = + !(parts.length >= 2 && + parts[parts.length - 2] == 'tool' && + parts.last == 'generator'); + + if (isRoot) { + Directory.current = Directory(p.join('tool', 'generator')); + } + try { + final config = await ConfigParser.loadConfig(); + expect( + config.directoryConfigs, + isNotEmpty, + reason: 'Configuration directoryConfigs should not be empty.', + ); + expect( - await validateSkills( - skillDirPaths: ['../../skills'], - resolvedRules: { - 'check-relative-paths': AnalysisSeverity.error, - 'check-absolute-paths': AnalysisSeverity.error, - }, - customRules: [LastModifiedRule()], - ), + await validateSkills(config: config, customRules: [LastModifiedRule()]), isTrue, ); } finally { + if (isRoot) { + Directory.current = originalDir; + } await subscription.cancel(); } });