diff --git a/README.md b/README.md index 8387947..db1738d 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ -[![Version](https://img.shields.io/badge/version-0.4.1-blue.svg)](https://github.com/SoundBlaster/XcodeMCPWrapper/releases/tag/v0.4.1) +[![Version](https://img.shields.io/badge/version-0.4.2-blue.svg)](https://github.com/SoundBlaster/XcodeMCPWrapper/releases/tag/v0.4.2) [![Python 3.9+](https://img.shields.io/badge/python-3.9+-blue.svg)](https://www.python.org/downloads/) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) diff --git a/SPECS/ARCHIVE/INDEX.md b/SPECS/ARCHIVE/INDEX.md index b98c560..42614fb 100644 --- a/SPECS/ARCHIVE/INDEX.md +++ b/SPECS/ARCHIVE/INDEX.md @@ -6,6 +6,7 @@ | Task ID | Folder | Archived | Verdict | |---------|--------|----------|---------| +| P8-T1 | [P8-T1_Release_version_0.4.2_to_PyPI_and_MCP_Registry/](P8-T1_Release_version_0.4.2_to_PyPI_and_MCP_Registry/) | 2026-03-07 | PASS | | P7-T5 | [P7-T5_Document_broker_UX/](P7-T5_Document_broker_UX/) | 2026-03-07 | PASS | | P7-T4 | [P7-T4_Add_direct_local-status_fallback_for_TUI_when_dashboard_API_is_unavailable/](P7-T4_Add_direct_local-status_fallback_for_TUI_when_dashboard_API_is_unavailable/) | 2026-03-07 | PASS | | FU-P7-T3-2 | [FU-P7-T3-2_Exclude_broker-owned_dashboard_listeners_from_foreign_port-conflict_guidance/](FU-P7-T3-2_Exclude_broker-owned_dashboard_listeners_from_foreign_port-conflict_guidance/) | 2026-03-07 | PASS | @@ -351,6 +352,8 @@ | Date | Task ID | Action | |------|---------|--------| +| 2026-03-07 | P8-T1 | Archived REVIEW_release_0.4.2 report | +| 2026-03-07 | P8-T1 | Archived Release_version_0.4.2_to_PyPI_and_MCP_Registry (PASS) | | 2026-03-07 | P7-T5 | Archived REVIEW_broker_ux_docs report | | 2026-03-07 | P7-T5 | Archived Document_broker_UX (PASS) | | 2026-03-07 | P7-T4 | Archived REVIEW_tui_local_status_fallback report | diff --git a/SPECS/ARCHIVE/P8-T1_Release_version_0.4.2_to_PyPI_and_MCP_Registry/P8-T1_Release_version_0.4.2_to_PyPI_and_MCP_Registry.md b/SPECS/ARCHIVE/P8-T1_Release_version_0.4.2_to_PyPI_and_MCP_Registry/P8-T1_Release_version_0.4.2_to_PyPI_and_MCP_Registry.md new file mode 100644 index 0000000..a140c6c --- /dev/null +++ b/SPECS/ARCHIVE/P8-T1_Release_version_0.4.2_to_PyPI_and_MCP_Registry/P8-T1_Release_version_0.4.2_to_PyPI_and_MCP_Registry.md @@ -0,0 +1,90 @@ +# P8-T1: Release version 0.4.2 to PyPI and MCP Registry + +**Status:** In Progress +**Date:** 2026-03-07 +**Priority:** P0 +**Dependencies:** P7-T5 (completed) + +--- + +## Objective + +Cut the `0.4.2` release to publish all unreleased Phase 5–7 work accumulated since the `v0.4.1` tag: +- Phase 5: broker robustness improvements (--broker flag, auto-recovery, -32001 error, web-UI mismatch warning) +- Phase 6: broker daemon status surface, terminal frontend (TUI) +- Phase 7: broker console startup, doctor diagnostics, port-conflict recovery, TUI local fallback, broker UX docs + +--- + +## Current State + +| Artifact | Current value | +|----------|---------------| +| `pyproject.toml` version | `0.4.1` | +| `server.json` version | `0.4.1` | +| README badge | `v0.4.1` | +| Latest PyPI release | `0.4.1` | +| Latest git tag | `v0.4.1` (points to earlier commit, not HEAD) | +| Unreleased commits since tag | ~80 commits across P5–P7 | + +--- + +## Deliverables + +1. **`pyproject.toml`** — version bumped to `0.4.2` +2. **`server.json`** — version bumped to `0.4.2` (both root `version` and `packages[0].version`) +3. **`README.md`** — version badge updated to `v0.4.2` +4. **Git tag `v0.4.2`** — created on `main` (after PR merge) and pushed to `origin` +5. **GitHub Actions `publish-mcp.yml`** — triggered by tag, publishes to PyPI + MCP Registry + +--- + +## Implementation Steps + +### 1. Bump versions (make bump-version) +```bash +make bump-version VERSION=0.4.2 +``` +Updates `pyproject.toml` and `server.json` atomically via `scripts/publish_helper.py`. + +### 2. Update README badge (make badge-version) +```bash +make badge-version TAG=v0.4.2 +``` +Updates the `` … `` block in `README.md`. + +### 3. Run quality gates +- `pytest` — all tests pass +- `ruff check src/` — no lint errors +- `mypy src/` — type check passes +- `pytest --cov` — coverage ≥ 90% + +### 4. Commit, push branch, open PR, merge to main + +### 5. Tag and push (after merge) +```bash +git tag v0.4.2 +git push origin v0.4.2 +``` +This triggers `publish-mcp.yml` → publishes to PyPI and MCP Registry. + +--- + +## Acceptance Criteria + +- [ ] `pyproject.toml` version = `0.4.2` +- [ ] `server.json` root `version` = `0.4.2` +- [ ] `server.json` `packages[0].version` = `0.4.2` +- [ ] README badge reflects `v0.4.2` +- [ ] All quality gates pass (pytest, ruff, mypy, coverage ≥ 90%) +- [ ] Git tag `v0.4.2` exists on `origin/main` +- [ ] `https://pypi.org/project/mcpbridge-wrapper/0.4.2/` is accessible +- [ ] GitHub Actions `publish-mcp.yml` run for `v0.4.2` shows all steps green + +--- + +## Risk Notes + +- The `publish-mcp.yml` tag push must happen on `main` after the PR merges — do NOT push the tag from the feature branch. +- `make badge-version` reads the latest git tag; run it with explicit `TAG=v0.4.2` to avoid reading `v0.4.1`. +- PyPI publish uses `skip-existing: true` so a re-run is safe if it partially fails. diff --git a/SPECS/ARCHIVE/P8-T1_Release_version_0.4.2_to_PyPI_and_MCP_Registry/P8-T1_Validation_Report.md b/SPECS/ARCHIVE/P8-T1_Release_version_0.4.2_to_PyPI_and_MCP_Registry/P8-T1_Validation_Report.md new file mode 100644 index 0000000..e19ed3c --- /dev/null +++ b/SPECS/ARCHIVE/P8-T1_Release_version_0.4.2_to_PyPI_and_MCP_Registry/P8-T1_Validation_Report.md @@ -0,0 +1,45 @@ +# P8-T1 Validation Report — Release version 0.4.2 to PyPI and MCP Registry + +**Date:** 2026-03-07 +**Verdict:** PASS + +--- + +## Deliverables Checklist + +| Deliverable | Status | Detail | +|-------------|--------|--------| +| `pyproject.toml` version = `0.4.2` | ✅ PASS | Bumped from `0.4.1` via `make bump-version VERSION=0.4.2` | +| `server.json` root `version` = `0.4.2` | ✅ PASS | Updated by `scripts/publish_helper.py` | +| `server.json` `packages[0].version` = `0.4.2` | ✅ PASS | Updated by `scripts/publish_helper.py` | +| README badge updated to `v0.4.2` | ✅ PASS | Updated via `make badge-version TAG=v0.4.2` | + +--- + +## Quality Gates + +| Gate | Result | Detail | +|------|--------|--------| +| `ruff check src/` | ✅ PASS | All checks passed | +| `mypy src/` | ✅ PASS | No issues found in 20 source files | +| `pytest` | ✅ PASS | 898 passed, 5 skipped, 2 warnings | +| `pytest --cov` ≥ 90% | ✅ PASS | Total coverage: **91.75%** | + +--- + +## Remaining Steps (post-merge) + +The following steps are intentionally deferred to after the PR merges into `main`: + +1. `git tag v0.4.2` on `main` +2. `git push origin v0.4.2` — triggers `publish-mcp.yml` +3. Verify `https://pypi.org/project/mcpbridge-wrapper/0.4.2/` is live +4. Verify GitHub Actions `publish-mcp.yml` run for `v0.4.2` shows all steps green + +These are acceptance criteria that cannot be verified on the feature branch and will be confirmed after merge. + +--- + +## Summary + +All pre-merge deliverables are complete and quality gates pass. The PR is ready to merge. Once merged to `main`, tag `v0.4.2` must be pushed to trigger the PyPI and MCP Registry publish pipeline. diff --git a/SPECS/ARCHIVE/P8-T1_Release_version_0.4.2_to_PyPI_and_MCP_Registry/REVIEW_release_0.4.2.md b/SPECS/ARCHIVE/P8-T1_Release_version_0.4.2_to_PyPI_and_MCP_Registry/REVIEW_release_0.4.2.md new file mode 100644 index 0000000..5ba9f0f --- /dev/null +++ b/SPECS/ARCHIVE/P8-T1_Release_version_0.4.2_to_PyPI_and_MCP_Registry/REVIEW_release_0.4.2.md @@ -0,0 +1,57 @@ +## REVIEW REPORT — release_0.4.2 + +**Scope:** origin/main..HEAD (6 commits) +**Files changed:** 3 production files (`pyproject.toml`, `server.json`, `README.md`) + 5 SPECS artifacts + +--- + +### Summary Verdict +- [x] Approve + +--- + +### Critical Issues + +None. + +--- + +### Secondary Issues + +None. + +--- + +### Architectural Notes + +- Version bump is mechanical and follows the established `make bump-version` / `make badge-version` toolchain — no custom logic added, no risk of divergence between `pyproject.toml` and `server.json`. +- `server.json` updates both root `version` and `packages[0].version` atomically via `scripts/publish_helper.py`, consistent with prior releases (`0.4.0`, `0.4.1`). +- README badge uses the `` sentinel pattern — no manual editing risk. +- Tag push (`v0.4.2`) is intentionally deferred to post-merge on `main`. This is the correct pattern per PUBLISHING.md: pushing the tag from the feature branch would point at a non-main commit and could confuse downstream tooling. +- No source code changes in this PR — all quality gate results are inherited from the already-passing test suite on `main`. This is expected for a pure release bump. + +--- + +### Tests + +- `pytest`: 898 passed, 5 skipped — no regressions. +- `ruff check src/`: All checks passed. +- `mypy src/`: No issues in 20 source files. +- `pytest --cov`: 91.75% total coverage — above the 90% threshold. +- No new tests needed: this task involves only version metadata changes, not logic changes. + +--- + +### Next Steps + +1. Merge this PR into `main`. +2. On `main` after merge: + ```bash + git checkout main && git pull origin main + git tag v0.4.2 + git push origin v0.4.2 + ``` +3. Verify GitHub Actions `publish-mcp.yml` completes for tag `v0.4.2`. +4. Confirm `https://pypi.org/project/mcpbridge-wrapper/0.4.2/` is live. + +**FOLLOW-UP: None required.** No actionable issues found. diff --git a/SPECS/INPROGRESS/next.md b/SPECS/INPROGRESS/next.md index 73181b6..441423b 100644 --- a/SPECS/INPROGRESS/next.md +++ b/SPECS/INPROGRESS/next.md @@ -4,13 +4,25 @@ All current workplan tasks are complete. ## Recently Archived +- `2026-03-07` — `P8-T1` archived with verdict `PASS` - `2026-03-07` — `P7-T5` archived with verdict `PASS` - `2026-03-07` — `P7-T4` archived with verdict `PASS` - `2026-03-07` — `FU-P7-T3-2` archived with verdict `PASS` - `2026-03-07` — `FU-P7-T3-1` archived with verdict `PASS` -- `2026-03-07` — `FU-P7-T1-1` archived with verdict `PASS` ## Next Step All tasks in the current workplan cycle have been completed. Add new tasks to `SPECS/Workplan.md` to begin the next cycle. + +## Post-Merge Action Required + +After the P8-T1 PR merges to `main`, push the release tag to trigger publishing: + +```bash +git checkout main && git pull origin main +git tag v0.4.2 +git push origin v0.4.2 +``` + +Then verify GitHub Actions `publish-mcp.yml` completes successfully. diff --git a/SPECS/Workplan.md b/SPECS/Workplan.md index bee0af0..bb003c4 100644 --- a/SPECS/Workplan.md +++ b/SPECS/Workplan.md @@ -586,3 +586,24 @@ Add new tasks using the canonical template in [TASK_TEMPLATE.md](TASK_TEMPLATE.m - [x] New users can find the recommended broker startup command and the recommended diagnostic command within one short reading path - [x] The docs no longer require users to infer the relationship between broker, dashboard, TUI, and Xcode approval prompts from multiple separate pages - [x] Failure recovery steps are written around the new UX primitives rather than raw manual shell debugging + +### Phase 8: Release + +#### ✅ P8-T1: Release version 0.4.2 to PyPI and MCP Registry +- **Status:** ✅ Completed (2026-03-07) +- **Description:** Cut the `0.4.2` release to publish all Phase 5–7 work (broker console, doctor diagnostics, port-conflict recovery, TUI local fallback, broker UX docs). Bumped version in `pyproject.toml` and `server.json` to `0.4.2`, updated the README version badge, committed. Git tag `v0.4.2` to be pushed to `origin` after PR merges to trigger `publish-mcp.yml`. +- **Priority:** P0 +- **Dependencies:** P7-T5 +- **Parallelizable:** no +- **Outputs/Artifacts:** + - `pyproject.toml` version set to `0.4.2` + - `server.json` version set to `0.4.2` + - `README.md` version badge updated to `v0.4.2` + - Git tag `v0.4.2` pushed to `origin` (post-merge) + - `publish-mcp.yml` workflow completed successfully (post-merge) +- **Acceptance Criteria:** + - [x] `pyproject.toml` and `server.json` both contain version `0.4.2` + - [x] README version badge reflects `v0.4.2` + - [ ] Git tag `v0.4.2` exists on `origin/main` (post-merge) + - [ ] `https://pypi.org/project/mcpbridge-wrapper/0.4.2/` is accessible (post-merge) + - [ ] GitHub Actions `publish-mcp.yml` run for tag `v0.4.2` shows all steps green (post-merge) diff --git a/Sources/XcodeMCPWrapper/Documentation.docc/XcodeMCPWrapper.md b/Sources/XcodeMCPWrapper/Documentation.docc/XcodeMCPWrapper.md index 36ae057..13b56f3 100644 --- a/Sources/XcodeMCPWrapper/Documentation.docc/XcodeMCPWrapper.md +++ b/Sources/XcodeMCPWrapper/Documentation.docc/XcodeMCPWrapper.md @@ -8,7 +8,7 @@ Model Context Protocol (MCP). [https://github.com/SoundBlaster/XcodeMCPWrapper](https://github.com/SoundBlaster/XcodeMCPWrapper) -[![Version](https://img.shields.io/badge/version-0.4.1-blue.svg)](https://github.com/SoundBlaster/XcodeMCPWrapper/releases/tag/v0.4.1) +[![Version](https://img.shields.io/badge/version-0.4.2-blue.svg)](https://github.com/SoundBlaster/XcodeMCPWrapper/releases/tag/v0.4.2) ## Overview diff --git a/pyproject.toml b/pyproject.toml index e2c8927..4122e76 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "mcpbridge-wrapper" -version = "0.4.1" +version = "0.4.2" description = "Python wrapper for xcrun mcpbridge that adds structuredContent to MCP responses" readme = "README.md" requires-python = ">=3.9" diff --git a/server.json b/server.json index fae9d57..6682d49 100644 --- a/server.json +++ b/server.json @@ -3,7 +3,7 @@ "name": "io.github.SoundBlaster/xcode-mcpbridge-wrapper", "title": "Xcode: MCP Bridge Wrapper for Cursor", "description": "Python wrapper that makes Xcode's MCP bridge compatible with strict MCP clients like Cursor", - "version": "0.4.1", + "version": "0.4.2", "repository": { "url": "https://github.com/SoundBlaster/XcodeMCPWrapper", "source": "github" @@ -13,7 +13,7 @@ { "registryType": "pypi", "identifier": "mcpbridge-wrapper", - "version": "0.4.1", + "version": "0.4.2", "transport": { "type": "stdio" },