From 761184dce714da7a66eee76ef636fd8d87c8e63e Mon Sep 17 00:00:00 2001 From: sjungwon03 Date: Wed, 29 Jul 2026 12:31:05 +0900 Subject: [PATCH 1/2] chore(release): prepare api-to-typemcp v0.2.2 --- .agents/scripts/test_skill_release.py | 18 +++--- .../75-release-api-to-typemcp-v0-2-2.md | 58 +++++++++++++++++++ skills/api-to-typemcp/SKILL.md | 2 +- 3 files changed, 68 insertions(+), 10 deletions(-) create mode 100644 .agents/task-briefs/75-release-api-to-typemcp-v0-2-2.md diff --git a/.agents/scripts/test_skill_release.py b/.agents/scripts/test_skill_release.py index d46ea5b..5a90841 100644 --- a/.agents/scripts/test_skill_release.py +++ b/.agents/scripts/test_skill_release.py @@ -65,7 +65,7 @@ def test_version_extraction_step_executes_and_writes_outputs(self) -> None: else: os.environ["GITHUB_OUTPUT"] = previous_output - self.assertEqual(output_path.read_text(encoding="utf-8"), "skill_version=0.2.1\ntag=v0.2.1\n") + self.assertEqual(output_path.read_text(encoding="utf-8"), "skill_version=0.2.2\ntag=v0.2.2\n") def test_version_extraction_step_rejects_invalid_numeric_prerelease_identifiers(self) -> None: workflow = WORKFLOW.read_text(encoding="utf-8") @@ -85,7 +85,7 @@ def test_version_extraction_step_rejects_invalid_numeric_prerelease_identifiers( skill_path = root / "skills/api-to-typemcp/SKILL.md" skill_path.parent.mkdir(parents=True) skill_path.write_text( - original.replace("version: 0.2.1", f"version: {invalid_version}"), + original.replace("version: 0.2.2", f"version: {invalid_version}"), encoding="utf-8", ) previous_cwd = Path.cwd() @@ -243,9 +243,9 @@ def test_existing_unpublished_skill_is_recovered_before_version_reconciliation(s [ (200, {"data": [{"slug": "integration"}]}), (200, {"slug": "api-to-typemcp", "status": "DRAFT"}), - (200, {"slug": "api-to-typemcp", "status": "PUBLISHED", "latestVersion": "0.2.1"}), - (200, [{"version": "0.2.1"}]), - (200, {"slug": "api-to-typemcp", "status": "PUBLISHED", "latestVersion": "0.2.1"}), + (200, {"slug": "api-to-typemcp", "status": "PUBLISHED", "latestVersion": "0.2.2"}), + (200, [{"version": "0.2.2"}]), + (200, {"slug": "api-to-typemcp", "status": "PUBLISHED", "latestVersion": "0.2.2"}), ] ) calls: list[tuple[str, str]] = [] @@ -258,7 +258,7 @@ def mocked_request( environment = { "SKILLS_HUB_AI_API_KEY": "test-key", - "SKILL_VERSION": "0.2.1", + "SKILL_VERSION": "0.2.2", "GITHUB_SHA": "test-sha", "GITHUB_REPOSITORY": "Theorvane/type-mcp-api-agent-skill", } @@ -280,8 +280,8 @@ def test_version_conflict_is_reconciled_without_a_second_mutation(self) -> None: (200, {"slug": "api-to-typemcp", "status": "PUBLISHED"}), (200, []), (409, {"error": "version already exists"}), - (200, [{"version": "0.2.1"}]), - (200, {"slug": "api-to-typemcp", "status": "PUBLISHED", "latestVersion": "0.2.1"}), + (200, [{"version": "0.2.2"}]), + (200, {"slug": "api-to-typemcp", "status": "PUBLISHED", "latestVersion": "0.2.2"}), ] ) calls: list[tuple[str, str]] = [] @@ -294,7 +294,7 @@ def mocked_request( environment = { "SKILLS_HUB_AI_API_KEY": "test-key", - "SKILL_VERSION": "0.2.1", + "SKILL_VERSION": "0.2.2", "GITHUB_SHA": "test-sha", "GITHUB_REPOSITORY": "Theorvane/type-mcp-api-agent-skill", } diff --git a/.agents/task-briefs/75-release-api-to-typemcp-v0-2-2.md b/.agents/task-briefs/75-release-api-to-typemcp-v0-2-2.md new file mode 100644 index 0000000..34419a6 --- /dev/null +++ b/.agents/task-briefs/75-release-api-to-typemcp-v0-2-2.md @@ -0,0 +1,58 @@ +# Task brief: 75 — reconcile and publish api-to-typemcp v0.2.2 + +**Status:** in-progress +**Issue:** https://github.com/Theorvane/type-mcp-api-agent-skill/issues/75 +**Branch:** `chore/75-release-api-to-typemcp-v0-2-2` +**Owner:** sjungwon03 + +## Goal + +Publish the reviewed Hermes and Claude Code MCP-registration capability as public `api-to-typemcp` version `0.2.2` through the protected `dev` → `main` release path. + +## Source references + +- Release contract: `docs/guides/skill-release.md` +- Release checklist: `.agents/checklists/release-readiness.md` +- Reviewed feature PR: https://github.com/Theorvane/type-mcp-api-agent-skill/pull/74 + +## Scope + +### Included + +- Preserve the divergent `main` release automation history by merging it into the current `dev` lineage with a no-fast-forward reconciliation commit. +- Bump the skill frontmatter version from `0.2.1` to `0.2.2`. +- Update the release-contract expected output and verify the bundled skill, generated-project E2E, and public release artifacts. + +### Excluded + +- New MCP engine behavior beyond reviewed `dev` content. +- Manual GitHub release, tag, ClawHub, or skills-hub.ai mutation. + +## Safety and contract notes + +- Source input: release promotion starts only from the current reviewed `dev` branch and preserves both release histories. +- Secrets: registry credentials remain GitHub Actions secrets only; no credential is read, printed, or committed. +- Side effects: GitHub Release and registry publication occur only after a reviewed `dev` → `main` merge. +- Compatibility: this is a backward-compatible feature release; generated projects continue to use the reviewed public TypeMCP runtime contract. + +## Test-first evidence + +| Stage | Command | Expected/observed result | +| --- | --- | --- | +| Red | `python3 .agents/scripts/test_skill_release.py` | Failed as expected after the contract expected `0.2.2` while `SKILL.md` remained `0.2.1`. | +| Green | `python3 .agents/scripts/test_skill_release.py` | Passed: 15 tests after the frontmatter and release-publisher fixture version were updated to `0.2.2`. | +| Regression | repository verification baseline plus generated-project E2E | Passed: 140 engine tests, 8 documentation tests, 3 workspace tests, 15 release-contract tests, documentation validation, Python compile, and `git diff --check`. | + +## Verification + +- [ ] Unit/integration tests +- [ ] Generator or generated-project E2E test +- [ ] Build/package validation +- [ ] `git diff --check` +- [ ] Documentation updated +- [ ] Independent specification review recorded +- [ ] Independent code-quality review recorded + +## Review notes + +- Pending exact-head independent review after PR creation. diff --git a/skills/api-to-typemcp/SKILL.md b/skills/api-to-typemcp/SKILL.md index 363d1ed..7522c20 100644 --- a/skills/api-to-typemcp/SKILL.md +++ b/skills/api-to-typemcp/SKILL.md @@ -1,7 +1,7 @@ --- name: api-to-typemcp description: Use when turning supplied API sources into a safe TypeMCP project. -version: 0.2.1 +version: 0.2.2 category: integration license: MIT metadata: From 611dcca064bd4b7049a805250b2d9e9b1f01af71 Mon Sep 17 00:00:00 2001 From: sjungwon03 Date: Wed, 29 Jul 2026 12:49:31 +0900 Subject: [PATCH 2/2] fix(release): align README link with v0.2.2 --- .agents/scripts/test_skill_release.py | 9 +++++++++ .agents/task-briefs/75-release-api-to-typemcp-v0-2-2.md | 4 ++-- README.md | 2 +- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/.agents/scripts/test_skill_release.py b/.agents/scripts/test_skill_release.py index 5a90841..1691b1e 100644 --- a/.agents/scripts/test_skill_release.py +++ b/.agents/scripts/test_skill_release.py @@ -33,6 +33,15 @@ def test_skill_frontmatter_declares_a_semver_release_version(self) -> None: assert match is not None self.assertRegex(match.group(1), SEMVER) + def test_readme_release_link_matches_the_skill_version(self) -> None: + skill = SKILL.read_text(encoding="utf-8") + version = re.search(r"^version:\s*([^\s#]+)\s*$", skill, re.MULTILINE) + self.assertIsNotNone(version, "SKILL.md must declare a release version") + assert version is not None + readme = (ROOT / "README.md").read_text(encoding="utf-8") + expected = f"releases/tag/v{version.group(1)}" + self.assertIn(expected, readme, "README GitHub Release link must match SKILL.md version") + def test_version_extraction_step_executes_and_writes_outputs(self) -> None: workflow = WORKFLOW.read_text(encoding="utf-8") match = re.search( diff --git a/.agents/task-briefs/75-release-api-to-typemcp-v0-2-2.md b/.agents/task-briefs/75-release-api-to-typemcp-v0-2-2.md index 34419a6..a313cb4 100644 --- a/.agents/task-briefs/75-release-api-to-typemcp-v0-2-2.md +++ b/.agents/task-briefs/75-release-api-to-typemcp-v0-2-2.md @@ -40,8 +40,8 @@ Publish the reviewed Hermes and Claude Code MCP-registration capability as publi | Stage | Command | Expected/observed result | | --- | --- | --- | | Red | `python3 .agents/scripts/test_skill_release.py` | Failed as expected after the contract expected `0.2.2` while `SKILL.md` remained `0.2.1`. | -| Green | `python3 .agents/scripts/test_skill_release.py` | Passed: 15 tests after the frontmatter and release-publisher fixture version were updated to `0.2.2`. | -| Regression | repository verification baseline plus generated-project E2E | Passed: 140 engine tests, 8 documentation tests, 3 workspace tests, 15 release-contract tests, documentation validation, Python compile, and `git diff --check`. | +| Green | `python3 .agents/scripts/test_skill_release.py` | Passed: 16 tests after the frontmatter, public README release link, and release-publisher fixture version were updated to `0.2.2`. | +| Regression | repository verification baseline plus generated-project E2E | Passed: 140 engine tests, 8 documentation tests, 3 workspace tests, 16 release-contract tests, documentation validation, Python compile, and `git diff --check`. | ## Verification diff --git a/README.md b/README.md index e62a690..12c8794 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ Tasks 1–7 of embedded-engine delivery are implemented on `dev`: structured Ope - [ClawHub (`@sjungwon03/api-to-typemcp`)](https://clawhub.ai/sjungwon03/api-to-typemcp) - [skills-hub.ai (`api-to-typemcp`)](https://skills-hub.ai/skills/api-to-typemcp) -- [GitHub Release v0.2.1](https://github.com/Theorvane/type-mcp-api-agent-skill/releases/tag/v0.2.1) +- [GitHub Release v0.2.2](https://github.com/Theorvane/type-mcp-api-agent-skill/releases/tag/v0.2.2) ## Layout