refactor: fold ack kit into skill
This commit is contained in:
@@ -8,15 +8,16 @@ REPO_ROOT = Path(__file__).resolve().parents[1]
|
||||
|
||||
|
||||
class AckSkillContentTests(unittest.TestCase):
|
||||
def test_ack_skill_routes_to_kit_without_modifying_agent_instructions(self) -> None:
|
||||
def test_ack_skill_owns_resources_without_modifying_agent_instructions(self) -> None:
|
||||
content = (REPO_ROOT / "skills" / "ack" / "SKILL.md").read_text(encoding="utf-8")
|
||||
|
||||
for expected in (
|
||||
"skiff kit init ack --project <project-root>",
|
||||
"skiff init ack --project <project-root>",
|
||||
"docs/ack/project.md",
|
||||
"docs/ack/tasks.yaml",
|
||||
"tasks: []",
|
||||
"validate_tasks.py",
|
||||
"references/kickoff.md",
|
||||
"不要修改项目的 `AGENTS.md`",
|
||||
"当前会话担任 Coordinator",
|
||||
):
|
||||
|
||||
@@ -19,7 +19,7 @@ class ProjectSkillContentTests(unittest.TestCase):
|
||||
"skiff check <name>",
|
||||
"~/.skills/skills/<name>/",
|
||||
"第三方 skill",
|
||||
"skiff kit init ack",
|
||||
"skiff init ack",
|
||||
"显式调用全局 `/ack` skill",
|
||||
):
|
||||
self.assertIn(expected, content)
|
||||
|
||||
@@ -11,22 +11,23 @@ from pathlib import Path
|
||||
REPO_ROOT = Path(__file__).resolve().parents[1]
|
||||
|
||||
|
||||
class KitInitTests(unittest.TestCase):
|
||||
class SkillInitTests(unittest.TestCase):
|
||||
def setUp(self) -> None:
|
||||
self.temp_dir = tempfile.TemporaryDirectory()
|
||||
self.home = Path(self.temp_dir.name)
|
||||
self.skills_home = self.home / ".skills"
|
||||
kit = self.skills_home / "kits" / "ack"
|
||||
(kit / "templates").mkdir(parents=True)
|
||||
(kit / "scripts").mkdir()
|
||||
(kit / "VERSION").write_text("1.2.3\n", encoding="utf-8")
|
||||
(kit / "templates" / "project.template.md").write_text(
|
||||
"# <project_name>\nversion=<kit_version>\npath=<overlay_file_path>\n",
|
||||
skill = self.skills_home / "skills" / "ack"
|
||||
(skill / "templates").mkdir(parents=True)
|
||||
(skill / "scripts").mkdir()
|
||||
(skill / "SKILL.md").write_text("---\nname: ack\n---\n", encoding="utf-8")
|
||||
(skill / "VERSION").write_text("1.2.3\n", encoding="utf-8")
|
||||
(skill / "templates" / "project.template.md").write_text(
|
||||
"# <project_name>\nversion=<ack_version>\npath=<overlay_file_path>\n",
|
||||
encoding="utf-8",
|
||||
)
|
||||
(kit / "templates" / "tasks.template.yaml").write_text(
|
||||
(skill / "templates" / "tasks.template.yaml").write_text(
|
||||
'updatedAt: "<YYYY-MM-DDTHH:mm:ss+TZ>"\n'
|
||||
'kitVersion: "<接入时的 ack 版本,见 kit 根 VERSION>"\n'
|
||||
'ackVersion: "<接入时的 ack skill 版本>"\n'
|
||||
'project:\n'
|
||||
' name: "<project_name>"\n'
|
||||
' repoPath: "<repo_path>"\n'
|
||||
@@ -50,16 +51,16 @@ class KitInitTests(unittest.TestCase):
|
||||
check=False,
|
||||
)
|
||||
|
||||
def test_init_creates_symlink_and_rendered_project_files(self) -> None:
|
||||
def test_init_creates_only_rendered_project_files(self) -> None:
|
||||
project = self.home / "sample-app"
|
||||
project.mkdir()
|
||||
|
||||
result = self.run_skiff("kit", "init", "ack", "--project", str(project))
|
||||
result = self.run_skiff("init", "ack", "--project", str(project))
|
||||
|
||||
self.assertEqual(result.returncode, 0, result.stderr)
|
||||
target = project / "docs" / "ack"
|
||||
self.assertTrue((target / "kit").is_symlink())
|
||||
self.assertEqual((target / "kit").resolve(), self.skills_home / "kits" / "ack")
|
||||
self.assertFalse((target / "kit").exists())
|
||||
self.assertFalse((target / "framework").exists())
|
||||
project_content = (target / "project.md").read_text(encoding="utf-8")
|
||||
tasks_content = (target / "tasks.yaml").read_text(encoding="utf-8")
|
||||
self.assertIn("# sample-app", project_content)
|
||||
@@ -67,18 +68,6 @@ class KitInitTests(unittest.TestCase):
|
||||
self.assertIn(f'repoPath: "{project}"', tasks_content)
|
||||
self.assertNotIn("<project_name>", tasks_content)
|
||||
|
||||
def test_init_copy_mode_copies_kit(self) -> None:
|
||||
project = self.home / "copied-app"
|
||||
project.mkdir()
|
||||
|
||||
result = self.run_skiff("kit", "init", "ack", "--copy", "--project", str(project))
|
||||
|
||||
self.assertEqual(result.returncode, 0, result.stderr)
|
||||
target = project / "docs" / "ack" / "kit"
|
||||
self.assertTrue(target.is_dir())
|
||||
self.assertFalse(target.is_symlink())
|
||||
self.assertEqual((target / "VERSION").read_text(encoding="utf-8"), "1.2.3\n")
|
||||
|
||||
def test_init_refuses_to_overwrite_existing_files(self) -> None:
|
||||
project = self.home / "existing-app"
|
||||
target = project / "docs" / "ack"
|
||||
@@ -86,22 +75,28 @@ class KitInitTests(unittest.TestCase):
|
||||
existing = target / "project.md"
|
||||
existing.write_text("keep me", encoding="utf-8")
|
||||
|
||||
result = self.run_skiff("kit", "init", "ack", "--project", str(project))
|
||||
result = self.run_skiff("init", "ack", "--project", str(project))
|
||||
|
||||
self.assertNotEqual(result.returncode, 0)
|
||||
self.assertIn("拒绝覆盖已有路径", result.stderr)
|
||||
self.assertEqual(existing.read_text(encoding="utf-8"), "keep me")
|
||||
self.assertFalse((target / "kit").exists())
|
||||
self.assertFalse((target / "tasks.yaml").exists())
|
||||
|
||||
def test_init_rejects_missing_project_directory(self) -> None:
|
||||
project = self.home / "missing-app"
|
||||
|
||||
result = self.run_skiff("kit", "init", "ack", "--project", str(project))
|
||||
result = self.run_skiff("init", "ack", "--project", str(project))
|
||||
|
||||
self.assertNotEqual(result.returncode, 0)
|
||||
self.assertIn("项目目录不存在", result.stderr)
|
||||
self.assertFalse(project.exists())
|
||||
|
||||
def test_legacy_kit_command_is_not_exposed(self) -> None:
|
||||
result = self.run_skiff("kit", "init", "ack")
|
||||
|
||||
self.assertNotEqual(result.returncode, 0)
|
||||
self.assertIn("invalid choice", result.stderr)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
Reference in New Issue
Block a user