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 ceedc06..c8317a9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,18 @@ 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) + - 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 +32,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/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. 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() 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