feat: mount canonical gitea-workflow skill for Codex and MCP inventory (Closes #551)
Expose gitea-workflow / llm-project-workflow / git-pr-workflows as one workflow router in mcp_list_project_skills, add preflight + Codex install script, and document multi-runtime skill name parity.
This commit is contained in:
@@ -0,0 +1,87 @@
|
||||
"""Tests for canonical workflow skill naming and preflight (#551)."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import os
|
||||
import tempfile
|
||||
import unittest
|
||||
from pathlib import Path
|
||||
from unittest.mock import patch
|
||||
|
||||
import workflow_skill
|
||||
import mcp_server
|
||||
|
||||
|
||||
class TestWorkflowSkillModule(unittest.TestCase):
|
||||
def test_canonical_names_include_gitea_workflow(self):
|
||||
names = workflow_skill.CANONICAL_WORKFLOW_SKILL_NAMES
|
||||
self.assertIn("gitea-workflow", names)
|
||||
self.assertIn("llm-project-workflow", names)
|
||||
self.assertIn("git-pr-workflows", names)
|
||||
|
||||
def test_repo_skill_present_in_this_checkout(self):
|
||||
root = str(Path(__file__).resolve().parent.parent)
|
||||
result = workflow_skill.assess_workflow_skill_presence(root)
|
||||
self.assertTrue(result["repo_skill_present"])
|
||||
self.assertTrue(result["repo_alias_present"])
|
||||
self.assertTrue(result["workflow_skill_ready"])
|
||||
self.assertFalse(result["blocked"])
|
||||
|
||||
def test_missing_repo_skill_blocks(self):
|
||||
with tempfile.TemporaryDirectory() as tmp:
|
||||
result = workflow_skill.assess_workflow_skill_presence(tmp)
|
||||
self.assertTrue(result["blocked"])
|
||||
self.assertFalse(result["workflow_skill_ready"])
|
||||
self.assertTrue(any("missing" in r for r in result["reasons"]))
|
||||
|
||||
def test_codex_mount_detection(self):
|
||||
root = str(Path(__file__).resolve().parent.parent)
|
||||
with tempfile.TemporaryDirectory() as tmp:
|
||||
skill_dir = Path(tmp) / "gitea-workflow"
|
||||
skill_dir.mkdir()
|
||||
(skill_dir / "SKILL.md").write_text("# x\n", encoding="utf-8")
|
||||
result = workflow_skill.assess_workflow_skill_presence(
|
||||
root, codex_skills_dir=tmp
|
||||
)
|
||||
self.assertTrue(result["codex_skill_mounted"])
|
||||
self.assertTrue(result["codex_skill_mounts"]["gitea-workflow"])
|
||||
|
||||
def test_registry_entries_cover_aliases(self):
|
||||
entries = workflow_skill.workflow_skill_registry_entries()
|
||||
for name in workflow_skill.CANONICAL_WORKFLOW_SKILL_NAMES:
|
||||
self.assertIn(name, entries)
|
||||
self.assertEqual(entries[name]["status"], "available")
|
||||
|
||||
|
||||
class TestWorkflowSkillMcpTools(unittest.TestCase):
|
||||
def test_list_includes_canonical_names(self):
|
||||
with patch.dict(
|
||||
os.environ,
|
||||
{
|
||||
"GITEA_PROFILE_NAME": "author-test",
|
||||
"GITEA_ALLOWED_OPERATIONS": "gitea.read",
|
||||
"GITEA_FORBIDDEN_OPERATIONS": "",
|
||||
},
|
||||
clear=False,
|
||||
):
|
||||
result = mcp_server.mcp_list_project_skills()
|
||||
names = {s["name"] for s in result["skills"]}
|
||||
for name in workflow_skill.CANONICAL_WORKFLOW_SKILL_NAMES:
|
||||
self.assertIn(name, names)
|
||||
|
||||
def test_get_skill_guide_gitea_workflow(self):
|
||||
guide = mcp_server.mcp_get_skill_guide("gitea-workflow")
|
||||
self.assertTrue(guide["success"])
|
||||
self.assertTrue(guide["steps"])
|
||||
self.assertIn("workflow", " ".join(guide["steps"]).lower())
|
||||
|
||||
def test_preflight_tool_ok_on_repo(self):
|
||||
result = mcp_server.mcp_check_workflow_skill_preflight()
|
||||
self.assertTrue(result["success"])
|
||||
self.assertTrue(result["workflow_skill_ready"])
|
||||
self.assertFalse(result["blocked"])
|
||||
self.assertIn("gitea-workflow", result["canonical_names"])
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
Reference in New Issue
Block a user