development: new version launched (v2.2.0) #32
@@ -1,17 +1,25 @@
|
||||
{
|
||||
"name": "claude-code-marketplace",
|
||||
"version": "2.0.0",
|
||||
"description": "Project management plugins with Gitea and NetBox integrations",
|
||||
"owner": {
|
||||
"name": "Leo Miranda",
|
||||
"email": "leobmiranda@gmail.com"
|
||||
},
|
||||
"metadata": {
|
||||
"description": "Project management plugins with Gitea and NetBox integrations",
|
||||
"version": "2.2.0"
|
||||
},
|
||||
"plugins": [
|
||||
{
|
||||
"name": "projman",
|
||||
"version": "2.0.0",
|
||||
"version": "2.2.0",
|
||||
"description": "Sprint planning and project management with Gitea integration",
|
||||
"source": "./plugins/projman",
|
||||
"author": {
|
||||
"name": "Leo Miranda",
|
||||
"email": "leobmiranda@gmail.com"
|
||||
},
|
||||
"homepage": "https://gitea.hotserv.cloud/personal-projects/support-claude-mktplace/src/branch/main/plugins/projman/README.md",
|
||||
"repository": "https://gitea.hotserv.cloud/personal-projects/support-claude-mktplace.git",
|
||||
"mcpServers": ["gitea"],
|
||||
"integrationFile": "claude-md-integration.md"
|
||||
},
|
||||
@@ -20,6 +28,12 @@
|
||||
"version": "0.1.0",
|
||||
"description": "Post-task cleanup hook that removes temp files and manages orphaned files",
|
||||
"source": "./plugins/project-hygiene",
|
||||
"author": {
|
||||
"name": "Leo Miranda",
|
||||
"email": "leobmiranda@gmail.com"
|
||||
},
|
||||
"homepage": "https://gitea.hotserv.cloud/personal-projects/support-claude-mktplace/src/branch/main/plugins/project-hygiene/README.md",
|
||||
"repository": "https://gitea.hotserv.cloud/personal-projects/support-claude-mktplace.git",
|
||||
"mcpServers": [],
|
||||
"integrationFile": "claude-md-integration.md",
|
||||
"hooks": ["PostToolUse"]
|
||||
@@ -29,6 +43,12 @@
|
||||
"version": "1.0.0",
|
||||
"description": "NetBox CMDB integration for infrastructure management",
|
||||
"source": "./plugins/cmdb-assistant",
|
||||
"author": {
|
||||
"name": "Leo Miranda",
|
||||
"email": "leobmiranda@gmail.com"
|
||||
},
|
||||
"homepage": "https://gitea.hotserv.cloud/personal-projects/support-claude-mktplace/src/branch/main/plugins/cmdb-assistant/README.md",
|
||||
"repository": "https://gitea.hotserv.cloud/personal-projects/support-claude-mktplace.git",
|
||||
"mcpServers": ["netbox"],
|
||||
"integrationFile": "claude-md-integration.md"
|
||||
},
|
||||
@@ -37,6 +57,12 @@
|
||||
"version": "1.0.0",
|
||||
"description": "CLAUDE.md optimization and maintenance for Claude Code projects",
|
||||
"source": "./plugins/claude-config-maintainer",
|
||||
"author": {
|
||||
"name": "Leo Miranda",
|
||||
"email": "leobmiranda@gmail.com"
|
||||
},
|
||||
"homepage": "https://gitea.hotserv.cloud/personal-projects/support-claude-mktplace/src/branch/main/plugins/claude-config-maintainer/README.md",
|
||||
"repository": "https://gitea.hotserv.cloud/personal-projects/support-claude-mktplace.git",
|
||||
"mcpServers": [],
|
||||
"integrationFile": "claude-md-integration.md"
|
||||
}
|
||||
|
||||
24
CHANGELOG.md
24
CHANGELOG.md
@@ -4,7 +4,29 @@ All notable changes to support-claude-mktplace will be documented in this file.
|
||||
|
||||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
||||
|
||||
## [Unreleased]
|
||||
## [2.2.0] - 2026-01-20
|
||||
|
||||
### Added
|
||||
- `/review` command for pre-sprint-close code quality checks (projman)
|
||||
- `/test-check` command for test verification before sprint close (projman)
|
||||
- `code-reviewer` agent for structured code review workflow (projman)
|
||||
- Validation script (`scripts/validate-marketplace.sh`) for marketplace compliance
|
||||
- `homepage` and `repository` fields to all plugin entries in marketplace.json
|
||||
- `metadata` wrapper for description/version in marketplace.json
|
||||
- Keywords to all plugin manifests for better discoverability
|
||||
- `commands` and `agents` directory references to plugin manifests
|
||||
|
||||
### Changed
|
||||
- Updated marketplace.json with required fields per Claude Code spec
|
||||
- Fixed installation documentation to use official Claude Code methods
|
||||
- Prioritized public HTTPS URL over Tailscale SSH URL in documentation
|
||||
- Updated all plugin manifests with author, homepage, repository, license fields
|
||||
|
||||
### Fixed
|
||||
- Plugin manifests now include all required fields per Claude Code spec
|
||||
- Installation section uses `extraKnownMarketplaces` instead of undocumented `pluginMarketplace`
|
||||
|
||||
## [2.1.0] - Previous Release
|
||||
|
||||
### Added
|
||||
- `docs/CANONICAL-PATHS.md` - Single source of truth for all file paths
|
||||
|
||||
70
README.md
70
README.md
@@ -4,19 +4,20 @@ A collection of Claude Code plugins for project management, infrastructure autom
|
||||
|
||||
## Plugins
|
||||
|
||||
### [projman](./plugins/projman/README.md) v2.1.0
|
||||
### [projman](./plugins/projman/README.md) v2.2.0
|
||||
**Sprint Planning and Project Management**
|
||||
|
||||
AI-guided sprint planning with full Gitea integration. Transforms a proven 15-sprint workflow into a distributable plugin.
|
||||
|
||||
- Three-agent model: Planner, Orchestrator, Executor
|
||||
- Three-agent model: Planner, Orchestrator, Executor, Code Reviewer
|
||||
- Intelligent label suggestions from 43-label taxonomy
|
||||
- Lessons learned capture via Gitea Wiki
|
||||
- Native issue dependencies with parallel execution
|
||||
- Milestone management for sprint organization
|
||||
- Branch-aware security (development/staging/production)
|
||||
- Pre-sprint-close code quality review and test verification
|
||||
|
||||
**Commands:** `/sprint-plan`, `/sprint-start`, `/sprint-status`, `/sprint-close`, `/labels-sync`, `/initial-setup`
|
||||
**Commands:** `/sprint-plan`, `/sprint-start`, `/sprint-status`, `/sprint-close`, `/labels-sync`, `/initial-setup`, `/review`, `/test-check`
|
||||
|
||||
### [claude-config-maintainer](./plugins/claude-config-maintainer/README.md)
|
||||
**CLAUDE.md Optimization and Maintenance**
|
||||
@@ -89,15 +90,47 @@ Comprehensive NetBox REST API integration for infrastructure management.
|
||||
- Python 3.10+
|
||||
- Access to target services (Gitea, NetBox as needed)
|
||||
|
||||
### Quick Start
|
||||
### Add Marketplace to Claude Code
|
||||
|
||||
1. **Clone the repository:**
|
||||
**Option 1 - CLI command (recommended):**
|
||||
```bash
|
||||
git clone ssh://git@hotserv.tailc9b278.ts.net:2222/personal-projects/support-claude-mktplace.git
|
||||
cd support-claude-mktplace
|
||||
/plugin marketplace add https://gitea.hotserv.cloud/personal-projects/support-claude-mktplace.git
|
||||
```
|
||||
|
||||
2. **Install MCP server dependencies:**
|
||||
**Option 2 - Settings file (for team distribution):**
|
||||
|
||||
Add to `.claude/settings.json` in your target project:
|
||||
```json
|
||||
{
|
||||
"extraKnownMarketplaces": {
|
||||
"support-claude-mktplace": {
|
||||
"source": {
|
||||
"source": "git",
|
||||
"url": "https://gitea.hotserv.cloud/personal-projects/support-claude-mktplace.git"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**Option 3 - Local development:**
|
||||
```bash
|
||||
# Clone the repository first
|
||||
git clone https://gitea.hotserv.cloud/personal-projects/support-claude-mktplace.git
|
||||
|
||||
# Then add from local path
|
||||
/plugin marketplace add /path/to/support-claude-mktplace
|
||||
```
|
||||
|
||||
**Alternative SSH URL (for authenticated access):**
|
||||
```
|
||||
ssh://git@hotserv.tailc9b278.ts.net:2222/personal-projects/support-claude-mktplace.git
|
||||
```
|
||||
|
||||
### Configure MCP Server Dependencies
|
||||
|
||||
If using plugins with MCP servers (projman, cmdb-assistant), install dependencies:
|
||||
|
||||
```bash
|
||||
# Gitea MCP (for projman)
|
||||
cd plugins/projman/mcp-servers/gitea
|
||||
@@ -114,7 +147,9 @@ Comprehensive NetBox REST API integration for infrastructure management.
|
||||
deactivate
|
||||
```
|
||||
|
||||
3. **Configure system-level credentials:**
|
||||
### Configure Credentials
|
||||
|
||||
**System-level credentials:**
|
||||
```bash
|
||||
mkdir -p ~/.config/claude
|
||||
|
||||
@@ -134,7 +169,7 @@ Comprehensive NetBox REST API integration for infrastructure management.
|
||||
chmod 600 ~/.config/claude/*.env
|
||||
```
|
||||
|
||||
4. **Configure project-level settings:**
|
||||
**Project-level settings:**
|
||||
```bash
|
||||
# In your target project root
|
||||
cat > .env << 'EOF'
|
||||
@@ -142,15 +177,6 @@ Comprehensive NetBox REST API integration for infrastructure management.
|
||||
EOF
|
||||
```
|
||||
|
||||
5. **Add marketplace to Claude Code:**
|
||||
|
||||
Add to your project's `.claude/settings.json`:
|
||||
```json
|
||||
{
|
||||
"pluginMarketplace": "/path/to/support-claude-mktplace"
|
||||
}
|
||||
```
|
||||
|
||||
## Repository Structure
|
||||
|
||||
```
|
||||
@@ -183,9 +209,10 @@ support-claude-mktplace/
|
||||
│ ├── CANONICAL-PATHS.md # Single source of truth for paths
|
||||
│ └── references/
|
||||
└── scripts/ # Setup and maintenance scripts
|
||||
└── validate-marketplace.sh # Marketplace compliance validation
|
||||
```
|
||||
|
||||
## Key Features (v2.1.0)
|
||||
## Key Features (v2.2.0)
|
||||
|
||||
### Parallel Execution
|
||||
Tasks are batched by dependency graph for optimal parallel execution:
|
||||
@@ -217,4 +244,5 @@ MIT License
|
||||
## Support
|
||||
|
||||
- **Issues**: Contact repository maintainer
|
||||
- **Repository**: `ssh://git@hotserv.tailc9b278.ts.net:2222/personal-projects/support-claude-mktplace.git`
|
||||
- **Repository**: `https://gitea.hotserv.cloud/personal-projects/support-claude-mktplace.git`
|
||||
- **SSH URL**: `ssh://git@hotserv.tailc9b278.ts.net:2222/personal-projects/support-claude-mktplace.git`
|
||||
|
||||
@@ -2,29 +2,21 @@
|
||||
"name": "claude-config-maintainer",
|
||||
"version": "1.0.0",
|
||||
"description": "Maintains and optimizes CLAUDE.md configuration files for Claude Code projects",
|
||||
"entryPoint": "agents/maintainer.md",
|
||||
"commands": [
|
||||
{
|
||||
"name": "config-analyze",
|
||||
"description": "Analyze CLAUDE.md for optimization opportunities",
|
||||
"entryPoint": "commands/analyze.md"
|
||||
"author": {
|
||||
"name": "Leo Miranda",
|
||||
"email": "leobmiranda@gmail.com"
|
||||
},
|
||||
{
|
||||
"name": "config-optimize",
|
||||
"description": "Optimize CLAUDE.md structure and content",
|
||||
"entryPoint": "commands/optimize.md"
|
||||
},
|
||||
{
|
||||
"name": "config-init",
|
||||
"description": "Initialize a new CLAUDE.md file for a project",
|
||||
"entryPoint": "commands/init.md"
|
||||
}
|
||||
"homepage": "https://gitea.hotserv.cloud/personal-projects/support-claude-mktplace/src/branch/main/plugins/claude-config-maintainer/README.md",
|
||||
"repository": "https://gitea.hotserv.cloud/personal-projects/support-claude-mktplace.git",
|
||||
"license": "MIT",
|
||||
"keywords": [
|
||||
"claude-code",
|
||||
"configuration",
|
||||
"optimization",
|
||||
"claude-md",
|
||||
"developer-tools"
|
||||
],
|
||||
"agents": [
|
||||
{
|
||||
"name": "maintainer",
|
||||
"description": "CLAUDE.md optimization and maintenance agent",
|
||||
"entryPoint": "agents/maintainer.md"
|
||||
}
|
||||
]
|
||||
"entryPoint": "agents/maintainer.md",
|
||||
"commands": ["./commands/"],
|
||||
"agents": ["./agents/"]
|
||||
}
|
||||
|
||||
@@ -6,7 +6,8 @@
|
||||
"name": "Leo Miranda",
|
||||
"email": "leobmiranda@gmail.com"
|
||||
},
|
||||
"homepage": "https://gitea.hotserv.cloud/personal-projects/support-claude-mktplace",
|
||||
"homepage": "https://gitea.hotserv.cloud/personal-projects/support-claude-mktplace/src/branch/main/plugins/cmdb-assistant/README.md",
|
||||
"repository": "https://gitea.hotserv.cloud/personal-projects/support-claude-mktplace.git",
|
||||
"license": "MIT",
|
||||
"keywords": [
|
||||
"netbox",
|
||||
@@ -15,5 +16,8 @@
|
||||
"network",
|
||||
"ipam",
|
||||
"dcim"
|
||||
]
|
||||
],
|
||||
"commands": ["./commands/"],
|
||||
"agents": ["./agents/"],
|
||||
"mcpServers": "./.mcp.json"
|
||||
}
|
||||
|
||||
@@ -6,9 +6,16 @@
|
||||
"name": "Leo Miranda",
|
||||
"email": "leobmiranda@gmail.com"
|
||||
},
|
||||
"homepage": "https://gitea.hotserv.cloud/personal-projects/support-claude-mktplace/src/branch/main/plugins/project-hygiene/README.md",
|
||||
"repository": "https://gitea.hotserv.cloud/personal-projects/support-claude-mktplace.git",
|
||||
"license": "MIT",
|
||||
"keywords": ["cleanup", "hygiene", "automation", "hooks", "maintenance"],
|
||||
"repository": "https://gitea.hotserv.cloud/personal-projects/support-claude-mktplace",
|
||||
"keywords": [
|
||||
"cleanup",
|
||||
"hygiene",
|
||||
"automation",
|
||||
"hooks",
|
||||
"maintenance"
|
||||
],
|
||||
"hooks": {
|
||||
"PostToolUse": [
|
||||
{
|
||||
|
||||
@@ -1,18 +1,21 @@
|
||||
{
|
||||
"name": "projman",
|
||||
"version": "2.0.0",
|
||||
"version": "2.2.0",
|
||||
"description": "Sprint planning and project management with Gitea integration",
|
||||
"author": {
|
||||
"name": "Leo Miranda",
|
||||
"email": "leobmiranda@gmail.com"
|
||||
},
|
||||
"homepage": "https://gitea.hotserv.cloud/personal-projects/support-claude-mktplace/src/branch/main/plugins/projman/README.md",
|
||||
"repository": "https://gitea.hotserv.cloud/personal-projects/support-claude-mktplace.git",
|
||||
"license": "MIT",
|
||||
"repository": "https://gitea.hotserv.cloud/personal-projects/support-claude-mktplace",
|
||||
"keywords": [
|
||||
"project-management",
|
||||
"sprint-planning",
|
||||
"gitea",
|
||||
"agile",
|
||||
"lessons-learned"
|
||||
]
|
||||
],
|
||||
"commands": ["./commands/"],
|
||||
"agents": ["./agents/"]
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Projman v2.0.0 - Project Management for Claude Code
|
||||
# Projman v2.2.0 - Project Management for Claude Code
|
||||
|
||||
Sprint planning and project management plugin with full Gitea integration.
|
||||
|
||||
@@ -174,6 +174,43 @@ Run initial setup for a new project.
|
||||
|
||||
**When to use:** First time setting up projman for a project
|
||||
|
||||
### `/review`
|
||||
Pre-sprint-close code quality review.
|
||||
|
||||
**What it does:**
|
||||
- Scans recent changes for debug artifacts (TODO, console.log, commented code)
|
||||
- Checks for code complexity issues (long functions, deep nesting)
|
||||
- Performs lightweight security scan (hardcoded secrets, SQL injection risks)
|
||||
- Identifies error handling gaps (bare except, swallowed exceptions)
|
||||
|
||||
**Output format:**
|
||||
- Critical Issues (Block Sprint Close)
|
||||
- Warnings (Should Address)
|
||||
- Recommendations (Nice to Have)
|
||||
|
||||
**When to use:** Before closing a sprint to ensure code quality
|
||||
|
||||
### `/test-check`
|
||||
Test verification before sprint close.
|
||||
|
||||
**What it does:**
|
||||
- Automatically detects test framework (pytest, Jest, Go test, Cargo, etc.)
|
||||
- Runs the test suite
|
||||
- Reports pass/fail summary with details on failures
|
||||
- Includes coverage report when available
|
||||
- Identifies sprint files lacking test coverage
|
||||
|
||||
**Flags:**
|
||||
- "run tests with coverage" - Include coverage report
|
||||
- "run tests verbose" - Show full output
|
||||
- "just check, don't run" - Report framework detection only
|
||||
|
||||
**When to use:** Before closing a sprint to ensure tests pass
|
||||
|
||||
## Code Quality Commands
|
||||
|
||||
The `/review` and `/test-check` commands complement the Executor agent by catching issues before work is marked complete. Run both commands before `/sprint-close` for a complete quality check.
|
||||
|
||||
## Agents
|
||||
|
||||
### Planner Agent
|
||||
@@ -203,6 +240,17 @@ Run initial setup for a new project.
|
||||
|
||||
**Invoked by:** `/sprint-start`, `/sprint-close`
|
||||
|
||||
### Code Reviewer Agent
|
||||
**Personality:** Thorough, practical, severity-focused
|
||||
|
||||
**Responsibilities:**
|
||||
- Identifying code quality issues before sprint close
|
||||
- Prioritizing findings (Critical > Warning > Recommendation)
|
||||
- Providing actionable feedback with file:line references
|
||||
- Respecting sprint scope (only reviewing changed files)
|
||||
|
||||
**Invoked by:** `/review`
|
||||
|
||||
### Executor Agent
|
||||
**Personality:** Implementation-focused, follows specs precisely
|
||||
|
||||
@@ -373,11 +421,14 @@ projman/
|
||||
│ ├── sprint-status.md
|
||||
│ ├── sprint-close.md
|
||||
│ ├── labels-sync.md
|
||||
│ └── initial-setup.md
|
||||
│ ├── initial-setup.md
|
||||
│ ├── review.md
|
||||
│ └── test-check.md
|
||||
├── agents/ # Agent prompts
|
||||
│ ├── planner.md
|
||||
│ ├── orchestrator.md
|
||||
│ └── executor.md
|
||||
│ ├── executor.md
|
||||
│ └── code-reviewer.md
|
||||
├── skills/ # Supporting knowledge
|
||||
│ └── label-taxonomy/
|
||||
│ └── labels-reference.md
|
||||
@@ -430,9 +481,11 @@ MIT License - See repository root for details
|
||||
|
||||
## Version
|
||||
|
||||
**Current:** 2.0.0
|
||||
**Current:** 2.2.0
|
||||
|
||||
**Changelog:**
|
||||
- v2.2.0: Added `/review` and `/test-check` commands, code-reviewer agent, marketplace compliance updates
|
||||
- v2.1.0: Documentation improvements, canonical paths, initial-setup command
|
||||
- v2.0.0: Full Gitea integration with wiki, milestones, dependencies, parallel execution
|
||||
- v1.0.0: Initial release with basic commands
|
||||
|
||||
|
||||
90
plugins/projman/agents/code-reviewer.md
Normal file
90
plugins/projman/agents/code-reviewer.md
Normal file
@@ -0,0 +1,90 @@
|
||||
---
|
||||
name: code-reviewer
|
||||
description: Specialized agent for pre-sprint code quality review
|
||||
---
|
||||
|
||||
# Code Reviewer Agent
|
||||
|
||||
You are a code quality reviewer focused on catching issues before sprint close.
|
||||
|
||||
## Your Role
|
||||
|
||||
- Identify issues that should be fixed before work is marked complete
|
||||
- Prioritize findings by severity (Critical > Warning > Recommendation)
|
||||
- Be concise—developers need actionable feedback, not lectures
|
||||
- Respect sprint scope—don't expand review beyond changed files
|
||||
|
||||
## Review Philosophy
|
||||
|
||||
**Critical**: Security issues, broken functionality, data loss risks
|
||||
- Hardcoded credentials or API keys
|
||||
- SQL injection vulnerabilities
|
||||
- Missing authentication/authorization checks
|
||||
- Unhandled errors that could crash the application
|
||||
|
||||
**Warning**: Technical debt that will cause problems soon
|
||||
- TODO/FIXME comments left unresolved
|
||||
- Debug statements (console.log, print) in production code
|
||||
- Functions over 50 lines (complexity smell)
|
||||
- Deeply nested conditionals (>3 levels)
|
||||
- Bare except/catch blocks
|
||||
|
||||
**Recommendation**: Improvements that can wait for a future sprint
|
||||
- Missing docstrings on public functions
|
||||
- Minor code duplication
|
||||
- Commented-out code blocks
|
||||
|
||||
## What You Don't Do
|
||||
|
||||
- Bikeshed on style (assume formatters handle this)
|
||||
- Suggest architectural rewrites mid-sprint
|
||||
- Flag issues in unchanged code (unless directly impacted)
|
||||
- Automatically fix code without explicit approval
|
||||
|
||||
## Integration with Projman
|
||||
|
||||
When sprint context is available, you can:
|
||||
- Reference the sprint's issue list
|
||||
- Create follow-up issues for non-critical findings via Gitea MCP
|
||||
- Tag findings with appropriate labels from the 43-label taxonomy
|
||||
|
||||
## Review Patterns by Language
|
||||
|
||||
### Python
|
||||
- Look for: bare `except:`, `print()` statements, `# TODO`, missing type hints on public APIs
|
||||
- Security: `eval()`, `exec()`, SQL string formatting, `verify=False`
|
||||
|
||||
### JavaScript/TypeScript
|
||||
- Look for: `console.log`, `// TODO`, `any` type abuse, missing error boundaries
|
||||
- Security: `eval()`, `innerHTML`, unescaped user input
|
||||
|
||||
### Go
|
||||
- Look for: `// TODO`, ignored errors (`_`), missing error returns
|
||||
- Security: SQL concatenation, missing input validation
|
||||
|
||||
### Rust
|
||||
- Look for: `// TODO`, `unwrap()` chains, `unsafe` blocks without justification
|
||||
- Security: unchecked `unwrap()` on user input
|
||||
|
||||
## Output Template
|
||||
|
||||
```
|
||||
## Code Review Summary
|
||||
|
||||
**Scope**: [X files from sprint/last N commits]
|
||||
**Verdict**: [READY FOR CLOSE / NEEDS ATTENTION / BLOCKED]
|
||||
|
||||
### Critical (Must Fix)
|
||||
- `src/auth.py:45` - Hardcoded API key in source code
|
||||
|
||||
### Warnings (Should Fix)
|
||||
- `src/utils.js:123` - console.log left in production code
|
||||
- `src/handler.py:67` - Bare except block swallows all errors
|
||||
|
||||
### Recommendations (Future Sprint)
|
||||
- `src/api.ts:89` - Function exceeds 50 lines, consider splitting
|
||||
|
||||
### Clean Files
|
||||
- src/models.py
|
||||
- src/tests/test_auth.py
|
||||
```
|
||||
82
plugins/projman/commands/review.md
Normal file
82
plugins/projman/commands/review.md
Normal file
@@ -0,0 +1,82 @@
|
||||
---
|
||||
name: review
|
||||
description: Pre-sprint-close code quality review
|
||||
---
|
||||
|
||||
# Code Review for Sprint Close
|
||||
|
||||
Review the recent code changes for quality issues before closing the sprint.
|
||||
|
||||
## Review Checklist
|
||||
|
||||
Analyze the changes and report on:
|
||||
|
||||
### 1. Debug Artifacts
|
||||
- [ ] TODO/FIXME comments that should be resolved or converted to issues
|
||||
- [ ] Console.log, print(), debug statements left in code
|
||||
- [ ] Commented-out code blocks
|
||||
|
||||
### 2. Code Quality
|
||||
- [ ] Functions exceeding 50 lines (complexity smell)
|
||||
- [ ] Deeply nested conditionals (>3 levels)
|
||||
- [ ] Duplicate code patterns
|
||||
- [ ] Missing docstrings/comments on public functions
|
||||
|
||||
### 3. Security Scan (Lightweight)
|
||||
- [ ] Hardcoded strings that look like secrets (API keys, passwords, tokens)
|
||||
- [ ] SQL strings with concatenation (injection risk)
|
||||
- [ ] Disabled SSL verification
|
||||
- [ ] Overly permissive file permissions in code
|
||||
|
||||
### 4. Error Handling
|
||||
- [ ] Bare except/catch blocks
|
||||
- [ ] Swallowed exceptions (catch with pass/empty block)
|
||||
- [ ] Missing null/undefined checks on external data
|
||||
|
||||
## Output Format
|
||||
|
||||
Provide a structured report:
|
||||
|
||||
```
|
||||
## Sprint Review Summary
|
||||
|
||||
### Critical Issues (Block Sprint Close)
|
||||
- [file:line] Description
|
||||
|
||||
### Warnings (Should Address)
|
||||
- [file:line] Description
|
||||
|
||||
### Recommendations (Nice to Have)
|
||||
- [file:line] Description
|
||||
|
||||
### Clean Files
|
||||
- List of files with no issues found
|
||||
```
|
||||
|
||||
## Scope
|
||||
|
||||
If sprint context is available from projman, limit review to files touched in current sprint.
|
||||
Otherwise, review staged changes or changes in the last 5 commits.
|
||||
|
||||
## How to Determine Scope
|
||||
|
||||
1. **Check for sprint context**: Look for `.projman/current-sprint.json` or similar
|
||||
2. **Fall back to git changes**: Use `git diff --name-only HEAD~5` or staged files
|
||||
3. **Filter by file type**: Focus on code files (.py, .js, .ts, .go, .rs, etc.)
|
||||
|
||||
## Execution Steps
|
||||
|
||||
1. Determine scope (sprint files or recent commits)
|
||||
2. For each file in scope:
|
||||
- Read the file content
|
||||
- Scan for patterns in each category
|
||||
- Record findings with file:line references
|
||||
3. Compile findings into the structured report
|
||||
4. Provide recommendation: READY / NEEDS ATTENTION / BLOCK
|
||||
|
||||
## Do NOT
|
||||
|
||||
- Rewrite or refactor code automatically
|
||||
- Make changes without explicit approval
|
||||
- Review files outside the sprint/change scope
|
||||
- Spend excessive time on style issues (assume formatters handle this)
|
||||
163
plugins/projman/commands/test-check.md
Normal file
163
plugins/projman/commands/test-check.md
Normal file
@@ -0,0 +1,163 @@
|
||||
---
|
||||
name: test-check
|
||||
description: Run tests and verify coverage before sprint close
|
||||
---
|
||||
|
||||
# Test Check for Sprint Close
|
||||
|
||||
Verify test status and coverage before closing the sprint.
|
||||
|
||||
## Framework Detection
|
||||
|
||||
Detect the test framework by checking for:
|
||||
|
||||
| Indicator | Framework | Command |
|
||||
|-----------|-----------|---------|
|
||||
| `pytest.ini`, `pyproject.toml` with pytest, `tests/` with `test_*.py` | pytest | `pytest` |
|
||||
| `package.json` with jest | Jest | `npm test` or `npx jest` |
|
||||
| `package.json` with mocha | Mocha | `npm test` or `npx mocha` |
|
||||
| `package.json` with vitest | Vitest | `npm test` or `npx vitest` |
|
||||
| `go.mod` with `*_test.go` files | Go test | `go test ./...` |
|
||||
| `Cargo.toml` with `tests/` or `#[test]` | Cargo test | `cargo test` |
|
||||
| `Makefile` with test target | Make | `make test` |
|
||||
| `tox.ini` | tox | `tox` |
|
||||
| `setup.py` with test command | setuptools | `python setup.py test` |
|
||||
|
||||
## Execution Steps
|
||||
|
||||
### 1. Detect Framework
|
||||
|
||||
1. Check for framework indicators in project root
|
||||
2. If multiple found, list them and ask which to run
|
||||
3. If none found, report "No test framework detected"
|
||||
|
||||
### 2. Run Tests
|
||||
|
||||
1. Execute the appropriate test command
|
||||
2. Capture stdout/stderr
|
||||
3. Parse results for pass/fail counts
|
||||
4. Note: Some frameworks may require dependencies to be installed first
|
||||
|
||||
### 3. Coverage Check (if available)
|
||||
|
||||
Coverage tools by framework:
|
||||
- **Python**: `pytest --cov` or `coverage run`
|
||||
- **JavaScript**: Jest has built-in coverage (`--coverage`)
|
||||
- **Go**: `go test -cover`
|
||||
- **Rust**: `cargo tarpaulin` or `cargo llvm-cov`
|
||||
|
||||
If coverage is configured:
|
||||
- Report overall coverage percentage
|
||||
- List files with 0% coverage that were changed in sprint
|
||||
|
||||
### 4. Sprint File Analysis
|
||||
|
||||
If sprint context is available:
|
||||
- Identify which sprint files have tests
|
||||
- Flag sprint files with no corresponding test coverage
|
||||
|
||||
## Output Format
|
||||
|
||||
```
|
||||
## Test Check Summary
|
||||
|
||||
### Test Results
|
||||
- Framework: {detected framework}
|
||||
- Status: {PASS/FAIL}
|
||||
- Passed: {n} | Failed: {n} | Skipped: {n}
|
||||
- Duration: {time}
|
||||
|
||||
### Failed Tests
|
||||
- test_name: error message (file:line)
|
||||
|
||||
### Coverage (if available)
|
||||
- Overall: {n}%
|
||||
- Sprint files coverage:
|
||||
- file.py: {n}%
|
||||
- file.py: NO TESTS
|
||||
|
||||
### Recommendation
|
||||
{READY FOR CLOSE / TESTS MUST PASS / COVERAGE GAPS TO ADDRESS}
|
||||
```
|
||||
|
||||
## Behavior Flags
|
||||
|
||||
The command accepts optional flags via natural language:
|
||||
|
||||
| Request | Behavior |
|
||||
|---------|----------|
|
||||
| "run tests with coverage" | Include coverage report |
|
||||
| "run tests verbose" | Show full output |
|
||||
| "just check, don't run" | Report framework detection only |
|
||||
| "run specific tests for X" | Run tests matching pattern |
|
||||
|
||||
## Framework-Specific Notes
|
||||
|
||||
### Python (pytest)
|
||||
```bash
|
||||
# Basic run
|
||||
pytest
|
||||
|
||||
# With coverage
|
||||
pytest --cov=src --cov-report=term-missing
|
||||
|
||||
# Verbose
|
||||
pytest -v
|
||||
|
||||
# Specific tests
|
||||
pytest tests/test_specific.py -k "test_function_name"
|
||||
```
|
||||
|
||||
### JavaScript (Jest/Vitest)
|
||||
```bash
|
||||
# Basic run
|
||||
npm test
|
||||
|
||||
# With coverage
|
||||
npm test -- --coverage
|
||||
|
||||
# Specific tests
|
||||
npm test -- --testPathPattern="specific"
|
||||
```
|
||||
|
||||
### Go
|
||||
```bash
|
||||
# Basic run
|
||||
go test ./...
|
||||
|
||||
# With coverage
|
||||
go test -cover ./...
|
||||
|
||||
# Verbose
|
||||
go test -v ./...
|
||||
```
|
||||
|
||||
### Rust
|
||||
```bash
|
||||
# Basic run
|
||||
cargo test
|
||||
|
||||
# Verbose
|
||||
cargo test -- --nocapture
|
||||
```
|
||||
|
||||
## Do NOT
|
||||
|
||||
- Modify test files
|
||||
- Skip failing tests to make the run pass
|
||||
- Run tests in production environments (check for .env indicators)
|
||||
- Install dependencies without asking first
|
||||
- Run tests that require external services without confirmation
|
||||
|
||||
## Error Handling
|
||||
|
||||
If tests fail:
|
||||
1. Report the failure clearly
|
||||
2. List failed test names and error summaries
|
||||
3. Recommend: "TESTS MUST PASS before sprint close"
|
||||
4. Offer to help debug specific failures
|
||||
|
||||
If framework not detected:
|
||||
1. List what was checked
|
||||
2. Ask user to specify the test command
|
||||
3. Offer common suggestions based on file types found
|
||||
139
scripts/validate-marketplace.sh
Executable file
139
scripts/validate-marketplace.sh
Executable file
@@ -0,0 +1,139 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
ROOT_DIR="$(dirname "$SCRIPT_DIR")"
|
||||
|
||||
echo "=== Validating Marketplace ==="
|
||||
|
||||
# Check marketplace.json exists and is valid JSON
|
||||
MARKETPLACE_JSON="$ROOT_DIR/.claude-plugin/marketplace.json"
|
||||
if [[ ! -f "$MARKETPLACE_JSON" ]]; then
|
||||
echo "ERROR: Missing $MARKETPLACE_JSON"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! jq empty "$MARKETPLACE_JSON" 2>/dev/null; then
|
||||
echo "ERROR: Invalid JSON in marketplace.json"
|
||||
exit 1
|
||||
fi
|
||||
echo "✓ marketplace.json is valid JSON"
|
||||
|
||||
# Check required fields
|
||||
if ! jq -e '.name' "$MARKETPLACE_JSON" >/dev/null; then
|
||||
echo "ERROR: Missing 'name' field in marketplace.json"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! jq -e '.owner.name' "$MARKETPLACE_JSON" >/dev/null; then
|
||||
echo "ERROR: Missing 'owner.name' field in marketplace.json"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! jq -e '.owner.email' "$MARKETPLACE_JSON" >/dev/null; then
|
||||
echo "ERROR: Missing 'owner.email' field in marketplace.json"
|
||||
exit 1
|
||||
fi
|
||||
echo "✓ Required marketplace fields present"
|
||||
|
||||
# Check plugins array exists
|
||||
if ! jq -e '.plugins | type == "array"' "$MARKETPLACE_JSON" >/dev/null; then
|
||||
echo "ERROR: Missing or invalid 'plugins' array in marketplace.json"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Check each plugin entry in marketplace.json
|
||||
PLUGIN_COUNT=$(jq '.plugins | length' "$MARKETPLACE_JSON")
|
||||
echo "Found $PLUGIN_COUNT plugins in marketplace.json"
|
||||
|
||||
for i in $(seq 0 $((PLUGIN_COUNT - 1))); do
|
||||
PLUGIN_NAME=$(jq -r ".plugins[$i].name" "$MARKETPLACE_JSON")
|
||||
echo "--- Checking marketplace entry: $PLUGIN_NAME ---"
|
||||
|
||||
# Check required fields in marketplace entry
|
||||
for field in name source description version; do
|
||||
if ! jq -e ".plugins[$i].$field" "$MARKETPLACE_JSON" >/dev/null; then
|
||||
echo "ERROR: Missing '$field' in marketplace entry for $PLUGIN_NAME"
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
|
||||
# Check author field
|
||||
if ! jq -e ".plugins[$i].author.name" "$MARKETPLACE_JSON" >/dev/null; then
|
||||
echo "ERROR: Missing 'author.name' in marketplace entry for $PLUGIN_NAME"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Check homepage and repository
|
||||
if ! jq -e ".plugins[$i].homepage" "$MARKETPLACE_JSON" >/dev/null; then
|
||||
echo "WARNING: Missing 'homepage' in marketplace entry for $PLUGIN_NAME"
|
||||
fi
|
||||
|
||||
if ! jq -e ".plugins[$i].repository" "$MARKETPLACE_JSON" >/dev/null; then
|
||||
echo "WARNING: Missing 'repository' in marketplace entry for $PLUGIN_NAME"
|
||||
fi
|
||||
|
||||
echo "✓ Marketplace entry $PLUGIN_NAME valid"
|
||||
done
|
||||
|
||||
# Validate each plugin directory
|
||||
PLUGINS_DIR="$ROOT_DIR/plugins"
|
||||
echo ""
|
||||
echo "=== Validating Plugin Directories ==="
|
||||
|
||||
for plugin_dir in "$PLUGINS_DIR"/*/; do
|
||||
plugin_name=$(basename "$plugin_dir")
|
||||
echo "--- Checking plugin directory: $plugin_name ---"
|
||||
|
||||
# Check plugin.json exists
|
||||
plugin_json="$plugin_dir.claude-plugin/plugin.json"
|
||||
if [[ ! -f "$plugin_json" ]]; then
|
||||
echo "WARNING: Missing plugin.json in $plugin_name/.claude-plugin/"
|
||||
continue
|
||||
fi
|
||||
|
||||
# Validate JSON syntax
|
||||
if ! jq empty "$plugin_json" 2>/dev/null; then
|
||||
echo "ERROR: Invalid JSON in $plugin_name/plugin.json"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Check required plugin fields
|
||||
for field in name description version; do
|
||||
if ! jq -e ".$field" "$plugin_json" >/dev/null; then
|
||||
echo "ERROR: Missing '$field' in $plugin_name/plugin.json"
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
|
||||
# Check recommended fields
|
||||
if ! jq -e '.author.name' "$plugin_json" >/dev/null; then
|
||||
echo "WARNING: Missing 'author.name' in $plugin_name/plugin.json"
|
||||
fi
|
||||
|
||||
if ! jq -e '.homepage' "$plugin_json" >/dev/null; then
|
||||
echo "WARNING: Missing 'homepage' in $plugin_name/plugin.json"
|
||||
fi
|
||||
|
||||
if ! jq -e '.repository' "$plugin_json" >/dev/null; then
|
||||
echo "WARNING: Missing 'repository' in $plugin_name/plugin.json"
|
||||
fi
|
||||
|
||||
if ! jq -e '.license' "$plugin_json" >/dev/null; then
|
||||
echo "WARNING: Missing 'license' in $plugin_name/plugin.json"
|
||||
fi
|
||||
|
||||
if ! jq -e '.keywords | type == "array"' "$plugin_json" >/dev/null; then
|
||||
echo "WARNING: Missing 'keywords' array in $plugin_name/plugin.json"
|
||||
fi
|
||||
|
||||
# Check README exists
|
||||
if [[ ! -f "$plugin_dir/README.md" ]]; then
|
||||
echo "WARNING: Missing README.md in $plugin_name/"
|
||||
fi
|
||||
|
||||
echo "✓ $plugin_name valid"
|
||||
done
|
||||
|
||||
echo ""
|
||||
echo "=== All validations passed ==="
|
||||
Reference in New Issue
Block a user