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);