From 2d33d0b362c4f455a0d1aee041fb74b12c64c073 Mon Sep 17 00:00:00 2001
From: Glaucia Lemos
Date: Tue, 17 Feb 2026 02:28:09 -0300
Subject: [PATCH 1/6] feat: rename project from Repo Doctor to Repo Check AI
and update related assets
- Updated project title and branding in various files including HTML, manifest, and SVG icons.
- Added new localization messages for GitHub issue publishing features.
- Enhanced clipboard utility comments to reflect new branding.
- Updated report generation and publishing logic to use new naming conventions.
- Refactored report extraction logic to improve handling of duplicate sections and assistant meta-narration.
- Added tests to ensure proper functionality of new features and naming conventions.
---
AGENTS.md | 3 +-
CHANGELOG.md | 90 +--
README.md | 199 +++----
SECURITY.md | 5 +-
analise.md | 543 ++++++++++++++++++
docs/AI-MODELS.md | 28 +-
docs/CONTRIBUTING.md | 22 +-
docs/GUIDE.md | 81 +--
docs/ai/PROMPTS.md | 3 +-
docs/ai/SECURITY.md | 3 +-
docs/ai/SESSION.md | 3 +-
docs/ai/TESTING.md | 3 +-
docs/ai/TOOLS.md | 3 +-
docs/analysis-categories.md | 5 +-
docs/announcements/repocheckai-migration.md | 50 ++
docs/architecture.md | 13 +-
docs/commands.md | 49 +-
docs/faq.md | 35 +-
docs/getting-started.md | 197 +++----
docs/index.md | 32 +-
docs/issue-publishing.md | 38 +-
docs/repository-layout.md | 5 +-
docs/troubleshooting.md | 49 +-
package-lock.json | 73 +--
package.json | 19 +-
resources/banner.svg | 132 +++--
resources/how-it-works.excalidraw | 10 +-
resources/how-it-works.png | Bin 56644 -> 66096 bytes
resources/image.png | Bin 44588 -> 55184 bytes
resources/repo-check-ai-web.png | Bin 0 -> 838236 bytes
resources/repo-doctor-ui.png | Bin 816418 -> 0 bytes
site/404.html | 3 +-
site/README.md | 3 +-
site/about.html | 44 +-
site/assets/app.js | 8 +-
site/assets/images/cli.png | Bin 44588 -> 55184 bytes
site/assets/images/repo-check-ai-web.png | Bin 0 -> 838236 bytes
site/assets/images/repo-doctor-ui.png | Bin 816418 -> 0 bytes
site/changelog.html | 32 +-
site/contribute.html | 32 +-
site/docs.html | 30 +-
site/index.html | 93 +--
site/install.html | 41 +-
site/roadmap.html | 32 +-
site/robots.txt | 4 +-
site/sitemap.xml | 20 +-
site/trust.html | 32 +-
site/use-cases.html | 32 +-
site/web-ui.html | 35 +-
src/application/core/agent/eventHandler.ts | 14 +-
.../core/agent/prompts/analysisPrompt.ts | 12 +
.../agent/prompts/base/securityDirective.ts | 3 +-
.../prompts/composers/systemPromptComposer.ts | 3 +-
.../core/agent/prompts/systemPrompt.ts | 3 +-
src/application/core/agent/toolCallTracker.ts | 3 +-
src/application/core/analyzer.ts | 3 +-
src/application/core/markdownReporter.ts | 10 +-
src/application/core/publish/labels.ts | 3 +-
src/application/core/publish/publishReport.ts | 6 +-
src/application/core/publish/reportBuilder.ts | 13 +-
src/application/core/repoPacker/packer.ts | 3 +-
src/application/core/reporter.ts | 3 +-
src/domain/config/commandPolicy.ts | 46 ++
src/domain/config/projectIdentity.ts | 17 +
src/domain/config/runtimeMetadata.ts | 20 +
src/domain/types/interfaces.ts | 3 +-
src/domain/types/schema.ts | 3 +-
src/index.ts | 3 +-
src/infrastructure/providers/github.ts | 4 +-
src/infrastructure/tools/index.ts | 3 +-
src/infrastructure/tools/repoTools.ts | 3 +-
.../api/jobs/analysisOrchestrator.ts | 63 +-
src/presentation/api/jobs/exportService.ts | 4 +-
src/presentation/api/routes/createJobRoute.ts | 5 +
src/presentation/cli.ts | 20 +-
src/presentation/cli/chatLoop.ts | 3 +-
.../cli/handlers/exportHandler.ts | 4 +-
src/presentation/cli/index.ts | 2 +
src/presentation/ui/commands.ts | 5 +-
src/presentation/ui/display.ts | 4 +-
src/presentation/ui/display/index.ts | 1 +
src/presentation/ui/display/menus.ts | 35 +-
src/presentation/ui/display/messages.ts | 6 +-
src/presentation/ui/index.ts | 3 +-
src/presentation/ui/prompts.ts | 4 +-
src/presentation/ui/themes.ts | 3 +-
src/presentation/ui/themes/icons.ts | 3 +-
src/presentation/ui/themes/index.ts | 3 +-
src/presentation/ui/themes/logo.ts | 143 +++--
src/presentation/web/pages/HomePage.ts | 2 +-
src/presentation/web/public/app.tsx | 63 +-
.../web/public/apple-touch-icon.svg | 27 +-
.../web/public/components/Footer.tsx | 14 +-
src/presentation/web/public/components/ui.tsx | 4 +-
src/presentation/web/public/constants.ts | 21 +-
src/presentation/web/public/favicon-16.svg | 11 +-
src/presentation/web/public/favicon.ico | Bin 5430 -> 5430 bytes
src/presentation/web/public/favicon.svg | 32 +-
src/presentation/web/public/i18n/messages.ts | 16 +-
src/presentation/web/public/icon-16.png | Bin 654 -> 663 bytes
src/presentation/web/public/icon-180.png | Bin 7733 -> 6707 bytes
src/presentation/web/public/icon-32.png | Bin 1258 -> 1118 bytes
src/presentation/web/public/icon-512.png | Bin 26363 -> 22273 bytes
.../web/public/icon-monochrome.svg | 16 +-
src/presentation/web/public/index.html | 4 +-
src/presentation/web/public/site.webmanifest | 4 +-
src/presentation/web/public/types.ts | 2 +
src/utils/clipboard.ts | 4 +-
src/utils/reportExtractor.ts | 260 ++++++++-
src/utils/sanitizer.ts | 3 +-
tests/cli/analyze.compat.integration.test.ts | 15 +
tests/cli/parsers/reportExtractor.test.ts | 164 ++++++
tests/core/agent/eventHandler.test.ts | 24 +
tests/core/publish/publishReport.test.ts | 45 +-
tests/core/publish/reportBuilder.test.ts | 7 +-
tests/tools/repoPacker.test.ts | 7 +-
116 files changed, 2405 insertions(+), 966 deletions(-)
create mode 100644 analise.md
create mode 100644 docs/announcements/repocheckai-migration.md
create mode 100644 resources/repo-check-ai-web.png
delete mode 100644 resources/repo-doctor-ui.png
create mode 100644 site/assets/images/repo-check-ai-web.png
delete mode 100644 site/assets/images/repo-doctor-ui.png
create mode 100644 src/domain/config/commandPolicy.ts
create mode 100644 src/domain/config/projectIdentity.ts
create mode 100644 src/domain/config/runtimeMetadata.ts
diff --git a/AGENTS.md b/AGENTS.md
index 57626c8..7185cae 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -1,4 +1,4 @@
-# AGENTS.md — Repo Doctor
+# AGENTS.md — Repo Check AI
AI-powered GitHub repository health analyzer using the GitHub Copilot SDK.
@@ -21,3 +21,4 @@ npm run build # Production build
- **Security**: Content sanitized via `utils/sanitizer.ts`
For detailed documentation, see [docs/index.md](docs/index.md).
+
diff --git a/CHANGELOG.md b/CHANGELOG.md
index ebb1d6d..88ea385 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,6 +7,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased]
+### Added
+
+- **Migration Communication**: Added official announcement at `docs/announcements/repocheckai-migration.md`.
+
+### Changed
+
+- **Project Identity Migration**: Official project identity is now `RepoCheckAI`.
+- **CLI Command Policy**: `repocheck` is now the official command, while `repodoctor` remains temporarily available with deprecation warning.
+- **Transition Window**: Legacy command support is scheduled for two releases (`2.5.0` through `2.6.x`).
+
---
## [2.5.0] - 2026-02-14
@@ -69,11 +79,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Added
-- **CLI**: Support for `/model` command in onboarding phase ([#123](https://github.com/glaucia86/repo-doctor/pull/123))
+- **CLI**: Support for `/model` command in onboarding phase ([#123](https://github.com/glaucia86/repocheckai/pull/123))
### Fixed
-- **CLI**: Fixed `/model` command requiring double input in onboarding phase ([#124](https://github.com/glaucia86/repo-doctor/pull/124))
+- **CLI**: Fixed `/model` command requiring double input in onboarding phase ([#124](https://github.com/glaucia86/repocheckai/pull/124))
---
@@ -102,20 +112,20 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Breaking Changes
-- **Infinite Sessions API**: Updated to Copilot SDK v0.1.18. Custom integrations using session management may need to handle new compaction events ([#104](https://github.com/glaucia86/repo-doctor/pull/104))
-- **Theme System**: Modular theme system introduced. Custom themes may need to be updated to use new module structure ([#105](https://github.com/glaucia86/repo-doctor/pull/105))
+- **Infinite Sessions API**: Updated to Copilot SDK v0.1.18. Custom integrations using session management may need to handle new compaction events ([#104](https://github.com/glaucia86/repocheckai/pull/104))
+- **Theme System**: Modular theme system introduced. Custom themes may need to be updated to use new module structure ([#105](https://github.com/glaucia86/repocheckai/pull/105))
### Changed
-- **Issue Publishing**: Improved priority label handling in `publishReport.ts` (removed unnecessary `.toLowerCase()`) ([#106](https://github.com/glaucia86/repo-doctor/pull/106))
-- **Documentation**: Enhanced `--issue` feature documentation with setup instructions and 401 troubleshooting ([#107](https://github.com/glaucia86/repo-doctor/pull/107))
-- **Documentation**: Updated AI model recommendations, highlighting Claude Sonnet 4.5 for best report quality with `--issue` ([#108](https://github.com/glaucia86/repo-doctor/pull/108))
-- **Documentation**: Improved token handling instructions for security best practices ([#109](https://github.com/glaucia86/repo-doctor/pull/109))
-- **Documentation**: Updated interactive mode instructions for secure token handling ([#110](https://github.com/glaucia86/repo-doctor/pull/110))
+- **Issue Publishing**: Improved priority label handling in `publishReport.ts` (removed unnecessary `.toLowerCase()`) ([#106](https://github.com/glaucia86/repocheckai/pull/106))
+- **Documentation**: Enhanced `--issue` feature documentation with setup instructions and 401 troubleshooting ([#107](https://github.com/glaucia86/repocheckai/pull/107))
+- **Documentation**: Updated AI model recommendations, highlighting Claude Sonnet 4.5 for best report quality with `--issue` ([#108](https://github.com/glaucia86/repocheckai/pull/108))
+- **Documentation**: Improved token handling instructions for security best practices ([#109](https://github.com/glaucia86/repocheckai/pull/109))
+- **Documentation**: Updated interactive mode instructions for secure token handling ([#110](https://github.com/glaucia86/repocheckai/pull/110))
### Fixed
-- **Priority Labels**: Ensured consistent case handling for issue priority labels ([#111](https://github.com/glaucia86/repo-doctor/pull/111))
+- **Priority Labels**: Ensured consistent case handling for issue priority labels ([#111](https://github.com/glaucia86/repocheckai/pull/111))
---
@@ -180,17 +190,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Breaking Changes
-- **Internal Architecture**: Major refactoring following SOLID principles. Contributors extending the codebase may need to update imports and class structures ([#95](https://github.com/glaucia86/repo-doctor/pull/95))
-- **CLI Module Structure**: Extracted CLI components into separate modules. Custom CLI integrations may require import path updates ([#96](https://github.com/glaucia86/repo-doctor/pull/96))
+- **Internal Architecture**: Major refactoring following SOLID principles. Contributors extending the codebase may need to update imports and class structures ([#95](https://github.com/glaucia86/repocheckai/pull/95))
+- **CLI Module Structure**: Extracted CLI components into separate modules. Custom CLI integrations may require import path updates ([#96](https://github.com/glaucia86/repocheckai/pull/96))
### Added
-- **Agent Guardrails**: Loop prevention with `ToolCallTracker` and `AgentGuardrails` ([#97](https://github.com/glaucia86/repo-doctor/pull/97))
+- **Agent Guardrails**: Loop prevention with `ToolCallTracker` and `AgentGuardrails` ([#97](https://github.com/glaucia86/repocheckai/pull/97))
- Step limit enforcement (30 standard / 40 deep)
- Consecutive identical call detection
- Sequence loop detection (A→B→A→B patterns)
- Progressive response: warn → inject replan message → abort
-- **Testing Infrastructure**: 86 unit tests across 7 test files ([#98](https://github.com/glaucia86/repo-doctor/pull/98))
+- **Testing Infrastructure**: 86 unit tests across 7 test files ([#98](https://github.com/glaucia86/repocheckai/pull/98))
- `tests/cli/parsers/repoParser.test.ts` (12 tests)
- `tests/cli/parsers/reportExtractor.test.ts` (9 tests)
- `tests/cli/state/appState.test.ts` (16 tests)
@@ -198,12 +208,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- `tests/core/agent/eventHandler.test.ts` (17 tests)
- `tests/core/agent/toolCallTracker.test.ts` (13 tests)
- `tests/core/agent/guardrails.test.ts` (11 tests)
-- **Vitest Configuration**: `vitest.config.ts` with proper TypeScript support ([#99](https://github.com/glaucia86/repo-doctor/pull/99))
-- **Deep Analysis Improvements**: Enhanced PHASE 6 instructions with comprehensive checklist ([#100](https://github.com/glaucia86/repo-doctor/pull/100))
+- **Vitest Configuration**: `vitest.config.ts` with proper TypeScript support ([#99](https://github.com/glaucia86/repocheckai/pull/99))
+- **Deep Analysis Improvements**: Enhanced PHASE 6 instructions with comprehensive checklist ([#100](https://github.com/glaucia86/repocheckai/pull/100))
### Changed
-- **Major Refactoring (SOLID Principles)**: ([#101](https://github.com/glaucia86/repo-doctor/pull/101))
+- **Major Refactoring (SOLID Principles)**: ([#101](https://github.com/glaucia86/repocheckai/pull/101))
- `src/cli.ts`: 1165 → 186 lines (-84%)
- Extracted `src/cli/chatLoop.ts` — Interactive REPL
- Extracted `src/cli/handlers/` — One file per command (SRP)
@@ -212,11 +222,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Extracted `src/core/agent/prompts/` — Isolated system and analysis prompts (OCP)
- Extracted `src/tools/` — Individual tool files (DIP)
- Extracted `src/ui/display/` — Modular UI components
-- **Interfaces**: Added `src/types/interfaces.ts` with shared interfaces (ISP) ([#102](https://github.com/glaucia86/repo-doctor/pull/102))
+- **Interfaces**: Added `src/types/interfaces.ts` with shared interfaces (ISP) ([#102](https://github.com/glaucia86/repocheckai/pull/102))
### Fixed
-- `/copy` command now captures full report (not just Deep Analysis section) ([#103](https://github.com/glaucia86/repo-doctor/pull/103))
+- `/copy` command now captures full report (not just Deep Analysis section) ([#103](https://github.com/glaucia86/repocheckai/pull/103))
---
@@ -224,31 +234,31 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Breaking Changes
-- **CLI Interface**: Removed legacy command-line arguments in favor of interactive chat mode. Use `repo-doctor analyze ` instead of direct CLI arguments ([#89](https://github.com/glaucia86/repo-doctor/pull/89))
-- **Configuration**: Environment variable names changed for better consistency (`GITHUB_TOKEN` now preferred over `GH_TOKEN` for API access) ([#90](https://github.com/glaucia86/repo-doctor/pull/90))
+- **CLI Interface**: Removed legacy command-line arguments in favor of interactive chat mode. Use `repocheck analyze ` instead of direct CLI arguments ([#89](https://github.com/glaucia86/repocheckai/pull/89))
+- **Configuration**: Environment variable names changed for better consistency (`GITHUB_TOKEN` now preferred over `GH_TOKEN` for API access) ([#90](https://github.com/glaucia86/repocheckai/pull/90))
### Added
-- **Deep Analysis Mode**: New `/deep` command with Repomix integration for comprehensive source code analysis ([#85](https://github.com/glaucia86/repo-doctor/pull/85))
-- **Security**: Content sanitization utilities to prevent prompt injection attacks ([#87](https://github.com/glaucia86/repo-doctor/pull/87))
-- **Documentation**: Comprehensive Copilot instructions (`.github/copilot-instructions.md`) ([#88](https://github.com/glaucia86/repo-doctor/pull/88))
-- **Documentation**: AGENTS.md with improved clarity and detail for agent configuration ([#86](https://github.com/glaucia86/repo-doctor/pull/86))
+- **Deep Analysis Mode**: New `/deep` command with Repomix integration for comprehensive source code analysis ([#85](https://github.com/glaucia86/repocheckai/pull/85))
+- **Security**: Content sanitization utilities to prevent prompt injection attacks ([#87](https://github.com/glaucia86/repocheckai/pull/87))
+- **Documentation**: Comprehensive Copilot instructions (`.github/copilot-instructions.md`) ([#88](https://github.com/glaucia86/repocheckai/pull/88))
+- **Documentation**: AGENTS.md with improved clarity and detail for agent configuration ([#86](https://github.com/glaucia86/repocheckai/pull/86))
### Changed
-- Enhanced README with improved structure, clarity, and visual formatting ([#91](https://github.com/glaucia86/repo-doctor/pull/91))
-- Updated demo image for better visual representation ([#92](https://github.com/glaucia86/repo-doctor/pull/92))
-- Reorganized README structure for better project description ([#93](https://github.com/glaucia86/repo-doctor/pull/93))
+- Enhanced README with improved structure, clarity, and visual formatting ([#91](https://github.com/glaucia86/repocheckai/pull/91))
+- Updated demo image for better visual representation ([#92](https://github.com/glaucia86/repocheckai/pull/92))
+- Reorganized README structure for better project description ([#93](https://github.com/glaucia86/repocheckai/pull/93))
### Fixed
-- License section header for improved clarity ([#94](https://github.com/glaucia86/repo-doctor/pull/94))
+- License section header for improved clarity ([#94](https://github.com/glaucia86/repocheckai/pull/94))
## [1.0.0] - 2026-01-22
### Added
-- Initial release of Repo Doctor
+- Initial release of RepoCheckAI
- **Core Features**:
- CLI with interactive chat mode using Commander.js
- GitHub repository analysis via Octokit REST API
@@ -282,12 +292,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
---
-[2.4.0]: https://github.com/glaucia86/repo-doctor/compare/v2.3.0...v2.4.0
-[2.3.0]: https://github.com/glaucia86/repo-doctor/compare/v2.2.0...v2.3.0
-[2.2.0]: https://github.com/glaucia86/repo-doctor/compare/v2.1.0...v2.2.0
-[2.1.2]: https://github.com/glaucia86/repo-doctor/compare/v2.1.1...v2.1.2
-[2.1.0]: https://github.com/glaucia86/repo-doctor/compare/v2.0.0...v2.1.0
-[2.0.0]: https://github.com/glaucia86/repo-doctor/compare/v1.0.0...v2.0.0
-[1.0.0]: https://github.com/glaucia86/repo-doctor/releases/tag/v1.0.0
-[2.5.0]: https://github.com/glaucia86/repo-doctor/compare/v2.4.0...v2.5.0
-[Unreleased]: https://github.com/glaucia86/repo-doctor/compare/v2.5.0...HEAD
+[2.4.0]: https://github.com/glaucia86/repocheckai/compare/v2.3.0...v2.4.0
+[2.3.0]: https://github.com/glaucia86/repocheckai/compare/v2.2.0...v2.3.0
+[2.2.0]: https://github.com/glaucia86/repocheckai/compare/v2.1.0...v2.2.0
+[2.1.2]: https://github.com/glaucia86/repocheckai/compare/v2.1.1...v2.1.2
+[2.1.0]: https://github.com/glaucia86/repocheckai/compare/v2.0.0...v2.1.0
+[2.0.0]: https://github.com/glaucia86/repocheckai/compare/v1.0.0...v2.0.0
+[1.0.0]: https://github.com/glaucia86/repocheckai/releases/tag/v1.0.0
+[2.5.0]: https://github.com/glaucia86/repocheckai/compare/v2.4.0...v2.5.0
+[Unreleased]: https://github.com/glaucia86/repocheckai/compare/v2.5.0...HEAD
+
+
diff --git a/README.md b/README.md
index 891291a..e633774 100644
--- a/README.md
+++ b/README.md
@@ -1,8 +1,8 @@
-
+
-🩺 Repo Doctor
+🩺 RepoCheckAI
AI-powered GitHub Repository Health Analyzer
@@ -10,34 +10,34 @@
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
- Website •
+ Website •
Quick Start •
Features •
How It Works •
@@ -49,7 +49,7 @@
## 📖 Overview
-**Repo Doctor** is your repository's AI doctor that diagnoses issues and prescribes solutions. It performs comprehensive health checks across **6 critical areas** — documentation, developer experience, CI/CD, testing, governance, and security — delivering a detailed diagnosis with prioritized findings (**P0/P1/P2**) and actionable remediation steps.
+**RepoCheckAI** is your repository's AI doctor that diagnoses issues and prescribes solutions. It performs comprehensive health checks across **6 critical areas** — documentation, developer experience, CI/CD, testing, governance, and security — delivering a detailed diagnosis with prioritized findings (**P0/P1/P2**) and actionable remediation steps.
### Two Analysis Modes
@@ -118,11 +118,11 @@
#### 🚀 Auto-Create Issues for Each Problem Found
```bash
-export GITHUB_TOKEN=ghp_xxx # or REPO_DOCTOR_GITHUB_TOKEN, as configured
-repo-doctor analyze owner/repo --issue
-# Creates: 🔴 [Repo Doctor] docs: Missing README
-# 🟠 [Repo Doctor] ci: No CI/CD Pipeline
-# 🟡 [Repo Doctor] dx: Code Quality Issues
+export GITHUB_TOKEN=ghp_xxx # or REPOCHECKAI_GITHUB_TOKEN, as configured
+repocheck analyze owner/repo --issue
+# Creates: 🔴 [RepoCheckAI] docs: Missing README
+# 🟠 [RepoCheckAI] ci: No CI/CD Pipeline
+# 🟡 [RepoCheckAI] dx: Code Quality Issues
```
**Each issue includes:**
@@ -140,7 +140,7 @@ export GITHUB_TOKEN=ghp_your_token_here
gh auth login
# Then start interactive mode
-repo-doctor chat
+repocheck chat
/analyze facebook/react --issue
/deep microsoft/vscode
```
@@ -154,7 +154,7 @@ repo-doctor chat
## � Quick Start (5 minutes)
-Want to see Repo Doctor create GitHub issues automatically?
+Want to see RepoCheckAI create GitHub issues automatically?
```bash
# 1. Get a GitHub token (see detailed setup below)
@@ -162,7 +162,7 @@ Want to see Repo Doctor create GitHub issues automatically?
export GITHUB_TOKEN=ghp_your_token_here
# 3. Analyze and create issues automatically!
-repo-doctor analyze your-username/your-repo --issue
+repocheck analyze your-username/your-repo --issue
```
**Result:** Multiple GitHub issues created with detailed analysis, impact assessment, and fix instructions! 🎉
@@ -185,101 +185,31 @@ For the `--issue` feature, you'll need a GitHub Personal Access Token with speci
---
-## 🧭 Detailed --issue Setup (and 401 Troubleshooting)
+## 🧭 Issue Publishing TL;DR
-This section explains, step by step, how to create the right token, avoid 401 errors, and run `--issue` safely. It also clarifies the two authentication paths used by Repo Doctor.
+`--issue` (CLI) and `Publish to GitHub Issues` (Web UI) both need GitHub API credentials with issue-write permission.
-### 1) Understand the two auth paths
+### CLI
-- **Copilot SDK auth (models and analysis)** uses GitHub Copilot access. If this fails, you will see: `Failed to list models: 401`.
-- **GitHub API auth (repo read + issue creation)** uses your PAT. If this fails, you will see 401/403 when listing files or creating issues.
-
-### 2) Clean environment (important)
-
-Do this before testing to avoid old tokens interfering.
-
-```powershell
-Remove-Item Env:GITHUB_TOKEN, Env:GH_TOKEN -ErrorAction SilentlyContinue
-```
-
-### 3) Authenticate Copilot SDK (fixes "Failed to list models: 401")
-
-Use GitHub CLI login to get an OAuth token that Copilot accepts.
-
-```powershell
-gh auth logout
-gh auth login
-```
-
-Choose:
-- Host: GitHub.com
-- Login via web
-- Git operations: HTTPS
-
-Confirm login:
-
-```powershell
-gh auth status
-```
-
-Export the token for Repo Doctor:
-
-```powershell
-$env:GH_TOKEN = (gh auth token)
-```
-
-### 4) Create a PAT for `--issue` (GitHub API)
-
-You have two supported paths. Classic PAT is the most reliable.
-
-#### Option A: Classic PAT (recommended)
-
-1. GitHub -> Settings -> Developer settings -> Personal access tokens -> **Tokens (classic)**
-2. Click **Generate new token (classic)**
-3. Select scopes:
- - `repo` (private + public) **or** `public_repo` (public only)
-4. Generate and copy the token once
-
-#### Option B: Fine-grained PAT
-
-1. GitHub -> Settings -> Developer settings -> Personal access tokens -> **Fine-grained tokens**
-2. **Repository access**:
- - **All repositories** (if you want to create issues in any repo you own)
- - or **Only select repositories** (recommended for least privilege)
-3. **Repository permissions** (minimum):
- - **Metadata**: Read-only (Required)
- - **Contents**: Read-only
- - **Issues**: Read and write
-4. **Account permissions**: keep **No access**
-
-### 5) Run Repo Doctor with `--issue`
-
-Use `GH_TOKEN` for Copilot and pass the PAT only for issue creation.
-
-```powershell
-# Copilot SDK auth (models/analysis)
-$env:GH_TOKEN = (gh auth token)
-
-# Run in dev (chat) and create issues
-npm run dev:cli
+```bash
+export GITHUB_TOKEN=ghp_your_pat_here
+repocheck analyze owner/repo --issue
```
-In the app:
+### Web UI
+```bash
+npm run dev:local-ui
```
-/deep owner/repo --issue --token
-```
-
-### 6) Quick diagnosis checklist
-- **401 on models**: Copilot auth failed -> redo Step 3 (gh auth + GH_TOKEN)
-- **401/403 on issue creation**: PAT lacks access or `Issues: Read/Write`
-- **Public repo but want issues**: PAT still needs `Issues: Read/Write`
-- **Org repo**: your account must have permission to create issues in that repo
+In the form:
+1. Enable `Publish to GitHub Issues`
+2. Optional: paste `GitHub Token` (overrides server env token)
+3. Run analysis
----
+If no token is provided in the field, the backend uses `GITHUB_TOKEN` from the server environment.
-For the complete step-by-step guide (including PAT creation screens and diagnostics), see [docs/issue-publishing.md](docs/issue-publishing.md).
+For full step-by-step setup and 401/403 troubleshooting, see [docs/issue-publishing.md](docs/issue-publishing.md).
---
@@ -306,8 +236,8 @@ For the complete step-by-step guide (including PAT creation screens and diagnost
```bash
# Clone the repository
-git clone https://github.com/glaucia86/repo-doctor.git
-cd repo-doctor
+git clone https://github.com/glaucia86/repocheckai.git
+cd repocheckai
# Install dependencies and build
npm install
@@ -321,16 +251,16 @@ npm link
```bash
# Interactive mode
-repo-doctor
+repocheck
# Direct analysis
-repo-doctor vercel/next.js
+repocheck vercel/next.js
# Deep analysis with premium model
-repo-doctor vercel/next.js --model claude-sonnet-4 --deep
+repocheck vercel/next.js --model claude-sonnet-4 --deep
# 🚀 Auto-create GitHub issues for each problem found
-repo-doctor vercel/next.js --issue
+repocheck vercel/next.js --issue
```
> [!NOTE]
@@ -354,7 +284,7 @@ repo-doctor vercel/next.js --issue
| `/export [path]` | Save report as markdown file |
| `/model [name]` | Switch AI model (now works in onboarding phase) |
| `/help` | Show all available commands |
-| `/quit` | Exit Repo Doctor |
+| `/quit` | Exit RepoCheckAI |
> [!TIP]
> Use `/deep` for comprehensive code quality analysis. Use `/analyze` for quick governance checks.
@@ -402,27 +332,27 @@ Current MVP capabilities:
### Quick Analysis
```bash
-repo-doctor
+repocheck
/analyze microsoft/vscode
```
### Deep Analysis with Custom Model
```bash
-repo-doctor
+repocheck
/model claude-sonnet-4
/deep facebook/react
```
### Export Report
```bash
-repo-doctor
+repocheck
/analyze vercel/next.js
/export nextjs-report.md
```
### Interactive Mode
```bash
-repo-doctor
+repocheck
# Then use commands interactively
/analyze myorg/myrepo
/copy
@@ -458,7 +388,7 @@ repo-doctor
| [🏗️ Architecture](docs/architecture.md) | Technical architecture and design |
| [❓ FAQ](docs/faq.md) | Frequently asked questions |
| [🔧 Troubleshooting](docs/troubleshooting.md) | Common issues and solutions |
-| [🤝 Contributing](docs/CONTRIBUTING.md) | How to contribute to Repo Doctor |
+| [🤝 Contributing](docs/CONTRIBUTING.md) | How to contribute to RepoCheckAI |
> 📖 **Full documentation:** [docs/index.md](docs/index.md)
@@ -532,7 +462,7 @@ src/
## ⭐ Support This Project
-If you find Repo Doctor useful:
+If you find RepoCheckAI useful:
@@ -546,11 +476,11 @@ If you find Repo Doctor useful:
-
-
+
+
-
-
+
+
@@ -558,11 +488,11 @@ If you find Repo Doctor useful:
## 📈 Star History
-
+
-
-
-
+
+
+
@@ -601,5 +531,8 @@ MIT © [Glaucia Lemos](https://github.com/glaucia86)
- ⬆️ Back to Top
+ ⬆️ Back to Top
+
+
+
diff --git a/SECURITY.md b/SECURITY.md
index eeba75b..accdb81 100644
--- a/SECURITY.md
+++ b/SECURITY.md
@@ -9,7 +9,7 @@
## Reporting a Vulnerability
-If you discover a security vulnerability in Repo Doctor, please report it responsibly:
+If you discover a security vulnerability in Repo Check AI, please report it responsibly:
1. Do NOT open a public GitHub issue
2. Email: skinclear86@gmail.com with details
@@ -25,8 +25,9 @@ We will acknowledge your report and work with you to address the issue promptly.
## Security Best Practices
-Repo Doctor is designed with security in mind:
+Repo Check AI is designed with security in mind:
- File content is treated as data (not instructions)
- GitHub tokens are handled securely
- No data storage - analysis runs locally
- Content sanitization for prompt injection protection
+
diff --git a/analise.md b/analise.md
new file mode 100644
index 0000000..adc6094
--- /dev/null
+++ b/analise.md
@@ -0,0 +1,543 @@
+## 🩺 Repository Health Report
+
+**Repository:** glaucia86/todo-list-mcp-server
+**Primary Stack:** TypeScript/Node.js (MCP Server)
+**Analyzed:** 2026-02-17T05:16:00.963Z
+
+---
+
+### 📊 Health Score: 58%
+
+| Category | Score | Issues |
+|----------|-------|--------|
+| 📚 Docs & Onboarding | 85% | 1 |
+| ⚡ Developer Experience | 40% | 2 |
+| 🔄 CI/CD | 0% | 1 |
+| 🧪 Quality & Tests | 30% | 2 |
+| 📋 Governance | 20% | 4 |
+| 🔐 Security | 50% | 1 |
+
+---
+
+### 🚨 P0 — Critical Issues
+
+#### CI/CD Configuration Inconsistent
+**Evidence found:**
+- `.github/workflows/` directory exists in file tree
+- Workflow files `ci.yml` and `pages.yml` detected by glob but returned 404 when reading
+- Package manager: npm (from package.json)
+- Node version: NOT SPECIFIED in package.json
+- Available scripts: `dev`, `build`, `validate` (from package.json)
+- Test script: NOT FOUND
+
+**Impact:** No automated validation of code changes before merge. The workflow files appear to exist in the file tree but are not accessible, suggesting a potential repository configuration issue.
+
+**Recommended fix:**
+
+Create `.github/workflows/ci.yml`:
+
+```yaml
+name: CI
+
+on:
+ push:
+ branches: [main]
+ pull_request:
+ branches: [main]
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: actions/checkout@v4
+
+ - uses: actions/setup-node@v4
+ with:
+ node-version: '20'
+ cache: 'npm'
+
+ - run: npm ci
+
+ - name: TypeScript validation
+ run: npm run validate
+
+ - name: Build
+ run: npm run build
+
+ # ⚠️ Note: Add test script first
+ # Suggested: Add vitest or jest for testing
+```
+
+---
+
+#### No Lockfile Committed
+
+**Evidence found:**
+- File tree contains: package.json ✅
+- Lockfile search results: package-lock.json ❌, yarn.lock ❌, pnpm-lock.yaml ❌
+- Dependencies: @modelcontextprotocol/sdk (^1.17.2), zod (^3.25.76), zod-to-json-schema (^3.24.6)
+
+**Impact:** Non-deterministic builds. Different developers and CI environments may install different dependency versions, leading to "works on my machine" issues.
+
+**Action:**
+```bash
+# Generate and commit lockfile
+npm install
+git add package-lock.json
+git commit -m "chore: add lockfile for deterministic builds"
+```
+
+---
+
+### ⚠️ P1 — High Priority
+
+#### No Test Infrastructure
+
+**Evidence found:**
+- Test script in package.json: ❌ NOT FOUND
+- Test files in source tree: ❌ NONE (searched **/*.test.*, **/*.spec.*)
+- Test framework in devDependencies: ❌ NONE
+
+**Impact:** No automated quality assurance. Code changes cannot be validated for correctness. For an MCP server handling todo operations, tests are essential to ensure handlers work correctly.
+
+**Recommended fix:**
+
+1. Install test framework:
+```bash
+npm install -D vitest @vitest/ui
+```
+
+2. Add to package.json scripts:
+```json
+{
+ "scripts": {
+ "test": "vitest",
+ "test:ui": "vitest --ui",
+ "test:coverage": "vitest --coverage"
+ }
+}
+```
+
+3. Create `vitest.config.ts`:
+```typescript
+import { defineConfig } from 'vitest/config';
+
+export default defineConfig({
+ test: {
+ globals: true,
+ environment: 'node',
+ },
+});
+```
+
+4. Example test file `src/__tests__/todo.services.test.ts`:
+```typescript
+import { describe, test, expect } from 'vitest';
+import { TodoService } from '../services/todo.services';
+
+describe('TodoService', () => {
+ test('should create todo', () => {
+ const service = new TodoService();
+ const todo = service.createTodo({
+ title: 'Test task',
+ priority: 'high'
+ });
+ expect(todo.title).toBe('Test task');
+ expect(todo.completed).toBe(false);
+ });
+});
+```
+
+---
+
+#### No CONTRIBUTING Guide
+
+**Evidence found:**
+- CONTRIBUTING.md: ❌ NOT FOUND (404 response)
+- Repository has 5 open issues (from metadata)
+- Public repository with external contributors expected
+
+**Impact:** Contributors don't know how to contribute effectively. No guidelines for code style, PR process, or development workflow.
+
+**Action:** Create `.github/CONTRIBUTING.md`:
+
+```markdown
+# Contributing to Todo List MCP Server
+
+## Development Setup
+
+1. Clone the repository
+2. Install dependencies: `npm install`
+3. Run in dev mode: `npm run dev`
+4. Build: `npm run build`
+5. Validate: `npm run validate`
+
+## Code Standards
+
+- Follow existing TypeScript strict mode patterns
+- Use Zod schemas for all validation
+- Maintain SOLID principles
+- Update README if adding new features
+
+## Pull Request Process
+
+1. Create a feature branch from `main`
+2. Make your changes with clear commit messages
+3. Ensure `npm run validate` passes
+4. Update documentation if needed
+5. Submit PR with description of changes
+```
+
+---
+
+#### No Dependency Automation
+
+**Evidence found:**
+- .github/dependabot.yml: ❌ NOT FOUND
+- renovate.json: ❌ NOT FOUND
+- Dependencies: 3 runtime + 4 dev dependencies
+
+**Impact:** Dependencies become outdated, missing security patches and bug fixes. Manual updates are time-consuming and often forgotten.
+
+**Action:** Create `.github/dependabot.yml`:
+
+```yaml
+version: 2
+updates:
+ - package-ecosystem: "npm"
+ directory: "/"
+ schedule:
+ interval: "weekly"
+ open-pull-requests-limit: 5
+ labels:
+ - "dependencies"
+```
+
+---
+
+### 💡 P2 — Suggestions
+
+- **No status badges in README** — Add build status, license, and npm version badges
+- **No CODE_OF_CONDUCT.md** — Add code of conduct for community standards (public OSS project)
+- **No SECURITY.md** — Add security policy for vulnerability reporting
+- **No Node.js version pinned** — Add `engines` field in package.json to specify Node version requirement
+- **No .nvmrc** — Add .nvmrc file for Node version management (README mentions Node.js 18+)
+- **No linter configuration** — Consider adding ESLint for code quality enforcement
+
+---
+
+### 📈 Recommended Next Steps
+
+1. **Commit lockfile** — Run `npm install` and commit `package-lock.json` immediately
+2. **Fix CI/CD** — Investigate why workflow files return 404 despite being in file tree; recreate if necessary
+3. **Add testing framework** — Install Vitest and create basic test coverage for TodoService and handlers
+4. **Add dependency automation** — Configure Dependabot to keep dependencies updated
+5. **Complete governance files** — Add CONTRIBUTING.md, SECURITY.md, and CODE_OF_CONDUCT.md
+
+---
+
+### 📋 Files Analyzed
+
+✅ README.md (21,627 bytes) — Comprehensive documentation with setup, architecture, examples
+✅ LICENSE (1,070 bytes) — MIT License present
+✅ package.json (997 bytes) — Dependencies and scripts configured
+✅ tsconfig.json (478 bytes) — Strict TypeScript configuration
+✅ .editorconfig (232 bytes) — Code formatting rules present
+❌ CONTRIBUTING.md — Missing
+❌ CODE_OF_CONDUCT.md — Missing
+❌ SECURITY.md — Missing
+❌ .github/workflows/ci.yml — Listed but not accessible (404)
+❌ .github/workflows/pages.yml — Listed but not accessible (404)
+❌ .github/dependabot.yml — Missing
+❌ renovate.json — Missing
+❌ package-lock.json — Not committed
+❌ Test files — None found
+
+---
+
+## 🔬 Deep Analysis
+
+**Analyzed Files:** src/server.ts, src/services/todo.services.ts, src/handlers/toolHandlers.ts, src/types.ts, src/utils/validation.ts, src/schemas/todo.schemas.ts, src/index.ts
+
+### Code Architecture Review
+
+#### ✅ Strengths
+
+| Aspect | Evidence |
+|--------|----------|
+| **SOLID Principles** | Clear separation: `ToolHandlers`, `ResourceHandlers`, `PromptHandlers` each handle one responsibility (SRP). Server orchestrates via dependency injection (DIP). |
+| **Type Safety** | Comprehensive Zod schemas with TypeScript integration. Runtime + compile-time validation enforced. |
+| **Clean Architecture** | Layered design: Handlers → Services → In-memory storage with well-defined boundaries. |
+| **Input Sanitization** | `sanitizeInput()` recursively trims strings in nested objects/arrays (src/utils/validation.ts:45-60). |
+| **Error Handling** | Custom `ValidationError` class with structured error responses via `createErrorResponse()` (src/utils/validation.ts:62-88). |
+| **Strict TypeScript** | tsconfig.json enables `exactOptionalPropertyTypes` and `noUncheckedIndexedAccess` for maximum safety. |
+
+#### ⚠️ Areas for Improvement
+
+| Issue | Evidence | Recommendation |
+|-------|----------|----------------|
+| **Typo in Schema Name** | `UuiSchema` instead of `UuidSchema` (src/schemas/todo.schemas.ts:3, 10) | Rename to `UuidSchema` for clarity |
+| **In-Memory Storage Limitation** | `private todos: Map` (src/services/todo.services.ts:19) — data lost on restart | Document limitation OR implement persistence layer |
+| **Inconsistent Optional Handling** | Multiple defensive checks: `validatedRequest.limit \|\| 50` after Zod already provides defaults (src/handlers/toolHandlers.ts:169-172) | Trust Zod defaults; remove redundant fallbacks |
+| **Signal Handler Limitation** | Only SIGINT handled (src/server.ts:96-100) — SIGTERM not handled | Add SIGTERM handler for graceful shutdown in containers |
+| **Sample Data in Production** | `addSampleData()` called in constructor always (src/services/todo.services.ts:22-23) | Make optional via env var: `if (process.env.LOAD_SAMPLES) this.addSampleData()` |
+
+#### 🐛 Potential Issues
+
+**Issue 1: Redundant Null Coalescing After Zod Defaults**
+
+```typescript
+// Current code (src/handlers/toolHandlers.ts:72-75)
+const todo = this.todoService.createTodo({
+ ...validatedRequest,
+ priority: validatedRequest.priority || "medium", // ❌ Zod already sets default
+ tags: validatedRequest.tags || [], // ❌ Zod already sets default
+});
+```
+
+- **Issue:** `CreateTodoSchema` already defines `.default('medium')` and `.default([])` (src/schemas/todo.schemas.ts:21-24). These fallbacks are redundant.
+- **Fix:** Remove the `||` operators and trust Zod validation:
+
+```typescript
+// Recommended code
+const todo = this.todoService.createTodo(validatedRequest);
+```
+
+---
+
+**Issue 2: No Graceful Shutdown for SIGTERM**
+
+```typescript
+// Current code (src/server.ts:96-100)
+process.on("SIGINT", async () => {
+ console.error("🛑 Encerrando Todo List MCP Server");
+ await this.server.close();
+ process.exit(0);
+});
+// ❌ SIGTERM not handled — containers send SIGTERM for shutdown
+```
+
+- **Issue:** Docker, Kubernetes, and systemd send SIGTERM (not SIGINT) for graceful shutdown. Current code won't handle it.
+- **Fix:** Add SIGTERM handler:
+
+```typescript
+// Recommended code
+const shutdown = async (signal: string) => {
+ console.error(`🛑 Encerrando Todo List MCP Server (${signal})`);
+ await this.server.close();
+ process.exit(0);
+};
+
+process.on("SIGINT", () => shutdown("SIGINT"));
+process.on("SIGTERM", () => shutdown("SIGTERM"));
+```
+
+---
+
+**Issue 3: Conditional Sample Data Loading Missing**
+
+```typescript
+// Current code (src/services/todo.services.ts:21-23)
+constructor() {
+ this.addSampleData(); // ❌ Always loads sample data, even in production
+}
+```
+
+- **Issue:** Sample todos will always exist, potentially confusing production users.
+- **Fix:** Make it conditional:
+
+```typescript
+// Recommended code
+constructor() {
+ if (process.env.NODE_ENV === 'development' || process.env.LOAD_SAMPLE_DATA === 'true') {
+ this.addSampleData();
+ }
+}
+```
+
+---
+
+**Issue 4: Defensive Undefined Checks After Strict Zod Validation**
+
+```typescript
+// Current code (src/services/todo.services.ts:60-66)
+const todoWithDefaults = {
+ ...todoData,
+ id,
+ completed: todoData.completed ?? false, // ❌ Already handled by schema default
+ priority: todoData.priority ?? 'medium', // ❌ Already handled by schema default
+ tags: todoData.tags ?? [] // ❌ Already handled by schema default
+};
+```
+
+- **Issue:** `TodoSchema` already defines defaults for `completed`, `priority`, and `tags` (src/schemas/todo.schemas.ts:13-16). These checks are redundant.
+- **Impact:** Adds maintenance burden and suggests mistrust of validation layer.
+- **Fix:** Simplify by relying on Zod:
+
+```typescript
+// Recommended code
+const todo: Todo = {
+ ...todoData,
+ id
+};
+const validatedTodo = validateData(TodoSchema, todo);
+this.todos.set(id, validatedTodo);
+```
+
+---
+
+#### 📊 Code Quality Summary
+
+| Metric | Status |
+|--------|--------|
+| Type Coverage | ✅ Excellent — Zod + TypeScript strict mode with advanced checks |
+| Error Handling | ✅ Comprehensive — Custom error classes, structured responses |
+| Code Organization | ✅ Clean — SOLID principles applied consistently |
+| Security | ⚠️ Good with gaps — Input sanitization present, but see Production Readiness |
+| Testability | ⚠️ Moderate — DI enables testing, but no tests written yet |
+
+---
+
+#### 🚀 Production Readiness
+
+| Aspect | Status | Notes |
+|--------|--------|-------|
+| **Graceful Shutdown** | ⚠️ Partial | Only SIGINT handled; add SIGTERM for container compatibility |
+| **Health Checks** | ❌ Missing | No `/health` or status endpoint for monitoring |
+| **Structured Logging** | ❌ Missing | Uses `console.error()` — replace with structured logger (pino, winston) |
+| **Error Tracking** | ❌ Missing | No Sentry/similar integration for production error monitoring |
+| **Config Management** | ❌ Missing | No environment variable validation (consider Zod for env vars) |
+| **Rate Limiting** | ❌ N/A | MCP protocol handles this at Claude Desktop level |
+| **Retry/Resilience** | ✅ N/A | No external dependencies to retry against |
+| **Cache Strategy** | ✅ Appropriate | In-memory storage for ephemeral MCP server use case |
+
+---
+
+### Security Review
+
+| Security Aspect | Status | Evidence/Recommendation |
+|------------------|--------|-------------------------|
+| **Input Validation** | ✅ Strong | Zod schemas validate all inputs with strict types (src/schemas/todo.schemas.ts) |
+| **Input Sanitization** | ✅ Present | `sanitizeInput()` trims strings recursively (src/utils/validation.ts:45) |
+| **Hardcoded Secrets** | ✅ None found | No API keys or credentials in code |
+| **Injection Risks** | ✅ Low | No SQL/command execution; in-memory storage only |
+| **Output Encoding** | ⚠️ Minor concern | JSON stringification used for responses — safe for JSON, but monitor for XSS if used in web UI later |
+| **Error Message Leakage** | ⚠️ Minor concern | Error stack traces logged via `console.error()` (src/index.ts:13) — acceptable for MCP server context |
+| **Dependency Security** | ⚠️ Unknown | No lockfile committed (see P0 finding) — cannot verify exact versions |
+
+**Security Recommendations:**
+
+1. **Structured Logging:** Replace `console.error()` with a logger that redacts sensitive data:
+```typescript
+import pino from 'pino';
+const logger = pino({ redact: ['password', 'token'] });
+```
+
+2. **Environment Variable Validation:** Validate config at startup:
+```typescript
+const EnvSchema = z.object({
+ NODE_ENV: z.enum(['development', 'production', 'test']).default('production'),
+ LOAD_SAMPLE_DATA: z.string().transform(val => val === 'true').default('false')
+});
+const env = EnvSchema.parse(process.env);
+```
+
+---
+
+### Performance Concerns
+
+| Concern | Evidence | Impact |
+|---------|----------|--------|
+| **Linear Search on Filters** | `todos.filter()` called multiple times sequentially (src/services/todo.services.ts:85-106) | O(n) per filter — acceptable for small datasets (<1000 todos) |
+| **No Pagination Optimization** | `getAllTodos()` loads all, then slices (src/services/todo.services.ts:130) | Inefficient for large datasets; consider index-based pagination |
+| **Map Iteration** | `Array.from(this.todos.values())` creates new array (src/services/todo.services.ts:81) | Acceptable; Map is already fast |
+
+**Performance is adequate for intended use case** (personal todo list via MCP). If scaling to thousands of todos, consider:
+- Indexing by tags/priority
+- Database with query optimization
+- Streaming pagination
+
+---
+
+### Testability Assessment
+
+**Strengths:**
+- ✅ Dependency injection: `TodoService` injected into handlers (src/server.ts:44-46)
+- ✅ Pure functions in validation utilities (src/utils/validation.ts)
+- ✅ Separated concerns enable isolated testing
+
+**Challenges:**
+- ⚠️ No test infrastructure present (see P1 finding)
+- ⚠️ Sample data always loaded — makes testing predictable state harder
+- ⚠️ `TodoMCPServer` directly creates `StdioServerTransport` — hard to mock for unit tests
+
+**Suggested Test Structure:**
+
+```typescript
+// tests/services/todo.services.test.ts
+import { describe, test, expect, beforeEach } from 'vitest';
+import { TodoService } from '../../src/services/todo.services';
+
+describe('TodoService', () => {
+ let service: TodoService;
+
+ beforeEach(() => {
+ service = new TodoService();
+ // Clear sample data for predictable tests
+ service['todos'].clear();
+ });
+
+ test('should create todo with defaults', () => {
+ const todo = service.createTodo({ title: 'Test' });
+ expect(todo.priority).toBe('medium');
+ expect(todo.completed).toBe(false);
+ expect(todo.tags).toEqual([]);
+ });
+
+ test('should validate title length', () => {
+ expect(() => {
+ service.createTodo({ title: 'a'.repeat(201) });
+ }).toThrow('Título não pode exceder 200 caracteres');
+ });
+});
+```
+
+---
+
+### Recommendations Summary
+
+#### 🚨 Critical (Do First)
+1. **Add SIGTERM handler** for container compatibility (2 lines of code)
+2. **Make sample data conditional** to avoid confusion in production usage
+
+#### 🔧 High Priority
+3. **Add unit tests** for `TodoService` and handlers (see P1 finding)
+4. **Commit lockfile** for dependency security (see P0 finding)
+5. **Add structured logging** with pino or winston
+
+#### 💡 Nice to Have
+6. **Fix typo** `UuiSchema` → `UuidSchema`
+7. **Remove redundant null coalescing** after Zod validation (trust the schema)
+8. **Add environment variable validation** using Zod
+9. **Document in-memory storage limitation** clearly in README
+
+---
+
+### Conclusion
+
+**Overall Code Quality: Strong (8/10)**
+
+This is a **well-architected, type-safe MCP server** with excellent separation of concerns and comprehensive validation. The SOLID principles are applied correctly, and the Zod integration provides robust runtime safety.
+
+**Key Strengths:**
+- Exemplary use of TypeScript + Zod for type safety
+- Clean architecture with proper dependency injection
+- Comprehensive input validation and sanitization
+
+**Key Gaps:**
+- Missing test infrastructure (P1 finding)
+- Production readiness concerns (graceful shutdown, logging)
+- Minor redundancies in defensive coding after Zod validation
+
+**This codebase is production-ready for its intended use case** (personal MCP todo server), but would benefit from the critical recommendations above before scaling or deploying in shared environments.
\ No newline at end of file
diff --git a/docs/AI-MODELS.md b/docs/AI-MODELS.md
index 820a2dd..6ac61e8 100644
--- a/docs/AI-MODELS.md
+++ b/docs/AI-MODELS.md
@@ -1,6 +1,6 @@
# 🤖 Available AI Models
-Repo Doctor supports multiple AI models through the GitHub Copilot SDK. Choose the model that best fits your needs and subscription level.
+RepoCheckAI supports multiple AI models through the GitHub Copilot SDK. Choose the model that best fits your needs and subscription level.
---
@@ -28,7 +28,7 @@ Available to all GitHub Copilot users (Individual, Business, Enterprise):
### GPT-4o
```bash
-repo-doctor vercel/next.js --model gpt-4o
+repocheck vercel/next.js --model gpt-4o
```
- **Best for:** Quick health checks, daily use
- **Speed:** Fast
@@ -36,7 +36,7 @@ repo-doctor vercel/next.js --model gpt-4o
### GPT-4.1
```bash
-repo-doctor vercel/next.js --model gpt-4.1
+repocheck vercel/next.js --model gpt-4.1
```
- **Best for:** General purpose analysis
- **Speed:** Fast
@@ -44,7 +44,7 @@ repo-doctor vercel/next.js --model gpt-4.1
### GPT-5 Mini
```bash
-repo-doctor vercel/next.js --model gpt-5-mini
+repocheck vercel/next.js --model gpt-5-mini
```
- **Best for:** Lightweight tasks, simple repositories
- **Speed:** Very fast
@@ -58,7 +58,7 @@ Require GitHub Copilot Pro, Business, or Enterprise subscription:
### Claude Sonnet 4 (Default)
```bash
-repo-doctor vercel/next.js --model claude-sonnet-4
+repocheck vercel/next.js --model claude-sonnet-4
```
- **Best for:** Balanced analysis, recommended default
- **Speed:** Moderate
@@ -66,7 +66,7 @@ repo-doctor vercel/next.js --model claude-sonnet-4
### Claude Sonnet 4.5
```bash
-repo-doctor vercel/next.js --model claude-sonnet-4.5
+repocheck vercel/next.js --model claude-sonnet-4.5
```
- **Best for:** Enhanced reasoning tasks
- **Speed:** Moderate
@@ -74,7 +74,7 @@ repo-doctor vercel/next.js --model claude-sonnet-4.5
### Claude Opus 4.5
```bash
-repo-doctor vercel/next.js --model claude-opus-4.5
+repocheck vercel/next.js --model claude-opus-4.5
```
- **Best for:** Complex repositories, deep analysis
- **Speed:** Slower (3x rate limit cost)
@@ -82,7 +82,7 @@ repo-doctor vercel/next.js --model claude-opus-4.5
### GPT-5
```bash
-repo-doctor vercel/next.js --model gpt-5
+repocheck vercel/next.js --model gpt-5
```
- **Best for:** Advanced analysis
- **Speed:** Moderate
@@ -90,7 +90,7 @@ repo-doctor vercel/next.js --model gpt-5
### GPT-5.1 Codex
```bash
-repo-doctor vercel/next.js --model gpt-5.1-codex
+repocheck vercel/next.js --model gpt-5.1-codex
```
- **Best for:** Code-heavy repositories
- **Speed:** Moderate
@@ -98,7 +98,7 @@ repo-doctor vercel/next.js --model gpt-5.1-codex
### GPT-5.2 Codex
```bash
-repo-doctor vercel/next.js --model gpt-5.2-codex
+repocheck vercel/next.js --model gpt-5.2-codex
```
- **Best for:** Latest code analysis capabilities
- **Speed:** Moderate
@@ -106,7 +106,7 @@ repo-doctor vercel/next.js --model gpt-5.2-codex
### GPT-5.3 Codex
```bash
-repo-doctor vercel/next.js --model gpt-5.3-codex
+repocheck vercel/next.js --model gpt-5.3-codex
```
- **Best for:** Advanced coding tasks and complex codebases
- **Speed:** Moderate
@@ -114,7 +114,7 @@ repo-doctor vercel/next.js --model gpt-5.3-codex
### O3
```bash
-repo-doctor vercel/next.js --model o3
+repocheck vercel/next.js --model o3
```
- **Best for:** Complex reasoning, large repositories
- **Speed:** Slower
@@ -138,7 +138,7 @@ Use the `/model` command to switch models interactively:
Specify the model when starting:
```bash
-repo-doctor owner/repo --model gpt-4o
+repocheck owner/repo --model gpt-4o
```
### Interactive Selection
@@ -216,3 +216,5 @@ export GH_TOKEN="$(gh auth token)"
```
See [issue-publishing.md](issue-publishing.md) for full steps.
+
+
diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md
index 1c56c8b..f2fb7dc 100644
--- a/docs/CONTRIBUTING.md
+++ b/docs/CONTRIBUTING.md
@@ -1,6 +1,6 @@
-# 🤝 Contributing to Repo Doctor
+# 🤝 Contributing to RepoCheckAI
-Thank you for your interest in contributing to Repo Doctor! This document provides guidelines and instructions for contributing.
+Thank you for your interest in contributing to RepoCheckAI! This document provides guidelines and instructions for contributing.
---
@@ -27,12 +27,12 @@ By participating in this project, you agree to maintain a respectful and inclusi
1. **Fork** the repository on GitHub
2. **Clone** your fork locally:
```bash
- git clone https://github.com/YOUR_USERNAME/repo-doctor.git
- cd repo-doctor
+ git clone https://github.com/YOUR_USERNAME/repocheckai.git
+ cd repocheckai
```
3. **Add upstream** remote:
```bash
- git remote add upstream https://github.com/glaucia86/repo-doctor.git
+ git remote add upstream https://github.com/glaucia86/repocheckai.git
```
---
@@ -83,7 +83,7 @@ npm run test:integration
## Project Structure
```
-repo-doctor/
+repocheck/
├── site/ # Static website (GitHub Pages)
├── src/
│ ├── index.ts # Package entrypoint
@@ -148,7 +148,7 @@ chore: update dependencies
2. **Make your changes** and test locally:
```bash
npm run build
- repo-doctor # Test your changes
+ repocheck # Test your changes
```
3. **Commit** your changes:
@@ -218,10 +218,12 @@ chore: update dependencies
## Need Help?
-- 💬 Open a [Discussion](https://github.com/glaucia86/repo-doctor/discussions)
-- 🐛 Report a [Bug](https://github.com/glaucia86/repo-doctor/issues/new?template=bug_report.md)
-- 💡 Request a [Feature](https://github.com/glaucia86/repo-doctor/issues/new?template=feature_request.md)
+- 💬 Open a [Discussion](https://github.com/glaucia86/repocheckai/discussions)
+- 🐛 Report a [Bug](https://github.com/glaucia86/repocheckai/issues/new?template=bug_report.md)
+- 💡 Request a [Feature](https://github.com/glaucia86/repocheckai/issues/new?template=feature_request.md)
---
Thank you for contributing! 💚
+
+
diff --git a/docs/GUIDE.md b/docs/GUIDE.md
index d3301cb..780d0e1 100644
--- a/docs/GUIDE.md
+++ b/docs/GUIDE.md
@@ -1,6 +1,6 @@
-# 📖 Repo Doctor User Guide
+# 📖 RepoCheckAI User Guide
-Complete guide for using Repo Doctor CLI.
+Complete guide for using RepoCheckAI CLI.
---
@@ -21,28 +21,28 @@ Complete guide for using Repo Doctor CLI.
```bash
# Start interactive mode - will prompt for repository and model
-repo-doctor
+repocheck
# Analyze a specific repository directly
-repo-doctor vercel/next.js
+repocheck vercel/next.js
# Analyze with a specific model
-repo-doctor vercel/next.js --model gpt-4o
+repocheck vercel/next.js --model gpt-4o
```
---
## Interactive Chat Mode
-When you run `repo-doctor`, you enter an interactive chat interface:
+When you run `repocheck`, you enter an interactive chat interface:
```
╭─────────────────────────────────────────╮
-│ 🩺 REPO DOCTOR v2.0 │
+│ 🩺 REPO CHECK AI v2.0 │
│ GitHub Repository Health Analyzer │
╰─────────────────────────────────────────╯
- ✨ Welcome to Repo Doctor!
+ ✨ Welcome to RepoCheckAI!
Enter repository (owner/repo): vercel/next.js
@@ -73,7 +73,7 @@ After analysis, you'll see options to copy, export, or analyze another repositor
| `/model [name]` | Switch AI model | `/model gpt-4o` |
| `/clear` | Clear the screen | `/clear` |
| `/help` | Show available commands | `/help` |
-| `/quit` | Exit Repo Doctor | `/quit` |
+| `/quit` | Exit RepoCheckAI | `/quit` |
> 💡 **Tip:** Use `/deep` for comprehensive analysis of complex repositories. It reads all source files and provides more detailed evidence.
@@ -132,7 +132,7 @@ The `/deep` command uses [Repomix](https://github.com/yamadashy/repomix) to perf
The `/export` command supports flexible paths:
```bash
-# Save to default location: ~/repo-doctor/reports/
+# Save to default location: ~/repocheck/reports/
/export
# Save to Desktop
@@ -155,7 +155,7 @@ Reports are saved with UTF-8 encoding (with BOM) to preserve emojis correctly.
## Command Line Options
```bash
-repo-doctor [repository] [options]
+repocheck [repository] [options]
Options:
--token GitHub token for private repos (or set GITHUB_TOKEN env)
@@ -172,20 +172,20 @@ Options:
```bash
# Analyze a public repository
-repo-doctor microsoft/typescript
+repocheck microsoft/typescript
# Analyze with full URL
-repo-doctor https://github.com/facebook/react
+repocheck https://github.com/facebook/react
# Analyze a private repository
export GITHUB_TOKEN=ghp_xxxxx
-repo-doctor owner/private-repo
+repocheck owner/private-repo
# Use a free model
-repo-doctor vercel/next.js --model gpt-4o
+repocheck vercel/next.js --model gpt-4o
# Auto-export after analysis
-repo-doctor vercel/next.js --export
+repocheck vercel/next.js --export
```
---
@@ -201,13 +201,13 @@ To analyze private repositories, you need to provide a GitHub Personal Access To
export GITHUB_TOKEN=ghp_xxxxxxxxxxxxxxxxxxxx
# Now analyze any private repo
-repo-doctor my-org/private-repo
+repocheck my-org/private-repo
```
### Option 2: Command Line Argument
```bash
-repo-doctor my-org/private-repo --token ghp_xxxxxxxxxxxxxxxxxxxx
+repocheck my-org/private-repo --token ghp_xxxxxxxxxxxxxxxxxxxx
```
### Creating a GitHub Token
@@ -225,6 +225,8 @@ repo-doctor my-org/private-repo --token ghp_xxxxxxxxxxxxxxxxxxxx
Use `--issue` to create GitHub issues with the analysis output. This requires a PAT with issue write access and Copilot SDK auth for model access.
+Web UI equivalent: run `npm run dev:local-ui` and enable `Publish to GitHub Issues` in the form.
+
> **Tip:** If you plan to use `--issue`, the best model for report quality is **Claude Sonnet 4.5**.
```bash
@@ -232,7 +234,7 @@ Use `--issue` to create GitHub issues with the analysis output. This requires a
export GH_TOKEN="$(gh auth token)"
# Create issues during analysis
-repo-doctor analyze owner/repo --issue --token ghp_your_pat_here
+repocheck analyze owner/repo --issue --token ghp_your_pat_here
```
For a full step-by-step guide and 401 troubleshooting, see [issue-publishing.md](issue-publishing.md).
@@ -241,7 +243,7 @@ For a full step-by-step guide and 401 troubleshooting, see [issue-publishing.md]
## Priority Levels
-Repo Doctor classifies findings into three priority levels:
+RepoCheckAI classifies findings into three priority levels:
| Priority | Meaning | Examples |
|----------|---------|----------|
@@ -297,11 +299,11 @@ jobs:
node-version: '20'
cache: 'npm'
- - name: Install Repo Doctor
- run: npm install -g repo-doctor
+ - name: Install RepoCheckAI
+ run: npm install -g repocheck
- name: Run health analysis
- run: repo-doctor analyze ${{ github.repository }} --export health-report.md
+ run: repocheck analyze ${{ github.repository }} --export health-report.md
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
@@ -342,11 +344,11 @@ pipeline {
stage('Repository Health Check') {
steps {
script {
- // Install Repo Doctor if not available globally
- sh 'npm install -g repo-doctor'
+ // Install RepoCheckAI if not available globally
+ sh 'npm install -g repocheck'
// Run analysis
- sh "repo-doctor analyze ${env.GIT_URL.replace('.git', '').split('/').slice(-2).join('/')} --export health-report.md"
+ sh "repocheck analyze ${env.GIT_URL.replace('.git', '').split('/').slice(-2).join('/')} --export health-report.md"
// Archive report
archiveArtifacts artifacts: 'health-report.md', fingerprint: true
@@ -400,12 +402,12 @@ jobs:
steps:
- checkout
- run:
- name: Install Repo Doctor
- command: npm install -g repo-doctor
+ name: Install RepoCheckAI
+ command: npm install -g repocheck
- run:
name: Run Health Analysis
command: |
- repo-doctor analyze $CIRCLE_PROJECT_USERNAME/$CIRCLE_PROJECT_REPONAME --export health-report.md
+ repocheck analyze $CIRCLE_PROJECT_USERNAME/$CIRCLE_PROJECT_REPONAME --export health-report.md
environment:
GITHUB_TOKEN: $GITHUB_TOKEN
- store_artifacts:
@@ -441,7 +443,7 @@ DATE=$(date +%Y-%m-%d)
mkdir -p "$OUTPUT_DIR"
# Run analysis
-repo-doctor analyze "$REPO" --export "$OUTPUT_DIR/health-report-$DATE.md"
+repocheck analyze "$REPO" --export "$OUTPUT_DIR/health-report-$DATE.md"
# Generate summary
SCORE=$(grep "Health Score:" "$OUTPUT_DIR/health-report-$DATE.md" | grep -o "[0-9]\+")
@@ -467,7 +469,7 @@ REPO="your-org/your-repo"
SLACK_WEBHOOK_URL="https://hooks.slack.com/services/YOUR/WEBHOOK/URL"
# Run analysis
-repo-doctor analyze "$REPO" --export health-report.md
+repocheck analyze "$REPO" --export health-report.md
# Extract key metrics
SCORE=$(grep "Health Score:" health-report.md | grep -o "[0-9]\+")
@@ -541,7 +543,7 @@ export GITHUB_TOKEN="your-github-token"
export GH_TOKEN="$(gh auth token)"
# Create issues for all findings
-repo-doctor analyze "$REPO" --issue
+repocheck analyze "$REPO" --issue
# Or create issues only for critical (P0) findings
# (This would require custom scripting to filter the report)
@@ -568,7 +570,7 @@ mkdir -p "$OUTPUT_DIR"
for repo in "${REPOS[@]}"; do
echo "Analyzing $repo..."
- repo-doctor analyze "$repo" --export "$OUTPUT_DIR/$(basename "$repo").md"
+ repocheck analyze "$repo" --export "$OUTPUT_DIR/$(basename "$repo").md"
done
# Generate summary report
@@ -595,7 +597,7 @@ REPO="your-org/your-repo"
HISTORY_FILE="./health-history.csv"
# Run analysis
-repo-doctor analyze "$REPO" --export temp-report.md
+repocheck analyze "$REPO" --export temp-report.md
# Extract metrics
DATE=$(date +%Y-%m-%d)
@@ -624,7 +626,7 @@ Add repository health checks to your pre-commit workflow:
# .git/hooks/pre-commit
# Run quick health check
-repo-doctor analyze "$(git config --get remote.origin.url | sed 's/.*github.com[:/]\(.*\)\.git/\1/')" --export /tmp/health-check.md
+repocheck analyze "$(git config --get remote.origin.url | sed 's/.*github.com[:/]\(.*\)\.git/\1/')" --export /tmp/health-check.md
SCORE=$(grep "Health Score:" /tmp/health-check.md | grep -o "[0-9]\+")
@@ -647,9 +649,9 @@ Create a VS Code task for easy access:
"version": "2.0.0",
"tasks": [
{
- "label": "Run Repo Doctor",
+ "label": "Run RepoCheckAI",
"type": "shell",
- "command": "repo-doctor",
+ "command": "repocheck",
"group": "build",
"presentation": {
"echo": true,
@@ -661,9 +663,12 @@ Create a VS Code task for easy access:
{
"label": "Analyze Current Repo",
"type": "shell",
- "command": "repo-doctor analyze $(git config --get remote.origin.url | sed 's/.*github.com[:/]\(.*\)\.git/\\1/')",
+ "command": "repocheck analyze $(git config --get remote.origin.url | sed 's/.*github.com[:/]\(.*\)\.git/\\1/')",
"group": "build"
}
]
}
```
+
+
+
diff --git a/docs/ai/PROMPTS.md b/docs/ai/PROMPTS.md
index 0aa6fe6..e9659ac 100644
--- a/docs/ai/PROMPTS.md
+++ b/docs/ai/PROMPTS.md
@@ -1,4 +1,4 @@
-# Prompt System — Repo Doctor
+# Prompt System — Repo Check AI
## Architecture
@@ -104,3 +104,4 @@ const CATEGORY_WEIGHTS = {
### ⚠️ P1 — High Priority
### 💡 P2 — Suggestions
```
+
diff --git a/docs/ai/SECURITY.md b/docs/ai/SECURITY.md
index b59fadf..5d7be3e 100644
--- a/docs/ai/SECURITY.md
+++ b/docs/ai/SECURITY.md
@@ -1,4 +1,4 @@
-# Security — Repo Doctor
+# Security — Repo Check AI
## Content Sanitization
@@ -68,3 +68,4 @@ const patterns = [
## Implementation
See `src/utils/sanitizer.ts` for full implementation.
+
diff --git a/docs/ai/SESSION.md b/docs/ai/SESSION.md
index 275f841..3756186 100644
--- a/docs/ai/SESSION.md
+++ b/docs/ai/SESSION.md
@@ -1,4 +1,4 @@
-# Session Configuration — Repo Doctor
+# Session Configuration — Repo Check AI
## Initialization
@@ -82,3 +82,4 @@ session.on((event: SessionEvent) => {
| Sequence Loop | A→B→A→B | Warn → Abort |
Config in `src/application/core/agent/guardrails.ts`.
+
diff --git a/docs/ai/TESTING.md b/docs/ai/TESTING.md
index 8c6af00..a719faf 100644
--- a/docs/ai/TESTING.md
+++ b/docs/ai/TESTING.md
@@ -1,4 +1,4 @@
-# Testing — Repo Doctor
+# Testing — Repo Check AI
## Commands
@@ -53,3 +53,4 @@ npm run dev:cli -- /deep owner/repo # Deep analysis
- **Non-standard structures**: No src/, custom layouts
- **Binary repos**: Mostly images/assets
- **Forked repos**: Fork metadata handling
+
diff --git a/docs/ai/TOOLS.md b/docs/ai/TOOLS.md
index 1c5bb04..0bf0b7e 100644
--- a/docs/ai/TOOLS.md
+++ b/docs/ai/TOOLS.md
@@ -1,4 +1,4 @@
-# Custom Tools — Repo Doctor
+# Custom Tools — Repo Check AI
## Tool: get_repo_meta
@@ -127,3 +127,4 @@ README.md, LICENSE, CONTRIBUTING.md, package.json, .github/**
| 404 | `{ found: false }` | Use as evidence |
| 403 | Rate limit error | Show warning, partial report |
| Timeout | Operation timeout | Partial results |
+
diff --git a/docs/analysis-categories.md b/docs/analysis-categories.md
index 07c626a..0f2a5b8 100644
--- a/docs/analysis-categories.md
+++ b/docs/analysis-categories.md
@@ -1,6 +1,6 @@
# 📊 Analysis Categories
-Repo Doctor evaluates repositories across six critical categories. This document details what gets analyzed in each category and how findings are classified.
+Repo Check AI evaluates repositories across six critical categories. This document details what gets analyzed in each category and how findings are classified.
---
@@ -108,7 +108,7 @@ Each category starts at 100% and deductions are made for missing elements:
### Stack Detection
-Repo Doctor automatically detects the project stack:
+Repo Check AI automatically detects the project stack:
| Stack | Detection Files |
|-------|-----------------|
@@ -435,3 +435,4 @@ overall_score = (
← Back to Documentation
+
diff --git a/docs/announcements/repocheckai-migration.md b/docs/announcements/repocheckai-migration.md
new file mode 100644
index 0000000..ee3020b
--- /dev/null
+++ b/docs/announcements/repocheckai-migration.md
@@ -0,0 +1,50 @@
+# RepoCheckAI Migration Announcement
+
+Date: 2026-02-17
+
+## Summary
+
+`Repo Check AI` is now `RepoCheckAI`.
+
+- Official npm package: `repocheckai`
+- Official CLI command: `repocheck`
+- Legacy command in transition: `repodoctor`
+
+## Why We Changed
+
+The new identity aligns product name, package name, and command conventions while keeping continuity for existing users.
+
+## Command Transition Policy
+
+- Effective release: `2.5.0`
+- Legacy support window: `2` releases
+- Legacy support until: `2.6.x`
+
+During transition:
+
+- `repocheck` is the default and recommended command.
+- `repodoctor` still runs, but shows a deprecation warning.
+
+After transition:
+
+- `repodoctor` will be rejected with migration guidance.
+
+## What You Need To Do
+
+1. Update scripts and docs to use `repocheck`.
+2. Ensure installation references `npm i -g repocheckai`.
+3. Remove hard dependencies on `repodoctor` before the end of the transition window.
+
+## Migration Examples
+
+```bash
+# install
+npm i -g repocheckai
+
+# old (transition only)
+repodoctor analyze owner/repo
+
+# new (recommended)
+repocheck analyze owner/repo
+```
+
diff --git a/docs/architecture.md b/docs/architecture.md
index 81b6a53..4ee8e76 100644
--- a/docs/architecture.md
+++ b/docs/architecture.md
@@ -1,6 +1,6 @@
# 🏗️ Architecture
-Technical overview of Repo Doctor's architecture and design decisions.
+Technical overview of Repo Check AI's architecture and design decisions.
---
@@ -19,11 +19,11 @@ Technical overview of Repo Doctor's architecture and design decisions.
## System Overview
-Repo Doctor is built as an **agentic CLI tool** using the GitHub Copilot SDK. It leverages AI to analyze GitHub repositories and provide health assessments.
+Repo Check AI is built as an **agentic CLI tool** using the GitHub Copilot SDK. It leverages AI to analyze GitHub repositories and provide health assessments.
```mermaid
flowchart TB
- subgraph RD["🩺 REPO DOCTOR"]
+ subgraph RD["🩺 REPO CHECK AI"]
direction TB
subgraph Input["📥 Input Layer"]
@@ -92,7 +92,7 @@ graph LR
## Project Structure
```
-repo-doctor/
+repocheckai/
├── site/ # Static website (GitHub Pages)
│
├── src/
@@ -252,7 +252,7 @@ export function createOctokit(token?: string): Octokit {
return new Octokit({
auth: resolvedToken,
- userAgent: "repo-doctor",
+ userAgent: "repocheckai",
});
}
```
@@ -585,7 +585,7 @@ function sanitizeFilePath(path: string): string | null {
- Environment variables are preferred
- GitHub CLI integration for secure auth
-Repo Doctor uses two auth paths:
+Repo Check AI uses two auth paths:
- Copilot SDK auth via GitHub CLI OAuth token (exported as `GH_TOKEN`)
- GitHub API auth for repo access and `--issue` via PAT (`GITHUB_TOKEN` or `--token`)
@@ -669,3 +669,4 @@ export const colors = {
← Back to Documentation
+
diff --git a/docs/commands.md b/docs/commands.md
index 81f7635..5f535a4 100644
--- a/docs/commands.md
+++ b/docs/commands.md
@@ -1,6 +1,8 @@
# 💻 Commands Reference
-Complete reference for all Repo Doctor CLI commands and options.
+Complete reference for all RepoCheckAI CLI commands and options.
+
+> Transition note: `repocheck` is the official command. `repodoctor` is still accepted temporarily with a deprecation warning.
---
@@ -17,7 +19,7 @@ Complete reference for all Repo Doctor CLI commands and options.
## Interactive Commands
-When running Repo Doctor in interactive mode, these slash commands are available:
+When running RepoCheckAI in interactive mode, these slash commands are available:
### Analysis Commands
@@ -70,7 +72,7 @@ When running Repo Doctor in interactive mode, these slash commands are available
| `/model` | `[name]` | Switch or display current AI model |
| `/clear` | — | Clear the terminal screen |
| `/help` | — | Show available commands |
-| `/quit` | — | Exit Repo Doctor |
+| `/quit` | — | Exit RepoCheckAI |
**Examples:**
@@ -92,7 +94,7 @@ When running Repo Doctor in interactive mode, these slash commands are available
### Basic Syntax
```bash
-repo-doctor [repository] [options]
+repocheck [repository] [options]
```
### Arguments
@@ -101,7 +103,7 @@ repo-doctor [repository] [options]
|----------|----------|-------------|
| `repository` | No | Repository to analyze (owner/repo or URL) |
-If no repository is provided, Repo Doctor starts in interactive mode.
+If no repository is provided, RepoCheckAI starts in interactive mode.
### Options
@@ -119,6 +121,9 @@ If no repository is provided, Repo Doctor starts in interactive mode.
| `--version` | `-v` | — | — | Show version number |
> **Tip:** If you plan to use `--issue`, the best model for report quality is **Claude Sonnet 4.5**.
+>
+> **Web UI equivalent:** enable `Publish to GitHub Issues` in the local Web UI form.
+> For token/auth setup and `401/403` troubleshooting, see [issue-publishing.md](issue-publishing.md).
---
@@ -239,7 +244,7 @@ Exports the report to a file.
| Argument | Required | Default | Description |
|----------|----------|---------|-------------|
-| `path` | No | `~/repo-doctor/reports/` | Output path |
+| `path` | No | `~/repocheck/reports/` | Output path |
| `format` | No | `md` | Output format (`md` or `json`) |
**Examples:**
@@ -247,7 +252,7 @@ Exports the report to a file.
```bash
# Default location and format
/export
-# Saves to: ~/repo-doctor/reports/vercel-next.js-2024-01-15.md
+# Saves to: ~/repocheck/reports/vercel-next.js-2024-01-15.md
# Custom path
/export ~/Desktop
@@ -380,7 +385,7 @@ Shows all available commands.
### /quit
-Exits Repo Doctor.
+Exits RepoCheckAI.
```bash
/quit
@@ -392,15 +397,15 @@ Also accepts: `/exit`, `/q`, `Ctrl+C`
## Environment Variables
-Configure Repo Doctor behavior using environment variables:
+Configure RepoCheckAI behavior using environment variables:
| Variable | Description | Example |
|----------|-------------|---------|
| `GITHUB_TOKEN` | GitHub personal access token | `ghp_xxxx` |
| `GH_TOKEN` | GitHub CLI OAuth token for Copilot SDK | `gho_xxxx` |
-| `REPO_DOCTOR_MODEL` | Default AI model | `gpt-4o` |
-| `REPO_DOCTOR_TIMEOUT` | Analysis timeout (ms) | `180000` |
-| `REPO_DOCTOR_EXPORT_PATH` | Default export path | `~/reports` |
+| `REPOCHECKAI_MODEL` | Default AI model | `gpt-4o` |
+| `REPOCHECKAI_TIMEOUT` | Analysis timeout (ms) | `180000` |
+| `REPOCHECKAI_EXPORT_PATH` | Default export path | `~/reports` |
**Example usage:**
@@ -408,10 +413,10 @@ Configure Repo Doctor behavior using environment variables:
# Set in .bashrc or .zshrc
export GITHUB_TOKEN=ghp_xxxxxxxxxxxx
export GH_TOKEN="$(gh auth token)"
-export REPO_DOCTOR_MODEL=gpt-4o
+export REPOCHECKAI_MODEL=gpt-4o
# Or inline
-GITHUB_TOKEN=ghp_xxxx repo-doctor owner/repo
+GITHUB_TOKEN=ghp_xxxx repocheck owner/repo
```
---
@@ -422,19 +427,19 @@ GITHUB_TOKEN=ghp_xxxx repo-doctor owner/repo
```bash
# Quick health check
-repo-doctor vercel/next.js
+repocheck vercel/next.js
# Deep audit with premium model
-repo-doctor facebook/react --model claude-opus-4.5 --deep
+repocheck facebook/react --model claude-opus-4.5 --deep
# Analyze and auto-export
-repo-doctor microsoft/typescript --export
+repocheck microsoft/typescript --export
# Private repository
-GITHUB_TOKEN=ghp_xxxx repo-doctor my-org/private-repo
+GITHUB_TOKEN=ghp_xxxx repocheck my-org/private-repo
# With extended timeout for large repos
-repo-doctor kubernetes/kubernetes --timeout 300000
+repocheck kubernetes/kubernetes --timeout 300000
```
### Batch Analysis
@@ -442,7 +447,7 @@ repo-doctor kubernetes/kubernetes --timeout 300000
```bash
# Analyze multiple repos (bash script)
for repo in "org/repo1" "org/repo2" "org/repo3"; do
- repo-doctor "$repo" --export
+ repocheck "$repo" --export
done
```
@@ -451,3 +456,7 @@ done
← Back to Documentation
+
+
+
+
diff --git a/docs/faq.md b/docs/faq.md
index 80f5c38..69dc0bd 100644
--- a/docs/faq.md
+++ b/docs/faq.md
@@ -1,6 +1,6 @@
# ❓ Frequently Asked Questions
-Common questions about using Repo Doctor.
+Common questions about using RepoCheckAI.
---
@@ -17,15 +17,15 @@ Common questions about using Repo Doctor.
## General Questions
-### What is Repo Doctor?
+### What is RepoCheckAI?
-Repo Doctor is an AI-powered CLI tool that analyzes GitHub repositories for health issues. It checks documentation, developer experience, CI/CD, testing, governance, and security practices, then provides a detailed report with prioritized findings and actionable recommendations.
+RepoCheckAI is an AI-powered CLI tool that analyzes GitHub repositories for health issues. It checks documentation, developer experience, CI/CD, testing, governance, and security practices, then provides a detailed report with prioritized findings and actionable recommendations.
### How is it different from other code analysis tools?
Unlike traditional linters or static analysis tools that focus on code syntax:
-| Aspect | Traditional Tools | Repo Doctor |
+| Aspect | Traditional Tools | RepoCheckAI |
|--------|------------------|-------------|
| Focus | Code syntax/style | Project health & best practices |
| Scope | Single language | Any language/framework |
@@ -35,7 +35,7 @@ Unlike traditional linters or static analysis tools that focus on code syntax:
### What languages/frameworks does it support?
-Repo Doctor supports **all languages and frameworks**. It automatically detects your stack and adapts its analysis:
+RepoCheckAI supports **all languages and frameworks**. It automatically detects your stack and adapts its analysis:
- **JavaScript/TypeScript** (Node.js, React, Vue, etc.)
- **Python** (Django, Flask, FastAPI, etc.)
@@ -69,7 +69,7 @@ Your code is processed through the GitHub Copilot API, which has enterprise-grad
### Why do I need GitHub Copilot?
-Repo Doctor uses the [GitHub Copilot SDK](https://github.com/github/copilot-sdk) for AI capabilities. This SDK requires an active GitHub Copilot subscription.
+RepoCheckAI uses the [GitHub Copilot SDK](https://github.com/github/copilot-sdk) for AI capabilities. This SDK requires an active GitHub Copilot subscription.
**Subscription options:**
- GitHub Copilot Individual ($10/month)
@@ -118,7 +118,7 @@ See [Troubleshooting](troubleshooting.md) for more solutions.
**Use `/analyze`** for quick health checks and governance reviews.
**Use `/deep`** for detailed audits and code quality analysis.
-### What files does Repo Doctor read?
+### What files does RepoCheckAI read?
**Quick analysis (`/analyze`) reads:**
- `README.md`
@@ -198,7 +198,7 @@ Yes! Switch models anytime:
```bash
# Via command line
-repo-doctor owner/repo --model gpt-4o
+repocheck owner/repo --model gpt-4o
# In interactive mode
/model claude-sonnet-4
@@ -225,13 +225,13 @@ Yes! You need to provide a GitHub token with `repo` scope:
```bash
# Option 1: Environment variable
export GITHUB_TOKEN=ghp_xxxxxxxxxxxx
-repo-doctor my-org/private-repo
+repocheck my-org/private-repo
# Option 2: Command line
-repo-doctor my-org/private-repo --token ghp_xxxxxxxxxxxx
+repocheck my-org/private-repo --token ghp_xxxxxxxxxxxx
# Option 3: GitHub CLI (if authenticated)
-gh auth login # Then Repo Doctor auto-detects
+gh auth login # Then RepoCheckAI auto-detects
```
### What token scopes are required?
@@ -275,6 +275,7 @@ See [issue-publishing.md](issue-publishing.md) for the full step-by-step guide.
### Why does `--issue` return 401/403?
Your PAT lacks write access to issues or does not have repo access.
+The same rule applies to Web UI publishing (`Publish to GitHub Issues`).
- Classic PAT: ensure `repo` (or `public_repo`) is selected
- Fine-grained PAT: ensure **Metadata (read)**, **Contents (read)**, **Issues (read/write)**
@@ -284,9 +285,9 @@ Your PAT lacks write access to issues or does not have repo access.
## Pricing & Limits
-### Is Repo Doctor free?
+### Is RepoCheckAI free?
-Repo Doctor is **open source and free**. However, it requires:
+RepoCheckAI is **open source and free**. However, it requires:
- **GitHub Copilot subscription** (paid)
- **GitHub API access** (free with limits)
@@ -311,7 +312,7 @@ You'll see an error like "Rate limit exceeded". Solutions:
### Are there costs for AI usage?
-AI usage is included in your GitHub Copilot subscription. There are no additional charges from Repo Doctor.
+AI usage is included in your GitHub Copilot subscription. There are no additional charges from RepoCheckAI.
**Note:** Premium models like `claude-opus-4.5` consume rate limits faster (3x cost), which may affect your Copilot usage for other tools.
@@ -319,8 +320,8 @@ AI usage is included in your GitHub Copilot subscription. There are no additiona
## More Questions?
-- 💬 [Start a Discussion](https://github.com/glaucia86/repo-doctor/discussions)
-- 🐛 [Report an Issue](https://github.com/glaucia86/repo-doctor/issues)
+- 💬 [Start a Discussion](https://github.com/glaucia86/repocheckai/discussions)
+- 🐛 [Report an Issue](https://github.com/glaucia86/repocheckai/issues)
- 📖 [Read the Full Documentation](index.md)
---
@@ -328,3 +329,5 @@ AI usage is included in your GitHub Copilot subscription. There are no additiona
← Back to Documentation
+
+
diff --git a/docs/getting-started.md b/docs/getting-started.md
index b25e8ed..743a93d 100644
--- a/docs/getting-started.md
+++ b/docs/getting-started.md
@@ -1,12 +1,14 @@
# 🚀 Getting Started
-This guide will help you install Repo Doctor and run your first repository health analysis.
+This guide will help you install RepoCheckAI and run your first repository health analysis.
+
+> Transition note: use `repocheck` as the default command. Legacy `repodoctor` remains available only during the migration window.
---
## ⚡ Quick Start (5 minutes)
-Want to see Repo Doctor in action? Here's how to test the GitHub issue creation feature:
+Want to see RepoCheckAI in action? Here's how to test the GitHub issue creation feature:
### 1. Get a GitHub Token
@@ -23,15 +25,15 @@ Want to see Repo Doctor in action? Here's how to test the GitHub issue creation
export GITHUB_TOKEN=ghp_your_token_here
# This may create one or multiple GitHub issues automatically, depending on findings/output format.
-repo-doctor analyze your-username/your-repo --issue
+repocheck analyze your-username/your-repo --issue
```
### 3. Check the Results
Visit your repository's **Issues** tab - you should see new issues like:
-- 🔴 [Repo Doctor] docs: Missing README
-- 🟠 [Repo Doctor] ci: No CI/CD Pipeline
-- 🟡 [Repo Doctor] dx: Code Quality Issues
+- 🔴 [RepoCheckAI] docs: Missing README
+- 🟠 [RepoCheckAI] ci: No CI/CD Pipeline
+- 🟡 [RepoCheckAI] dx: Code Quality Issues
**That's it!** 🎉 Each issue contains detailed analysis, impact assessment, and fix instructions.
@@ -41,7 +43,7 @@ Visit your repository's **Issues** tab - you should see new issues like:
## Prerequisites
-Before installing Repo Doctor, ensure you have:
+Before installing RepoCheckAI, ensure you have:
### 1. Node.js (v18+)
@@ -58,7 +60,7 @@ If you need to install or update Node.js:
### 2. GitHub Copilot Subscription
-Repo Doctor uses the GitHub Copilot SDK, which requires an active subscription:
+RepoCheckAI uses the GitHub Copilot SDK, which requires an active subscription:
- **GitHub Copilot Individual** - Works with free models (GPT-4o, GPT-4.1)
- **GitHub Copilot Pro/Business/Enterprise** - Full access to premium models
@@ -67,7 +69,7 @@ Repo Doctor uses the GitHub Copilot SDK, which requires an active subscription:
### 3. GitHub Copilot CLI (Required)
-Repo Doctor uses the GitHub Copilot SDK, which requires the **Copilot CLI** installed:
+RepoCheckAI uses the GitHub Copilot SDK, which requires the **Copilot CLI** installed:
```bash
# Install Copilot CLI
@@ -113,7 +115,7 @@ Then authenticate:
gh auth login
```
-> **Tip:** For model access, Repo Doctor uses the GitHub CLI OAuth token. If you see `Failed to list models: 401`, follow the Copilot auth steps in [issue-publishing.md](issue-publishing.md).
+> **Tip:** For model access, RepoCheckAI uses the GitHub CLI OAuth token. If you see `Failed to list models: 401`, follow the Copilot auth steps in [issue-publishing.md](issue-publishing.md).
### 5. GitHub Personal Access Token (For Publishing Features)
@@ -132,7 +134,7 @@ To use advanced features like creating issues or commenting on PRs, you need a G
3. **Generate New Token**
- Click **Generate new token (classic)**
- - **Name**: `Repo Doctor` (or descriptive name)
+ - **Name**: `RepoCheckAI` (or descriptive name)
- **Expiration**: Choose appropriate time (30 days recommended)
- **Scopes**: Select minimal required permissions
@@ -152,7 +154,7 @@ To use advanced features like creating issues or commenting on PRs, you need a G
export GITHUB_TOKEN=ghp_your_token_here
# Or pass it only for a single command (avoids storing it in shell history)
-GITHUB_TOKEN=ghp_your_token_here repo-doctor analyze owner/repo --issue
+GITHUB_TOKEN=ghp_your_token_here repocheck analyze owner/repo --issue
```
> **Full guide:** See [issue-publishing.md](issue-publishing.md) for step-by-step `--issue` setup and 401 troubleshooting.
@@ -172,10 +174,10 @@ GITHUB_TOKEN=ghp_your_token_here repo-doctor analyze owner/repo --issue
```bash
# 1. Clone the repository
-git clone https://github.com/glaucia86/repo-doctor.git
+git clone https://github.com/glaucia86/repocheckai.git
# 2. Navigate to the directory
-cd repo-doctor
+cd repocheckai
# 3. Install dependencies
npm install
@@ -187,7 +189,7 @@ npm run build
npm link
```
-After installation, the `repo-doctor` command will be available globally.
+After installation, the `repocheck` command will be available globally.
### Option 2: Development Mode
@@ -195,8 +197,8 @@ If you want to contribute or modify the code:
```bash
# Clone and install
-git clone https://github.com/glaucia86/repo-doctor.git
-cd repo-doctor
+git clone https://github.com/glaucia86/repocheckai.git
+cd repocheckai
npm install
# Run in development mode (with hot reload)
@@ -206,8 +208,8 @@ npm run dev:cli
### Verify Installation
```bash
-repo-doctor --version
-# Should display: repo-doctor v2.x.x
+repocheck --version
+# Should display: repocheck v2.x.x
```
---
@@ -219,13 +221,13 @@ repo-doctor --version
The easiest way to start is with interactive mode:
```bash
-repo-doctor
+repocheck
```
You'll see a welcome screen:
-
+
1. **Enter a repository** — Type `vercel/next.js` or any public repository
@@ -239,17 +241,17 @@ You can also analyze directly from the command line:
```bash
# Analyze a public repository
-repo-doctor vercel/next.js
+repocheck vercel/next.js
# With a specific model
-repo-doctor facebook/react --model gpt-4o
+repocheck facebook/react --model gpt-4o
# Deep analysis (comprehensive scan)
-repo-doctor microsoft/typescript --deep
+repocheck microsoft/typescript --deep
# 🔥 NEW: Create GitHub issues automatically
export GITHUB_TOKEN=ghp_your_token_here
-repo-doctor analyze your-username/your-repo --issue
+repocheck analyze your-username/your-repo --issue
```
### Publishing Reports to GitHub
@@ -265,122 +267,54 @@ repo-doctor analyze your-username/your-repo --issue
export GITHUB_TOKEN=ghp_your_token_here
# Create issues for each problem found
-repo-doctor analyze your-username/your-repo --issue
+repocheck analyze your-username/your-repo --issue
# Result: One or multiple GitHub issues created automatically, depending on findings.
```
-#### Interactive Mode
+#### Web UI (equivalent to `--issue`)
```bash
-# Set token securely for the session
-export GITHUB_TOKEN=ghp_your_token_here
-
-# Then start interactive mode
-repo-doctor chat
-# Then type:
-/analyze facebook/react --issue
-/deep microsoft/vscode
+npm run dev:local-ui
```
----
-
-## 🧪 Testing Publishing Features
+In the Web UI form:
-Want to try the publishing features? Here's a complete step-by-step guide:
+1. Enable `Publish to GitHub Issues`
+2. Optional: fill `GitHub Token`
+3. Run analysis
-### Step 1: Get Your GitHub Token
+If `GitHub Token` is empty, the backend uses `GITHUB_TOKEN` from the server environment.
-1. **Go to GitHub Settings**
- - Visit [github.com](https://github.com) → Your profile → **Settings**
-
-2. **Generate Personal Access Token**
- - **Developer settings** → **Personal access tokens** → **Tokens (classic)**
- - Click **"Generate new token (classic)"**
- - **Name**: `Repo Doctor Test`
- - **Expiration**: 7 days (for testing)
- - **Scopes**: Select one of these options:
- - `repo` (full control of private repositories) **OR**
- - Granular permissions:
- - `metadata` — Read repository metadata
- - `contents` — Read repository contents
- - `issues` — Create and manage issues
-
-3. **Copy the token** (often starts with `ghp_` or `github_pat_`)
-
-### Step 2: Test with Interactive Mode
+#### Interactive Mode
```bash
-# Set your token securely
+# Set token securely for the session
export GITHUB_TOKEN=ghp_your_token_here
-# Start interactive mode
-repo-doctor chat
-```
-
-### Step 3: Test Issue Creation
-
-```bash
-# In the chat, type:
+# Then start interactive mode
+repocheck chat
+# Then type:
/analyze facebook/react --issue
+/deep microsoft/vscode
```
-**What happens:**
-- ✅ Analyzes the repository
-- ✅ Creates a GitHub issue in `facebook/react` (if you have access)
-- ✅ Or creates issues in your own repository if you don't have access to facebook/react
-
-### Step 4: Test with Your Own Repository
-
-```bash
-# Use your own repository for testing
-/analyze your-username/your-repo --issue
-```
-
-**Expected Result:**
-- One or multiple issues created, depending on findings
-- Each issue has detailed description, impact, and fix instructions
-- Issues are labeled by category (docs, dx, ci, security, etc.)
-
-### Example Output
-
-After running `/analyze facebook/react --issue`, you should see:
-
-```
-✓ Analysis completed successfully!
- Made 25 API calls in 45.2s
-
- Publishing report as GitHub issue(s)...
-
-✓ Report published: 3 issues created.
- https://github.com/facebook/react/issues/123
- https://github.com/facebook/react/issues/124
- https://github.com/facebook/react/issues/125
-```
-
-### Troubleshooting Publishing
+---
-**"Repository not found"**
-- Check repository name spelling
-- Ensure you have access to the repository
-- Try with your own repository first
+## 🧪 Testing Publishing Features
-**"Token permission denied"**
-- Regenerate token with correct scopes
-- Make sure you have `repo` scope OR the granular permissions: `metadata`, `contents`, and `issues`
+Quick validation checklist:
-**"No issues created"**
-- The repository might be very healthy (no issues found)
-- Check the analysis output for problems
+1. Configure token with issue-write permission.
+2. Run one CLI test (`repocheck analyze owner/repo --issue`) or one Web UI test (`npm run dev:local-ui` + enable `Publish to GitHub Issues`).
+3. Confirm new issue(s) were created in the target repository.
-### Security Best Practices
+If publishing fails:
+- `401` in model listing: Copilot auth issue (`GH_TOKEN` path).
+- `401/403` in issue creation: GitHub API token scope/access issue (`GITHUB_TOKEN` path).
-- **Never commit tokens** to code
-- Use short-lived tokens for testing
-- Revoke tokens after testing
-- Consider GitHub Apps for production use
-
----
+For full step-by-step setup, token scope matrix, and troubleshooting, use:
+- [Issue Publishing Guide](issue-publishing.md)
---
@@ -450,11 +384,11 @@ Now that you've run your first analysis:
```bash
# Your organization's repos
-repo-doctor your-org/your-repo
+repocheck your-org/your-repo
# Private repositories (requires token)
export GITHUB_TOKEN=ghp_xxxxx
-repo-doctor your-org/private-repo
+repocheck your-org/private-repo
```
### Publishing Features
@@ -465,10 +399,10 @@ With a GitHub Personal Access Token, you can automatically publish analysis repo
```bash
# Create a GitHub issue with the complete analysis
-GITHUB_TOKEN=ghp_your_token repo-doctor analyze owner/repo --issue
+GITHUB_TOKEN=ghp_your_token repocheck analyze owner/repo --issue
# The issue includes:
-# - Title: "Repo Doctor Report: owner/repo"
+# - Title: "RepoCheckAI Report: owner/repo"
# - Labels: Based on findings (docs, dx, ci, security, etc.)
# - Body: Full analysis report in Markdown format
```
@@ -476,7 +410,7 @@ GITHUB_TOKEN=ghp_your_token repo-doctor analyze owner/repo --issue
#### Interactive Mode
```bash
-repo-doctor chat
+repocheck chat
# Then use:
/analyze owner/repo --issue
/deep owner/repo
@@ -484,7 +418,7 @@ repo-doctor chat
### Integrate into Workflow
-- Run Repo Doctor before major releases
+- Run RepoCheckAI before major releases
- Use it in CI/CD for automated health checks
- Share reports with your team
- **Auto-publish issues** for tracking repository improvements
@@ -492,26 +426,26 @@ repo-doctor chat
### Join the Community
-- ⭐ [Star the repository](https://github.com/glaucia86/repo-doctor)
-- 🐛 [Report issues](https://github.com/glaucia86/repo-doctor/issues)
-- 💡 [Suggest features](https://github.com/glaucia86/repo-doctor/discussions)
+- ⭐ [Star the repository](https://github.com/glaucia86/repocheckai)
+- 🐛 [Report issues](https://github.com/glaucia86/repocheckai/issues)
+- 💡 [Suggest features](https://github.com/glaucia86/repocheckai/discussions)
- 🤝 [Contribute](CONTRIBUTING.md)
---
## Troubleshooting Installation
-### "command not found: repo-doctor"
+### "command not found: repocheck"
The global link wasn't created properly:
```bash
# Try relinking
-npm unlink repo-doctor
+npm unlink repocheck
npm link
# Or run directly
-npx repo-doctor
+npx repocheck
```
### "Cannot find module" errors
@@ -544,3 +478,6 @@ See [Troubleshooting](troubleshooting.md) for more solutions.
← Back to Documentation •
User Guide →
+
+
+
diff --git a/docs/index.md b/docs/index.md
index 2664af2..f921c0b 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -1,4 +1,4 @@
-# 🩺 Repo Doctor Documentation
+# 🩺 RepoCheckAI Documentation
AI-powered GitHub Repository Health Analyzer
@@ -6,11 +6,21 @@
---
-Welcome to the official documentation for **Repo Doctor** — an agentic CLI tool that performs comprehensive health checks on GitHub repositories using AI.
+Welcome to the official documentation for **RepoCheckAI** — an agentic CLI tool that performs comprehensive health checks on GitHub repositories using AI.
-## What is Repo Doctor?
+## Recommended Path For Issue Publishing
-Repo Doctor is your repository's AI doctor that diagnoses issues and prescribes solutions. Built with the [GitHub Copilot SDK](https://github.com/github/copilot-sdk), it analyzes repositories across **6 critical areas**:
+If your goal is to publish analysis results as GitHub issues, follow this order:
+
+1. Read [🧭 Issue Publishing](issue-publishing.md) for token/auth setup and troubleshooting.
+2. Choose your interface:
+ - CLI: use `--issue`
+ - Web UI: enable `Publish to GitHub Issues`
+3. If publishing fails with `401/403`, return to the same guide and follow the diagnostics section.
+
+## What is RepoCheckAI?
+
+RepoCheckAI is your repository's AI doctor that diagnoses issues and prescribes solutions. Built with the [GitHub Copilot SDK](https://github.com/github/copilot-sdk), it analyzes repositories across **6 critical areas**:
- 📚 **Documentation & Onboarding**
- ⚡ **Developer Experience**
@@ -93,14 +103,14 @@ Get an overall health percentage (0-100%) based on weighted category scores:
```bash
# Install
-git clone https://github.com/glaucia86/repo-doctor.git
-cd repo-doctor && npm install && npm run build && npm link
+git clone https://github.com/glaucia86/repocheckai.git
+cd repocheckai && npm install && npm run build && npm link
# Run interactive mode
-repo-doctor
+repocheck
# Or analyze directly
-repo-doctor vercel/next.js
+repocheck vercel/next.js
```
See the [Getting Started Guide](getting-started.md) for detailed instructions.
@@ -119,8 +129,8 @@ See the [Getting Started Guide](getting-started.md) for detailed instructions.
## Support
-- 🐛 **Found a bug?** [Open an issue](https://github.com/glaucia86/repo-doctor/issues/new)
-- 💡 **Have an idea?** [Start a discussion](https://github.com/glaucia86/repo-doctor/discussions)
+- 🐛 **Found a bug?** [Open an issue](https://github.com/glaucia86/repocheckai/issues/new)
+- 💡 **Have an idea?** [Start a discussion](https://github.com/glaucia86/repocheckai/discussions)
- 🤝 **Want to contribute?** Read our [Contributing Guide](CONTRIBUTING.md)
---
@@ -128,3 +138,5 @@ See the [Getting Started Guide](getting-started.md) for detailed instructions.
Made with 💚 by Glaucia Lemos
+
+
diff --git a/docs/issue-publishing.md b/docs/issue-publishing.md
index 7cfe673..8f51d9a 100644
--- a/docs/issue-publishing.md
+++ b/docs/issue-publishing.md
@@ -6,7 +6,7 @@ This guide explains how to use the `--issue` flag safely, how Copilot SDK auth d
## 1) Two auth paths (very important)
-Repo Doctor uses two separate auth paths:
+RepoCheckAI uses two separate auth paths:
- **Copilot SDK auth (models and analysis)**
- If this fails, you will see: `Failed to list models: 401`.
@@ -37,7 +37,7 @@ gh auth login
# Do NOT use GITHUB_TOKEN here
gh auth status
-# Export OAuth token for Repo Doctor
+# Export OAuth token for RepoCheckAI
$env:GH_TOKEN = (gh auth token)
```
@@ -74,7 +74,7 @@ You need a PAT that can create issues in the target repo.
---
-## 4) Run Repo Doctor with `--issue`
+## 4) Run RepoCheckAI with `--issue` (CLI)
You can use Copilot auth (GH_TOKEN) and pass the PAT only for issue creation.
@@ -95,12 +95,34 @@ In the app:
Direct mode:
```powershell
-repo-doctor analyze owner/repo --issue --token
+repocheck analyze owner/repo --issue --token
```
---
-## 5) Quick diagnostics
+## 5) Run issue publishing from Web UI
+
+Start both services:
+
+```bash
+npm run dev:local-ui
+```
+
+In the Web UI form:
+
+1. Enable **Publish to GitHub Issues**
+2. Optionally fill **GitHub Token**
+3. Run analysis
+
+Token behavior in Web UI:
+
+- If **GitHub Token** is filled, that value is used.
+- If the field is empty, the backend tries `GITHUB_TOKEN` from server environment.
+- If neither is available, analysis still runs, but issue publishing is skipped.
+
+---
+
+## 6) Quick diagnostics
### Check PAT can create an issue
@@ -109,7 +131,7 @@ $env:GITHUB_TOKEN = ""
Invoke-RestMethod -Method Post \
-Headers @{ Authorization = "Bearer $env:GITHUB_TOKEN" } \
-Uri https://api.github.com/repos/owner/repo/issues \
- -Body (@{ title = "Repo Doctor test"; body = "test" } | ConvertTo-Json) \
+ -Body (@{ title = "RepoCheckAI test"; body = "test" } | ConvertTo-Json) \
-ContentType "application/json"
```
@@ -121,7 +143,7 @@ Invoke-RestMethod -Method Post \
---
-## 6) Security notes
+## 7) Security notes
- Never commit tokens or store them inside the repo
- Use short expiration for PATs
@@ -132,3 +154,5 @@ Invoke-RestMethod -Method Post \
← Back to Documentation
+
+
diff --git a/docs/repository-layout.md b/docs/repository-layout.md
index 6651324..f824b71 100644
--- a/docs/repository-layout.md
+++ b/docs/repository-layout.md
@@ -1,6 +1,6 @@
# 🗂️ Repository Layout
-Repo Doctor currently has three application surfaces:
+Repo Check AI currently has three application surfaces:
- **CLI**: terminal-first workflow for repository analysis.
- **Web UI**: local browser UI backed by a local API.
@@ -9,7 +9,7 @@ Repo Doctor currently has three application surfaces:
## Top-Level Structure
```text
-repo-doctor/
+repocheckai/
├── site/
├── src/
├── tests/
@@ -54,3 +54,4 @@ Static site content deployed with GitHub Pages.
- Keeps the public website isolated from runtime source code.
- Separates `src/` by clean architecture layers.
- Reduces accidental cross-surface edits by clarifying ownership.
+
diff --git a/docs/troubleshooting.md b/docs/troubleshooting.md
index db48a64..14ad263 100644
--- a/docs/troubleshooting.md
+++ b/docs/troubleshooting.md
@@ -1,6 +1,8 @@
# 🔧 Troubleshooting
-Solutions for common issues when using Repo Doctor.
+Solutions for common issues when using RepoCheckAI.
+
+> Transition note: if old scripts still call `repodoctor`, they should keep working during migration but will emit a deprecation warning.
---
@@ -18,7 +20,7 @@ Solutions for common issues when using Repo Doctor.
## Installation Issues
-### "command not found: repo-doctor"
+### "command not found: repocheck"
The global npm link wasn't created successfully.
@@ -26,11 +28,11 @@ The global npm link wasn't created successfully.
```bash
# 1. Try relinking
-npm unlink repo-doctor
+npm unlink repocheck
npm link
# 2. Run directly with npx
-npx repo-doctor
+npx repocheck
# 3. Check npm global path
npm config get prefix
@@ -56,7 +58,7 @@ npm run build
### "Node.js version too old"
-Repo Doctor requires Node.js 18+.
+RepoCheckAI requires Node.js 18+.
**Solutions:**
@@ -217,7 +219,7 @@ curl https://api.github.com/repos/owner/repo
```bash
# 1. Increase timeout
-repo-doctor owner/repo --timeout 180000
+repocheck owner/repo --timeout 180000
# 2. Use quick analysis instead of deep
/analyze owner/repo # Instead of /deep
@@ -226,7 +228,7 @@ repo-doctor owner/repo --timeout 180000
ping api.github.com
# 4. Try a different model (some are faster)
-repo-doctor owner/repo --model gpt-4o
+repocheck owner/repo --model gpt-4o
```
### "Empty repository" error
@@ -264,13 +266,13 @@ The analysis took longer than the timeout limit.
```bash
# Increase timeout (default: 120000ms = 2 minutes)
-repo-doctor owner/repo --timeout 300000 # 5 minutes
+repocheck owner/repo --timeout 300000 # 5 minutes
# Use quick analysis for large repos
/analyze owner/repo
# Use a faster model
-repo-doctor owner/repo --model gpt-4o
+repocheck owner/repo --model gpt-4o
```
---
@@ -290,7 +292,7 @@ The selected model isn't available for your subscription.
```bash
# Switch to a free model
-repo-doctor owner/repo --model gpt-4o
+repocheck owner/repo --model gpt-4o
```
### "Copilot session error" or "SDK error"
@@ -338,7 +340,7 @@ Premium models like Opus consume rate limits faster.
# 2. Wait for rate limit to reset
# 3. Use free models for bulk analysis
-repo-doctor owner/repo --model gpt-4o
+repocheck owner/repo --model gpt-4o
```
---
@@ -352,7 +354,7 @@ The file encoding might not support emojis.
**Solutions:**
```bash
-# Repo Doctor saves with UTF-8 BOM by default
+# RepoCheckAI saves with UTF-8 BOM by default
# If viewing in old editors, try:
# - VS Code (recommended)
# - Notepad++ with UTF-8 encoding
@@ -361,11 +363,11 @@ The file encoding might not support emojis.
### Can't find exported file
-**Default export location:** `~/repo-doctor/reports/`
+**Default export location:** `~/repocheck/reports/`
```bash
# Check default location
-ls ~/repo-doctor/reports/
+ls ~/repocheck/reports/
# Export to specific location
/export ~/Desktop
@@ -428,7 +430,7 @@ Large repositories can use significant memory during deep analysis.
/analyze owner/repo
# Limit files analyzed
-repo-doctor owner/repo --max-files 500
+repocheck owner/repo --max-files 500
# Close other applications during analysis
```
@@ -442,10 +444,10 @@ repo-doctor owner/repo --max-files 500
/analyze owner/repo
# 2. Increase Node.js memory if needed
-NODE_OPTIONS="--max-old-space-size=4096" repo-doctor owner/repo
+NODE_OPTIONS="--max-old-space-size=4096" repocheck owner/repo
# 3. Use faster model
-repo-doctor owner/repo --model gpt-4o
+repocheck owner/repo --model gpt-4o
```
### Terminal rendering issues
@@ -470,7 +472,7 @@ export LANG=en_US.UTF-8
### Before asking for help
1. **Check this troubleshooting guide**
-2. **Search existing issues:** [github.com/glaucia86/repo-doctor/issues](https://github.com/glaucia86/repo-doctor/issues)
+2. **Search existing issues:** [github.com/glaucia86/repocheckai/issues](https://github.com/glaucia86/repocheckai/issues)
3. **Read the FAQ:** [faq.md](faq.md)
### Reporting a bug
@@ -486,7 +488,7 @@ Create an issue with:
# Include this info
node --version
npm --version
-repo-doctor --version # If available
+repocheck --version # If available
```
5. **Error messages** — Full error output
@@ -496,8 +498,8 @@ repo-doctor --version # If available
| Channel | Best For |
|---------|----------|
-| [GitHub Issues](https://github.com/glaucia86/repo-doctor/issues) | Bug reports |
-| [GitHub Discussions](https://github.com/glaucia86/repo-doctor/discussions) | Questions, ideas |
+| [GitHub Issues](https://github.com/glaucia86/repocheckai/issues) | Bug reports |
+| [GitHub Discussions](https://github.com/glaucia86/repocheckai/discussions) | Questions, ideas |
| [Twitter @glaucia_lemos86](https://twitter.com/glaucia_lemos86) | Quick questions |
---
@@ -506,7 +508,7 @@ repo-doctor --version # If available
| Problem | Quick Fix |
|---------|-----------|
-| Command not found | `npm link` or use `npx repo-doctor` |
+| Command not found | `npm link` or use `npx repocheck` |
| Module errors | `rm -rf node_modules && npm install` |
| Auth failure | `export GITHUB_TOKEN=ghp_xxx` |
| Rate limited | Wait 1 hour or use token |
@@ -520,3 +522,6 @@ repo-doctor --version # If available
← Back to Documentation
+
+
+
diff --git a/package-lock.json b/package-lock.json
index 3e0be03..b1106c6 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,15 +1,15 @@
{
- "name": "repo-doctor",
+ "name": "repocheckai",
"version": "2.4.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
- "name": "repo-doctor",
+ "name": "repocheckai",
"version": "2.4.0",
"license": "MIT",
"dependencies": {
- "@github/copilot-sdk": "~0.1.23",
+ "@github/copilot-sdk": "~0.1.24",
"@inquirer/prompts": "~8.2.0",
"@octokit/rest": "~22.0.1",
"chalk": "~5.3.0",
@@ -24,7 +24,8 @@
"zod": "~3.22.0"
},
"bin": {
- "repo-doctor": "dist/index.js"
+ "repocheck": "dist/index.js",
+ "repodoctor": "dist/index.js"
},
"devDependencies": {
"@types/commander": "^2.12.0",
@@ -1223,26 +1224,26 @@
}
},
"node_modules/@github/copilot": {
- "version": "0.0.403",
- "resolved": "https://registry.npmjs.org/@github/copilot/-/copilot-0.0.403.tgz",
- "integrity": "sha512-v5jUdtGJReLmE1rmff/LZf+50nzmYQYAaSRNtVNr9g0j0GkCd/noQExe31i1+PudvWU0ZJjltR0B8pUfDRdA9Q==",
+ "version": "0.0.409",
+ "resolved": "https://registry.npmjs.org/@github/copilot/-/copilot-0.0.409.tgz",
+ "integrity": "sha512-rkYWOKjTSuGg99KsgmA0QAP4X2cpJzAYk6lZDlVxKPhuLP03wC5E+jLctrSLjpxhX32p9n13rm1+7Jun80a1hw==",
"license": "SEE LICENSE IN LICENSE.md",
"bin": {
"copilot": "npm-loader.js"
},
"optionalDependencies": {
- "@github/copilot-darwin-arm64": "0.0.403",
- "@github/copilot-darwin-x64": "0.0.403",
- "@github/copilot-linux-arm64": "0.0.403",
- "@github/copilot-linux-x64": "0.0.403",
- "@github/copilot-win32-arm64": "0.0.403",
- "@github/copilot-win32-x64": "0.0.403"
+ "@github/copilot-darwin-arm64": "0.0.409",
+ "@github/copilot-darwin-x64": "0.0.409",
+ "@github/copilot-linux-arm64": "0.0.409",
+ "@github/copilot-linux-x64": "0.0.409",
+ "@github/copilot-win32-arm64": "0.0.409",
+ "@github/copilot-win32-x64": "0.0.409"
}
},
"node_modules/@github/copilot-darwin-arm64": {
- "version": "0.0.403",
- "resolved": "https://registry.npmjs.org/@github/copilot-darwin-arm64/-/copilot-darwin-arm64-0.0.403.tgz",
- "integrity": "sha512-dOw8IleA0d1soHnbr/6wc6vZiYWNTKMgfTe/NET1nCfMzyKDt/0F0I7PT5y+DLujJknTla/ZeEmmBUmliTW4Cg==",
+ "version": "0.0.409",
+ "resolved": "https://registry.npmjs.org/@github/copilot-darwin-arm64/-/copilot-darwin-arm64-0.0.409.tgz",
+ "integrity": "sha512-yjrrp++UNNvRoWsZ1+UioBqb3DEVxL5M5ePnMO5/Sf1sngxh0y5P9P6ePFZU4PVlM5BgC38DtrcauZaKf/oArQ==",
"cpu": [
"arm64"
],
@@ -1256,9 +1257,9 @@
}
},
"node_modules/@github/copilot-darwin-x64": {
- "version": "0.0.403",
- "resolved": "https://registry.npmjs.org/@github/copilot-darwin-x64/-/copilot-darwin-x64-0.0.403.tgz",
- "integrity": "sha512-aK2jSNWgY8eiZ+TmrvGhssMCPDTKArc0ip6Ul5OaslpytKks8hyXoRbxGD0N9sKioSUSbvKUf+1AqavbDpJO+w==",
+ "version": "0.0.409",
+ "resolved": "https://registry.npmjs.org/@github/copilot-darwin-x64/-/copilot-darwin-x64-0.0.409.tgz",
+ "integrity": "sha512-EhLfY5DGU/BZmwjVcfnwKuJA7BxS9zdNCGeynUq7z/SI93ziastFqOddUX4D+ySz6yMrrXieN8cUKgzAlRCOJg==",
"cpu": [
"x64"
],
@@ -1272,9 +1273,9 @@
}
},
"node_modules/@github/copilot-linux-arm64": {
- "version": "0.0.403",
- "resolved": "https://registry.npmjs.org/@github/copilot-linux-arm64/-/copilot-linux-arm64-0.0.403.tgz",
- "integrity": "sha512-KhoR2iR70O6vCkzf0h8/K+p82qAgOvMTgAPm9bVEHvbdGFR7Py9qL5v03bMbPxsA45oNaZAkzDhfTAqWhIAZsQ==",
+ "version": "0.0.409",
+ "resolved": "https://registry.npmjs.org/@github/copilot-linux-arm64/-/copilot-linux-arm64-0.0.409.tgz",
+ "integrity": "sha512-O7b/9LmBO8ljPqNngonx+v5d3cOs6HKvj2E9f5/Flb9Uw2lut7g6KGerfDYCMZUpvFCMDfbZSBJD3SDuJj1uPg==",
"cpu": [
"arm64"
],
@@ -1288,9 +1289,9 @@
}
},
"node_modules/@github/copilot-linux-x64": {
- "version": "0.0.403",
- "resolved": "https://registry.npmjs.org/@github/copilot-linux-x64/-/copilot-linux-x64-0.0.403.tgz",
- "integrity": "sha512-eoswUc9vo4TB+/9PgFJLVtzI4dPjkpJXdCsAioVuoqPdNxHxlIHFe9HaVcqMRZxUNY1YHEBZozy+IpUEGjgdfQ==",
+ "version": "0.0.409",
+ "resolved": "https://registry.npmjs.org/@github/copilot-linux-x64/-/copilot-linux-x64-0.0.409.tgz",
+ "integrity": "sha512-zSfFqyPxNaBE5/ClrSjsKxhhTpJaVOqSJY0q87iV9fw6xwdzcJ1/FlZGKjE7W8YVb4tdJx+OBMjQCU8WYewF1A==",
"cpu": [
"x64"
],
@@ -1304,17 +1305,17 @@
}
},
"node_modules/@github/copilot-sdk": {
- "version": "0.1.23",
- "resolved": "https://registry.npmjs.org/@github/copilot-sdk/-/copilot-sdk-0.1.23.tgz",
- "integrity": "sha512-0by81bsBQlDKE5VbcegZfUMvPyPm1aXwSGS2rGaMAFxv3ps+dACf1Voruxik7hQTae0ziVFJjuVrlxZoRaXBLw==",
+ "version": "0.1.24",
+ "resolved": "https://registry.npmjs.org/@github/copilot-sdk/-/copilot-sdk-0.1.24.tgz",
+ "integrity": "sha512-BkP4OCrB8zFYS77JhzbAfB9xCzpUN6h2XTUsWQJaTR2xSvyBdXulrpXaeF2P2tOE5R4/sozDpjRtPgwz0v8V5Q==",
"license": "MIT",
"dependencies": {
- "@github/copilot": "^0.0.403",
+ "@github/copilot": "^0.0.409",
"vscode-jsonrpc": "^8.2.1",
"zod": "^4.3.6"
},
"engines": {
- "node": ">=24.0.0"
+ "node": ">=20.0.0"
}
},
"node_modules/@github/copilot-sdk/node_modules/zod": {
@@ -1327,9 +1328,9 @@
}
},
"node_modules/@github/copilot-win32-arm64": {
- "version": "0.0.403",
- "resolved": "https://registry.npmjs.org/@github/copilot-win32-arm64/-/copilot-win32-arm64-0.0.403.tgz",
- "integrity": "sha512-djWjzCsp2xPNafMyOZ/ivU328/WvWhdroGie/DugiJBTgQL2SP0quWW1fhTlDwE81a3g9CxfJonaRgOpFTJTcg==",
+ "version": "0.0.409",
+ "resolved": "https://registry.npmjs.org/@github/copilot-win32-arm64/-/copilot-win32-arm64-0.0.409.tgz",
+ "integrity": "sha512-VizZsdK7L3ym/OR4wahiFx+6hFtaOYN9qvsHmNSo8pb65AZ6ORdRnCPE7w9ZejMpdNEa6x6WqHfxDKJlF85zyA==",
"cpu": [
"arm64"
],
@@ -1343,9 +1344,9 @@
}
},
"node_modules/@github/copilot-win32-x64": {
- "version": "0.0.403",
- "resolved": "https://registry.npmjs.org/@github/copilot-win32-x64/-/copilot-win32-x64-0.0.403.tgz",
- "integrity": "sha512-lju8cHy2E6Ux7R7tWyLZeksYC2MVZu9i9ocjiBX/qfG2/pNJs7S5OlkwKJ0BSXSbZEHQYq7iHfEWp201bVfk9A==",
+ "version": "0.0.409",
+ "resolved": "https://registry.npmjs.org/@github/copilot-win32-x64/-/copilot-win32-x64-0.0.409.tgz",
+ "integrity": "sha512-c6dP3XRFk550PmH1Vxe7n/bStNSLnVGH5B+ErUKXk/SPqmZ59pyoa7H2USNdoC6Nav5tkwYYR1vwNZRy+iKvrA==",
"cpu": [
"x64"
],
diff --git a/package.json b/package.json
index 22ce70a..78e776b 100644
--- a/package.json
+++ b/package.json
@@ -1,11 +1,12 @@
{
- "name": "repo-doctor",
+ "name": "repocheckai",
"version": "2.4.0",
"description": "AI-powered GitHub repository health analyzer using GitHub Copilot SDK",
"main": "dist/index.js",
"type": "module",
"bin": {
- "repo-doctor": "./dist/index.js"
+ "repocheck": "./dist/index.js",
+ "repodoctor": "./dist/index.js"
},
"files": [
"dist",
@@ -46,7 +47,7 @@
},
"repository": {
"type": "git",
- "url": "https://github.com/glaucia86/repo-doctor.git"
+ "url": "https://github.com/glaucia86/repocheckai.git"
},
"keywords": [
"github",
@@ -65,11 +66,11 @@
"author": "Glaucia Lemos",
"license": "MIT",
"bugs": {
- "url": "https://github.com/glaucia86/repo-doctor/issues"
+ "url": "https://github.com/glaucia86/repocheckai/issues"
},
- "homepage": "https://github.com/glaucia86/repo-doctor#readme",
+ "homepage": "https://github.com/glaucia86/repocheckai#readme",
"dependencies": {
- "@github/copilot-sdk": "~0.1.23",
+ "@github/copilot-sdk": "~0.1.24",
"@inquirer/prompts": "~8.2.0",
"@octokit/rest": "~22.0.1",
"chalk": "~5.3.0",
@@ -89,18 +90,18 @@
"@types/node": "^25.2.3",
"@types/react": "^18.3.12",
"@types/react-dom": "^18.3.1",
- "@vitejs/plugin-react": "^4.4.1",
"@typescript-eslint/eslint-plugin": "^8.55.0",
"@typescript-eslint/parser": "^8.55.0",
+ "@vitejs/plugin-react": "^4.4.1",
"@vitest/coverage-v8": "^4.0.18",
- "axe-core": "^4.11.1",
"autoprefixer": "^10.4.21",
+ "axe-core": "^4.11.1",
"eslint": "^9.0.0",
"eslint-config-prettier": "^9.1.0",
"husky": "^9.1.6",
"jsdom": "^28.0.0",
- "postcss": "^8.5.6",
"png-to-ico": "^3.0.1",
+ "postcss": "^8.5.6",
"prettier": "^3.3.3",
"sharp": "^0.34.5",
"tailwindcss": "^3.4.17",
diff --git a/resources/banner.svg b/resources/banner.svg
index 363f67d..7348a2a 100644
--- a/resources/banner.svg
+++ b/resources/banner.svg
@@ -1,60 +1,88 @@
-
+
+ RepoCheckAI Banner
+ Technology banner with repository graph mark and RepoCheckAI wordmark.
+
-
-
-
+
+
+
+
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
- Repo Doctor
-
-
-
-
- AI-powered GitHub Repository Health Analyzer
-
-
-
-
-
- Copilot SDK
-
-
- TypeScript
-
-
- CLI
+
+
+
+ RepoCheck AI
+
+
+ AI-powered GitHub Repository Health Analyzer
+
-
-
-
-
-
+
+
+
+ GITHUB COPILOT SDK
+
+
+ TYPESCRIPT
+
+
+ CLI
diff --git a/resources/how-it-works.excalidraw b/resources/how-it-works.excalidraw
index e5eca79..211ec19 100644
--- a/resources/how-it-works.excalidraw
+++ b/resources/how-it-works.excalidraw
@@ -1079,13 +1079,13 @@
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
- "text": "🩺 How Repo Doctor Works",
+ "text": "🩺 How Repo Check AI Works",
"fontSize": 36,
"fontFamily": 5,
"textAlign": "center",
"verticalAlign": "middle",
- "version": 388,
- "versionNonce": 1521777022,
+ "version": 413,
+ "versionNonce": 1507786882,
"index": "aT",
"isDeleted": false,
"seed": 1,
@@ -1093,11 +1093,11 @@
"frameId": null,
"roundness": null,
"boundElements": [],
- "updated": 1769210783886,
+ "updated": 1771296156698,
"link": null,
"locked": false,
"containerId": null,
- "originalText": "🩺 How Repo Doctor Works",
+ "originalText": "🩺 How Repo Check AI Works",
"autoResize": false,
"lineHeight": 1.25
}
diff --git a/resources/how-it-works.png b/resources/how-it-works.png
index 71ea22bb0cdd32a47bcd8c2e7ccb05ebd1a96e63..1055ffff0bfc082be9747501e262ffb1cdd58dd5 100644
GIT binary patch
literal 66096
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