From e2516f29a045181e0aeea72f95fd2c0a2b2d8e60 Mon Sep 17 00:00:00 2001 From: Alwan Juliawan Date: Thu, 30 Jul 2026 22:25:15 +0700 Subject: [PATCH 1/2] docs: add project status badges --- README.md | 7 +++++++ tests/test_validation.py | 16 ++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/README.md b/README.md index ba02015..b0f2441 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,12 @@ # Comic Sol +[![Tests](https://github.com/wenn-id/comicsol/actions/workflows/tests.yml/badge.svg?branch=main)](https://github.com/wenn-id/comicsol/actions/workflows/tests.yml) +[![Release](https://img.shields.io/github/v/release/wenn-id/comicsol?include_prereleases&label=release)](https://github.com/wenn-id/comicsol/releases) +[![License](https://img.shields.io/github/license/wenn-id/comicsol)](LICENSE) +[![Python](https://img.shields.io/badge/Python-3.11-3776AB?logo=python&logoColor=white)](https://www.python.org/) +[![MCP tools](https://img.shields.io/badge/MCP_tools-17-brightgreen)](#mcp-server-optional) +[![Platforms](https://img.shields.io/badge/platforms-Linux%20%7C%20macOS%20%7C%20Windows-blue)](docs/install.md) + Comic Sol is an installable Codex Skill and portable Python CLI that turns a short prompt, pasted story, or `.txt`/`.md` file into an original manga/anime comic. One natural-language invocation drives planning, character consistency, image generation, visual QA, diff --git a/tests/test_validation.py b/tests/test_validation.py index d66f9f0..9d37d68 100644 --- a/tests/test_validation.py +++ b/tests/test_validation.py @@ -961,6 +961,22 @@ def test_public_surface_uses_the_canonical_independent_repository(self): for name in ("CONTRIBUTING.md", "SECURITY.md"): self.assertTrue((ROOT / name).is_file(), name) + def test_readme_badges_report_live_project_contracts(self): + readme = self.readme() + for badge in ( + "actions/workflows/tests.yml/badge.svg?branch=main", + "img.shields.io/github/v/release/wenn-id/comicsol?include_prereleases&label=release", + "img.shields.io/github/license/wenn-id/comicsol", + "img.shields.io/badge/Python-3.11-3776AB", + "img.shields.io/badge/MCP_tools-17-brightgreen", + "img.shields.io/badge/platforms-Linux%20%7C%20macOS%20%7C%20Windows-blue", + ): + self.assertIn(badge, readme) + self.assertLess( + readme.index("actions/workflows/tests.yml/badge.svg"), + readme.index("Comic Sol is an installable"), + ) + def test_package_files_install_and_artifact_contract_are_documented(self): for name in ("LICENSE", "README.md", "SKILL.md"): self.assertTrue((ROOT / name).is_file(), name) From f1a503217400ab14c1909d3c137572952e9dd6a6 Mon Sep 17 00:00:00 2001 From: Alwan Juliawan Date: Thu, 30 Jul 2026 22:38:08 +0700 Subject: [PATCH 2/2] test: validate README badges structurally --- tests/test_validation.py | 41 +++++++++++++++++++++++++++------------- 1 file changed, 28 insertions(+), 13 deletions(-) diff --git a/tests/test_validation.py b/tests/test_validation.py index 9d37d68..617ef6d 100644 --- a/tests/test_validation.py +++ b/tests/test_validation.py @@ -963,19 +963,34 @@ def test_public_surface_uses_the_canonical_independent_repository(self): def test_readme_badges_report_live_project_contracts(self): readme = self.readme() - for badge in ( - "actions/workflows/tests.yml/badge.svg?branch=main", - "img.shields.io/github/v/release/wenn-id/comicsol?include_prereleases&label=release", - "img.shields.io/github/license/wenn-id/comicsol", - "img.shields.io/badge/Python-3.11-3776AB", - "img.shields.io/badge/MCP_tools-17-brightgreen", - "img.shields.io/badge/platforms-Linux%20%7C%20macOS%20%7C%20Windows-blue", - ): - self.assertIn(badge, readme) - self.assertLess( - readme.index("actions/workflows/tests.yml/badge.svg"), - readme.index("Comic Sol is an installable"), - ) + preamble, separator, _ = readme.partition("Comic Sol is an installable") + self.assertTrue(separator, "README product introduction is missing") + badges = set(re.findall(r"\[!\[([^]]+)\]\(([^)]+)\)\]\(([^)]+)\)", preamble)) + expected = { + ( + "Tests", + "https://github.com/wenn-id/comicsol/actions/workflows/tests.yml/badge.svg?branch=main", + "https://github.com/wenn-id/comicsol/actions/workflows/tests.yml", + ), + ( + "Release", + "https://img.shields.io/github/v/release/wenn-id/comicsol?include_prereleases&label=release", + "https://github.com/wenn-id/comicsol/releases", + ), + ("License", "https://img.shields.io/github/license/wenn-id/comicsol", "LICENSE"), + ( + "Python", + "https://img.shields.io/badge/Python-3.11-3776AB?logo=python&logoColor=white", + "https://www.python.org/", + ), + ("MCP tools", "https://img.shields.io/badge/MCP_tools-17-brightgreen", "#mcp-server-optional"), + ( + "Platforms", + "https://img.shields.io/badge/platforms-Linux%20%7C%20macOS%20%7C%20Windows-blue", + "docs/install.md", + ), + } + self.assertEqual(expected, badges) def test_package_files_install_and_artifact_contract_are_documented(self): for name in ("LICENSE", "README.md", "SKILL.md"):