diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 0000000..5342962 --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1 @@ +* @davidweb3-ctrl diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 0000000..38dad48 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,69 @@ +name: Bug report +description: Report incorrect behavior in an MCP Git Enhanced tool. +title: "[Bug]: " +labels: ["bug", "needs-triage"] +body: + - type: markdown + attributes: + value: | + Thanks for helping improve MCP Git Enhanced. Please avoid pasting secrets, private diffs, or sensitive repository output. + - type: textarea + id: summary + attributes: + label: Summary + description: What went wrong? + validations: + required: true + - type: dropdown + id: tool + attributes: + label: Affected tool + options: + - git_diff + - git_log + - git_branch + - git_status + - git_commit_analyze + - server startup/configuration + - documentation + - unknown + validations: + required: true + - type: textarea + id: steps + attributes: + label: Reproduction steps + description: Include the tool input shape, but redact sensitive paths or output. + placeholder: | + 1. Start the MCP server with ... + 2. Call ... with ... + 3. Observe ... + validations: + required: true + - type: textarea + id: expected + attributes: + label: Expected behavior + validations: + required: true + - type: textarea + id: actual + attributes: + label: Actual behavior + validations: + required: true + - type: input + id: node + attributes: + label: Node.js version + placeholder: "22.0.0" + - type: input + id: git + attributes: + label: Git version + placeholder: "git version 2.45.0" + - type: input + id: os + attributes: + label: Operating system + placeholder: "macOS, Linux, Windows" diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..a700bc5 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,5 @@ +blank_issues_enabled: true +contact_links: + - name: Security report + url: https://github.com/davidweb3-ctrl/mcp-git-enhanced/security + about: Please report exploitable vulnerabilities privately when possible. diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml new file mode 100644 index 0000000..2a7124b --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -0,0 +1,39 @@ +name: Feature request +description: Propose a new read-oriented maintainer workflow. +title: "[Feature]: " +labels: ["enhancement", "needs-triage"] +body: + - type: textarea + id: problem + attributes: + label: Maintainer problem + description: What open-source maintenance task should this improve? + placeholder: "As a maintainer, I need to..." + validations: + required: true + - type: textarea + id: proposal + attributes: + label: Proposed tool or behavior + description: Describe the smallest useful workflow. + validations: + required: true + - type: dropdown + id: mutating + attributes: + label: Does this mutate a repository? + options: + - "No, it is read-only" + - "Yes, it changes repository state" + - "Unsure" + validations: + required: true + - type: textarea + id: security + attributes: + label: Security or safety considerations + description: Mention path handling, Git refs, sensitive output, or destructive behavior. + - type: textarea + id: alternatives + attributes: + label: Alternatives considered diff --git a/.github/ISSUE_TEMPLATE/maintenance_task.yml b/.github/ISSUE_TEMPLATE/maintenance_task.yml new file mode 100644 index 0000000..8e0b151 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/maintenance_task.yml @@ -0,0 +1,31 @@ +name: Maintenance task +description: Track release, CI, documentation, or repository hygiene work. +title: "[Maintenance]: " +labels: ["maintenance", "needs-triage"] +body: + - type: dropdown + id: area + attributes: + label: Area + options: + - CI + - release + - documentation + - tests + - packaging + - repository hygiene + - security review + validations: + required: true + - type: textarea + id: task + attributes: + label: Task + description: What needs to be done? + validations: + required: true + - type: textarea + id: done + attributes: + label: Done when + description: What would make this task complete? diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000..9aaa4ca --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,21 @@ +## Summary + + + +## Verification + + + +- [ ] `npm run lint` +- [ ] `npm run format:check` +- [ ] `npm test` +- [ ] `npm run build` + +## Maintainer Review Notes + + + +- [ ] This PR does not add mutating Git behavior. +- [ ] Any new tool has README documentation. +- [ ] Any new tool has tests. +- [ ] Security-sensitive behavior is documented in `SECURITY.md` or comments. diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 924e704..8d42a26 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -6,8 +6,11 @@ on: pull_request: branches: [ master, main ] +permissions: + contents: read + jobs: - build: + verify: runs-on: ubuntu-latest strategy: @@ -15,22 +18,29 @@ jobs: node-version: [18.x, 20.x, 22.x] steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v4 + + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v4 + with: + node-version: ${{ matrix.node-version }} + cache: "npm" + + - name: Install dependencies + run: npm ci + + - name: Lint + run: npm run lint - - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v4 - with: - node-version: ${{ matrix.node-version }} - cache: 'npm' + - name: Check formatting + run: npm run format:check - - name: Install dependencies - run: npm ci + - name: Test + run: npm test - - name: Build - run: npm run build + - name: Build + run: npm run build - - name: Test server starts - run: | - timeout 3 node dist/index.js & - sleep 1 - echo '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"test","version":"1.0.0"}}}' | node dist/index.js \ No newline at end of file + - name: Smoke test MCP server + run: | + echo '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"ci","version":"1.0.0"}}}' | timeout 5 node dist/index.js diff --git a/CHANGELOG.md b/CHANGELOG.md index 4e67c83..52689bd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,23 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [Unreleased] + +### Added +- Security policy and supported-version guidance. +- Open-source roadmap focused on maintainer workflows. +- Codex for Open Source maintenance plan. +- GitHub issue templates, pull request template, and CODEOWNERS. +- Package metadata for repository, issues, homepage, and publish files. +- English launch and publish checklists aligned with the current tools. + +### Changed +- Repositioned README around open-source maintenance workflows. +- Expanded CI to run lint, formatting checks, tests, build, and MCP smoke test. +- Updated the placeholder index test to use Jest consistently. +- Excluded test files from release builds and added a clean prebuild step. +- Updated TypeScript ESLint dependencies to resolve audit findings. + ## [1.0.0] - 2025-04-19 ### Added @@ -21,4 +38,4 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - MIT License - Comprehensive documentation and examples -[1.0.0]: https://github.com/davidweb3-ctrl/mcp-git-enhanced/releases/tag/v1.0.0 \ No newline at end of file +[1.0.0]: https://github.com/davidweb3-ctrl/mcp-git-enhanced/releases/tag/v1.0.0 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 8fc0d1f..27e42eb 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,6 +1,6 @@ # Contributing to MCP Git Enhanced -Thank you for your interest in contributing! 🦞 +Thank you for your interest in contributing. ## Development Setup @@ -58,4 +58,4 @@ Please include: ## License -By contributing, you agree that your contributions will be licensed under the MIT License. \ No newline at end of file +By contributing, you agree that your contributions will be licensed under the MIT License. diff --git a/LAUNCHGUIDE.md b/LAUNCHGUIDE.md index 926a30c..8a50510 100644 --- a/LAUNCHGUIDE.md +++ b/LAUNCHGUIDE.md @@ -1,111 +1,115 @@ -# MCP Git Enhanced - Launch Guide +# MCP Git Enhanced Launch Guide -## Server Overview +This guide covers the release path for MCP Git Enhanced. -**MCP Git Enhanced** is an enhanced Git MCP Server that enables AI agents to perform advanced Git operations including code review, commit analysis, and branch management. +## Release Status -### Key Features +| Item | Status | Notes | +| --- | --- | --- | +| Source release | Ready | Repository builds and tests locally. | +| npm package | Manual step | Requires npm account access and 2FA. | +| MCP registry metadata | Prepared | `server.json` and `mcp-registry.json` are included. | +| GitHub release | Needs cleanup | The public release should use a normal tag such as `v1.0.0`. | -- 🔍 **Code Review**: Analyze diffs and provide intelligent code review feedback -- 📝 **Commit Analysis**: Understand commit history and generate summaries -- 🌿 **Branch Management**: List, compare, and manage Git branches -- 📊 **Repository Insights**: Get repository statistics and health metrics -- 🔗 **GitHub Integration**: Seamlessly works with GitHub repositories +## What This Server Does -### Use Cases +MCP Git Enhanced exposes read-oriented Git inspection tools for maintainers and AI coding assistants: -- AI-powered code review assistants -- Automated commit message generators -- Repository health monitoring tools -- Branch comparison and merge helpers +- `git_diff` +- `git_log` +- `git_branch` +- `git_status` +- `git_commit_analyze` -## Installation +It does not require a GitHub token. It runs against local repositories through Git. -```bash -npm install -g @davidweb3-ctrl/mcp-git-enhanced -``` +## Pre-Release Verification -## Configuration +Run: -### Required Environment Variables +```bash +npm ci +npm run lint +npm run format:check +npm test +npm run build +npm audit +npm pack --dry-run +``` -This server requires a **GitHub Personal Access Token** for accessing private repositories and higher API rate limits. +Expected result: -| Variable | Required | Description | How to Get | -|----------|----------|-------------|------------| -| `GITHUB_TOKEN` | **Yes** | GitHub Personal Access Token | [Create here](https://github.com/settings/tokens) | +- Lint passes. +- Formatting check passes. +- Jest tests pass. +- TypeScript build succeeds. +- `npm audit` reports 0 vulnerabilities. +- The package contains only release files, not source tests or local caches. -### Optional Environment Variables +## npm Publish -| Variable | Default | Description | -|----------|---------|-------------| -| `GIT_AUTHOR_NAME` | Git config | Default author name for commits | -| `GIT_AUTHOR_EMAIL` | Git config | Default author email for commits | +Prerequisites: -## Getting Your GitHub Token +- npm account access. +- Permission to publish `@bountyclaw/mcp-git-enhanced`. +- 2FA one-time password if the account requires it. -1. Go to https://github.com/settings/tokens -2. Click "Generate new token (classic)" -3. Select scopes: - - `repo` - Full control of private repositories - - `read:org` - Read org and team membership - - `read:user` - Read user profile data -4. Generate and copy the token -5. Set as environment variable: `export GITHUB_TOKEN=your_token_here` +Steps: -## Usage with Claude +```bash +npm login +npm ci +npm run build +npm test +npm publish --access public +npm view @bountyclaw/mcp-git-enhanced +``` -Add to your Claude configuration: +## MCP Registry Publish -```json -{ - "mcpServers": { - "git-enhanced": { - "command": "npx", - "args": ["@davidweb3-ctrl/mcp-git-enhanced"], - "env": { - "GITHUB_TOKEN": "your_github_token_here" - } - } - } -} -``` +Prerequisites: -## Available Tools +- npm package has been published. +- MCP publisher CLI is installed. +- GitHub authentication is available for the registry account. -### Repository Tools -- `git_repo_info` - Get repository information and statistics -- `git_branch_list` - List all branches in the repository -- `git_branch_compare` - Compare two branches +Steps: -### Commit Tools -- `git_log` - View commit history with filtering -- `git_commit_analyze` - Analyze commit patterns and generate insights -- `git_diff` - Show differences between commits or branches +```bash +mcp-publisher login github +mcp-publisher publish +``` -### Code Review Tools -- `git_review_pr` - Perform AI-powered code review on pull requests -- `git_blame` - Show line-by-line commit information +Verify: -## Pricing +```bash +curl "https://registry.modelcontextprotocol.io/v0.1/servers?search=io.github.davidweb3-ctrl/mcp-git-enhanced" +``` -This server is **open source and free** to use. +## GitHub Release -For enterprise support or custom features, contact: prodavidweb3@gmail.com +Use a normal SemVer tag: -## Security +```bash +git tag v1.0.0 +git push origin v1.0.0 +gh release create v1.0.0 --title "v1.0.0" --notes-file CHANGELOG.md +``` -- All Git operations are performed locally -- GitHub token is never logged or stored -- HTTPS-only communication with GitHub API -- No code is uploaded to external servers +If an older release uses a nonstandard tag, replace it with a standard tag before using the release as public evidence. -## Support +## Release Notes Checklist -- GitHub Issues: https://github.com/davidweb3-ctrl/mcp-git-enhanced/issues -- Email: prodavidweb3@gmail.com -- Documentation: See README.md in repository +- Mention new tools or changed tool behavior. +- Mention security-sensitive changes. +- Mention dependency security fixes. +- Link to verification commands. +- Link to `SECURITY.md` for vulnerability reporting. -## License +## Community Launch Checklist -MIT License - Copyright (c) 2025 David Xia +- Update README install instructions if npm is published. +- Confirm MCP registry metadata is current. +- Open roadmap issues for the next maintainer workflows. +- Mark the GitHub release as latest. +- Announce with a short maintainer-focused example, such as PR review or release-note drafting. diff --git a/PUBLISH_CHECKLIST.md b/PUBLISH_CHECKLIST.md index cd03587..f9281ae 100644 --- a/PUBLISH_CHECKLIST.md +++ b/PUBLISH_CHECKLIST.md @@ -1,164 +1,86 @@ -# 🚀 MCP Git Enhanced - 发布检查清单 +# Publish Checklist -## 发布状态 +Use this checklist before publishing MCP Git Enhanced to npm, the MCP registry, or GitHub releases. -| 步骤 | 状态 | 说明 | -|------|------|------| -| 代码准备 | ✅ 完成 | 已推送到 GitHub | -| npm 发布 | ⏳ 待手动执行 | 需要 npm 登录 | -| MCP Registry 发布 | ⏳ 待手动执行 | 需要 mcp-publisher 登录 | -| 推广 | ⏳ 待手动执行 | Twitter/X 发布 | +## Local Verification ---- +- [ ] `npm ci` +- [ ] `npm run lint` +- [ ] `npm run format:check` +- [ ] `npm test` +- [ ] `npm run build` +- [ ] `npm audit` +- [ ] `npm pack --dry-run` -## 1. npm 发布 (需要手动执行) +## Package Metadata -### 前提条件 -- 需要 npm 账号 (https://www.npmjs.com/) -- 需要双因素认证 (2FA) 的 OTP +- [ ] `package.json` has the correct repository URL. +- [ ] `package.json` has the correct bugs URL. +- [ ] `package.json` has the intended package name. +- [ ] `server.json` points to `io.github.davidweb3-ctrl/mcp-git-enhanced`. +- [ ] `mcp-registry.json` matches the npm package name and version. +- [ ] README installation instructions match the release state. -### 执行步骤 +## npm Publish -```bash -# 1. 进入项目目录 -cd /home/openclaw/.openclaw/workspace/mcp-git-enhanced +Prerequisites: -# 2. 登录 npm -npm login -# 或使用网页登录 -npm login --auth-type=web +- npm account access. +- Permission to publish `@bountyclaw/mcp-git-enhanced`. +- 2FA one-time password, if required. -# 3. 构建项目 -npm run build +Commands: -# 4. 运行测试 +```bash +npm login +npm ci +npm run build npm test - -# 5. 发布 (公开访问) npm publish --access public - -# 6. 验证发布 npm view @bountyclaw/mcp-git-enhanced ``` -### 预期输出 -``` -+ @bountyclaw/mcp-git-enhanced@1.0.0 -``` - ---- +## MCP Registry Publish -## 2. MCP Registry 发布 +Prerequisites: -### 前提条件 -- npm 包已发布 -- GitHub 账号已登录 +- npm package is published. +- MCP publisher CLI is installed. +- GitHub authentication is available for the registry account. -### 执行步骤 +Commands: ```bash -# 1. 进入项目目录 -cd /home/openclaw/.openclaw/workspace/mcp-git-enhanced - -# 2. 登录 MCP Registry (使用 GitHub 认证) mcp-publisher login github - -# 3. 按照提示完成设备授权流程 -# - 访问 https://github.com/login/device -# - 输入终端显示的代码 -# - 授权应用 - -# 4. 发布到 MCP Registry mcp-publisher publish - -# 5. 验证发布 -curl "https://registry.modelcontextprotocol.io/v0.1/servers?search=io.github.davidweb3-ctrl/mcp-git-enhanced" -``` - -### 预期输出 -``` -Publishing to https://registry.modelcontextprotocol.io... -✓ Successfully published -✓ Server io.github.davidweb3-ctrl/mcp-git-enhanced version 1.0.0 -``` - ---- - -## 3. 推广 - -### Twitter/X 发布内容模板 - ``` -🚀 刚刚发布了 MCP Git Enhanced - 一个增强型 Git MCP 服务器! - -✨ 功能亮点: -• 代码差异分析 (git_diff) -• 提交历史分析 (git_log) -• 分支管理 (git_branch) -• 仓库状态 (git_status) -• 提交详情分析 (git_commit_analyze) -📦 npm: npm install -g @bountyclaw/mcp-git-enhanced -🔧 MCP Registry: io.github.davidweb3-ctrl/mcp-git-enhanced -📖 GitHub: https://github.com/davidweb3-ctrl/mcp-git-enhanced +Verify: -#MCP #Git #DeveloperTools #AI +```bash +curl "https://registry.modelcontextprotocol.io/v0.1/servers?search=io.github.davidweb3-ctrl/mcp-git-enhanced" ``` -### 开发者社区分享 - -- [ ] Reddit r/programming -- [ ] Hacker News (Show HN) -- [ ] Dev.to 文章 -- [ ] GitHub Discussions - ---- - -## 项目信息 +## GitHub Release -| 属性 | 值 | -|------|-----| -| 包名 | @bountyclaw/mcp-git-enhanced | -| 版本 | 1.0.0 | -| MCP Registry 名称 | io.github.davidweb3-ctrl/mcp-git-enhanced | -| GitHub 仓库 | https://github.com/davidweb3-ctrl/mcp-git-enhanced | -| 测试覆盖率 | 98% | -| 测试数量 | 43 个 | +- [ ] Use a SemVer tag, such as `v1.0.0`. +- [ ] Release notes summarize user-visible changes. +- [ ] Release notes include verification status. +- [ ] Release notes mention dependency/security fixes when relevant. +- [ ] The latest release tag matches `CHANGELOG.md`. ---- +Example: -## 故障排除 - -### npm 发布失败 - -| 错误 | 解决方案 | -|------|----------| -| ENEEDAUTH | 运行 `npm login` 登录 | -| E403 | 检查包名是否已被占用 | -| EOTP | 输入双因素认证 OTP | - -### MCP Registry 发布失败 - -| 错误 | 解决方案 | -|------|----------| -| "Registry validation failed for package" | 确保 package.json 包含 `mcpName` 字段 | -| "Invalid or expired Registry JWT token" | 重新运行 `mcp-publisher login github` | -| "You do not have permission to publish this server" | 确保 mcpName 格式为 `io.github.your-username/...` | - ---- - -## 后续维护 - -### 版本更新流程 - -1. 更新代码 -2. 修改版本号:`npm version patch|minor|major` -3. 提交并推送:`git push && git push --tags` -4. 发布到 npm:`npm publish --access public` -5. 更新 MCP Registry:`mcp-publisher publish` +```bash +git tag v1.0.0 +git push origin v1.0.0 +gh release create v1.0.0 --title "v1.0.0" --notes-file CHANGELOG.md +``` -### 监控指标 +## Post-Release Maintenance -- npm 下载量: https://www.npmjs.com/package/@bountyclaw/mcp-git-enhanced -- MCP Registry 状态: https://registry.modelcontextprotocol.io -- GitHub Stars: https://github.com/davidweb3-ctrl/mcp-git-enhanced +- [ ] Open or update roadmap issues. +- [ ] Confirm CI is passing on the release branch. +- [ ] Confirm `npm audit` is clean after publication. +- [ ] Confirm the README badge points to the current CI workflow. +- [ ] Confirm `SECURITY.md` reflects the supported version. diff --git a/README.md b/README.md index 29fdf14..319bf67 100644 --- a/README.md +++ b/README.md @@ -1,66 +1,110 @@ -# 🦞 MCP Git Enhanced +# MCP Git Enhanced -[![Tests](https://img.shields.io/badge/tests-43%20passing-brightgreen)](src/__tests__/) -[![Coverage](https://img.shields.io/badge/coverage-98%25-brightgreen)](coverage/) +[![CI](https://github.com/davidweb3-ctrl/mcp-git-enhanced/actions/workflows/ci.yml/badge.svg)](https://github.com/davidweb3-ctrl/mcp-git-enhanced/actions/workflows/ci.yml) [![License](https://img.shields.io/badge/license-MIT-blue)](LICENSE) +[![MCP](https://img.shields.io/badge/MCP-Git%20maintenance-6f42c1)](https://modelcontextprotocol.io/) -An enhanced Git MCP (Model Context Protocol) server that provides AI assistants with powerful code review, commit analysis, and branch management capabilities. +MCP Git Enhanced is a Model Context Protocol server that helps AI coding assistants inspect repository state for day-to-day open-source maintenance. -## Features +It gives maintainers structured Git context for code review, commit analysis, branch comparison, and release preparation without asking the assistant to run broad shell commands. -- 🔍 **Code Diff Analysis** - Compare commits, branches, or working directory changes -- 📊 **Commit History Analysis** - Deep insights into commit patterns and contributors -- 🌿 **Branch Management** - List, compare, and cleanup suggestions -- 📈 **Repository Status** - Comprehensive working directory overview -- 🔎 **Commit Analysis** - Detailed single commit inspection +## Why Maintainers Use It + +Open-source maintainers spend a lot of time answering the same repository questions before they can review or merge work: + +- What changed in this branch? +- Which commits matter for the release notes? +- Is this branch behind the base branch? +- What is staged, unstaged, or untracked? +- Which merged or stale branches need cleanup? + +This server exposes those workflows as focused MCP tools so assistants can help with PR review, issue triage, release management, and repository hygiene. + +## Available Tools + +| Tool | Purpose | +| --- | --- | +| `git_diff` | Analyze working tree, staged, branch, commit, or path-specific diffs. | +| `git_log` | Review commit history with filters for author, date range, branch, path, and stats. | +| `git_branch` | List branches, compare a branch to its base, or suggest cleanup candidates. | +| `git_status` | Summarize staged, unstaged, and untracked repository state. | +| `git_commit_analyze` | Inspect one commit with metadata, changed files, statistics, and diff output. | ## Installation -### From npm (when published) -```bash -npm install -g @bountyclaw/mcp-git-enhanced -``` +### From Source -### From source ```bash -git clone https://github.com/bountyclaw/mcp-git-enhanced.git +git clone https://github.com/davidweb3-ctrl/mcp-git-enhanced.git cd mcp-git-enhanced npm install npm run build ``` -## Usage with Claude Code +### Claude Code Configuration -Add to your Claude Code configuration (`~/.claude/settings.json`): +Use the built server from this repository: ```json { "mcpServers": { "git-enhanced": { - "command": "npx", - "args": ["@bountyclaw/mcp-git-enhanced"] + "command": "node", + "args": ["/absolute/path/to/mcp-git-enhanced/dist/index.js"] } } } ``` -Or for local development: +### Future npm Install + +The package is prepared for npm publication as `@bountyclaw/mcp-git-enhanced`: + +```bash +npm install -g @bountyclaw/mcp-git-enhanced +``` + +After publication, clients can use: ```json { "mcpServers": { "git-enhanced": { - "command": "node", - "args": ["/path/to/mcp-git-enhanced/dist/index.js"] + "command": "npx", + "args": ["@bountyclaw/mcp-git-enhanced"] } } } ``` -## Available Tools +## Example Workflows + +### PR Review + +```text +Use git_diff to compare this branch with master and summarize the risky files. +Use git_log to list commits since the last release. +Use git_commit_analyze on the largest commit before I review it. +``` + +### Issue Triage + +```text +Use git_log to find recent commits touching src/tools.ts. +Use git_status to check whether the local reproduction has uncommitted changes. +``` + +### Release Management + +```text +Use git_branch compare against master to prepare release notes. +Use git_log with --stat style output to identify user-visible changes. +Use git_branch suggest_cleanup after the release branch is merged. +``` + +## Tool Examples -### git_diff -Analyze code changes between commits, branches, or working directory. +### `git_diff` ```json { @@ -72,32 +116,38 @@ Analyze code changes between commits, branches, or working directory. } ``` -### git_log -Analyze commit history with filtering and statistics. +### `git_log` ```json { "repoPath": "/absolute/path/to/repo", "maxCount": 20, - "author": "John Doe", + "author": "Maintainer Name", "since": "1 week ago", "stat": true } ``` -### git_branch -Manage and analyze git branches. +### `git_branch` ```json { "repoPath": "/absolute/path/to/repo", - "action": "list|compare|suggest_cleanup", + "action": "list", "includeRemote": true } ``` -### git_status -Get comprehensive repository status. +```json +{ + "repoPath": "/absolute/path/to/repo", + "action": "compare", + "branchName": "feature/pr-review-summary", + "baseBranch": "master" +} +``` + +### `git_status` ```json { @@ -106,8 +156,7 @@ Get comprehensive repository status. } ``` -### git_commit_analyze -Analyze a specific commit in detail. +### `git_commit_analyze` ```json { @@ -116,104 +165,40 @@ Analyze a specific commit in detail. } ``` -## Example Use Cases +## Security Model -### Code Review -``` -"Show me the diff between main and the feature branch" -"What files changed in the last 5 commits?" -"Analyze the impact of commit abc123" -``` +MCP Git Enhanced is designed as a read-oriented repository inspection server. -### Repository Health -``` -"List all branches that can be safely deleted" -"Show me commits from the last week" -"Who are the top contributors to this project?" -``` +- It runs fixed `git` subcommands through `spawnSync` without shell interpolation. +- It does not expose destructive branch deletion, reset, checkout, rebase, push, or force-push tools. +- It validates that `repoPath` points to a Git repository before executing tool handlers. +- It is intended for local repositories controlled by the user or maintainer. -### Working Directory -``` -"What's the current status of my repo?" -"Show me the staged changes" -"What files have uncommitted changes?" -``` +See [SECURITY.md](SECURITY.md) for reporting and supported-version details. ## Development ```bash -# Install dependencies npm install - -# Build npm run build - -# Watch mode -npm run dev - -# Test locally -node dist/index.js -``` - -## Testing - -This project uses Jest for testing with comprehensive coverage for all Git tool handlers. - -```bash -# Run all tests npm test - -# Run tests with coverage report -npm run test:coverage - -# Run tests in watch mode -npm run test:watch -``` - -### Coverage Report - -| File | Statements | Branches | Functions | Lines | -|-----------|------------|----------|-----------|--------| -| tools.ts | 98%+ | 95%+ | 100% | 98%+ | - -### Test Structure - -- `src/__tests__/tools.test.ts` - Unit tests for all 5 Git tool handlers - - `git_diff` - 7 test cases - - `git_log` - 13 test cases - - `git_branch` - 10 test cases (list, compare, suggest_cleanup) - - `git_status` - 5 test cases - - `git_commit_analyze` - 4 test cases - -## Code Quality - -```bash -# Run ESLint npm run lint - -# Fix ESLint issues -npm run lint:fix - -# Format with Prettier -npm run format - -# Check formatting npm run format:check ``` +## Project Files + +- [CONTRIBUTING.md](CONTRIBUTING.md): development setup and contribution process. +- [SECURITY.md](SECURITY.md): vulnerability reporting and trust boundaries. +- [ROADMAP.md](ROADMAP.md): planned maintainer workflows and release direction. +- [CHANGELOG.md](CHANGELOG.md): release notes. +- [docs/CODEX_FOR_OSS.md](docs/CODEX_FOR_OSS.md): Codex for Open Source maintenance plan. + ## Requirements - Node.js >= 18.0.0 -- Git installed and available in PATH +- Git installed and available in `PATH` ## License MIT - -## Contributing - -Contributions welcome! Please read [CONTRIBUTING.md](CONTRIBUTING.md) for details. - ---- - -Built with 🦞 by BountyClaw \ No newline at end of file diff --git a/ROADMAP.md b/ROADMAP.md new file mode 100644 index 0000000..8305fee --- /dev/null +++ b/ROADMAP.md @@ -0,0 +1,49 @@ +# Roadmap + +MCP Git Enhanced focuses on repository inspection workflows that reduce open-source maintainer overhead. + +## Current Scope + +- Diff analysis for working tree, staged changes, branches, commits, and paths. +- Commit history review with author, date, branch, path, and stat filters. +- Branch listing, branch comparison, and cleanup suggestions. +- Repository status summaries. +- Single-commit analysis for review and release preparation. + +## Near-Term Priorities + +1. PR review summaries + - Add a higher-level tool that combines branch comparison, diff statistics, and changed-file risk hints. + - Keep the output grounded in Git data so maintainers can verify the summary quickly. + +2. Release note support + - Add a release-range helper for changes between tags or commits. + - Produce maintainer-editable notes grouped by feature, fix, documentation, and maintenance. + +3. Repository health report + - Summarize stale branches, recent commit activity, large diffs, untracked files, and local drift from the base branch. + - Keep recommendations read-only and explicit. + +4. Safer output handling + - Add configurable output size limits. + - Add warnings when diffs appear to include secrets or local environment files. + +5. Packaging and registry polish + - Publish the npm package. + - Keep MCP registry metadata current. + - Maintain release tags and changelog entries for every public release. + +## Maintainer Workflow Goals + +- Faster first-pass PR review. +- Better issue triage from repository history. +- Cleaner release preparation. +- Safer assistant access to Git context. +- Lower friction for contributors adding new focused Git tools. + +## Non-Goals + +- Replacing GitHub review, CI, or maintainer judgment. +- Running arbitrary shell commands. +- Mutating repositories by default. +- Automating destructive Git actions such as force-push, reset, branch deletion, or rebase. diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..dd1f58b --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,56 @@ +# Security Policy + +## Supported Versions + +Security fixes are accepted for the current source release on the default branch. + +| Version | Supported | +| --- | --- | +| `1.x` | Yes | +| `< 1.0.0` | No | + +## Reporting a Vulnerability + +Please report security issues privately instead of opening a public issue when the report includes an exploitable path, sensitive repository data, or a bypass of the intended read-oriented trust model. + +Use one of these channels: + +- GitHub private vulnerability reporting, if enabled for this repository. +- A direct maintainer contact channel listed on the maintainer GitHub profile. + +Please include: + +- A short summary of the issue. +- Affected version or commit. +- Reproduction steps. +- Expected impact. +- Whether the issue requires a malicious repository, malicious tool input, or only normal maintainer use. + +The maintainer will acknowledge valid reports as soon as practical and will coordinate a fix before public disclosure when the impact justifies it. + +## Trust Boundaries + +MCP Git Enhanced is a local repository inspection tool. It is designed to help AI assistants read and summarize Git state, not mutate repositories. + +Current safety boundaries: + +- Tool handlers execute fixed Git commands with `spawnSync`. +- Commands are invoked without shell interpolation. +- The server does not expose branch deletion, checkout, reset, rebase, merge, commit, push, or force-push tools. +- `repoPath` must point to a Git repository. + +Known limitations: + +- Git itself may execute repository-local hooks or filters in some workflows. Run this server only against repositories you trust. +- Large diffs and logs may expose sensitive local changes to the connected MCP client. +- The server does not redact secrets from Git output. + +## Security Review Areas + +High-priority review areas for future contributions: + +- Path handling and repository validation. +- Git argument construction. +- Output size limits and timeout behavior. +- Secret exposure risks in diffs, logs, and commit output. +- Any proposed mutating Git tool. diff --git a/docs/CODEX_FOR_OSS.md b/docs/CODEX_FOR_OSS.md new file mode 100644 index 0000000..86a32b2 --- /dev/null +++ b/docs/CODEX_FOR_OSS.md @@ -0,0 +1,47 @@ +# Codex for Open Source Maintenance Plan + +This document explains how MCP Git Enhanced can use Codex and API credits for open-source maintenance work. + +## Repository Importance + +MCP Git Enhanced gives AI coding assistants structured, reviewable Git context for common maintainer tasks. It is useful for maintainers who need help reviewing diffs, understanding commit history, comparing branches, preparing releases, and keeping local repository state understandable. + +The project is small, but it sits directly inside an important open-source workflow: reducing the repetitive inspection work that maintainers do before deciding whether a change is safe to review, merge, or release. + +## Why Codex Fits + +Codex is most useful here when it helps with maintainer workflows rather than general code generation: + +- Review pull request diffs and identify risky files. +- Generate focused test cases for Git command handlers. +- Triage issues by mapping bug reports to tool behavior. +- Draft release notes from commit ranges. +- Review changes to repository-path validation and Git argument construction. +- Keep docs, examples, and MCP client configuration current. + +## API Credit Usage + +API credits would be used for: + +- Automated PR review summaries grounded in `git_diff`, `git_log`, and `git_commit_analyze` output. +- Issue triage that links reports to affected tools and likely tests. +- Release-note drafting from commit ranges and tags. +- Maintainer-facing documentation updates. +- Security-sensitive review of Git argument construction, path handling, and output exposure. + +## Security Relevance + +The server gives AI assistants local Git visibility. That makes the trust boundary important: + +- Git commands should stay focused and non-destructive. +- User-provided paths and refs should be handled carefully. +- Output may include sensitive local changes, so documentation and future filtering matter. +- Mutating Git tools should require a stricter review process if they are ever proposed. + +## Maintenance Workflows To Improve + +- PR review: summarize changed files, large diffs, and commit intent. +- Issue triage: connect reported behavior to recent changes and relevant tests. +- Release management: build changelogs from commit ranges and tags. +- Contributor onboarding: explain how to add a new MCP tool with tests and docs. +- Repository hygiene: identify stale branches and local drift without destructive actions. diff --git a/examples/README.md b/examples/README.md index adecd8b..3295925 100644 --- a/examples/README.md +++ b/examples/README.md @@ -4,7 +4,16 @@ This directory contains usage examples for the MCP Git Enhanced server. ## Claude Code Integration -### 1. Configure Claude Code +### 1. Build From Source + +```bash +git clone https://github.com/davidweb3-ctrl/mcp-git-enhanced.git +cd mcp-git-enhanced +npm install +npm run build +``` + +### 2. Configure Claude Code Add to `~/.claude/settings.json`: @@ -12,14 +21,16 @@ Add to `~/.claude/settings.json`: { "mcpServers": { "git-enhanced": { - "command": "npx", - "args": ["@bountyclaw/mcp-git-enhanced"] + "command": "node", + "args": ["/absolute/path/to/mcp-git-enhanced/dist/index.js"] } } } ``` -### 2. Example Prompts +After npm publication, the server can also be configured through `npx @bountyclaw/mcp-git-enhanced`. + +### 3. Example Prompts Once configured, you can ask Claude: @@ -57,7 +68,7 @@ You can also call the tools directly via JSON-RPC: ```bash # List available tools -echo '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' | npx @bountyclaw/mcp-git-enhanced +echo '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' | node dist/index.js # Get git status echo '{ @@ -70,7 +81,7 @@ echo '{ "repoPath": "/path/to/repo" } } -}' | npx @bountyclaw/mcp-git-enhanced +}' | node dist/index.js ``` ## Integration with Other MCP Clients @@ -80,4 +91,4 @@ The server implements the Model Context Protocol and can be used with any MCP-co - Claude Desktop - Claude Code - Custom MCP clients -- Any tool supporting MCP stdio transport \ No newline at end of file +- Any tool supporting MCP stdio transport diff --git a/jest.config.cjs b/jest.config.cjs index c5636a3..5024322 100644 --- a/jest.config.cjs +++ b/jest.config.cjs @@ -11,6 +11,9 @@ module.exports = { 'ts-jest', { useESM: true, + diagnostics: { + ignoreCodes: [151002], + }, }, ], }, @@ -23,4 +26,4 @@ module.exports = { ], testMatch: ['**/__tests__/**/*.test.ts'], verbose: true, -}; \ No newline at end of file +}; diff --git a/package-lock.json b/package-lock.json index fe71812..fc29764 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,8 +18,8 @@ "devDependencies": { "@types/jest": "^29.5.14", "@types/node": "^25.6.0", - "@typescript-eslint/eslint-plugin": "^6.21.0", - "@typescript-eslint/parser": "^6.21.0", + "@typescript-eslint/eslint-plugin": "^8.60.0", + "@typescript-eslint/parser": "^8.60.0", "eslint": "^8.57.0", "jest": "^29.7.0", "prettier": "^3.2.5", @@ -61,6 +61,7 @@ "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.29.0", "@babel/generator": "^7.29.0", @@ -1388,13 +1389,6 @@ "pretty-format": "^29.0.0" } }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/node": { "version": "25.6.0", "resolved": "https://registry.npmjs.org/@types/node/-/node-25.6.0.tgz", @@ -1405,13 +1399,6 @@ "undici-types": "~7.19.0" } }, - "node_modules/@types/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/stack-utils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", @@ -1437,124 +1424,160 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz", - "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==", + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.60.0.tgz", + "integrity": "sha512-QYb/sa74/s7OKMbACMjrYnGspj9Hs5YI5aaffSL65UfeBUzVzBJfVo3oWSpbzPurvm7yaCCo2Lk7lVj610HqKw==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/type-utils": "6.21.0", - "@typescript-eslint/utils": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.4", + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.60.0", + "@typescript-eslint/type-utils": "8.60.0", + "@typescript-eslint/utils": "8.60.0", + "@typescript-eslint/visitor-keys": "8.60.0", + "ignore": "^7.0.5", "natural-compare": "^1.4.0", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" + "ts-api-utils": "^2.5.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "@typescript-eslint/parser": "^8.60.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" } }, "node_modules/@typescript-eslint/parser": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", - "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.60.0.tgz", + "integrity": "sha512-fcqpj/MyK4sxDPcbe7STNPbpQL4RLZOPWuaTmwZYuc+hJKzRf58yRxfhqGpc6PIq9ZyfSBpfHgmUHmHs0KwHwg==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", + "peer": true, "dependencies": { - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/typescript-estree": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", - "debug": "^4.3.4" + "@typescript-eslint/scope-manager": "8.60.0", + "@typescript-eslint/types": "8.60.0", + "@typescript-eslint/typescript-estree": "8.60.0", + "@typescript-eslint/visitor-keys": "8.60.0", + "debug": "^4.4.3" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.60.0.tgz", + "integrity": "sha512-aZu74NNKJeUWqCjDddzdiKaS82dgYgV/vmf+Ui3ZdZejmgfXR/q+pRumgobnQ2cCJTgGTWp4ypiwsuofFubavg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.60.0", + "@typescript-eslint/types": "^8.60.0", + "debug": "^4.4.3" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", - "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.60.0.tgz", + "integrity": "sha512-pFzqhllJMs+jghLQWzV00ds39xLzuyqPSev5pd8f4Ir0rtKR3ZLUB4/4dhjOFighWb9larvtfJvqL+4yKDI3Xw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0" + "@typescript-eslint/types": "8.60.0", + "@typescript-eslint/visitor-keys": "8.60.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.60.0.tgz", + "integrity": "sha512-BZPR3RGYlAXnly6ymAxfkVn5rCbZzQNou0rxv3GfWZ8cTQp+hhVd73khbGLAd8k1TlAPLISH337M+tAgAnaJDQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/type-utils": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz", - "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==", + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.60.0.tgz", + "integrity": "sha512-SX46wEUtitCpq7AN38HkUU/+zvUpdKf7ephtWAFgckH8O7PQIyL5gvrhQgBLuEYgLfuKWOVvWVskMbuFHAz5xg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "6.21.0", - "@typescript-eslint/utils": "6.21.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" + "@typescript-eslint/types": "8.60.0", + "@typescript-eslint/typescript-estree": "8.60.0", + "@typescript-eslint/utils": "8.60.0", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", - "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.60.0.tgz", + "integrity": "sha512-AsE7x2XaAK+CVbeih0Fvbn+r1qHxtpLDJ3XUuFcIinT318T90yHMJC+Zgv+jUuDjQQd06HKwxnDu6sz1IcTilA==", "dev": true, "license": "MIT", "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -1562,78 +1585,88 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", - "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.60.0.tgz", + "integrity": "sha512-3AcZNBGMClm6CXDyo8kYvVGT/sx29sS0oBsIb9oZI2gunA4Vm2M3YHzRLPvsUBBsl+yB5FPtltq7gGH0iTlp9g==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" + "@typescript-eslint/project-service": "8.60.0", + "@typescript-eslint/tsconfig-utils": "8.60.0", + "@typescript-eslint/types": "8.60.0", + "@typescript-eslint/visitor-keys": "8.60.0", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/utils": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", - "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.60.0.tgz", + "integrity": "sha512-HtXuPfrHTyBDkameWpl+vJb1Uevu2tznAyahM1Oc4AENidCLTPiZDWIo4GfcxNdC/RcfGcadzzkqbRG87dUrQA==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/typescript-estree": "6.21.0", - "semver": "^7.5.4" + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.60.0", + "@typescript-eslint/types": "8.60.0", + "@typescript-eslint/typescript-estree": "8.60.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", - "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.60.0.tgz", + "integrity": "sha512-9WI52t8ZGLVGrPMBet25yAftqY/n95+zmoUUtJBBQTKDSKUu7OsPTroT2op7U9JatkoRccL0YkWDNMFfC4Sjxg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "6.21.0", - "eslint-visitor-keys": "^3.4.1" + "@typescript-eslint/types": "8.60.0", + "eslint-visitor-keys": "^5.0.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/@ungap/structured-clone": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", @@ -1660,6 +1693,7 @@ "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "dev": true, "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -1786,16 +1820,6 @@ "dev": true, "license": "Python-2.0" }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/babel-jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", @@ -1967,13 +1991,26 @@ } }, "node_modules/brace-expansion": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", - "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/brace-expansion/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" } }, "node_modules/braces": { @@ -2009,6 +2046,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.10.12", "caniuse-lite": "^1.0.30001782", @@ -2420,19 +2458,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -2578,6 +2603,7 @@ "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -2869,6 +2895,7 @@ "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", "license": "MIT", + "peer": true, "dependencies": { "accepts": "^2.0.0", "body-parser": "^2.2.1", @@ -2908,12 +2935,12 @@ } }, "node_modules/express-rate-limit": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.3.2.tgz", - "integrity": "sha512-77VmFeJkO0/rvimEDuUC5H30oqUC4EyOhyGccfqoLebB0oiEYfM7nwPrsDsBL1gsTpwfzX8SFy2MT3TDyRq+bg==", + "version": "8.5.2", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.5.2.tgz", + "integrity": "sha512-5Kb34ipNX694DH48vN9irak1Qx30nb0PLYHXfJgw4YEjiC3ZEmZJhwOp+VfiCYwFzvFTdB9QkArYS5kXa2cx2A==", "license": "MIT", "dependencies": { - "ip-address": "10.1.0" + "ip-address": "^10.2.0" }, "engines": { "node": ">= 16" @@ -2931,36 +2958,6 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "license": "MIT" }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -2976,9 +2973,9 @@ "license": "MIT" }, "node_modules/fast-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", - "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", + "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==", "funding": [ { "type": "github", @@ -3301,27 +3298,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -3405,10 +3381,11 @@ } }, "node_modules/hono": { - "version": "4.12.14", - "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.14.tgz", - "integrity": "sha512-am5zfg3yu6sqn5yjKBNqhnTX7Cv+m00ox+7jbaKkrLMRJ4rAdldd1xPd/JzbBWspqaQv6RSTrgFN95EsfhC+7w==", + "version": "4.12.23", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.23.tgz", + "integrity": "sha512-eIaZ9qDgu7XV0pxOCrg7/WhnQ6Ivm22UcxhXx/A3dcbqbbYgBEkc6e/J/s7j2tS96zoB0S9VBdLwQNCWwUo4LA==", "license": "MIT", + "peer": true, "engines": { "node": ">=16.9.0" } @@ -3542,9 +3519,9 @@ "license": "ISC" }, "node_modules/ip-address": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz", - "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.2.0.tgz", + "integrity": "sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==", "license": "MIT", "engines": { "node": ">= 12" @@ -3747,6 +3724,7 @@ "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/core": "^29.7.0", "@jest/types": "^29.6.3", @@ -4573,16 +4551,6 @@ "dev": true, "license": "MIT" }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, "node_modules/micromatch": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", @@ -4633,16 +4601,16 @@ } }, "node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^5.0.5" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -4929,16 +4897,6 @@ "url": "https://opencollective.com/express" } }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -5156,9 +5114,9 @@ "license": "MIT" }, "node_modules/qs": { - "version": "6.15.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.1.tgz", - "integrity": "sha512-6YHEFRL9mfgcAvql/XhwTvf5jKcOiiupt2FiJxHkiX1z4j7WL8J/jRHYLluORvc1XxB5rV20KoeK00gVJamspg==", + "version": "6.15.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.2.tgz", + "integrity": "sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==", "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.1.0" @@ -5768,6 +5726,55 @@ "dev": true, "license": "MIT" }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", @@ -5798,16 +5805,16 @@ } }, "node_modules/ts-api-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", - "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", "dev": true, "license": "MIT", "engines": { - "node": ">=16" + "node": ">=18.12" }, "peerDependencies": { - "typescript": ">=4.2.0" + "typescript": ">=4.8.4" } }, "node_modules/ts-jest": { @@ -5932,6 +5939,7 @@ "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", "dev": true, "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -6179,6 +6187,7 @@ "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", "license": "MIT", + "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } diff --git a/package.json b/package.json index ac064d5..423cb26 100644 --- a/package.json +++ b/package.json @@ -5,10 +5,28 @@ "description": "Enhanced Git MCP Server - Code review, commit analysis, and branch management", "main": "dist/index.js", "type": "module", + "homepage": "https://github.com/davidweb3-ctrl/mcp-git-enhanced#readme", + "repository": { + "type": "git", + "url": "git+https://github.com/davidweb3-ctrl/mcp-git-enhanced.git" + }, + "bugs": { + "url": "https://github.com/davidweb3-ctrl/mcp-git-enhanced/issues" + }, + "files": [ + "dist", + "README.md", + "LICENSE", + "CHANGELOG.md", + "server.json", + "mcp-registry.json" + ], "bin": { "mcp-git-enhanced": "dist/index.js" }, "scripts": { + "clean": "node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\"", + "prebuild": "npm run clean", "build": "tsc", "dev": "tsc --watch", "start": "node dist/index.js", @@ -26,7 +44,12 @@ "git", "code-review", "developer-tools", - "claude" + "claude", + "codex", + "oss-maintenance", + "pull-request-review", + "release-management", + "model-context-protocol" ], "author": "BountyClaw", "license": "MIT", @@ -40,8 +63,8 @@ "devDependencies": { "@types/jest": "^29.5.14", "@types/node": "^25.6.0", - "@typescript-eslint/eslint-plugin": "^6.21.0", - "@typescript-eslint/parser": "^6.21.0", + "@typescript-eslint/eslint-plugin": "^8.60.0", + "@typescript-eslint/parser": "^8.60.0", "eslint": "^8.57.0", "jest": "^29.7.0", "prettier": "^3.2.5", diff --git a/src/__tests__/index.test.ts b/src/__tests__/index.test.ts index e3b4167..cc1f4a1 100644 --- a/src/__tests__/index.test.ts +++ b/src/__tests__/index.test.ts @@ -1,7 +1,7 @@ -import { describe, it, expect } from 'vitest'; +import { describe, expect, it } from "@jest/globals"; -describe('MCP Git Enhanced', () => { - it('should be defined', () => { +describe("MCP Git Enhanced", () => { + it("should be defined", () => { expect(true).toBe(true); }); -}); \ No newline at end of file +}); diff --git a/tsconfig.json b/tsconfig.json index 926ec0a..a74c3ba 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -16,5 +16,5 @@ "types": ["node", "jest"] }, "include": ["src/**/*"], - "exclude": ["node_modules", "dist"] -} \ No newline at end of file + "exclude": ["node_modules", "dist", "src/__tests__"] +}