diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index 507ee51..71b50d8 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -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" } diff --git a/CHANGELOG.md b/CHANGELOG.md index a959dc4..fcb1b2e 100644 --- a/CHANGELOG.md +++ b/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 diff --git a/README.md b/README.md index 2e72bba..2c7125e 100644 --- a/README.md +++ b/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,67 +90,92 @@ 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:** - ```bash - git clone ssh://git@hotserv.tailc9b278.ts.net:2222/personal-projects/support-claude-mktplace.git - cd support-claude-mktplace - ``` +**Option 1 - CLI command (recommended):** +```bash +/plugin marketplace add https://gitea.hotserv.cloud/personal-projects/support-claude-mktplace.git +``` -2. **Install MCP server dependencies:** - ```bash - # Gitea MCP (for projman) - cd plugins/projman/mcp-servers/gitea - python3 -m venv .venv - source .venv/bin/activate - pip install -r requirements.txt - deactivate +**Option 2 - Settings file (for team distribution):** - # NetBox MCP (for cmdb-assistant) - cd ../../../cmdb-assistant/mcp-servers/netbox - python3 -m venv .venv - source .venv/bin/activate - pip install -r requirements.txt - deactivate - ``` +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" + } + } + } +} +``` -3. **Configure system-level credentials:** - ```bash - mkdir -p ~/.config/claude +**Option 3 - Local development:** +```bash +# Clone the repository first +git clone https://gitea.hotserv.cloud/personal-projects/support-claude-mktplace.git - # Gitea credentials - cat > ~/.config/claude/gitea.env << 'EOF' - GITEA_URL=https://gitea.example.com - GITEA_TOKEN=your_token - GITEA_ORG=your_org - EOF +# Then add from local path +/plugin marketplace add /path/to/support-claude-mktplace +``` - # NetBox credentials - cat > ~/.config/claude/netbox.env << 'EOF' - NETBOX_API_URL=https://netbox.example.com/api - NETBOX_API_TOKEN=your_token - EOF +**Alternative SSH URL (for authenticated access):** +``` +ssh://git@hotserv.tailc9b278.ts.net:2222/personal-projects/support-claude-mktplace.git +``` - chmod 600 ~/.config/claude/*.env - ``` +### Configure MCP Server Dependencies -4. **Configure project-level settings:** - ```bash - # In your target project root - cat > .env << 'EOF' - GITEA_REPO=your-repository-name - EOF - ``` +If using plugins with MCP servers (projman, cmdb-assistant), install dependencies: -5. **Add marketplace to Claude Code:** +```bash +# Gitea MCP (for projman) +cd plugins/projman/mcp-servers/gitea +python3 -m venv .venv +source .venv/bin/activate +pip install -r requirements.txt +deactivate - Add to your project's `.claude/settings.json`: - ```json - { - "pluginMarketplace": "/path/to/support-claude-mktplace" - } - ``` +# NetBox MCP (for cmdb-assistant) +cd ../../../cmdb-assistant/mcp-servers/netbox +python3 -m venv .venv +source .venv/bin/activate +pip install -r requirements.txt +deactivate +``` + +### Configure Credentials + +**System-level credentials:** +```bash +mkdir -p ~/.config/claude + +# Gitea credentials +cat > ~/.config/claude/gitea.env << 'EOF' +GITEA_URL=https://gitea.example.com +GITEA_TOKEN=your_token +GITEA_ORG=your_org +EOF + +# NetBox credentials +cat > ~/.config/claude/netbox.env << 'EOF' +NETBOX_API_URL=https://netbox.example.com/api +NETBOX_API_TOKEN=your_token +EOF + +chmod 600 ~/.config/claude/*.env +``` + +**Project-level settings:** +```bash +# In your target project root +cat > .env << 'EOF' +GITEA_REPO=your-repository-name +EOF +``` ## 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` diff --git a/plugins/claude-config-maintainer/.claude-plugin/plugin.json b/plugins/claude-config-maintainer/.claude-plugin/plugin.json index 5d3ea99..2f413ce 100644 --- a/plugins/claude-config-maintainer/.claude-plugin/plugin.json +++ b/plugins/claude-config-maintainer/.claude-plugin/plugin.json @@ -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" - }, - { - "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" - } + "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", + "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/"] } diff --git a/plugins/cmdb-assistant/.claude-plugin/plugin.json b/plugins/cmdb-assistant/.claude-plugin/plugin.json index b96cfa2..ff9bfb7 100644 --- a/plugins/cmdb-assistant/.claude-plugin/plugin.json +++ b/plugins/cmdb-assistant/.claude-plugin/plugin.json @@ -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" } diff --git a/plugins/project-hygiene/.claude-plugin/plugin.json b/plugins/project-hygiene/.claude-plugin/plugin.json index f9977c0..4ec8ef9 100644 --- a/plugins/project-hygiene/.claude-plugin/plugin.json +++ b/plugins/project-hygiene/.claude-plugin/plugin.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": [ { diff --git a/plugins/projman/.claude-plugin/plugin.json b/plugins/projman/.claude-plugin/plugin.json index 8646b0e..09c5b28 100644 --- a/plugins/projman/.claude-plugin/plugin.json +++ b/plugins/projman/.claude-plugin/plugin.json @@ -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/"] } diff --git a/plugins/projman/README.md b/plugins/projman/README.md index 93c66ec..61bb49f 100644 --- a/plugins/projman/README.md +++ b/plugins/projman/README.md @@ -1,4 +1,4 @@ -# Projman - 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 diff --git a/plugins/projman/agents/code-reviewer.md b/plugins/projman/agents/code-reviewer.md new file mode 100644 index 0000000..905ffc6 --- /dev/null +++ b/plugins/projman/agents/code-reviewer.md @@ -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 +``` diff --git a/plugins/projman/commands/review.md b/plugins/projman/commands/review.md new file mode 100644 index 0000000..963aab2 --- /dev/null +++ b/plugins/projman/commands/review.md @@ -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) diff --git a/plugins/projman/commands/test-check.md b/plugins/projman/commands/test-check.md new file mode 100644 index 0000000..96b81bc --- /dev/null +++ b/plugins/projman/commands/test-check.md @@ -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 diff --git a/scripts/validate-marketplace.sh b/scripts/validate-marketplace.sh new file mode 100755 index 0000000..876d994 --- /dev/null +++ b/scripts/validate-marketplace.sh @@ -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 ==="