sdd-full 4.6.2 → 4.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin.js +1 -1
- package/package.json +1 -1
- package/skills/.agents/skills/flutter-add-integration-test/SKILL.md +165 -0
- package/skills/.agents/skills/flutter-add-widget-preview/SKILL.md +147 -0
- package/skills/.agents/skills/flutter-add-widget-test/SKILL.md +156 -0
- package/skills/.agents/skills/flutter-apply-architecture-best-practices/SKILL.md +164 -0
- package/skills/.agents/skills/flutter-build-responsive-layout/SKILL.md +141 -0
- package/skills/.agents/skills/flutter-fix-layout-issues/SKILL.md +132 -0
- package/skills/.agents/skills/flutter-implement-json-serialization/SKILL.md +155 -0
- package/skills/.agents/skills/flutter-setup-declarative-routing/SKILL.md +257 -0
- package/skills/.agents/skills/flutter-setup-localization/SKILL.md +212 -0
- package/skills/.agents/skills/flutter-use-http-package/SKILL.md +177 -0
- package/skills/VERSION.md +176 -62
- package/skills/design-planning/ai-coding-rules/SKILL.md +5 -13
- package/skills/design-planning/design-to-code/SKILL.md +5 -14
- package/skills/design-planning/enterprise-spec/SKILL.md +5 -13
- package/skills/design-planning/flutter-av/SKILL.md +5 -16
- package/skills/design-planning/flutter-map/SKILL.md +5 -14
- package/skills/design-planning/function-sdd/SKILL.md +5 -13
- package/skills/design-planning/global-overlay-stack-standard/SKILL.md +73 -0
- package/skills/design-planning/ui-motion-interaction-standard/SKILL.md +69 -0
- package/skills/design-planning/ui-sdd-specialized/SKILL.md +5 -14
- package/skills/development-execution/flutter-errors/SKILL.md +5 -15
- package/skills/flutter-skills/.github/dependabot.yaml +15 -0
- package/skills/flutter-skills/.github/workflows/dart_skills_lint_workflow.yaml +68 -0
- package/skills/flutter-skills/.github/workflows/skills_tool.yaml +51 -0
- package/skills/flutter-skills/CODE_OF_CONDUCT.md +3 -0
- package/skills/flutter-skills/CONTRIBUTING.md +36 -0
- package/skills/flutter-skills/LICENSE +26 -0
- package/skills/flutter-skills/README.md +50 -0
- package/skills/flutter-skills/pubspec.yaml +9 -0
- package/skills/flutter-skills/resources/flutter_skills.yaml +434 -0
- package/skills/flutter-skills/skills/flutter-add-integration-test/SKILL.md +163 -0
- package/skills/flutter-skills/skills/flutter-add-widget-preview/SKILL.md +145 -0
- package/skills/flutter-skills/skills/flutter-add-widget-test/SKILL.md +154 -0
- package/skills/flutter-skills/skills/flutter-apply-architecture-best-practices/SKILL.md +162 -0
- package/skills/flutter-skills/skills/flutter-build-responsive-layout/SKILL.md +139 -0
- package/skills/flutter-skills/skills/flutter-fix-layout-issues/SKILL.md +130 -0
- package/skills/flutter-skills/skills/flutter-implement-json-serialization/SKILL.md +153 -0
- package/skills/flutter-skills/skills/flutter-setup-declarative-routing/SKILL.md +255 -0
- package/skills/flutter-skills/skills/flutter-setup-localization/SKILL.md +210 -0
- package/skills/flutter-skills/skills/flutter-use-http-package/SKILL.md +175 -0
- package/skills/flutter-skills/tool/dart_skills_lint/.agents/skills/add-dart-lint-validation-rule/SKILL.md +196 -0
- package/skills/flutter-skills/tool/dart_skills_lint/.agents/skills/dart-best-practices/SKILL.md +65 -0
- package/skills/flutter-skills/tool/dart_skills_lint/.agents/skills/dart-checks-migration/SKILL.md +158 -0
- package/skills/flutter-skills/tool/dart_skills_lint/.agents/skills/dart-cli-app-best-practices/SKILL.md +168 -0
- package/skills/flutter-skills/tool/dart_skills_lint/.agents/skills/dart-doc-validation/SKILL.md +87 -0
- package/skills/flutter-skills/tool/dart_skills_lint/.agents/skills/dart-long-lines/SKILL.md +101 -0
- package/skills/flutter-skills/tool/dart_skills_lint/.agents/skills/dart-matcher-best-practices/SKILL.md +136 -0
- package/skills/flutter-skills/tool/dart_skills_lint/.agents/skills/dart-modern-features/SKILL.md +266 -0
- package/skills/flutter-skills/tool/dart_skills_lint/.agents/skills/dart-package-maintenance/SKILL.md +92 -0
- package/skills/flutter-skills/tool/dart_skills_lint/.agents/skills/dart-test-coverage/SKILL.md +92 -0
- package/skills/flutter-skills/tool/dart_skills_lint/.agents/skills/dart-test-coverage/example/lib/src/calculator.dart +7 -0
- package/skills/flutter-skills/tool/dart_skills_lint/.agents/skills/dart-test-coverage/example/pubspec.yaml +8 -0
- package/skills/flutter-skills/tool/dart_skills_lint/.agents/skills/dart-test-coverage/example/test/calculator_test.dart +11 -0
- package/skills/flutter-skills/tool/dart_skills_lint/.agents/skills/dart-test-coverage/scripts/interpret_coverage.dart +95 -0
- package/skills/flutter-skills/tool/dart_skills_lint/.agents/skills/dart-test-coverage/scripts/pubspec.yaml +6 -0
- package/skills/flutter-skills/tool/dart_skills_lint/.agents/skills/dart-test-coverage/scripts/test/interpret_coverage_test.dart +93 -0
- package/skills/flutter-skills/tool/dart_skills_lint/.agents/skills/dart-test-fundamentals/SKILL.md +173 -0
- package/skills/flutter-skills/tool/dart_skills_lint/.agents/skills/definition-of-done/SKILL.md +27 -0
- package/skills/flutter-skills/tool/dart_skills_lint/.agents/skills/flutter_skills_ignore.json +3 -0
- package/skills/flutter-skills/tool/dart_skills_lint/.agents/skills/grill-me/SKILL.md +10 -0
- package/skills/flutter-skills/tool/dart_skills_lint/.agents/skills/ignore.json +3 -0
- package/skills/flutter-skills/tool/dart_skills_lint/.agents/skills/test-driven-development/SKILL.md +371 -0
- package/skills/flutter-skills/tool/dart_skills_lint/.agents/skills/test-driven-development/testing-anti-patterns.md +299 -0
- package/skills/flutter-skills/tool/dart_skills_lint/AUTHORS +7 -0
- package/skills/flutter-skills/tool/dart_skills_lint/CHANGELOG.md +12 -0
- package/skills/flutter-skills/tool/dart_skills_lint/CONTRIBUTING.md +51 -0
- package/skills/flutter-skills/tool/dart_skills_lint/LICENSE +27 -0
- package/skills/flutter-skills/tool/dart_skills_lint/README.md +203 -0
- package/skills/flutter-skills/tool/dart_skills_lint/analysis_options.yaml +296 -0
- package/skills/flutter-skills/tool/dart_skills_lint/bench/README.md +23 -0
- package/skills/flutter-skills/tool/dart_skills_lint/bench/baseline_throughput.dart +230 -0
- package/skills/flutter-skills/tool/dart_skills_lint/bin/cli.dart +10 -0
- package/skills/flutter-skills/tool/dart_skills_lint/dart_skills_lint.yaml +14 -0
- package/skills/flutter-skills/tool/dart_skills_lint/documentation/feature_design_docs/PRODUCTION_READYNESS.md +48 -0
- package/skills/flutter-skills/tool/dart_skills_lint/documentation/feature_design_docs/completion_migration_plan.md +99 -0
- package/skills/flutter-skills/tool/dart_skills_lint/documentation/feature_design_docs/legacy_patterns_report.md +110 -0
- package/skills/flutter-skills/tool/dart_skills_lint/documentation/feature_design_docs/pub_vs_skill_report.md +56 -0
- package/skills/flutter-skills/tool/dart_skills_lint/documentation/knowledge/SPECIFICATION.md +79 -0
- package/skills/flutter-skills/tool/dart_skills_lint/documentation/knowledge/architecture_overview.md +64 -0
- package/skills/flutter-skills/tool/dart_skills_lint/lib/dart_skills_lint.dart +11 -0
- package/skills/flutter-skills/tool/dart_skills_lint/lib/src/config_parser.dart +156 -0
- package/skills/flutter-skills/tool/dart_skills_lint/lib/src/entry_point.dart +354 -0
- package/skills/flutter-skills/tool/dart_skills_lint/lib/src/fixable_rule.dart +20 -0
- package/skills/flutter-skills/tool/dart_skills_lint/lib/src/models/analysis_severity.dart +15 -0
- package/skills/flutter-skills/tool/dart_skills_lint/lib/src/models/check_type.dart +17 -0
- package/skills/flutter-skills/tool/dart_skills_lint/lib/src/models/ignore_entry.dart +34 -0
- package/skills/flutter-skills/tool/dart_skills_lint/lib/src/models/ignore_entry.g.dart +19 -0
- package/skills/flutter-skills/tool/dart_skills_lint/lib/src/models/skill_context.dart +27 -0
- package/skills/flutter-skills/tool/dart_skills_lint/lib/src/models/skill_rule.dart +27 -0
- package/skills/flutter-skills/tool/dart_skills_lint/lib/src/models/skills_ignores.dart +26 -0
- package/skills/flutter-skills/tool/dart_skills_lint/lib/src/models/skills_ignores.g.dart +24 -0
- package/skills/flutter-skills/tool/dart_skills_lint/lib/src/models/validation_error.dart +31 -0
- package/skills/flutter-skills/tool/dart_skills_lint/lib/src/rule_registry.dart +79 -0
- package/skills/flutter-skills/tool/dart_skills_lint/lib/src/rules/absolute_paths_rule.dart +74 -0
- package/skills/flutter-skills/tool/dart_skills_lint/lib/src/rules/description_length_rule.dart +49 -0
- package/skills/flutter-skills/tool/dart_skills_lint/lib/src/rules/disallowed_field_rule.dart +61 -0
- package/skills/flutter-skills/tool/dart_skills_lint/lib/src/rules/name_format_rule.dart +167 -0
- package/skills/flutter-skills/tool/dart_skills_lint/lib/src/rules/relative_paths_rule.dart +72 -0
- package/skills/flutter-skills/tool/dart_skills_lint/lib/src/rules/trailing_whitespace_rule.dart +93 -0
- package/skills/flutter-skills/tool/dart_skills_lint/lib/src/rules/valid_yaml_metadata_rule.dart +74 -0
- package/skills/flutter-skills/tool/dart_skills_lint/lib/src/skills_ignores_storage.dart +36 -0
- package/skills/flutter-skills/tool/dart_skills_lint/lib/src/validation_session.dart +559 -0
- package/skills/flutter-skills/tool/dart_skills_lint/lib/src/validator.dart +238 -0
- package/skills/flutter-skills/tool/dart_skills_lint/pubspec.yaml +28 -0
- package/skills/flutter-skills/tool/dart_skills_lint/skills/README.md +10 -0
- package/skills/flutter-skills/tool/dart_skills_lint/skills/dart-skills-lint-validation/SKILL.md +195 -0
- package/skills/flutter-skills/tool/dart_skills_lint/skills-lock.json +75 -0
- package/skills/flutter-skills/tool/dart_skills_lint/test/absolute_paths_test.dart +167 -0
- package/skills/flutter-skills/tool/dart_skills_lint/test/cli_integration_test.dart +683 -0
- package/skills/flutter-skills/tool/dart_skills_lint/test/config_file_test.dart +292 -0
- package/skills/flutter-skills/tool/dart_skills_lint/test/custom_rule_test.dart +122 -0
- package/skills/flutter-skills/tool/dart_skills_lint/test/directory_structure_test.dart +163 -0
- package/skills/flutter-skills/tool/dart_skills_lint/test/field_constraints_test.dart +178 -0
- package/skills/flutter-skills/tool/dart_skills_lint/test/fixer_test.dart +172 -0
- package/skills/flutter-skills/tool/dart_skills_lint/test/ignore_models_test.dart +63 -0
- package/skills/flutter-skills/tool/dart_skills_lint/test/metadata_validation_test.dart +116 -0
- package/skills/flutter-skills/tool/dart_skills_lint/test/relative_path_flag_test.dart +70 -0
- package/skills/flutter-skills/tool/dart_skills_lint/test/relative_paths_test.dart +172 -0
- package/skills/flutter-skills/tool/dart_skills_lint/test/resolve_rules_test.dart +82 -0
- package/skills/flutter-skills/tool/dart_skills_lint/test/rule_naming_test.dart +29 -0
- package/skills/flutter-skills/tool/dart_skills_lint/test/skills_ignores_storage_test.dart +89 -0
- package/skills/flutter-skills/tool/dart_skills_lint/test/test_utils.dart +19 -0
- package/skills/flutter-skills/tool/dart_skills_lint/test/trailing_whitespace_test.dart +152 -0
- package/skills/flutter-skills/tool/generator/README.md +150 -0
- package/skills/flutter-skills/tool/generator/analysis_options.yaml +143 -0
- package/skills/flutter-skills/tool/generator/bin/skills.dart +73 -0
- package/skills/flutter-skills/tool/generator/lib/src/commands/base_skill_command.dart +87 -0
- package/skills/flutter-skills/tool/generator/lib/src/commands/base_yaml_command.dart +83 -0
- package/skills/flutter-skills/tool/generator/lib/src/commands/generate_skill_command.dart +92 -0
- package/skills/flutter-skills/tool/generator/lib/src/commands/update_readme_command.dart +150 -0
- package/skills/flutter-skills/tool/generator/lib/src/commands/update_skill_command.dart +97 -0
- package/skills/flutter-skills/tool/generator/lib/src/commands/validate_skill_command.dart +284 -0
- package/skills/flutter-skills/tool/generator/lib/src/models/skill_params.dart +41 -0
- package/skills/flutter-skills/tool/generator/lib/src/services/gemini_service.dart +310 -0
- package/skills/flutter-skills/tool/generator/lib/src/services/markdown_converter.dart +226 -0
- package/skills/flutter-skills/tool/generator/lib/src/services/prompts.dart +72 -0
- package/skills/flutter-skills/tool/generator/lib/src/services/resource_fetcher_service.dart +84 -0
- package/skills/flutter-skills/tool/generator/lib/src/services/skill_instructions.dart +30 -0
- package/skills/flutter-skills/tool/generator/pubspec.yaml +32 -0
- package/skills/flutter-skills/tool/generator/test/commands/base_skill_command_test.dart +131 -0
- package/skills/flutter-skills/tool/generator/test/commands/validate_skills_input_test.dart +263 -0
- package/skills/flutter-skills/tool/generator/test/custom_skill_rules/last_modified_rule.dart +32 -0
- package/skills/flutter-skills/tool/generator/test/generate_skills_retry_test.dart +105 -0
- package/skills/flutter-skills/tool/generator/test/generate_skills_test.dart +519 -0
- package/skills/flutter-skills/tool/generator/test/lint_skills_test.dart +34 -0
- package/skills/flutter-skills/tool/generator/test/markdown_converter_test.dart +103 -0
- package/skills/flutter-skills/tool/generator/test/markdown_table_test.dart +131 -0
- package/skills/flutter-skills/tool/generator/test/models/skill_params_test.dart +37 -0
- package/skills/flutter-skills/tool/generator/test/services/gemini_service_test.dart +291 -0
- package/skills/flutter-skills/tool/generator/test/services/markdown_converter_test.dart +156 -0
- package/skills/flutter-skills/tool/generator/test/services/resource_fetcher_service_test.dart +188 -0
- package/skills/flutter-skills/tool/generator/test/update_skills_test.dart +241 -0
- package/skills/flutter-skills/tool/generator/test/validate_skills_test.dart +728 -0
- package/skills/quality-assurance/bdd-acceptance/SKILL.md +5 -14
- package/skills/quality-assurance/flutter-test/SKILL.md +5 -16
- package/skills/rules/project_rules.md +538 -127
- package/skills/special-tools/env-check/SKILL.md +5 -13
- package/skills/special-tools/ios-full-auto-debug/SKILL.md +5 -15
- package/skills/writing-skills/SKILL.md +654 -0
- package/skills/writing-skills/anthropic-best-practices.md +1149 -0
- package/skills/writing-skills/examples/CLAUDE_MD_TESTING.md +189 -0
- package/skills/writing-skills/graphviz-conventions.dot +172 -0
- package/skills/writing-skills/persuasion-principles.md +187 -0
- package/skills/writing-skills/render-graphs.js +168 -0
- package/skills/writing-skills/testing-skills-with-subagents.md +384 -0
- package/skills/checklist.md +0 -154
- package/skills/rules/user_rules.md +0 -263
- package/skills//345/256/214/346/225/264/345/274/200/345/217/221/346/265/201/347/250/213/346/211/213/345/206/214.md +0 -454
- package/skills//346/212/200/350/203/275/344/275/223/347/263/273/345/256/214/345/226/204/345/273/272/350/256/256.md +0 -308
- package/skills//346/212/200/350/203/275/344/275/277/347/224/250/346/214/207/345/215/227.md +0 -309
- package/skills//346/212/200/350/203/275/345/206/263/347/255/226/346/240/221.md +0 -338
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
// Copyright (c) 2026, the Dart project authors. Please see the AUTHORS file
|
|
2
|
+
// for details. All rights reserved. Use of this source code is governed by a
|
|
3
|
+
// BSD-style license that can be found in the LICENSE file.
|
|
4
|
+
|
|
5
|
+
import 'dart:io';
|
|
6
|
+
|
|
7
|
+
import 'package:dart_skills_lint/src/models/analysis_severity.dart';
|
|
8
|
+
import 'package:dart_skills_lint/src/models/skill_context.dart';
|
|
9
|
+
|
|
10
|
+
import 'package:dart_skills_lint/src/rules/absolute_paths_rule.dart';
|
|
11
|
+
import 'package:dart_skills_lint/src/rules/relative_paths_rule.dart';
|
|
12
|
+
import 'package:dart_skills_lint/src/validator.dart';
|
|
13
|
+
import 'package:test/test.dart';
|
|
14
|
+
|
|
15
|
+
import 'test_utils.dart';
|
|
16
|
+
|
|
17
|
+
void main() {
|
|
18
|
+
group('Absolute Paths Validation', () {
|
|
19
|
+
late Directory tempDir;
|
|
20
|
+
|
|
21
|
+
setUp(() async {
|
|
22
|
+
tempDir = await Directory.systemTemp.createTemp('absolute_path_test.');
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
tearDown(() async {
|
|
26
|
+
if (tempDir.existsSync()) {
|
|
27
|
+
await tempDir.delete(recursive: true);
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
test('flags absolute path starting with / as warning by default', () async {
|
|
32
|
+
final Directory skillDir = await Directory('${tempDir.path}/test-skill').create();
|
|
33
|
+
await File('${skillDir.path}/SKILL.md').writeAsString(
|
|
34
|
+
'${buildFrontmatter(name: 'test-skill')}[Absolute link](/absolute/path.md)\n',
|
|
35
|
+
);
|
|
36
|
+
|
|
37
|
+
final validator = Validator();
|
|
38
|
+
final ValidationResult result = await validator.validate(skillDir);
|
|
39
|
+
|
|
40
|
+
expect(result.isValid, isTrue);
|
|
41
|
+
expect(
|
|
42
|
+
result.warnings,
|
|
43
|
+
contains(contains('Absolute filepath found in link: /absolute/path.md')),
|
|
44
|
+
);
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
test('flags windows absolute path starting with drive letter as error', () async {
|
|
48
|
+
final Directory skillDir = await Directory('${tempDir.path}/test-skill').create();
|
|
49
|
+
await File('${skillDir.path}/SKILL.md').writeAsString(
|
|
50
|
+
'${buildFrontmatter(name: 'test-skill')}[Windows absolute link](C:\\absolute\\path.md)\n',
|
|
51
|
+
);
|
|
52
|
+
|
|
53
|
+
final validator = Validator();
|
|
54
|
+
final ValidationResult result = await validator.validate(skillDir);
|
|
55
|
+
|
|
56
|
+
expect(result.isValid, isTrue);
|
|
57
|
+
expect(
|
|
58
|
+
result.warnings,
|
|
59
|
+
contains(contains(r'Absolute filepath found in link: C:\absolute\path.md')),
|
|
60
|
+
);
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
test('ignores valid relative paths resembling windows drives', () async {
|
|
64
|
+
final Directory skillDir = await Directory('${tempDir.path}/test-skill').create();
|
|
65
|
+
await File(
|
|
66
|
+
'${skillDir.path}/SKILL.md',
|
|
67
|
+
).writeAsString('${buildFrontmatter(name: 'test-skill')}[Relative link](C:relative.md)\n');
|
|
68
|
+
|
|
69
|
+
final validator = Validator(
|
|
70
|
+
ruleOverrides: {RelativePathsRule.ruleName: AnalysisSeverity.disabled},
|
|
71
|
+
);
|
|
72
|
+
final ValidationResult result = await validator.validate(skillDir);
|
|
73
|
+
|
|
74
|
+
expect(result.isValid, isTrue);
|
|
75
|
+
expect(result.errors, isEmpty);
|
|
76
|
+
expect(result.warnings, isEmpty);
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
test('ignores ordinary file links', () async {
|
|
80
|
+
final Directory skillDir = await Directory('${tempDir.path}/test-skill').create();
|
|
81
|
+
await File(
|
|
82
|
+
'${skillDir.path}/SKILL.md',
|
|
83
|
+
).writeAsString('${buildFrontmatter(name: 'test-skill')}[Relative link](file.md)\n');
|
|
84
|
+
|
|
85
|
+
final validator = Validator(
|
|
86
|
+
ruleOverrides: {RelativePathsRule.ruleName: AnalysisSeverity.disabled},
|
|
87
|
+
);
|
|
88
|
+
final ValidationResult result = await validator.validate(skillDir);
|
|
89
|
+
|
|
90
|
+
expect(result.isValid, isTrue);
|
|
91
|
+
expect(result.errors, isEmpty);
|
|
92
|
+
expect(result.warnings, isEmpty);
|
|
93
|
+
});
|
|
94
|
+
test('ignores absolute paths when disabled', () async {
|
|
95
|
+
final Directory skillDir = await Directory('${tempDir.path}/test-skill').create();
|
|
96
|
+
await File('${skillDir.path}/SKILL.md').writeAsString(
|
|
97
|
+
'${buildFrontmatter(name: 'test-skill')}Body with [broken link](missing.md) and [absolute link](/absolute/path.md)',
|
|
98
|
+
);
|
|
99
|
+
|
|
100
|
+
final validator = Validator(
|
|
101
|
+
ruleOverrides: {AbsolutePathsRule.ruleName: AnalysisSeverity.disabled},
|
|
102
|
+
);
|
|
103
|
+
final ValidationResult result = await validator.validate(skillDir);
|
|
104
|
+
|
|
105
|
+
expect(result.isValid, isTrue);
|
|
106
|
+
expect(result.errors, isEmpty);
|
|
107
|
+
expect(result.warnings, isEmpty);
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
test(
|
|
111
|
+
'flags absolute path as warning when absolutePathsSeverity: AnalysisSeverity.warning',
|
|
112
|
+
() async {
|
|
113
|
+
final Directory skillDir = await Directory('${tempDir.path}/test-skill').create();
|
|
114
|
+
await File('${skillDir.path}/SKILL.md').writeAsString(
|
|
115
|
+
'${buildFrontmatter(name: 'test-skill')}Body with [absolute link](/absolute/path.md)',
|
|
116
|
+
);
|
|
117
|
+
|
|
118
|
+
final validator = Validator(
|
|
119
|
+
ruleOverrides: {AbsolutePathsRule.ruleName: AnalysisSeverity.warning},
|
|
120
|
+
);
|
|
121
|
+
final ValidationResult result = await validator.validate(skillDir);
|
|
122
|
+
|
|
123
|
+
expect(result.isValid, isTrue); // Warnings don't fail validation
|
|
124
|
+
expect(result.errors, isEmpty);
|
|
125
|
+
expect(
|
|
126
|
+
result.warnings,
|
|
127
|
+
contains(contains('Absolute filepath found in link: /absolute/path.md')),
|
|
128
|
+
);
|
|
129
|
+
},
|
|
130
|
+
);
|
|
131
|
+
|
|
132
|
+
test('fixes absolute path to relative if file exists', () async {
|
|
133
|
+
final Directory skillDir = await Directory('${tempDir.path}/test-skill').create();
|
|
134
|
+
final File targetFile = await File('${tempDir.path}/target.md').create();
|
|
135
|
+
|
|
136
|
+
await File(
|
|
137
|
+
'${skillDir.path}/SKILL.md',
|
|
138
|
+
).writeAsString('${buildFrontmatter(name: 'test-skill')}[Link](${targetFile.path})\n');
|
|
139
|
+
|
|
140
|
+
final rule = AbsolutePathsRule();
|
|
141
|
+
final file = File('${skillDir.path}/SKILL.md');
|
|
142
|
+
final String content = await file.readAsString();
|
|
143
|
+
final context = SkillContext(directory: skillDir, rawContent: content);
|
|
144
|
+
|
|
145
|
+
final String fixedContent = await rule.fix('SKILL.md', content, context.directory);
|
|
146
|
+
|
|
147
|
+
expect(fixedContent, contains('(../target.md)'));
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
test('does not fix absolute path if file does not exist', () async {
|
|
151
|
+
final Directory skillDir = await Directory('${tempDir.path}/test-skill').create();
|
|
152
|
+
|
|
153
|
+
await File(
|
|
154
|
+
'${skillDir.path}/SKILL.md',
|
|
155
|
+
).writeAsString('${buildFrontmatter(name: 'test-skill')}[Link](/non/existent/file.md)\n');
|
|
156
|
+
|
|
157
|
+
final rule = AbsolutePathsRule();
|
|
158
|
+
final file = File('${skillDir.path}/SKILL.md');
|
|
159
|
+
final String content = await file.readAsString();
|
|
160
|
+
final context = SkillContext(directory: skillDir, rawContent: content);
|
|
161
|
+
|
|
162
|
+
final String fixedContent = await rule.fix('SKILL.md', content, context.directory);
|
|
163
|
+
|
|
164
|
+
expect(fixedContent, contains('(/non/existent/file.md)'));
|
|
165
|
+
});
|
|
166
|
+
});
|
|
167
|
+
}
|