From 393039d72cb1f411e0bfed71c73c223150a13f40 Mon Sep 17 00:00:00 2001 From: Reid Baker Date: Fri, 10 Apr 2026 13:31:56 -0400 Subject: [PATCH 1/2] Rename the bin/dart_skills_lint.dart file to cli and update documenation. --- .../bin/{dart_skills_lint.dart => cli.dart} | 0 .../completion_migration_plan.md | 2 +- .../pub_vs_skill_report.md | 4 +- tool/dart_skills_lint/pubspec.yaml | 2 +- .../test/cli_integration_test.dart | 44 +++++++++---------- .../test/config_file_test.dart | 14 +++--- 6 files changed, 33 insertions(+), 33 deletions(-) rename tool/dart_skills_lint/bin/{dart_skills_lint.dart => cli.dart} (100%) diff --git a/tool/dart_skills_lint/bin/dart_skills_lint.dart b/tool/dart_skills_lint/bin/cli.dart similarity index 100% rename from tool/dart_skills_lint/bin/dart_skills_lint.dart rename to tool/dart_skills_lint/bin/cli.dart diff --git a/tool/dart_skills_lint/documentation/feature_design_docs/completion_migration_plan.md b/tool/dart_skills_lint/documentation/feature_design_docs/completion_migration_plan.md index 6a5acc51..72bd9cad 100644 --- a/tool/dart_skills_lint/documentation/feature_design_docs/completion_migration_plan.md +++ b/tool/dart_skills_lint/documentation/feature_design_docs/completion_migration_plan.md @@ -54,7 +54,7 @@ If we plan to expand this CLI with subcommands in the future (e.g., `dart_skills } } ``` -4. **Update `bin/dart_skills_lint.dart`:** +4. **Update `bin/cli.dart`:** Change `runApp(args)` to instantiate the new runner instead. --- diff --git a/tool/dart_skills_lint/documentation/feature_design_docs/pub_vs_skill_report.md b/tool/dart_skills_lint/documentation/feature_design_docs/pub_vs_skill_report.md index 1039987f..bc8df469 100644 --- a/tool/dart_skills_lint/documentation/feature_design_docs/pub_vs_skill_report.md +++ b/tool/dart_skills_lint/documentation/feature_design_docs/pub_vs_skill_report.md @@ -33,7 +33,7 @@ The most significant conflict lies in the allowed characters for project identif * **Pub Package Specification:** Places CLI entry points in the `bin/` directory. **Result:** To align with the Agent Skills specification, the `SKILL.md` instructions must either: -1. Explicitly point the agent to `bin/dart_skills_lint.dart`. +1. Explicitly point the agent to `bin/cli.dart`. 2. Provide a wrapper script in a `scripts/` directory (e.g., `scripts/run-linter.sh`) that executes the Dart code. ### 2.5 Metadata Redundancy @@ -50,7 +50,7 @@ To achieve dual-compatibility, the following configuration is recommended: 1. **Directory Name:** Keep the directory named `dart-skills-lint`. 2. **SKILL.md:** - Set `name: dart-skills-lint`. - - Provide clear instructions to run `dart bin/dart_skills_lint.dart` or `dart run`. + - Provide clear instructions to run `dart bin/cli.dart` or `dart run`. 3. **pubspec.yaml:** - Set `name: dart_skills_lint`. 4. **Scripts Wrapper:** Consider adding a `scripts/lint.sh` that calls the Dart linter to satisfy the standard skill directory structure. diff --git a/tool/dart_skills_lint/pubspec.yaml b/tool/dart_skills_lint/pubspec.yaml index a5d05719..871cee79 100644 --- a/tool/dart_skills_lint/pubspec.yaml +++ b/tool/dart_skills_lint/pubspec.yaml @@ -23,4 +23,4 @@ dev_dependencies: build_runner: ^2.4.0 executables: - dart_skills_lint: + dart_skills_lint: cli diff --git a/tool/dart_skills_lint/test/cli_integration_test.dart b/tool/dart_skills_lint/test/cli_integration_test.dart index eaccbc57..410df082 100644 --- a/tool/dart_skills_lint/test/cli_integration_test.dart +++ b/tool/dart_skills_lint/test/cli_integration_test.dart @@ -39,7 +39,7 @@ void main() { // Run with --generate-baseline final TestProcess process = await TestProcess.start( 'dart', - ['bin/dart_skills_lint.dart', '-s', skillDir.path, '--generate-baseline'], + ['bin/cli.dart', '-s', skillDir.path, '--generate-baseline'], ); await process.shouldExit(0); @@ -83,7 +83,7 @@ dart_skills_lint: final TestProcess genProcess = await TestProcess.start( 'dart', [ - p.normalize(p.absolute('bin/dart_skills_lint.dart')), + p.normalize(p.absolute('bin/cli.dart')), '-d', 'skills', '--generate-baseline' @@ -105,7 +105,7 @@ dart_skills_lint: // 2. Run again silently. It should succeed with exit 0 because all errors are ignored! final TestProcess runProcess = await TestProcess.start( 'dart', - [p.normalize(p.absolute('bin/dart_skills_lint.dart')), '-d', 'skills', '-q'], + [p.normalize(p.absolute('bin/cli.dart')), '-d', 'skills', '-q'], workingDirectory: tempDir.path, ); await runProcess.shouldExit(0); @@ -118,7 +118,7 @@ dart_skills_lint: final TestProcess process = await TestProcess.start( 'dart', - ['bin/dart_skills_lint.dart', '-s', skillDir.path], + ['bin/cli.dart', '-s', skillDir.path], ); final List stdout = await process.stdout.rest.toList(); @@ -132,7 +132,7 @@ dart_skills_lint: final TestProcess process = await TestProcess.start( 'dart', - ['bin/dart_skills_lint.dart', '-s', skillDir.path], + ['bin/cli.dart', '-s', skillDir.path], ); final List stderr = await process.stderr.rest.toList(); @@ -154,7 +154,7 @@ dart_skills_lint: final TestProcess process = await TestProcess.start( 'dart', - ['bin/dart_skills_lint.dart', '-d', skillsDir.path], + ['bin/cli.dart', '-d', skillsDir.path], ); // Verify outputs for both skills (sorted order) @@ -180,7 +180,7 @@ dart_skills_lint: final TestProcess process = await TestProcess.start( 'dart', - ['bin/dart_skills_lint.dart', '-d', skillsDir.path], + ['bin/cli.dart', '-d', skillsDir.path], ); final List stdout = await process.stdout.rest.toList(); @@ -202,7 +202,7 @@ dart_skills_lint: final TestProcess process = await TestProcess.start( 'dart', - ['bin/dart_skills_lint.dart', '-d', skillsDir.path], + ['bin/cli.dart', '-d', skillsDir.path], ); // Verify outputs @@ -229,7 +229,7 @@ dart_skills_lint: final TestProcess process = await TestProcess.start( 'dart', - ['bin/dart_skills_lint.dart', '-d', skillsDir.path, '--fast-fail'], + ['bin/cli.dart', '-d', skillsDir.path, '--fast-fail'], ); // Verify outputs for skill-a @@ -252,7 +252,7 @@ dart_skills_lint: final TestProcess process = await TestProcess.start( 'dart', - ['bin/dart_skills_lint.dart', '-s', skillDir.path, '--quiet'], + ['bin/cli.dart', '-s', skillDir.path, '--quiet'], ); await process.shouldExit(0); @@ -264,7 +264,7 @@ dart_skills_lint: test('fails with 64 when no flags passed and both defaults are missing', () async { final TestProcess process = await TestProcess.start( 'dart', - [p.normalize(p.absolute('bin/dart_skills_lint.dart'))], + [p.normalize(p.absolute('bin/cli.dart'))], workingDirectory: tempDir.path, ); @@ -282,7 +282,7 @@ dart_skills_lint: final TestProcess process = await TestProcess.start( 'dart', - [p.normalize(p.absolute('bin/dart_skills_lint.dart'))], + [p.normalize(p.absolute('bin/cli.dart'))], workingDirectory: tempDir.path, ); @@ -297,7 +297,7 @@ dart_skills_lint: final TestProcess process = await TestProcess.start( 'dart', - [p.normalize(p.absolute('bin/dart_skills_lint.dart')), '-s', '~/some-skill'], + [p.normalize(p.absolute('bin/cli.dart')), '-s', '~/some-skill'], environment: {'HOME': tempDir.path}, ); @@ -313,14 +313,14 @@ dart_skills_lint: // 1. Run normally. Should fail because valid-yaml-metadata defaults to true (error). final TestProcess process = await TestProcess.start( 'dart', - ['bin/dart_skills_lint.dart', '-s', skillDir.path], + ['bin/cli.dart', '-s', skillDir.path], ); await process.shouldExit(1); // 2. Run with --no-valid-yaml-metadata. Should pass because the check is disabled! final TestProcess noYamlProcess = await TestProcess.start( 'dart', - ['bin/dart_skills_lint.dart', '-s', skillDir.path, '--no-valid-yaml-metadata'], + ['bin/cli.dart', '-s', skillDir.path, '--no-valid-yaml-metadata'], ); await noYamlProcess.shouldExit(0); }); @@ -330,7 +330,7 @@ dart_skills_lint: final TestProcess process = await TestProcess.start( 'dart', - ['bin/dart_skills_lint.dart', '-d', emptyDir.path], + ['bin/cli.dart', '-d', emptyDir.path], ); await process.shouldExit(1); @@ -346,7 +346,7 @@ dart_skills_lint: final TestProcess process = await TestProcess.start( 'dart', - ['bin/dart_skills_lint.dart', '-d', skillAsRoot.path], + ['bin/cli.dart', '-d', skillAsRoot.path], ); await process.shouldExit(1); @@ -368,7 +368,7 @@ dart_skills_lint: final TestProcess process = await TestProcess.start( 'dart', - ['bin/dart_skills_lint.dart', '-s', skill1.path, '-s', skill2.path], + ['bin/cli.dart', '-s', skill1.path, '-s', skill2.path], ); await process.shouldExit(0); @@ -388,7 +388,7 @@ dart_skills_lint: final TestProcess process = await TestProcess.start( 'dart', - ['bin/dart_skills_lint.dart', '-s', skillFolder.path, '--ignore-file', malformedFile.path], + ['bin/cli.dart', '-s', skillFolder.path, '--ignore-file', malformedFile.path], ); await process.shouldExit(0); // Valid skill should still pass @@ -399,7 +399,7 @@ dart_skills_lint: test('CLI help displays all registered rules', () async { final TestProcess process = await TestProcess.start( 'dart', - [p.normalize(p.absolute('bin/dart_skills_lint.dart')), '--help'], + [p.normalize(p.absolute('bin/cli.dart')), '--help'], ); await process.shouldExit(0); final List stdout = await process.stdout.rest.toList(); @@ -413,7 +413,7 @@ dart_skills_lint: test('CLI help does not display path-does-not-exist', () async { final TestProcess process = await TestProcess.start( 'dart', - [p.normalize(p.absolute('bin/dart_skills_lint.dart')), '--help'], + [p.normalize(p.absolute('bin/cli.dart')), '--help'], ); await process.shouldExit(0); final List stdout = await process.stdout.rest.toList(); @@ -456,7 +456,7 @@ dart_skills_lint: final TestProcess process = await TestProcess.start( 'dart', - [p.normalize(p.absolute('bin/dart_skills_lint.dart')), '-d', 'skills'], + [p.normalize(p.absolute('bin/cli.dart')), '-d', 'skills'], workingDirectory: tempDir.path, ); diff --git a/tool/dart_skills_lint/test/config_file_test.dart b/tool/dart_skills_lint/test/config_file_test.dart index b4e056b9..65eaa869 100644 --- a/tool/dart_skills_lint/test/config_file_test.dart +++ b/tool/dart_skills_lint/test/config_file_test.dart @@ -40,7 +40,7 @@ dart_skills_lint: final TestProcess process = await TestProcess.start( 'dart', - [p.normalize(p.absolute('bin/dart_skills_lint.dart')), '-s', 'test-skill'], + [p.normalize(p.absolute('bin/cli.dart')), '-s', 'test-skill'], workingDirectory: tempDir.path, ); @@ -66,7 +66,7 @@ dart_skills_lint: final TestProcess process = await TestProcess.start( 'dart', - [p.normalize(p.absolute('bin/dart_skills_lint.dart')), '-s', 'test-skill'], + [p.normalize(p.absolute('bin/cli.dart')), '-s', 'test-skill'], workingDirectory: tempDir.path, ); @@ -93,7 +93,7 @@ dart_skills_lint: final TestProcess process = await TestProcess.start( 'dart', [ - p.normalize(p.absolute('bin/dart_skills_lint.dart')), + p.normalize(p.absolute('bin/cli.dart')), '-s', 'test-skill', '--check-relative-paths' @@ -125,7 +125,7 @@ dart_skills_lint: final TestProcess process = await TestProcess.start( 'dart', - [p.normalize(p.absolute('bin/dart_skills_lint.dart')), '-s', 'test-skill'], + [p.normalize(p.absolute('bin/cli.dart')), '-s', 'test-skill'], workingDirectory: tempDir.path, ); @@ -158,7 +158,7 @@ dart_skills_lint: // 1. Run without --ignore-config. Should pass because config disables the check. final TestProcess passProcess = await TestProcess.start( 'dart', - [p.normalize(p.absolute('bin/dart_skills_lint.dart')), '-s', 'TEST-SKILL'], + [p.normalize(p.absolute('bin/cli.dart')), '-s', 'TEST-SKILL'], workingDirectory: tempDir.path, ); await passProcess.shouldExit(0); @@ -167,7 +167,7 @@ dart_skills_lint: final TestProcess failProcess = await TestProcess.start( 'dart', [ - p.normalize(p.absolute('bin/dart_skills_lint.dart')), + p.normalize(p.absolute('bin/cli.dart')), '-s', 'TEST-SKILL', '--ignore-config' @@ -197,7 +197,7 @@ dart_skills_lint: final TestProcess genProcess = await TestProcess.start( 'dart', [ - p.normalize(p.absolute('bin/dart_skills_lint.dart')), + p.normalize(p.absolute('bin/cli.dart')), '-s', 'TEST-SKILL', '--generate-baseline', From 50520e2583bba9ca5384d99e3fe7299b74bf5717 Mon Sep 17 00:00:00 2001 From: Reid Baker Date: Fri, 10 Apr 2026 15:03:46 -0400 Subject: [PATCH 2/2] Fix PR failures: update workflow and format files --- .github/workflows/dart_skills_lint_workflow.yaml | 2 +- .../test/cli_integration_test.dart | 7 +------ tool/dart_skills_lint/test/config_file_test.dart | 14 ++------------ 3 files changed, 4 insertions(+), 19 deletions(-) diff --git a/.github/workflows/dart_skills_lint_workflow.yaml b/.github/workflows/dart_skills_lint_workflow.yaml index 6eddd30d..dad8746f 100644 --- a/.github/workflows/dart_skills_lint_workflow.yaml +++ b/.github/workflows/dart_skills_lint_workflow.yaml @@ -50,7 +50,7 @@ jobs: - run: dart pub get - name: Validate skills - run: dart run dart_skills_lint + run: dart run dart_skills_lint:cli formatting: runs-on: ubuntu-latest diff --git a/tool/dart_skills_lint/test/cli_integration_test.dart b/tool/dart_skills_lint/test/cli_integration_test.dart index 410df082..4b1147c8 100644 --- a/tool/dart_skills_lint/test/cli_integration_test.dart +++ b/tool/dart_skills_lint/test/cli_integration_test.dart @@ -82,12 +82,7 @@ dart_skills_lint: // 1. Run with --generate-baseline. It should evaluate all skills and write both to the baseline! final TestProcess genProcess = await TestProcess.start( 'dart', - [ - p.normalize(p.absolute('bin/cli.dart')), - '-d', - 'skills', - '--generate-baseline' - ], + [p.normalize(p.absolute('bin/cli.dart')), '-d', 'skills', '--generate-baseline'], workingDirectory: tempDir.path, ); await genProcess.shouldExit(0); // Exits 0 if --generate-baseline is passed diff --git a/tool/dart_skills_lint/test/config_file_test.dart b/tool/dart_skills_lint/test/config_file_test.dart index 65eaa869..92192794 100644 --- a/tool/dart_skills_lint/test/config_file_test.dart +++ b/tool/dart_skills_lint/test/config_file_test.dart @@ -92,12 +92,7 @@ dart_skills_lint: final TestProcess process = await TestProcess.start( 'dart', - [ - p.normalize(p.absolute('bin/cli.dart')), - '-s', - 'test-skill', - '--check-relative-paths' - ], + [p.normalize(p.absolute('bin/cli.dart')), '-s', 'test-skill', '--check-relative-paths'], workingDirectory: tempDir.path, ); @@ -166,12 +161,7 @@ dart_skills_lint: // 2. Run with --ignore-config. Should fail because config is ignored and default is used. final TestProcess failProcess = await TestProcess.start( 'dart', - [ - p.normalize(p.absolute('bin/cli.dart')), - '-s', - 'TEST-SKILL', - '--ignore-config' - ], + [p.normalize(p.absolute('bin/cli.dart')), '-s', 'TEST-SKILL', '--ignore-config'], workingDirectory: tempDir.path, ); await failProcess.shouldExit(1);