blob: ea80d5ec7308f025301852ac0af4c7bc87f89e41 [file] [edit]
import 'dart:io';
import 'package:logging/logging.dart';
import 'package:path/path.dart' as p;
import 'package:skills/src/core/skill_scanner.dart';
import 'package:skills/src/agent/adapters/opencode_adapter.dart';
import 'package:test/test.dart';
import 'package:test_descriptor/test_descriptor.dart' as d;
void main() {
setUpAll(() {
Logger.root.onRecord.listen((r) => printOnFailure(r.toString()));
});
group('Given an OpenCodeAdapter', () {
late OpenCodeAdapter adapter;
setUp(() async {
await d.dir('project', [
d.dir('.opencode', [d.dir('skills')]),
]).create();
adapter = OpenCodeAdapter(d.path('project'));
});
group('and a scanned skill', () {
late ScannedSkill skill;
setUp(() async {
await d.dir('opencode_pkg', [
d.dir('skills', [
d.dir('opencode_pkg-code-review', [
d.file('SKILL.md', '''
---
name: opencode_pkg-code-review
description: Reviews code.
---
# Code Review
Review guidelines here.
'''),
]),
]),
]).create();
skill = ScannedSkill(
packageName: 'opencode_pkg',
skillName: 'opencode_pkg-code-review',
skillPath: d.path('opencode_pkg/skills/opencode_pkg-code-review'),
);
});
test(
'when installing then creates skill directory in .opencode/skills/',
() async {
final name = (await adapter.installSkill(skill)).name;
expect(name, equals('opencode_pkg-code-review'));
final installed = Directory(
p.join(
d.path('project'),
'.opencode',
'skills',
'opencode_pkg-code-review',
),
);
expect(await installed.exists(), isTrue);
},
);
test('when installing then SKILL.md is copied unchanged', () async {
await adapter.installSkill(skill);
final content = await File(
p.join(
d.path('project'),
'.opencode',
'skills',
'opencode_pkg-code-review',
'SKILL.md',
),
).readAsString();
expect(content, contains('name: opencode_pkg-code-review'));
expect(content, contains('# Code Review'));
});
});
test('when removing then deletes the skill directory', () async {
await d.dir('project', [
d.dir('.opencode', [
d.dir('skills', [
d.dir('pkg-skill', [
d.file(
'SKILL.md',
'---\nname: pkg-skill\n'
'description: x\n---\nbody',
),
]),
]),
]),
]).create();
adapter = OpenCodeAdapter(d.path('project'));
await adapter.removeSkill('pkg-skill');
expect(
await Directory(
p.join(d.path('project'), '.opencode', 'skills', 'pkg-skill'),
).exists(),
isFalse,
);
});
});
}