Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/dart_skills_lint_workflow.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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.

---
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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.
2 changes: 1 addition & 1 deletion tool/dart_skills_lint/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -23,4 +23,4 @@ dev_dependencies:
build_runner: ^2.4.0

executables:
dart_skills_lint:
dart_skills_lint: cli
49 changes: 22 additions & 27 deletions tool/dart_skills_lint/test/cli_integration_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down Expand Up @@ -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/dart_skills_lint.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
Expand All @@ -105,7 +100,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);
Expand All @@ -118,7 +113,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<String> stdout = await process.stdout.rest.toList();
Expand All @@ -132,7 +127,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<String> stderr = await process.stderr.rest.toList();
Expand All @@ -154,7 +149,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)
Expand All @@ -180,7 +175,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<String> stdout = await process.stdout.rest.toList();
Expand All @@ -202,7 +197,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
Expand All @@ -229,7 +224,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
Expand All @@ -252,7 +247,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);
Expand All @@ -264,7 +259,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,
);

Expand All @@ -282,7 +277,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,
);

Expand All @@ -297,7 +292,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},
);

Expand All @@ -313,14 +308,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);
});
Expand All @@ -330,7 +325,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);
Expand All @@ -346,7 +341,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);
Expand All @@ -368,7 +363,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);
Expand All @@ -388,7 +383,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
Expand All @@ -399,7 +394,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<String> stdout = await process.stdout.rest.toList();
Expand All @@ -413,7 +408,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<String> stdout = await process.stdout.rest.toList();
Expand Down Expand Up @@ -456,7 +451,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,
);

Expand Down
24 changes: 7 additions & 17 deletions tool/dart_skills_lint/test/config_file_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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,
);

Expand All @@ -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,
);

Expand All @@ -92,12 +92,7 @@ dart_skills_lint:

final TestProcess process = await TestProcess.start(
'dart',
[
p.normalize(p.absolute('bin/dart_skills_lint.dart')),
'-s',
'test-skill',
'--check-relative-paths'
],
[p.normalize(p.absolute('bin/cli.dart')), '-s', 'test-skill', '--check-relative-paths'],
workingDirectory: tempDir.path,
);

Expand Down Expand Up @@ -125,7 +120,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,
);

Expand Down Expand Up @@ -158,20 +153,15 @@ 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);

// 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/dart_skills_lint.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);
Expand All @@ -197,7 +187,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',
Expand Down
Loading