From 28c9552d1d7d8f5bea7c47a25c2ad85fb9821975 Mon Sep 17 00:00:00 2001 From: lmiranda Date: Mon, 26 Jan 2026 10:35:06 -0500 Subject: [PATCH 1/3] fix(projman): add mandatory CHANGELOG and versioning to sprint-close workflow Problem: Version workflow was documented but not enforced in sprint-close. After completing sprints, CHANGELOG wasn't updated and releases weren't created. Solution: - Add "Update CHANGELOG" as mandatory step 7 in sprint-close - Add "Version Check" as step 8 with /suggest-version and release.sh - Update orchestrator agent with CHANGELOG and version reminders - Add V04.1.0 wiki workflow changes to CHANGELOG [Unreleased] - Document MCP bug #160 in Known Issues This ensures versioning workflow is part of the sprint close process, not just documented in CLAUDE.md. Co-Authored-By: Claude Opus 4.5 --- CHANGELOG.md | 10 ++++++ plugins/projman/agents/orchestrator.md | 41 +++++++++++++++++++++++- plugins/projman/commands/sprint-close.md | 18 ++++++++--- 3 files changed, 64 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ceedc06..3f0961f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,13 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ## [Unreleased] ### Added +- **projman:** Wiki-based planning workflow enhancement (V04.1.0) + - Flexible input source detection in `/sprint-plan` (file, wiki, or conversation) + - Wiki proposal and implementation page creation during sprint planning + - Wiki reference linking in created issues + - Wiki status updates in `/sprint-close` (Implemented/Partial/Failed) + - Metadata section in lessons learned with implementation link for traceability + - New `/proposal-status` command for viewing proposal/implementation tree - **projman:** `/suggest-version` command - Analyzes CHANGELOG and recommends semantic version bump - **projman:** SessionStart hook now suggests sprint planning when open issues exist without milestone - **projman:** SessionStart hook now warns about unreleased CHANGELOG entries @@ -21,6 +28,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - Documentation drift: COMMANDS-CHEATSHEET.md was missing data-platform plugin added in v4.0.0 - Proactive sprint planning: projman now suggests `/sprint-plan` at session start when unplanned issues exist +### Known Issues +- **MCP Bug #160:** `update_wiki_page` tool renames pages to "unnamed" when page_name contains URL-encoded characters (`:` → `%3A`). Workaround: use `create_wiki_page` to overwrite instead. + --- ## [4.0.0] - 2026-01-25 diff --git a/plugins/projman/agents/orchestrator.md b/plugins/projman/agents/orchestrator.md index c97471e..9ed8832 100644 --- a/plugins/projman/agents/orchestrator.md +++ b/plugins/projman/agents/orchestrator.md @@ -465,7 +465,44 @@ update_wiki_page( ) ``` -**G. Git Operations** +**G. Update CHANGELOG (MANDATORY)** + +Add all sprint changes to `[Unreleased]` section: +```markdown +## [Unreleased] + +### Added +- **projman:** New feature description +- **plugin-name:** Another feature + +### Changed +- **projman:** Modified behavior + +### Fixed +- **plugin-name:** Bug fix description +``` + +**IMPORTANT:** Never skip this step. Every sprint must update CHANGELOG. + +**H. Version Check** + +Run `/suggest-version` to analyze CHANGELOG and recommend version bump: +``` +/suggest-version +``` + +If release is warranted: +```bash +./scripts/release.sh X.Y.Z +``` + +This ensures version numbers stay in sync: +- README.md title +- .claude-plugin/marketplace.json +- Git tags +- CHANGELOG.md section header + +**I. Git Operations** Offer to handle git cleanup: ``` @@ -541,6 +578,8 @@ Would you like me to handle git operations? 10. **Capture lessons** - At sprint close, interview thoroughly 11. **Update wiki status** - At sprint close, update implementation and proposal pages 12. **Link lessons to wiki** - Include lesson links in implementation completion summary +13. **Update CHANGELOG** - MANDATORY at sprint close, never skip +14. **Run suggest-version** - Check if release is needed after CHANGELOG update ## Your Mission diff --git a/plugins/projman/commands/sprint-close.md b/plugins/projman/commands/sprint-close.md index b5e392d..4ebb73f 100644 --- a/plugins/projman/commands/sprint-close.md +++ b/plugins/projman/commands/sprint-close.md @@ -54,13 +54,23 @@ The orchestrator agent will guide you through: - If partial: Keep status as "In Progress", note completed implementations - Add summary of what was accomplished -7. **Git Operations** - - Commit any remaining work +7. **Update CHANGELOG** (MANDATORY) + - Add all sprint changes to `[Unreleased]` section in CHANGELOG.md + - Categorize: Added, Changed, Fixed, Removed, Deprecated + - Include plugin prefix (e.g., `- **projman:** New feature`) + +8. **Version Check** + - Run `/suggest-version` to analyze changes and recommend version bump + - If release warranted: run `./scripts/release.sh X.Y.Z` + - Ensures version numbers stay in sync across files + +9. **Git Operations** + - Commit any remaining work (including CHANGELOG updates) - Merge feature branches if needed - Clean up merged branches - - Tag sprint completion + - Tag sprint completion (if release created) -8. **Close Milestone** +10. **Close Milestone** - Use `update_milestone` to close the sprint milestone - Document final completion status From 834cf3ac56ee3f035832de151f229395be138d2d Mon Sep 17 00:00:00 2001 From: lmiranda Date: Mon, 26 Jan 2026 10:36:14 -0500 Subject: [PATCH 2/3] chore: release v4.1.0 --- .claude-plugin/marketplace.json | 4 ++-- CHANGELOG.md | 4 ++++ README.md | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index de985bc..9eb91f7 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -6,12 +6,12 @@ }, "metadata": { "description": "Project management plugins with Gitea and NetBox integrations", - "version": "4.0.0" + "version": "4.1.0" }, "plugins": [ { "name": "projman", - "version": "3.1.0", + "version": "3.2.0", "description": "Sprint planning and project management with Gitea integration", "source": "./plugins/projman", "author": { diff --git a/CHANGELOG.md b/CHANGELOG.md index 3f0961f..c8317a9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ## [Unreleased] +--- + +## [4.1.0] - 2026-01-26 + ### Added - **projman:** Wiki-based planning workflow enhancement (V04.1.0) - Flexible input source detection in `/sprint-plan` (file, wiki, or conversation) diff --git a/README.md b/README.md index be30d59..3ce62a9 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Leo Claude Marketplace - v4.0.0 +# Leo Claude Marketplace - v4.1.0 A collection of Claude Code plugins for project management, infrastructure automation, and development workflows. From 530c5f4aa0abda36527d56280d2ad8323d9ab6ca Mon Sep 17 00:00:00 2001 From: lmiranda Date: Mon, 26 Jan 2026 10:54:33 -0500 Subject: [PATCH 3/3] fix(gitea-mcp): URL-encode wiki page names and include title in updates Fixes #160: update_wiki_page was renaming pages to "unnamed" Root causes: 1. page_name wasn't URL-encoded, breaking pages with special chars like ':' 2. PATCH request was missing 'title' field, causing Gitea to use default name Changes: - Add URL encoding (urllib.parse.quote) to get_wiki_page, update_wiki_page, delete_wiki_page - Add 'title': page_name to update_wiki_page payload to preserve page name Co-Authored-By: Claude Opus 4.5 --- mcp-servers/gitea/mcp_server/gitea_client.py | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/mcp-servers/gitea/mcp_server/gitea_client.py b/mcp-servers/gitea/mcp_server/gitea_client.py index 3e077af..abe62ba 100644 --- a/mcp-servers/gitea/mcp_server/gitea_client.py +++ b/mcp-servers/gitea/mcp_server/gitea_client.py @@ -239,8 +239,11 @@ class GiteaClient: repo: Optional[str] = None ) -> Dict: """Get a specific wiki page by name.""" + from urllib.parse import quote owner, target_repo = self._parse_repo(repo) - url = f"{self.base_url}/repos/{owner}/{target_repo}/wiki/page/{page_name}" + # URL-encode the page_name to handle special characters like ':' + encoded_page_name = quote(page_name, safe='') + url = f"{self.base_url}/repos/{owner}/{target_repo}/wiki/page/{encoded_page_name}" logger.info(f"Getting wiki page '{page_name}' from {owner}/{target_repo}") response = self.session.get(url) response.raise_for_status() @@ -271,9 +274,13 @@ class GiteaClient: repo: Optional[str] = None ) -> Dict: """Update an existing wiki page.""" + from urllib.parse import quote owner, target_repo = self._parse_repo(repo) - url = f"{self.base_url}/repos/{owner}/{target_repo}/wiki/page/{page_name}" + # URL-encode the page_name to handle special characters like ':' + encoded_page_name = quote(page_name, safe='') + url = f"{self.base_url}/repos/{owner}/{target_repo}/wiki/page/{encoded_page_name}" data = { + 'title': page_name, # CRITICAL: include title to preserve page name 'content_base64': self._encode_base64(content) } logger.info(f"Updating wiki page '{page_name}' in {owner}/{target_repo}") @@ -287,8 +294,11 @@ class GiteaClient: repo: Optional[str] = None ) -> bool: """Delete a wiki page.""" + from urllib.parse import quote owner, target_repo = self._parse_repo(repo) - url = f"{self.base_url}/repos/{owner}/{target_repo}/wiki/page/{page_name}" + # URL-encode the page_name to handle special characters like ':' + encoded_page_name = quote(page_name, safe='') + url = f"{self.base_url}/repos/{owner}/{target_repo}/wiki/page/{encoded_page_name}" logger.info(f"Deleting wiki page '{page_name}' from {owner}/{target_repo}") response = self.session.delete(url) response.raise_for_status()