From fce05cc290b2e71c2dba04cfb146dad6609cd353 Mon Sep 17 00:00:00 2001 From: Reid-Agent <269567208+reidbaker-agent@users.noreply.github.com> Date: Mon, 20 Jul 2026 16:10:07 -0400 Subject: [PATCH 1/9] Migrate generator test off deprecated resolvedRules onto resolvedRuleConfigs --- tool/generator/dart_skills_lint.yaml | 6 ++++++ tool/generator/test/lint_skills_test.dart | 7 ++----- 2 files changed, 8 insertions(+), 5 deletions(-) create mode 100644 tool/generator/dart_skills_lint.yaml 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..871bf547 100644 --- a/tool/generator/test/lint_skills_test.dart +++ b/tool/generator/test/lint_skills_test.dart @@ -16,13 +16,10 @@ void main() { }); try { + final config = await ConfigParser.loadConfig(); expect( await validateSkills( - skillDirPaths: ['../../skills'], - resolvedRules: { - 'check-relative-paths': AnalysisSeverity.error, - 'check-absolute-paths': AnalysisSeverity.error, - }, + config: config, customRules: [LastModifiedRule()], ), isTrue, From 8e6f31b0fb3378a103f11011cd47daaf64940a3a Mon Sep 17 00:00:00 2001 From: Reid-Agent <269567208+reidbaker-agent@users.noreply.github.com> Date: Mon, 20 Jul 2026 16:16:18 -0400 Subject: [PATCH 2/9] Remove duplicate validate_skills CLI workflow job --- .github/workflows/dart_skills_lint_workflow.yaml | 13 ------------- 1 file changed, 13 deletions(-) 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: From ff95079887f0ccbc0abb2ab5cbd8a870ec01eac3 Mon Sep 17 00:00:00 2001 From: Reid Baker Date: Mon, 20 Jul 2026 16:22:25 -0400 Subject: [PATCH 3/9] Ensure lint_skills_test is path-resilient and asserts non-empty directoryConfigs --- tool/generator/test/lint_skills_test.dart | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/tool/generator/test/lint_skills_test.dart b/tool/generator/test/lint_skills_test.dart index 871bf547..db33377a 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'; @@ -16,9 +19,22 @@ void main() { }); try { - final config = await ConfigParser.loadConfig(); + final String packageDir = Directory.current.path.endsWith('generator') + ? Directory.current.path + : p.join(Directory.current.path, 'tool', 'generator'); + final String configPath = p.join(packageDir, 'dart_skills_lint.yaml'); + final String skillsDir = p.normalize(p.join(packageDir, '..', '..', 'skills')); + + final config = await ConfigParser.loadConfig(path: configPath); + expect( + config.directoryConfigs, + isNotEmpty, + reason: 'Configuration directoryConfigs should not be empty.', + ); + expect( await validateSkills( + skillDirPaths: [skillsDir], config: config, customRules: [LastModifiedRule()], ), From eae460ac8fac691bcdb234e62f6970e10d718340 Mon Sep 17 00:00:00 2001 From: Reid Baker Date: Mon, 20 Jul 2026 16:23:02 -0400 Subject: [PATCH 4/9] Fix omit_local_variable_types lints in lint_skills_test.dart --- tool/generator/test/lint_skills_test.dart | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tool/generator/test/lint_skills_test.dart b/tool/generator/test/lint_skills_test.dart index db33377a..346f8b70 100644 --- a/tool/generator/test/lint_skills_test.dart +++ b/tool/generator/test/lint_skills_test.dart @@ -19,11 +19,11 @@ void main() { }); try { - final String packageDir = Directory.current.path.endsWith('generator') + final packageDir = Directory.current.path.endsWith('generator') ? Directory.current.path : p.join(Directory.current.path, 'tool', 'generator'); - final String configPath = p.join(packageDir, 'dart_skills_lint.yaml'); - final String skillsDir = p.normalize(p.join(packageDir, '..', '..', 'skills')); + final configPath = p.join(packageDir, 'dart_skills_lint.yaml'); + final skillsDir = p.normalize(p.join(packageDir, '..', '..', 'skills')); final config = await ConfigParser.loadConfig(path: configPath); expect( From 3f31abd2f831641c40af44cab5ebfea41667038c Mon Sep 17 00:00:00 2001 From: Reid Baker Date: Mon, 20 Jul 2026 16:24:00 -0400 Subject: [PATCH 5/9] Simplify lint_skills_test to direct ConfigParser.loadConfig() call --- tool/generator/test/lint_skills_test.dart | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/tool/generator/test/lint_skills_test.dart b/tool/generator/test/lint_skills_test.dart index 346f8b70..5711391b 100644 --- a/tool/generator/test/lint_skills_test.dart +++ b/tool/generator/test/lint_skills_test.dart @@ -2,11 +2,8 @@ // 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'; @@ -19,13 +16,7 @@ void main() { }); try { - final packageDir = Directory.current.path.endsWith('generator') - ? Directory.current.path - : p.join(Directory.current.path, 'tool', 'generator'); - final configPath = p.join(packageDir, 'dart_skills_lint.yaml'); - final skillsDir = p.normalize(p.join(packageDir, '..', '..', 'skills')); - - final config = await ConfigParser.loadConfig(path: configPath); + final config = await ConfigParser.loadConfig(); expect( config.directoryConfigs, isNotEmpty, @@ -34,7 +25,6 @@ void main() { expect( await validateSkills( - skillDirPaths: [skillsDir], config: config, customRules: [LastModifiedRule()], ), From 37c6900b97a1d448e1d72f5a7446ae2d5807fc90 Mon Sep 17 00:00:00 2001 From: Reid Baker Date: Mon, 20 Jul 2026 16:26:08 -0400 Subject: [PATCH 6/9] Update onboarding docs and skills to include directoryConfigs.isNotEmpty assertion when loading config --- .../.agents/skills/dart-skills-lint-integration/SKILL.md | 5 +++++ tool/dart_skills_lint/CONTRIBUTING.md | 5 +++++ .../skills/dart-skills-lint-validation/SKILL.md | 5 +++++ tool/dart_skills_lint/test/dart_skills_lint_skills_test.dart | 5 +++++ 4 files changed, 20 insertions(+) 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.'); From fdbebb4a11545db5dce78f5df88043cb15cfc327 Mon Sep 17 00:00:00 2001 From: Reid Baker Date: Mon, 20 Jul 2026 16:27:35 -0400 Subject: [PATCH 7/9] Address PR discussion r3617291798: handle working directory when run from repo root --- tool/generator/test/lint_skills_test.dart | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/tool/generator/test/lint_skills_test.dart b/tool/generator/test/lint_skills_test.dart index 5711391b..37cfa6c8 100644 --- a/tool/generator/test/lint_skills_test.dart +++ b/tool/generator/test/lint_skills_test.dart @@ -2,6 +2,8 @@ // 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:test/test.dart'; @@ -15,6 +17,12 @@ void main() { printOnFailure('${record.level.name}: ${record.message}'); }); + final originalDir = Directory.current; + final isRoot = !originalDir.path.endsWith('tool/generator'); + if (isRoot) { + Directory.current = Directory('tool/generator'); + } + try { final config = await ConfigParser.loadConfig(); expect( @@ -31,6 +39,9 @@ void main() { isTrue, ); } finally { + if (isRoot) { + Directory.current = originalDir; + } await subscription.cancel(); } }); From cdb850fb0c1ebc2e0c75c1777fdfb46adb46d7bd Mon Sep 17 00:00:00 2001 From: Reid Baker Date: Mon, 20 Jul 2026 16:29:10 -0400 Subject: [PATCH 8/9] Make working directory path resolution cross-platform for Windows, macOS, and Linux --- tool/generator/test/lint_skills_test.dart | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/tool/generator/test/lint_skills_test.dart b/tool/generator/test/lint_skills_test.dart index 37cfa6c8..ce13e0ca 100644 --- a/tool/generator/test/lint_skills_test.dart +++ b/tool/generator/test/lint_skills_test.dart @@ -6,6 +6,7 @@ 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'; @@ -18,9 +19,13 @@ void main() { }); final originalDir = Directory.current; - final isRoot = !originalDir.path.endsWith('tool/generator'); + final parts = p.split(originalDir.path); + final isRoot = !(parts.length >= 2 && + parts[parts.length - 2] == 'tool' && + parts.last == 'generator'); + if (isRoot) { - Directory.current = Directory('tool/generator'); + Directory.current = Directory(p.join('tool', 'generator')); } try { From b3798aa2d1694f1b9cf74137fc84920a9b8fdefc Mon Sep 17 00:00:00 2001 From: Reid Baker Date: Mon, 20 Jul 2026 16:40:31 -0400 Subject: [PATCH 9/9] Format lint_skills_test.dart with dart format --- .../resources/known_consumers.md | 6 +++--- tool/generator/test/lint_skills_test.dart | 12 +++++------- 2 files changed, 8 insertions(+), 10 deletions(-) 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/generator/test/lint_skills_test.dart b/tool/generator/test/lint_skills_test.dart index ce13e0ca..01bb34bc 100644 --- a/tool/generator/test/lint_skills_test.dart +++ b/tool/generator/test/lint_skills_test.dart @@ -20,9 +20,10 @@ void main() { final originalDir = Directory.current; final parts = p.split(originalDir.path); - final isRoot = !(parts.length >= 2 && - parts[parts.length - 2] == 'tool' && - parts.last == 'generator'); + final isRoot = + !(parts.length >= 2 && + parts[parts.length - 2] == 'tool' && + parts.last == 'generator'); if (isRoot) { Directory.current = Directory(p.join('tool', 'generator')); @@ -37,10 +38,7 @@ void main() { ); expect( - await validateSkills( - config: config, - customRules: [LastModifiedRule()], - ), + await validateSkills(config: config, customRules: [LastModifiedRule()]), isTrue, ); } finally {