From 67d319c9156147d492876ce8e38d9cd504057bd6 Mon Sep 17 00:00:00 2001 From: Hermes Agent Date: Sat, 18 Jul 2026 22:06:21 +0300 Subject: [PATCH] feat: add top-level --version flag to CLI (Closes #1) - Import __version__ from skill2 package in cli.py - Add -V/--version argparse action to build_parser() - Add regression tests for --version and -V flags in test_cli.py - Sync generated Skill runtime bundles via sync_skill_runtime.py --- skills/skill2-audit/scripts/.runtime-manifest.json | 2 +- skills/skill2-audit/scripts/_runtime/skill2/cli.py | 13 ++++++++++++- skills/skill2-create/scripts/.runtime-manifest.json | 2 +- skills/skill2-create/scripts/_runtime/skill2/cli.py | 13 ++++++++++++- .../skill2-package/scripts/.runtime-manifest.json | 2 +- .../skill2-package/scripts/_runtime/skill2/cli.py | 13 ++++++++++++- skills/skill2-test/scripts/.runtime-manifest.json | 2 +- skills/skill2-test/scripts/_runtime/skill2/cli.py | 13 ++++++++++++- .../skill2-visualize/scripts/.runtime-manifest.json | 2 +- .../skill2-visualize/scripts/_runtime/skill2/cli.py | 13 ++++++++++++- src/skill2/cli.py | 13 ++++++++++++- tests/test_cli.py | 10 ++++++++++ 12 files changed, 87 insertions(+), 11 deletions(-) diff --git a/skills/skill2-audit/scripts/.runtime-manifest.json b/skills/skill2-audit/scripts/.runtime-manifest.json index 5c8fdbe..044042b 100644 --- a/skills/skill2-audit/scripts/.runtime-manifest.json +++ b/skills/skill2-audit/scripts/.runtime-manifest.json @@ -14,7 +14,7 @@ "source": "src/skill2/__init__.py" }, "skill2/cli.py": { - "sha256": "614a10d8977fa98a8d5d9ca7851a214f13e4132a673e8ce5ef49dfc8f612a0f9", + "sha256": "31866a5627693f32bed04fc93f97d157c490bb549f862c0182c7d60700bd01c5", "source": "src/skill2/cli.py" }, "skill2/lint.py": { diff --git a/skills/skill2-audit/scripts/_runtime/skill2/cli.py b/skills/skill2-audit/scripts/_runtime/skill2/cli.py index 9db401e..1f1c69d 100644 --- a/skills/skill2-audit/scripts/_runtime/skill2/cli.py +++ b/skills/skill2-audit/scripts/_runtime/skill2/cli.py @@ -6,6 +6,7 @@ from pathlib import Path from typing import Any +from . import __version__ from .models import SCHEMA_VERSION, Issue, LintResult, ScanResult, Severity _SARIF_SCHEMA = "https://json.schemastore.org/sarif-2.1.0.json" @@ -302,7 +303,17 @@ def _path_uri(value: str) -> str: def build_parser() -> argparse.ArgumentParser: - parser = argparse.ArgumentParser(prog="skill2") + parser = argparse.ArgumentParser(prog="skill2", add_help=False) + parser.add_argument( + "-h", "--help", action="help", help="show this help message and exit" + ) + parser.add_argument( + "-V", + "--version", + action="version", + version=f"skill2 {__version__}", + help="print version and exit", + ) sub = parser.add_subparsers(dest="command", required=True) scaffold = sub.add_parser("scaffold", help="create skill scaffolds") diff --git a/skills/skill2-create/scripts/.runtime-manifest.json b/skills/skill2-create/scripts/.runtime-manifest.json index ddaff10..eb5204b 100644 --- a/skills/skill2-create/scripts/.runtime-manifest.json +++ b/skills/skill2-create/scripts/.runtime-manifest.json @@ -9,7 +9,7 @@ "source": "src/skill2/__init__.py" }, "skill2/cli.py": { - "sha256": "614a10d8977fa98a8d5d9ca7851a214f13e4132a673e8ce5ef49dfc8f612a0f9", + "sha256": "31866a5627693f32bed04fc93f97d157c490bb549f862c0182c7d60700bd01c5", "source": "src/skill2/cli.py" }, "skill2/models.py": { diff --git a/skills/skill2-create/scripts/_runtime/skill2/cli.py b/skills/skill2-create/scripts/_runtime/skill2/cli.py index 9db401e..1f1c69d 100644 --- a/skills/skill2-create/scripts/_runtime/skill2/cli.py +++ b/skills/skill2-create/scripts/_runtime/skill2/cli.py @@ -6,6 +6,7 @@ from pathlib import Path from typing import Any +from . import __version__ from .models import SCHEMA_VERSION, Issue, LintResult, ScanResult, Severity _SARIF_SCHEMA = "https://json.schemastore.org/sarif-2.1.0.json" @@ -302,7 +303,17 @@ def _path_uri(value: str) -> str: def build_parser() -> argparse.ArgumentParser: - parser = argparse.ArgumentParser(prog="skill2") + parser = argparse.ArgumentParser(prog="skill2", add_help=False) + parser.add_argument( + "-h", "--help", action="help", help="show this help message and exit" + ) + parser.add_argument( + "-V", + "--version", + action="version", + version=f"skill2 {__version__}", + help="print version and exit", + ) sub = parser.add_subparsers(dest="command", required=True) scaffold = sub.add_parser("scaffold", help="create skill scaffolds") diff --git a/skills/skill2-package/scripts/.runtime-manifest.json b/skills/skill2-package/scripts/.runtime-manifest.json index fa3316b..85601c2 100644 --- a/skills/skill2-package/scripts/.runtime-manifest.json +++ b/skills/skill2-package/scripts/.runtime-manifest.json @@ -20,7 +20,7 @@ "source": "src/skill2/bundle.py" }, "skill2/cli.py": { - "sha256": "614a10d8977fa98a8d5d9ca7851a214f13e4132a673e8ce5ef49dfc8f612a0f9", + "sha256": "31866a5627693f32bed04fc93f97d157c490bb549f862c0182c7d60700bd01c5", "source": "src/skill2/cli.py" }, "skill2/lint.py": { diff --git a/skills/skill2-package/scripts/_runtime/skill2/cli.py b/skills/skill2-package/scripts/_runtime/skill2/cli.py index 9db401e..1f1c69d 100644 --- a/skills/skill2-package/scripts/_runtime/skill2/cli.py +++ b/skills/skill2-package/scripts/_runtime/skill2/cli.py @@ -6,6 +6,7 @@ from pathlib import Path from typing import Any +from . import __version__ from .models import SCHEMA_VERSION, Issue, LintResult, ScanResult, Severity _SARIF_SCHEMA = "https://json.schemastore.org/sarif-2.1.0.json" @@ -302,7 +303,17 @@ def _path_uri(value: str) -> str: def build_parser() -> argparse.ArgumentParser: - parser = argparse.ArgumentParser(prog="skill2") + parser = argparse.ArgumentParser(prog="skill2", add_help=False) + parser.add_argument( + "-h", "--help", action="help", help="show this help message and exit" + ) + parser.add_argument( + "-V", + "--version", + action="version", + version=f"skill2 {__version__}", + help="print version and exit", + ) sub = parser.add_subparsers(dest="command", required=True) scaffold = sub.add_parser("scaffold", help="create skill scaffolds") diff --git a/skills/skill2-test/scripts/.runtime-manifest.json b/skills/skill2-test/scripts/.runtime-manifest.json index 64107c5..ae0fcaa 100644 --- a/skills/skill2-test/scripts/.runtime-manifest.json +++ b/skills/skill2-test/scripts/.runtime-manifest.json @@ -20,7 +20,7 @@ "source": "src/skill2/claude_runner.py" }, "skill2/cli.py": { - "sha256": "614a10d8977fa98a8d5d9ca7851a214f13e4132a673e8ce5ef49dfc8f612a0f9", + "sha256": "31866a5627693f32bed04fc93f97d157c490bb549f862c0182c7d60700bd01c5", "source": "src/skill2/cli.py" }, "skill2/codex_runner.py": { diff --git a/skills/skill2-test/scripts/_runtime/skill2/cli.py b/skills/skill2-test/scripts/_runtime/skill2/cli.py index 9db401e..1f1c69d 100644 --- a/skills/skill2-test/scripts/_runtime/skill2/cli.py +++ b/skills/skill2-test/scripts/_runtime/skill2/cli.py @@ -6,6 +6,7 @@ from pathlib import Path from typing import Any +from . import __version__ from .models import SCHEMA_VERSION, Issue, LintResult, ScanResult, Severity _SARIF_SCHEMA = "https://json.schemastore.org/sarif-2.1.0.json" @@ -302,7 +303,17 @@ def _path_uri(value: str) -> str: def build_parser() -> argparse.ArgumentParser: - parser = argparse.ArgumentParser(prog="skill2") + parser = argparse.ArgumentParser(prog="skill2", add_help=False) + parser.add_argument( + "-h", "--help", action="help", help="show this help message and exit" + ) + parser.add_argument( + "-V", + "--version", + action="version", + version=f"skill2 {__version__}", + help="print version and exit", + ) sub = parser.add_subparsers(dest="command", required=True) scaffold = sub.add_parser("scaffold", help="create skill scaffolds") diff --git a/skills/skill2-visualize/scripts/.runtime-manifest.json b/skills/skill2-visualize/scripts/.runtime-manifest.json index 1e635c9..4d1dc04 100644 --- a/skills/skill2-visualize/scripts/.runtime-manifest.json +++ b/skills/skill2-visualize/scripts/.runtime-manifest.json @@ -14,7 +14,7 @@ "source": "src/skill2/__init__.py" }, "skill2/cli.py": { - "sha256": "614a10d8977fa98a8d5d9ca7851a214f13e4132a673e8ce5ef49dfc8f612a0f9", + "sha256": "31866a5627693f32bed04fc93f97d157c490bb549f862c0182c7d60700bd01c5", "source": "src/skill2/cli.py" }, "skill2/models.py": { diff --git a/skills/skill2-visualize/scripts/_runtime/skill2/cli.py b/skills/skill2-visualize/scripts/_runtime/skill2/cli.py index 9db401e..1f1c69d 100644 --- a/skills/skill2-visualize/scripts/_runtime/skill2/cli.py +++ b/skills/skill2-visualize/scripts/_runtime/skill2/cli.py @@ -6,6 +6,7 @@ from pathlib import Path from typing import Any +from . import __version__ from .models import SCHEMA_VERSION, Issue, LintResult, ScanResult, Severity _SARIF_SCHEMA = "https://json.schemastore.org/sarif-2.1.0.json" @@ -302,7 +303,17 @@ def _path_uri(value: str) -> str: def build_parser() -> argparse.ArgumentParser: - parser = argparse.ArgumentParser(prog="skill2") + parser = argparse.ArgumentParser(prog="skill2", add_help=False) + parser.add_argument( + "-h", "--help", action="help", help="show this help message and exit" + ) + parser.add_argument( + "-V", + "--version", + action="version", + version=f"skill2 {__version__}", + help="print version and exit", + ) sub = parser.add_subparsers(dest="command", required=True) scaffold = sub.add_parser("scaffold", help="create skill scaffolds") diff --git a/src/skill2/cli.py b/src/skill2/cli.py index 9db401e..1f1c69d 100644 --- a/src/skill2/cli.py +++ b/src/skill2/cli.py @@ -6,6 +6,7 @@ from pathlib import Path from typing import Any +from . import __version__ from .models import SCHEMA_VERSION, Issue, LintResult, ScanResult, Severity _SARIF_SCHEMA = "https://json.schemastore.org/sarif-2.1.0.json" @@ -302,7 +303,17 @@ def _path_uri(value: str) -> str: def build_parser() -> argparse.ArgumentParser: - parser = argparse.ArgumentParser(prog="skill2") + parser = argparse.ArgumentParser(prog="skill2", add_help=False) + parser.add_argument( + "-h", "--help", action="help", help="show this help message and exit" + ) + parser.add_argument( + "-V", + "--version", + action="version", + version=f"skill2 {__version__}", + help="print version and exit", + ) sub = parser.add_subparsers(dest="command", required=True) scaffold = sub.add_parser("scaffold", help="create skill scaffolds") diff --git a/tests/test_cli.py b/tests/test_cli.py index c3a402d..a67c41d 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -309,6 +309,16 @@ def test_cli_import_is_lazy(self) -> None: self.assertEqual(result.returncode, 0, result.stderr) self.assertEqual(json.loads(result.stdout), []) + def test_version_flag_prints_version_and_exits_zero(self) -> None: + result = run_cli("--version") + self.assertEqual(result.returncode, 0, result.stderr) + self.assertEqual(result.stdout.strip(), "skill2 0.1.1") + + def test_version_short_flag_prints_version_and_exits_zero(self) -> None: + result = run_cli("-V") + self.assertEqual(result.returncode, 0, result.stderr) + self.assertEqual(result.stdout.strip(), "skill2 0.1.1") + if __name__ == "__main__": unittest.main()