diff --git a/.github/workflows/updateCodeGov.yml b/.github/workflows/updateCodeGov.yml index c525ef0b..9c8b294d 100644 --- a/.github/workflows/updateCodeGov.yml +++ b/.github/workflows/updateCodeGov.yml @@ -28,6 +28,9 @@ jobs: - name: Update CodeGov.json run: node config/updateCodeGov.js + - name: Update issue-pool.json + run: node config/updateIssuePool.js + - name: Configure Git run: | git config --local user.email "github-actions[bot]@users.noreply.github.com" @@ -36,6 +39,6 @@ jobs: - name: Commit and push changes run: | git pull - git add codegov.json - git diff --staged --quiet || git commit -m "updated codegov.json file with latest index additions" + git add issue-pool.json + git diff --staged --quiet || git commit -m "updated codegov.json and issue-pool.json files with latest additions" git push \ No newline at end of file diff --git a/_data/issuesData.js b/_data/issuesData.js new file mode 100644 index 00000000..a1068840 --- /dev/null +++ b/_data/issuesData.js @@ -0,0 +1,70 @@ +const fs = require('fs'); +const path = require('path'); + +module.exports = function() { + const rawData = fs.readFileSync(path.join(__dirname, '../issue-pool.json'), 'utf8'); + const data = JSON.parse(rawData); + + const issues = []; + const organizations = new Set(); + const statuses = new Set(); + + Object.entries(data).forEach(([issueId, issueData]) => { + if (issueData.repo_owner) { + organizations.add(issueData.repo_owner); + } + + if (issueData.status_has_assignee) { + statuses.add('Assigned'); + } else { + statuses.add('Unassigned'); + } + + if (issueData.flags_is_bug) { + statuses.add('Bug'); + } + + if (issueData.flags_is_feature) { + statuses.add('Feature'); + } + + if (issueData.flags_needs_help) { + statuses.add('Help Wanted'); + } + + if (issueData.flags_is_beginner_friendly) { + statuses.add('Good First Issue'); + } + + issues.push({ + id: issueId, + title: issueData.content_title, + url: issueData.url, + owner: issueData.repo_owner, + isOpen: issueData.status_is_open, + hasAssignee: issueData.status_has_assignee, + author: issueData.people_author, + assignee: issueData.people_assignee, + createdDate: issueData.time_created_date, + lastUpdated: issueData.time_last_updated, + daysOld: issueData.time_days_old, + commentCount: issueData.engagement_comment_count, + reactionCount: issueData.engagement_reaction_count, + labels: issueData.labels_list || [], + labelCount: issueData.labels_count, + isBeginner: issueData.flags_is_beginner_friendly, + needsHelp: issueData.flags_needs_help, + isBug: issueData.flags_is_bug, + isFeature: issueData.flags_is_feature, + repoName: issueData.url ? issueData.url.split('/').slice(-3, -2)[0] : 'Unknown' + }); + }); + + return { + issues, + filters: { + organizations: Array.from(organizations).sort(), + statuses: Array.from(statuses).sort(), + } + }; +}; \ No newline at end of file diff --git a/_data/navigation.yaml b/_data/navigation.yaml index a0022244..ce136ffa 100644 --- a/_data/navigation.yaml +++ b/_data/navigation.yaml @@ -4,5 +4,7 @@ codegov: url: / - name: Agencies url: /agencies/ + - name: Issues + url: /issues/ - name: Guidance url: /agency-compliance/compliance/dashboard/ diff --git a/_includes/filters.html b/_includes/filters.html index fa56639f..2a1e6380 100644 --- a/_includes/filters.html +++ b/_includes/filters.html @@ -1,5 +1,5 @@
-
+
@@ -16,11 +16,18 @@
+ {% if filterTarget != 'issues' %}
+ {% endif %} {% if filterTarget == 'projects' %}
@@ -63,9 +71,15 @@
@@ -78,6 +92,11 @@ + {% else if filterTarget == 'issues' %} + + + + {% else %} @@ -94,8 +113,6 @@ -
-
diff --git a/assets/_common/js/issue-filters.js b/assets/_common/js/issue-filters.js new file mode 100644 index 00000000..fa8c0ad5 --- /dev/null +++ b/assets/_common/js/issue-filters.js @@ -0,0 +1,242 @@ +(function() { + 'use strict'; + + const issuesGrid = document.getElementById('issues-grid'); + + let allIssues = []; + let filteredIssues = []; + + function init() { + try { + const scriptElement = document.querySelector('script[data-issues]'); + if (!scriptElement) { + throw new Error('Issues data not found'); + } + + allIssues = JSON.parse(scriptElement.textContent); + // console.log('Found', allIssues.length, 'issues'); + + allIssues.forEach(issue => { + if (issue.url) { + const urlParts = issue.url.split('/'); + issue.repoName = urlParts[urlParts.length - 3] || 'Unknown'; + } + + issue.isBeginner = issue.isBeginner || false; + issue.needsHelp = issue.needsHelp || false; + issue.isBug = issue.isBug || false; + issue.isFeature = issue.isFeature || false; + }); + + filteredIssues = [...allIssues]; + setupEventListeners(); + renderIssues(); + updateResultsCount(); + } catch (error) { + console.error('Error loading issues:', error); + issuesGrid.innerHTML = '

Error loading issues. Please refresh or contact us.

'; + } + } + + function setupEventListeners() { + const searchInput = document.getElementById('search-input'); + const statusSelect = document.getElementById('status-select'); + const agencySelect = document.getElementById('agency-select'); + const orgSelect = document.getElementById('org-select'); + const sortSelect = document.getElementById('sort-select'); + const clearButton = document.getElementById('clear-filters'); + + if (searchInput) searchInput.addEventListener('input', debounce(filterAndRender, 300)); + if (statusSelect) statusSelect.addEventListener('change', filterAndRender); + if (agencySelect) agencySelect.addEventListener('change', filterAndRender); + if (orgSelect) orgSelect.addEventListener('change', filterAndRender); + if (sortSelect) sortSelect.addEventListener('change', filterAndRender); + if (clearButton) clearButton.addEventListener('click', clearFilters); + } + + // Debounce function for search input + function debounce(func, wait) { + let timeout; + return function executedFunction(...args) { + const later = () => { + clearTimeout(timeout); + func(...args); + }; + clearTimeout(timeout); + timeout = setTimeout(later, wait); + }; + } + + function filterAndRender() { + applyFilters(); + renderIssues(); + updateResultsCount(); + } + + function applyFilters() { + const searchTerm = document.getElementById('search-input')?.value.toLowerCase().trim() || ''; + const statusFilter = document.getElementById('status-select')?.value || ''; + const agencyFilter = document.getElementById('agency-select')?.value || ''; + const orgFilter = document.getElementById('org-select')?.value || ''; + const sortBy = document.getElementById('sort-select')?.value || 'created-desc'; + + filteredIssues = allIssues.filter(issue => { + if (searchTerm) { + const searchFields = [ + issue.title || '', + issue.owner || '', + issue.repoName || '', + issue.author || '', + (issue.labels || []).join(' ') + ].join(' ').toLowerCase(); + + if (!searchFields.includes(searchTerm)) { + return false; + } + } + + if (statusFilter) { + if (statusFilter === 'Open' && !issue.isOpen) return false; + if (statusFilter === 'Closed' && issue.isOpen) return false; + if (statusFilter === 'Assigned' && !issue.hasAssignee) return false; + if (statusFilter === 'Unassigned' && issue.hasAssignee) return false; + if (statusFilter === 'Bug' && !issue.isBug) return false; + if (statusFilter === 'Feature' && !issue.isFeature) return false; + if (statusFilter === 'Help Wanted' && !issue.needsHelp) return false; + if (statusFilter === 'Good First Issue' && !issue.isBeginner) return false; + } + + if (agencyFilter && issue.owner !== agencyFilter) { + return false; + } + + if (orgFilter && issue.owner !== orgFilter) { + return false; + } + + return true; + }); + + filteredIssues.sort((a, b) => { + switch (sortBy) { + case 'created-desc': + return new Date(b.createdDate) - new Date(a.createdDate); + case 'created-asc': + return new Date(a.createdDate) - new Date(b.createdDate); + case 'modified-desc': + return new Date(b.lastUpdated) - new Date(a.lastUpdated); + case 'modified-asc': + return new Date(a.lastUpdated) - new Date(b.lastUpdated); + case 'name-asc': + return (a.title || '').localeCompare(b.title || ''); + case 'name-desc': + return (b.title || '').localeCompare(a.title || ''); + default: + return 0; + } + }); + } + + function clearFilters() { + const searchInput = document.getElementById('search-input'); + const statusSelect = document.getElementById('status-select'); + const agencySelect = document.getElementById('agency-select'); + const orgSelect = document.getElementById('org-select'); + const sortSelect = document.getElementById('sort-select'); + + if (searchInput) searchInput.value = ''; + if (statusSelect) statusSelect.value = ''; + if (agencySelect) agencySelect.value = ''; + if (orgSelect) orgSelect.value = ''; + if (sortSelect) sortSelect.value = 'created-desc'; + + filterAndRender(); + } + + function updateResultsCount() { + const resultsCount = document.getElementById('results-count'); + if (resultsCount) { + const total = filteredIssues.length; + if (total === 0) { + resultsCount.textContent = 'No results found'; + } else { + resultsCount.textContent = `Showing ${total} issues`; + } + } + } + + function createIssueCard(issue) { + const typeTags = []; + if (issue.isOpen) { + typeTags.push('Open'); + } else { + typeTags.push('Closed'); + } + + if (issue.isBug) typeTags.push('Bug'); + if (issue.isFeature) typeTags.push('Feature'); + if (issue.needsHelp) typeTags.push('Help Wanted'); + if (issue.isBeginner) typeTags.push('Good First Issue'); + + return ` +
+
+

+ + ${escapeHtml(issue.title || 'Untitled Issue')} + +

+ +
+ ${escapeHtml(issue.owner)}/${escapeHtml(issue.repoName)} created by ${escapeHtml(issue.author)} +
+ +
+ ${typeTags.join(' ')} +
+ +
+ ${issue.commentCount || 0} comments • + Created ${formatDate(issue.createdDate)} • + Updated ${formatDate(issue.lastUpdated)} + ${issue.assignee ? ` • Assigned to ${escapeHtml(issue.assignee)}` : ''} +
+
+
+ `; + } + + function renderIssues() { + if (filteredIssues.length === 0) { + issuesGrid.innerHTML = '

No issues found matching your filters.

'; + return; + } + + issuesGrid.innerHTML = filteredIssues.map(createIssueCard).join(''); + } + + // Escape HTML to prevent XSS + function escapeHtml(text) { + if (!text) return ''; + const div = document.createElement('div'); + div.textContent = text.toString(); + return div.innerHTML; + } + + function formatDate(dateString) { + if (!dateString) return 'N/A'; + try { + const date = new Date(dateString); + return date.toLocaleDateString(); + } catch (e) { + return 'Invalid Date'; + } + } + + if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', init); + } else { + init(); + } + + })(); \ No newline at end of file diff --git a/config/updateIssuePool.js b/config/updateIssuePool.js new file mode 100644 index 00000000..2dd3fbac --- /dev/null +++ b/config/updateIssuePool.js @@ -0,0 +1,182 @@ +const fs = require("fs").promises +const path = require('path') + +const CONFIG = { + repoFilePath: path.resolve(__dirname, "../codegov.json"), + issueFilePath: path.resolve(__dirname, "../issue-pool.json"), + regex: /https?:\/\/github\.com\/([^\/]+)\/([^\/]+)/, + githubToken: process.env.GITHUB_TOKEN, + requiredLabel: 'code-gov' +} + +// #region - Helper Functions +const getHeaders = () => { + const HEADERS = { + 'Accept': 'application/vnd.github.v3+json', + 'User-Agent': 'CodeGov-Issue-Pool-Updater', + 'Authorization': `token ${CONFIG.githubToken}` + } + return HEADERS +} + +async function getRepoInfo() { // dont know how i feel about this double loop setup... + let repoInfo = [] + + try { + const content = await fs.readFile(CONFIG.repoFilePath, "utf-8") // filter by tier 3 maturity to get the projects that truly want outside help + const jsonData = JSON.parse(content) + + for (const agencyKey in jsonData) { + const agency = jsonData[agencyKey] + + if (agency.releases) { + for (const organization of agency.releases) { + + if (organization.repositoryURL) { + const match = organization.repositoryURL.match(CONFIG.regex) + const [url, owner, repo] = match + + repoInfo.push({ + ownerName: owner, + repoName: repo + }) + } + } + } + } + } catch (error) { + console.error("Error in getting repo information:", error) + } + + // console.log(repoInfo) + return repoInfo +} + +function daysBetween(date1, date2) { + const diffTime = Math.abs(date2 - date1) + return Math.ceil(diffTime / (1000 * 60 * 60 * 24)) +} + +function checkLabelKeywords(labels, keywords) { + return labels.some(label => + keywords.some(keyword => + label.name.toLowerCase().includes(keyword.toLowerCase()) + ) + ) +} + +function transformIssue(issue, repo, repoLanguage) { + const now = new Date() + const createdDate = new Date(issue.created_at) + const updatedDate = new Date(issue.updated_at) + + const labelNames = issue.labels.map(label => label.name) + + return { + id: String(issue.id), + number: issue.number, + url: issue.html_url, + content_title: issue.title || "", + content_description: issue.body || "", + repo_name: repo.repoName, + repo_url: `https://github.com/${repo.ownerName}/${repo.repoName}`, + repo_language: repoLanguage || "", + repo_owner: repo.ownerName, + status_is_open: issue.state === 'open', + status_has_assignee: issue.assignee !== null, + status_is_locked: issue.locked, + time_created_date: issue.created_at, + time_last_updated: issue.updated_at, + time_days_old: daysBetween(createdDate, now), + time_last_activity_days_ago: daysBetween(updatedDate, now), + people_author: issue.user?.login || "", + people_assignee: issue.assignee?.login || null, + people_author_type: issue.user?.type || "", + labels_list: labelNames, + labels_count: labelNames.length, + labels_has_priority: checkLabelKeywords(issue.labels, ['priority', 'p0', 'p1', 'p2', 'urgent']), + labels_has_difficulty: checkLabelKeywords(issue.labels, ['difficulty', 'easy', 'medium', 'hard', 'beginner']), + engagement_comment_count: issue.comments || 0, + engagement_reaction_count: issue.reactions?.total_count || 0, + engagement_score: (issue.comments || 0) + (issue.reactions?.total_count || 0), + flags_is_beginner_friendly: checkLabelKeywords(issue.labels, ['beginner', 'good first issue', 'easy', 'starter']), + flags_needs_help: checkLabelKeywords(issue.labels, ['help wanted', 'needs help', 'assistance']), + flags_is_bug: checkLabelKeywords(issue.labels, ['bug', 'defect', 'error']), + flags_is_feature: checkLabelKeywords(issue.labels, ['feature', 'enhancement', 'feature request']), + flags_is_stale: checkLabelKeywords(issue.labels, ['stale', 'wontfix', 'abandoned']) + } +} + +// #region - Main Function +async function updateIssuePool() { + const issuePool = {} + const repoInfo = await getRepoInfo() + const headers = getHeaders() + + for (let i = 0; i < repoInfo.length; i++) { // switch to a forOf loop here? + const repo = repoInfo[i] + + try { + const repoUrl = `https://api.github.com/repos/${repo.ownerName}/${repo.repoName}` + const repoResponse = await fetch(repoUrl, { headers }) + + if (!repoResponse.ok) { + console.error(`Failed to fetch repo info for ${repo.ownerName}/${repo.repoName}: ${repoResponse.status}`) + continue + } + + const repoData = await repoResponse.json() + const repoLanguage = repoData.language || "" + + let page = 1 + let hasMore = true + + while (hasMore) { + const issuesUrl = `https://api.github.com/repos/${repo.ownerName}/${repo.repoName}/issues?page=${page}&per_page=100&state=open&labels=${CONFIG.requiredLabel}` + const issuesResponse = await fetch(issuesUrl, { headers }) + + if (!issuesResponse.ok) { + console.error(`Failed to fetch issues for ${repo.ownerName}/${repo.repoName}: ${issuesResponse.status}`) + break + } + + const issues = await issuesResponse.json() + + // endpoint always returns both issues and pull requests so we ignore the PRs + for (const issue of issues) { + if (issue.pull_request) { + continue + } + + + const transformedIssue = transformIssue(issue, repo, repoLanguage) + issuePool[transformedIssue.id] = transformedIssue // is having the ID is the best key name? + } + + if (issues.length < 100) { + hasMore = false + } + + page++ + } + + console.log(`✅ Processed ${i + 1}/${repoInfo.length}: ${repo.ownerName}/${repo.repoName}`) + + } catch (error) { + console.error(`❌ Error processing ${repo.ownerName}/${repo.repoName}:`, error) + continue + } + } + + try { + await fs.writeFile(CONFIG.issueFilePath, JSON.stringify(issuePool, null, 2)) + console.log(`Successfully saved issues!`) + } catch (error) { + console.error("Error saving issue pool:", error) + } + + return issuePool +} + +// getRepoInfo() +updateIssuePool() \ No newline at end of file diff --git a/content/issues/index.md b/content/issues/index.md new file mode 100644 index 00000000..272caeee --- /dev/null +++ b/content/issues/index.md @@ -0,0 +1,23 @@ +--- +title: Open Issues +description: 'Browse open source issues from federal government projects' +permalink: /issues/ +layout: layouts/page +tags: codegov +eleventyNavigation: + parent: codegov-issues + key: codegov-issues-main + order: 1 + title: Open Issues +sidenav: false +sticky_sidenav: false +templateEngineOverride: liquid, html +--- + +
+{% include "filters.html", filterTarget: "issues" %} +
+
+ + + \ No newline at end of file diff --git a/index.html b/index.html index aa298ccd..82678399 100644 --- a/index.html +++ b/index.html @@ -80,5 +80,37 @@

MISSION

+
+
+
+

Find Ways to Contribute

+

+ Browse federal open source projects and discover issues where your skills can make a difference +

+
+ {% image_with_class "assets/resources/img/homepage/mission_icon_sm.png" "contribute_icon_sm-img" "Contribute icon" %} +
+

EXPLORE OPPORTUNITIES

+

+ Search through issues from federal repositories, filter by popularity or difficulty, and find ways to contribute to government open source technology +

+
+
+
+ {% image_with_class "assets/resources/img/homepage/vision_icon_sm.png" "labels_icon_sm-img" "Labels icon" %} +
+

OPT-IN WITH LABELS

+

+ Repository maintainers can include their projects by adding a code-gov label + to GitHub issues, making them discoverable to developers ready to contribute +

+
+
+
+ Browse Issues +
+
+
+
\ No newline at end of file diff --git a/issue-pool.json b/issue-pool.json new file mode 100644 index 00000000..14d327e0 --- /dev/null +++ b/issue-pool.json @@ -0,0 +1,72 @@ +{ + "3169231016": { + "id": "3169231016", + "number": 239, + "url": "https://github.com/DSACMS/dedupliFHIR/issues/239", + "content_title": "TEST ISSUE FOR code-gov", + "content_description": "TEST ISSUE FOR code-gov", + "repo_name": "dedupliFHIR", + "repo_url": "https://github.com/DSACMS/dedupliFHIR", + "repo_language": "Python", + "repo_owner": "DSACMS", + "status_is_open": true, + "status_has_assignee": false, + "status_is_locked": false, + "time_created_date": "2025-06-23T19:26:03Z", + "time_last_updated": "2025-06-23T19:26:03Z", + "time_days_old": 1, + "time_last_activity_days_ago": 1, + "people_author": "sachin-panayil", + "people_assignee": null, + "people_author_type": "User", + "labels_list": [ + "code-gov" + ], + "labels_count": 1, + "labels_has_priority": false, + "labels_has_difficulty": false, + "engagement_comment_count": 0, + "engagement_reaction_count": 0, + "engagement_score": 0, + "flags_is_beginner_friendly": false, + "flags_needs_help": false, + "flags_is_bug": false, + "flags_is_feature": false, + "flags_is_stale": false + }, + "3169232573": { + "id": "3169232573", + "number": 400, + "url": "https://github.com/DSACMS/metrics/issues/400", + "content_title": "TEST ISSUE FOR code-gov", + "content_description": "TEST ISSUE FOR code-gov", + "repo_name": "metrics", + "repo_url": "https://github.com/DSACMS/metrics", + "repo_language": "Liquid", + "repo_owner": "DSACMS", + "status_is_open": true, + "status_has_assignee": false, + "status_is_locked": false, + "time_created_date": "2025-06-23T19:26:47Z", + "time_last_updated": "2025-06-23T19:26:47Z", + "time_days_old": 1, + "time_last_activity_days_ago": 1, + "people_author": "sachin-panayil", + "people_assignee": null, + "people_author_type": "User", + "labels_list": [ + "code-gov" + ], + "labels_count": 1, + "labels_has_priority": false, + "labels_has_difficulty": false, + "engagement_comment_count": 0, + "engagement_reaction_count": 0, + "engagement_score": 0, + "flags_is_beginner_friendly": false, + "flags_needs_help": false, + "flags_is_bug": false, + "flags_is_feature": false, + "flags_is_stale": false + } +} \ No newline at end of file diff --git a/test-agency-indexes/GSA-code.json b/test-agency-indexes/GSA-code.json deleted file mode 100644 index 59e63f24..00000000 --- a/test-agency-indexes/GSA-code.json +++ /dev/null @@ -1,305 +0,0 @@ -{ - "agency": "GSA", - "version": "1.0.0", - "measurementType": { - "method": "projects" - }, - "releases": [ - { - "organization": "GSA Technology Transformation Services", - "name": "uswds", - "description": "The U.S. Web Design System", - "longDescription": "A design system for the federal government that helps agencies create consistent, professional, and trustworthy digital services for the American public.", - "status": "Production", - "permissions": { - "license": [ - { - "name": "MIT License", - "URL": "https://github.com/uswds/uswds/blob/develop/LICENSE.md" - } - ], - "usageType": "openSource", - "exemptionText": "" - }, - "repositoryURL": "https://github.com/uswds/uswds", - "vcs": "git", - "laborHours": 22540, - "platforms": [ - "web" - ], - "categories": [ - "front-end-development", - "design", - "accessibility" - ], - "softwareType": "standalone/web", - "languages": [ - "JavaScript", - "SCSS", - "HTML" - ], - "maintenance": "internal", - "date": { - "created": "2015-09-28T18:12:32Z", - "lastModified": "2025-04-15T16:45:21Z", - "metaDataLastUpdated": "2025-04-15T16:48:36.123Z" - }, - "tags": [ - "design-system", - "federal", - "accessibility" - ], - "contact": { - "email": "uswds@gsa.gov", - "name": "U.S. Web Design System Team" - }, - "localisation": true, - "repositoryType": "framework", - "userInput": "No", - "fismaLevel": "Low", - "group": "GSA/TTS", - "subsetInGovernment": "Operational", - "userType": "Government", - "repositoryHost": "Github.com", - "maturityModelTier": 4, - "projectType": "Framework" - }, - { - "organization": "GSA Technology Transformation Services", - "name": "search-gov", - "description": "Search.gov powers federal agency search boxes", - "longDescription": "Search.gov is a government-wide service that provides search functionality for federal websites. It helps agencies provide more accurate search results to public users and eliminates the need to build and maintain their own search infrastructure.", - "status": "Production", - "permissions": { - "license": [ - { - "name": "Creative Commons Zero v1.0 Universal", - "URL": "https://github.com/GSA/search-gov/blob/main/LICENSE.md" - } - ], - "usageType": "openSource", - "exemptionText": "" - }, - "repositoryURL": "https://github.com/GSA/search-gov", - "vcs": "git", - "laborHours": 18320, - "platforms": [ - "web" - ], - "categories": [ - "search", - "application-development" - ], - "softwareType": "standalone/web", - "languages": [ - "Ruby", - "JavaScript", - "CSS", - "HTML" - ], - "maintenance": "internal", - "date": { - "created": "2017-12-08T17:18:22Z", - "lastModified": "2025-03-28T14:12:18Z", - "metaDataLastUpdated": "2025-03-28T14:15:45.897Z" - }, - "tags": [ - "search", - "government", - "federalist" - ], - "contact": { - "email": "search@gsa.gov", - "name": "Search.gov Team" - }, - "localisation": true, - "repositoryType": "application", - "userInput": "Yes", - "fismaLevel": "Moderate", - "group": "GSA/TTS", - "subsetInGovernment": "Service", - "userType": "Government", - "repositoryHost": "Github.com", - "maturityModelTier": 4, - "projectType": "Service" - }, - { - "organization": "GSA 18F", - "name": "federalist", - "description": "Cloud-based government publishing made easy", - "longDescription": "Federalist is a publishing platform for federal government websites. It enables agencies to focus on creating useful content while providing a smooth path to launching a live, compliant website with no technical development needed on the agency's side.", - "status": "Production", - "permissions": { - "license": [ - { - "name": "CC0 1.0 Universal", - "URL": "https://github.com/18F/federalist/blob/main/LICENSE.md" - } - ], - "usageType": "openSource", - "exemptionText": "" - }, - "repositoryURL": "https://github.com/18F/federalist", - "vcs": "git", - "laborHours": 15840, - "platforms": [ - "web" - ], - "categories": [ - "web-publishing", - "content-management", - "cloud-hosting" - ], - "softwareType": "standalone/web", - "languages": [ - "JavaScript", - "Node.js", - "React" - ], - "maintenance": "internal", - "date": { - "created": "2015-04-16T21:34:51Z", - "lastModified": "2025-04-12T18:29:36Z", - "metaDataLastUpdated": "2025-04-12T18:32:14.329Z" - }, - "tags": [ - "publishing", - "static-sites", - "government" - ], - "contact": { - "email": "federalist-support@gsa.gov", - "name": "Federalist Team" - }, - "localisation": false, - "repositoryType": "application", - "userInput": "Yes", - "fismaLevel": "Moderate", - "group": "GSA/18F", - "subsetInGovernment": "Service", - "userType": "Government", - "repositoryHost": "Github.com", - "maturityModelTier": 4, - "projectType": "Service" - }, - { - "organization": "GSA Technology Transformation Services", - "name": "code-gov-front-end", - "description": "Website for the federal government's code sharing platform", - "longDescription": "The frontend for Code.gov, the federal government's code sharing platform to enable sharing and improvement of government code. This site helps agencies share open source code and comply with federal policy on code reuse.", - "status": "Production", - "permissions": { - "license": [ - { - "name": "MIT License", - "URL": "https://github.com/GSA/code-gov-front-end/blob/master/LICENSE.md" - } - ], - "usageType": "openSource", - "exemptionText": "" - }, - "repositoryURL": "https://github.com/GSA/code-gov-front-end", - "vcs": "git", - "laborHours": 8760, - "platforms": [ - "web" - ], - "categories": [ - "code-sharing", - "open-source-management" - ], - "softwareType": "standalone/web", - "languages": [ - "JavaScript", - "React", - "SCSS", - "HTML" - ], - "maintenance": "internal", - "date": { - "created": "2018-12-19T15:36:12Z", - "lastModified": "2025-04-02T20:15:18Z", - "metaDataLastUpdated": "2025-04-02T20:18:42.555Z" - }, - "tags": [ - "code-gov", - "open-source", - "federal-source-code-policy" - ], - "contact": { - "email": "code@gsa.gov", - "name": "Code.gov Team" - }, - "localisation": false, - "repositoryType": "website", - "userInput": "No", - "fismaLevel": "Low", - "group": "GSA/TTS", - "subsetInGovernment": "Operational", - "userType": "Government", - "repositoryHost": "Github.com", - "maturityModelTier": 3, - "projectType": "Website" - }, - { - "organization": "GSA Office of CIO", - "name": "grace-ansible", - "description": "GSA Reusable Ansible Components and Extensions", - "longDescription": "GRACE Ansible is a collection of reusable Ansible code components developed by GSA for managing cloud infrastructure. It enables automation of infrastructure deployment and configuration across different environments while following security best practices.", - "status": "Production", - "permissions": { - "license": [ - { - "name": "CC0 1.0 Universal", - "URL": "https://github.com/GSA/grace-ansible/blob/main/LICENSE.md" - } - ], - "usageType": "openSource", - "exemptionText": "" - }, - "repositoryURL": "https://github.com/GSA/grace-ansible", - "vcs": "git", - "laborHours": 6240, - "platforms": [ - "linux", - "cloud" - ], - "categories": [ - "devops", - "infrastructure-as-code", - "configuration-management" - ], - "softwareType": "standalone/other", - "languages": [ - "YAML", - "Python", - "Shell" - ], - "maintenance": "internal", - "date": { - "created": "2019-02-27T18:24:46Z", - "lastModified": "2025-03-18T16:42:37Z", - "metaDataLastUpdated": "2025-03-18T16:45:14.888Z" - }, - "tags": [ - "ansible", - "cloud", - "automation" - ], - "contact": { - "email": "grace-support@gsa.gov", - "name": "GRACE Team" - }, - "localisation": false, - "repositoryType": "tools", - "userInput": "No", - "fismaLevel": "Low", - "group": "GSA/OCIO", - "subsetInGovernment": "Infrastructure", - "userType": "Government", - "repositoryHost": "Github.com", - "maturityModelTier": 3, - "projectType": "Tools" - } - ] - } \ No newline at end of file diff --git a/test-agency-indexes/HHS-code.json b/test-agency-indexes/HHS-code.json deleted file mode 100644 index f2782fcb..00000000 --- a/test-agency-indexes/HHS-code.json +++ /dev/null @@ -1,305 +0,0 @@ -{ - "agency": "HHS", - "version": "1.0.0", - "measurementType": { - "method": "projects" - }, - "releases": [ - { - "organization": "Centers for Medicare & Medicaid Services", - "name": "open", - "description": "Repo Visualizations", - "longDescription": "First Iteration of Metrics Visualizations Site", - "status": "Archival", - "permissions": { - "license": [ - { - "name": "CC0 1.0 Universal", - "URL": "https://github.com/DSACMS/open/blob/main/LICENSE.md" - } - ], - "usageType": "openSource", - "exemptionText": "" - }, - "repositoryURL": "https://github.com/DSACMS/open", - "vcs": "git", - "laborHours": 3139, - "platforms": [ - "web" - ], - "categories": [ - "data-analytics", - "data-collection", - "data-visualization" - ], - "softwareType": "standalone/web", - "languages": [ - "JavaScript", - "Liquid" - ], - "maintenance": "internal", - "date": { - "created": "2023-06-06T16:35:30Z", - "lastModified": "2025-02-11T21:18:36Z", - "metaDataLastUpdated": "2025-02-11T21:20:46.666Z" - }, - "tags": [ - "metrics", - "ospo", - "repository" - ], - "contact": { - "email": "opensource@cms.hhs.gov", - "name": "CMS/OA/DSAC" - }, - "localisation": false, - "repositoryType": "", - "userInput": "No", - "fismaLevel": "Low", - "group": "CMS/OA/DSAC", - "subsetInHealthcare": "Operational", - "userType": "Government", - "repositoryHost": "Github.com", - "maturityModelTier": 2, - "projectType": "Website" - }, - { - "organization": "Centers for Medicare & Medicaid Services", - "name": "dsacms.github.io", - "description": "Landing Page for DSACMS GitHub Organization", - "longDescription": "We're a group of civic-minded technologists transforming how the federal government delivers healthcare to the American people. The Digital Service at CMS (DSAC) consists of engineers, designers, and product managers—serving our country by building and maintaining the technology underpinning our national health care programs.", - "status": "Production", - "permissions": { - "license": [ - { - "name": "CC0 1.0 Universal", - "URL": "https://github.com/DSACMS/dsacms.github.io/blob/main/LICENSE.md#license" - } - ], - "usageType": "openSource", - "exemptionText": "" - }, - "repositoryURL": "https://github.com/DSACMS/dsacms.github.io", - "vcs": "git", - "laborHours": 2392, - "platforms": [ - "web" - ], - "categories": [ - "communications" - ], - "softwareType": "standalone/other", - "languages": [ - "Shell" - ], - "maintenance": "internal", - "date": { - "created": "2023-06-06T17:27:47Z", - "lastModified": "2025-02-13T20:59:29Z", - "metaDataLastUpdated": "2025-02-13T21:01:14.296Z" - }, - "tags": [ - "repository", - "comms" - ], - "contact": { - "email": "opensource@cms.hhs.gov", - "name": "CMS Open Source Team" - }, - "localisation": false, - "repositoryType": "data", - "userInput": false, - "fismaLevel": "low", - "group": "CMS/OA/DSAC", - "subsetInHealthcare": [ - "operational" - ], - "userType": [ - "government" - ], - "repositoryHost": "github.com/DSACMS", - "maturityModelTier": 2 - }, - { - "organization": "Centers for Medicare & Medicaid Services", - "name": "dedupliFHIR", - "description": "Prototype for basic deduplication and aggregation of eCQM data", - "longDescription": "A CLI bundled with an electron front-end that provides data-linkage and AI deduplication for reported ACO data at scale.", - "status": "Production", - "permissions": { - "license": [ - { - "name": "CC0 1.0 Universal", - "URL": "https://github.com/DSACMS/dedupliFHIR/blob/main/LICENSE" - } - ], - "usageType": "openSource", - "exemptionText": "" - }, - "repositoryURL": "https://github.com/DSACMS/dedupliFHIR", - "vcs": "git", - "laborHours": 4252, - "platforms": [ - "windows", - "mac", - "linux" - ], - "categories": [ - "data-analytics", - "application-development", - "data-collection" - ], - "softwareType": "standalone/desktop", - "languages": [ - "Python", - "JavaScript", - "HTML", - "CSS", - "Shell", - "Makefile" - ], - "maintenance": "internal", - "date": { - "created": "2023-06-22T17:08:19Z", - "lastModified": "2025-02-10T19:13:19Z", - "metaDataLastUpdated": "2025-02-10T19:14:29.970Z" - }, - "tags": [ - "AI", - "deduplication", - "data", - "ACA", - "FHIR" - ], - "contact": { - "email": "opensource@cms.hhs.gov", - "name": "CMS Open Source Team" - }, - "localisation": false, - "repositoryType": "application", - "userInput": "Yes", - "fismaLevel": "Moderate", - "group": "CMS/OA/DSAC", - "subsetInHealthcare": "Operational", - "userType": "Providers", - "repositoryHost": "Github.com", - "maturityModelTier": "3", - "projectType": "Tools" - }, - { - "organization": "Centers for Medicare & Medicaid Services", - "name": "opportunities", - "description": "Resource for Public Service Internship and Fellowship Opportunities", - "longDescription": "This page shares currently active opportunities for recurring fellowship and internships, related to data science or technology, for work in the U.S. Department of Health and Human Services (HHS). The people of HHS are essential to its vision of making data meaningfully usable and actively used across the Department. Fellowships and internships provide a unique opportunity to learn about government work and to contribute to HHS’ mission of enhancing the health and well-being of all Americans.", - "status": "Production", - "permissions": { - "license": [ - { - "name": "CC0 1.0 Universal", - "URL": "https://github.com/DSACMS/opportunities/blob/main/LICENSE.md" - } - ], - "usageType": "openSource", - "exemptionText": "" - }, - "repositoryURL": "https://github.com/DSACMS/opportunities", - "vcs": "git", - "laborHours": 1460, - "platforms": [ - "web" - ], - "categories": [ - "educational-content", - "talent-management" - ], - "softwareType": "standalone/web", - "languages": [ - "HTML", - "CSS" - ], - "maintenance": "internal", - "date": { - "created": "2023-06-29T15:55:54Z", - "lastModified": "2025-02-12T02:50:47Z", - "metaDataLastUpdated": "2025-02-12T02:52:38.555Z" - }, - "tags": [ - "repository" - ], - "contact": { - "email": "opensource@cms.hhs.gov", - "name": "CMS/OA/DSAC" - }, - "localisation": false, - "repositoryType": "website", - "userInput": false, - "fismaLevel": "low", - "group": "CMS/OA/DSAC", - "subsetInHealthcare": "Operational", - "userType": "Government", - "repositoryHost": "Github.com", - "maturityModelTier": 2, - "projectType": "Website" - }, - { - "organization": "Centers for Medicare & Medicaid Services", - "name": "metrics", - "description": "Experimentations in Open Source Repository Metrics", - "longDescription": "The CMS Repository Metrics Website shows an overview of software development activity across open source projects within a specified organization. This webpage is meant to be used by developers and program managers interested in repository health within CMS open source projects.", - "status": "Production", - "permissions": { - "license": [ - { - "name": "CC0 1.0 Universal", - "URL": "https://github.com/DSACMS/metrics/blob/main/LICENSE.md" - } - ], - "usageType": "openSource", - "exemptionText": "" - }, - "repositoryURL": "https://github.com/DSACMS/metrics", - "vcs": "git", - "laborHours": 20475, - "platforms": [ - "web" - ], - "categories": [ - "data-visualization", - "data-analytics" - ], - "softwareType": "standalone/web", - "languages": [ - "Liquid", - "JavaScript", - "CSS", - "Shell", - "Python" - ], - "maintenance": "internal", - "date": { - "created": "2023-07-18T14:10:58Z", - "lastModified": "2025-02-11T19:10:14Z", - "metaDataLastUpdated": "2025-02-11T19:20:16.212Z" - }, - "tags": [ - "metrics", - "ospo", - "repository" - ], - "contact": { - "email": "opensource@cms.hhs.gov", - "name": "CMS/OA/DSAC" - }, - "localisation": false, - "repositoryType": "website", - "userInput": "No", - "fismaLevel": "Low", - "group": "CMS/OA/DSAC", - "subsetInHealthcare": "Operational", - "userType": "Government", - "repositoryHost": "Github.com", - "maturityModelTier": 3, - "projectType": "Website" - } - ] - } \ No newline at end of file