From 620957e7fb1b0e1bb7a7dfb123d54a6a107ed0c0 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 27 Sep 2025 15:30:23 +0000 Subject: [PATCH 1/2] Initial plan From 9ec7f04f9315fed753841d109469205360ecc54b Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 27 Sep 2025 15:42:05 +0000 Subject: [PATCH 2/2] Remove hygiene section from frontend, backend, and API - Remove RepositoryHygieneSection component completely - Remove hygiene imports and usage from MuiApp.tsx and components/index.ts - Remove HygieneChecks interface and hygiene property from AnalysisReport - Remove hygiene data from mockData.ts - Remove hygieneSchema from backend schemas and server registration - Update analyze route to not return hygiene data - Remove hygiene from required fields in API schema Co-authored-by: ChrisTimperley <523560+ChrisTimperley@users.noreply.github.com> --- frontend/src/MuiApp.tsx | 3 - .../components/RepositoryHygieneSection.tsx | 609 ------------------ frontend/src/components/index.ts | 1 - frontend/src/data/mockData.ts | 89 --- frontend/src/types/index.ts | 91 --- src/routes/analyze.ts | 1 - src/schemas/analyze-response.ts | 53 -- src/server.ts | 2 - 8 files changed, 849 deletions(-) delete mode 100644 frontend/src/components/RepositoryHygieneSection.tsx diff --git a/frontend/src/MuiApp.tsx b/frontend/src/MuiApp.tsx index df95d34..f1c0600 100644 --- a/frontend/src/MuiApp.tsx +++ b/frontend/src/MuiApp.tsx @@ -11,7 +11,6 @@ import { PullRequestsSection, ContributorsSection, IssuesSection, - RepositoryHygieneSection, DirectPushesSection, } from './components'; @@ -200,8 +199,6 @@ function App() { projectItems={data.project.items} /> - - = ({ - hygiene, -}) => { - // Calculate passed checks - const checks = [ - hygiene.branch_protection.present, - hygiene.codeowners, - hygiene.security_policy, - hygiene.vulnerability_alerts, - hygiene.secret_scanning, - hygiene.dependency_scanning, - hygiene.readme_quality.has_description && - hygiene.readme_quality.has_setup && - hygiene.readme_quality.has_test, - hygiene.readme_quality.has_badges && - hygiene.readme_quality.badges.length >= 3, - hygiene.contributing, - hygiene.code_of_conduct, - hygiene.license, - hygiene.changelog, - hygiene.issue_templates, - hygiene.pr_template, - hygiene.wiki_present, - hygiene.ci_present, - hygiene.test_coverage.present && - hygiene.test_coverage.percentage >= 80, - hygiene.linting.present, - hygiene.formatting.present, - hygiene.precommit, - hygiene.editorconfig, - hygiene.gitignore_quality.present && - hygiene.gitignore_quality.comprehensive, - hygiene.dependabot, - hygiene.security_advisories, - hygiene.package_lock, - hygiene.outdated_dependencies.count <= 5 && - hygiene.outdated_dependencies.critical === 0, - hygiene.releases_recent, - hygiene.semantic_versioning, - hygiene.release_notes, - hygiene.tags_present, - hygiene.conventional_commits_rate >= 0.7, - hygiene.pr_size_check.large_pr_rate <= 0.3, - hygiene.review_coverage >= 0.8, - hygiene.merge_strategy.squash_enabled, - hygiene.discussions_enabled, - hygiene.projects_used, - hygiene.issue_response_time.sla_met, - hygiene.stale_issue_management, - ]; - const passed = checks.filter(Boolean).length; - const total = checks.length; - const percentage = Math.round((passed / total) * 100); - - return ( - - - - - - Repository Hygiene & Best Practices ✨ - - - {passed}/{total} checks passed ({percentage}%) - - - - - {/* Security Section */} - - - 🔒 Repository Security - - - - - {hygiene.branch_protection.present ? ( - - ) : ( - - )} - - Branch Protection - - - - - {hygiene.branch_protection.required_reviews}{' '} - required reviews, Status checks:{' '} - {hygiene.branch_protection.status_checks_required - ? 'Yes' - : 'No'} - - - - - - {hygiene.codeowners ? ( - - ) : ( - - )} - - Code Owners - - - - - CODEOWNERS file for mandatory code review assignment - - - - - - {hygiene.vulnerability_alerts ? ( - - ) : ( - - )} - - Vulnerability Alerts - - - - - GitHub vulnerability alerts enabled for dependencies - - - - - - {hygiene.secret_scanning ? ( - - ) : ( - - )} - - Secret Scanning - - - - - GitHub secret scanning to prevent credential leaks - - - - - - {/* Code Quality Section */} - - - ⚙️ Code Quality - - - - - {hygiene.ci_present ? ( - - ) : ( - - )} - - CI/CD Present - - - - - Continuous integration workflows configured - - - - = 80 - ? 'success.light' - : 'warning.light', - }} - > - - {hygiene.test_coverage.present && - hygiene.test_coverage.percentage >= 80 ? ( - - ) : ( - - )} - - Test Coverage - - - - - {hygiene.test_coverage.percentage}% coverage{' '} - {hygiene.test_coverage.present - ? '(tracked)' - : '(not tracked)'} - - - - - - {hygiene.linting.present ? ( - - ) : ( - - )} - - Code Linting - - - - - Tools: {hygiene.linting.tools.join(', ')} - - - - - - {/* Development Practices Section */} - - - 🚀 Development Practices - - - = 0.7 - ? 'success.light' - : 'warning.light', - }} - > - - {hygiene.conventional_commits_rate >= 0.7 ? ( - - ) : ( - - )} - - Conventional Commits - - - - - {Math.round( - hygiene.conventional_commits_rate * 100 - )} - % follow convention - - - - = 0.8 - ? 'success.light' - : 'error.light', - }} - > - - {hygiene.review_coverage >= 0.8 ? ( - - ) : ( - - )} - - Review Coverage - - - - - {Math.round(hygiene.review_coverage * 100)}% of PRs - reviewed - - - - - - {hygiene.pr_size_check.large_pr_rate <= 0.3 ? ( - - ) : ( - - )} - - PR Size Management - - - - - Avg size: {hygiene.pr_size_check.average_size},{' '} - {Math.round( - hygiene.pr_size_check.large_pr_rate * 100 - )} - % large - - - - - - {/* Documentation Section */} - - - 📚 Documentation - - - - - {hygiene.readme_quality.has_description && - hygiene.readme_quality.has_setup ? ( - - ) : ( - - )} - - Comprehensive README - - - - - {hygiene.readme_quality.word_count} words, Setup & - Tests documented - - - - - - {hygiene.contributing ? ( - - ) : ( - - )} - - Contributing Guide - - - - - CONTRIBUTING.md with development guidelines - - - - - - {hygiene.license ? ( - - ) : ( - - )} - - License - - - - - License file present for legal clarity - - - - - - - ); -}; \ No newline at end of file diff --git a/frontend/src/components/index.ts b/frontend/src/components/index.ts index df45c41..0d0923c 100644 --- a/frontend/src/components/index.ts +++ b/frontend/src/components/index.ts @@ -3,5 +3,4 @@ export { RepositoryInput } from './RepositoryInput'; export { PullRequestsSection } from './PullRequestsSection'; export { ContributorsSection } from './ContributorsSection'; export { IssuesSection } from './IssuesSection'; -export { RepositoryHygieneSection } from './RepositoryHygieneSection'; export { DirectPushesSection } from './DirectPushesSection'; \ No newline at end of file diff --git a/frontend/src/data/mockData.ts b/frontend/src/data/mockData.ts index 864f50a..bd8ca7b 100644 --- a/frontend/src/data/mockData.ts +++ b/frontend/src/data/mockData.ts @@ -231,95 +231,6 @@ export const mockAnalysisData: AnalysisReport = { url: 'https://github.com/cmu-sei/example-project/issues/459', }, ], - hygiene: { - // Repository Security - branch_protection: { - present: true, - required_reviews: 2, - status_checks_required: true, - dismiss_stale_reviews: true, - require_code_owner_reviews: true, - }, - codeowners: true, - security_policy: true, - vulnerability_alerts: true, - secret_scanning: false, - dependency_scanning: true, - - // Documentation - readme_quality: { - has_setup: true, - has_test: true, - has_description: true, - has_badges: true, - badges: ['build', 'coverage', 'license', 'version'], - word_count: 1247, - }, - contributing: true, - code_of_conduct: true, - license: true, - changelog: false, - issue_templates: true, - pr_template: true, - wiki_present: false, - - // Code Quality - ci_present: true, - test_coverage: { - present: true, - percentage: 87.3, - }, - linting: { - present: true, - tools: ['ESLint', 'Prettier', 'TypeScript'], - }, - formatting: { - present: true, - tools: ['Prettier', 'EditorConfig'], - }, - precommit: true, - editorconfig: true, - gitignore_quality: { - present: true, - comprehensive: true, - }, - - // Dependency Management - dependabot: true, - security_advisories: false, - package_lock: true, - outdated_dependencies: { - count: 7, - critical: 1, - }, - - // Release Management - releases_recent: true, - semantic_versioning: true, - release_notes: false, - tags_present: true, - - // Development Practices - conventional_commits_rate: 0.78, - pr_size_check: { - average_size: 'M', - large_pr_rate: 0.23, - }, - review_coverage: 0.89, - merge_strategy: { - squash_enabled: true, - merge_commits_allowed: false, - }, - - // Community Health - discussions_enabled: false, - projects_used: true, - issue_response_time: { - average_hours: 18.5, - sla_met: true, - }, - stale_issue_management: true, - }, direct_pushes: [ { sha: 'a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t', diff --git a/frontend/src/types/index.ts b/frontend/src/types/index.ts index 3f87b34..66d6ec6 100644 --- a/frontend/src/types/index.ts +++ b/frontend/src/types/index.ts @@ -20,7 +20,6 @@ export interface AnalysisReport { items: ProjectItem[]; }; issues: Issue[]; - hygiene: HygieneChecks; } export interface Contributor { @@ -92,93 +91,3 @@ export interface Commit { additions?: number; deletions?: number; } - -export interface HygieneChecks { - // Repository Security - branch_protection: { - present: boolean; - required_reviews: number; - status_checks_required: boolean; - dismiss_stale_reviews: boolean; - require_code_owner_reviews: boolean; - }; - codeowners: boolean; - security_policy: boolean; - vulnerability_alerts: boolean; - secret_scanning: boolean; - dependency_scanning: boolean; - - // Documentation - readme_quality: { - has_setup: boolean; - has_test: boolean; - has_description: boolean; - has_badges: boolean; - badges: string[]; - word_count: number; - }; - contributing: boolean; - code_of_conduct: boolean; - license: boolean; - changelog: boolean; - issue_templates: boolean; - pr_template: boolean; - wiki_present: boolean; - - // Code Quality - ci_present: boolean; - test_coverage: { - present: boolean; - percentage: number; - }; - linting: { - present: boolean; - tools: string[]; - }; - formatting: { - present: boolean; - tools: string[]; - }; - precommit: boolean; - editorconfig: boolean; - gitignore_quality: { - present: boolean; - comprehensive: boolean; - }; - - // Dependency Management - dependabot: boolean; - security_advisories: boolean; - package_lock: boolean; - outdated_dependencies: { - count: number; - critical: number; - }; - - // Release Management - releases_recent: boolean; - semantic_versioning: boolean; - release_notes: boolean; - tags_present: boolean; - - // Development Practices - conventional_commits_rate: number; - pr_size_check: { - average_size: string; - large_pr_rate: number; - }; - review_coverage: number; - merge_strategy: { - squash_enabled: boolean; - merge_commits_allowed: boolean; - }; - - // Community Health - discussions_enabled: boolean; - projects_used: boolean; - issue_response_time: { - average_hours: number; - sla_met: boolean; - }; - stale_issue_management: boolean; -} diff --git a/src/routes/analyze.ts b/src/routes/analyze.ts index 1aca1fa..5d809ad 100644 --- a/src/routes/analyze.ts +++ b/src/routes/analyze.ts @@ -227,7 +227,6 @@ export const analyzeRoutes: FastifyPluginAsync = async (fastify) => { })), project: { items: [] }, issues: [], - hygiene: {}, }; return response; diff --git a/src/schemas/analyze-response.ts b/src/schemas/analyze-response.ts index d2845c6..3a2cc0c 100644 --- a/src/schemas/analyze-response.ts +++ b/src/schemas/analyze-response.ts @@ -68,9 +68,6 @@ export const analyzeResponseSchema = { items: { $ref: 'Issue' }, default: [], }, - hygiene: { - $ref: 'Hygiene', - }, scores: { $ref: 'Scores', }, @@ -83,7 +80,6 @@ export const analyzeResponseSchema = { 'pull_requests', 'project', 'issues', - 'hygiene', ], } as const; @@ -231,54 +227,6 @@ export const projectItemSchema = { required: ['title', 'type', 'column', 'last_activity', 'assignees', 'labels'], } as const; -export const hygieneSchema = { - $id: 'Hygiene', - type: 'object', - additionalProperties: false, - properties: { - branch_protection: { - type: 'object', - additionalProperties: false, - properties: { - present: { type: 'boolean' }, - required_reviews: { type: 'integer', minimum: 0 }, - status_checks_required: { type: 'boolean' }, - enforce_admins: { type: 'boolean' }, - allow_force_pushes: { type: 'boolean' }, - }, - required: ['present'], - }, - codeowners: { type: 'boolean' }, - ci_present: { type: 'boolean' }, - issue_templates: { type: 'boolean' }, - pr_template: { type: 'boolean' }, - contributing: { type: 'boolean' }, - code_of_conduct: { type: 'boolean' }, - security: { type: 'boolean' }, - license: { type: 'boolean' }, - readme_quality: { - type: 'object', - additionalProperties: false, - properties: { - has_setup: { type: 'boolean' }, - has_test: { type: 'boolean' }, - badges: { - type: 'array', - items: { type: 'string' }, - default: [], - }, - }, - required: ['has_setup', 'has_test'], - }, - precommit: { type: 'boolean' }, - editorconfig: { type: 'boolean' }, - releases_recent: { type: 'boolean' }, - conventional_commits_rate: { type: 'number', minimum: 0, maximum: 1 }, - dependabot: { type: 'boolean' }, - }, - required: ['branch_protection', 'codeowners', 'ci_present', 'license'], -} as const; - export const scoresSchema = { $id: 'Scores', type: 'object', @@ -289,7 +237,6 @@ export const scoresSchema = { prs: { type: 'integer', minimum: 0, maximum: 100 }, project: { type: 'integer', minimum: 0, maximum: 100 }, issues: { type: 'integer', minimum: 0, maximum: 100 }, - hygiene: { type: 'integer', minimum: 0, maximum: 100 }, }, required: ['overall'], } as const; diff --git a/src/server.ts b/src/server.ts index e470871..eb2a09f 100644 --- a/src/server.ts +++ b/src/server.ts @@ -12,7 +12,6 @@ import { pullRequestSchema, issueSchema, projectItemSchema, - hygieneSchema, scoresSchema, loginSchema, urlSchema, @@ -69,7 +68,6 @@ server.addSchema(contributorSchema); server.addSchema(pullRequestSchema); server.addSchema(issueSchema); server.addSchema(projectItemSchema); -server.addSchema(hygieneSchema); server.addSchema(scoresSchema); server.addSchema(analyzeResponseSchema); server.addSchema(errorSchema);