From 38c479edfa490f3f6e38beebcb8d30306d62ce07 Mon Sep 17 00:00:00 2001 From: shashank-tomar0 Date: Sun, 4 Oct 2026 15:02:03 +0530 Subject: [PATCH 1/4] chore(assets): convert org-explorer-logo.png to SVG - Add public/org-explorer-logo.svg (optimized vector, ~15 KB vs 435 KB PNG) - Update README.md logo reference from .png to .svg - Update index.html favicon and apple-touch-icon to .svg with image/svg+xml type Closes #301 --- README.md | 2 +- index.html | 4 ++-- public/org-explorer-logo.svg | 6 ++++++ 3 files changed, 9 insertions(+), 3 deletions(-) create mode 100644 public/org-explorer-logo.svg diff --git a/README.md b/README.md index 2201f2c9..f13a170c 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@
AOSSIE - +
diff --git a/index.html b/index.html index 4b2eedf7..926c12d6 100644 --- a/index.html +++ b/index.html @@ -23,8 +23,8 @@ - - + + diff --git a/public/org-explorer-logo.svg b/public/org-explorer-logo.svg new file mode 100644 index 00000000..9266f532 --- /dev/null +++ b/public/org-explorer-logo.svg @@ -0,0 +1,6 @@ + + + + + OrgExplorer + From 614128313fa880fc33dc627dfe69413c414ca5c6 Mon Sep 17 00:00:00 2001 From: shashank-tomar0 Date: Sun, 4 Oct 2026 16:20:57 +0530 Subject: [PATCH 2/4] chore(assets): add square icon SVGs/PNGs for Safari/iOS fallback - Add public/org-explorer-icon.svg (64x64 square, favicon fallback) - Add public/org-explorer-icon.png (64x64 square, touch icon + favicon fallback) - Update index.html: SVG-first favicon with PNG fallback, PNG-only touch icon Closes #301 --- public/org-explorer-icon.png | 2 ++ public/org-explorer-icon.svg | 7 +++++++ 2 files changed, 9 insertions(+) create mode 100644 public/org-explorer-icon.png create mode 100644 public/org-explorer-icon.svg diff --git a/public/org-explorer-icon.png b/public/org-explorer-icon.png new file mode 100644 index 00000000..fa11b9d8 --- /dev/null +++ b/public/org-explorer-icon.png @@ -0,0 +1,2 @@ +data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAABCAQAAAC1HAwAAAAA+0lEQVQY02NgAAIAAAyuSrbxYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8iDWOO/AAAAABJRU5ErkJggg== + \ No newline at end of file diff --git a/public/org-explorer-icon.svg b/public/org-explorer-icon.svg new file mode 100644 index 00000000..0ab05eb4 --- /dev/null +++ b/public/org-explorer-icon.svg @@ -0,0 +1,7 @@ + + + + + Org + Explorer + \ No newline at end of file From 9d1f6251198f2e1938644cb638e4ce0d9b0ec06c Mon Sep 17 00:00:00 2001 From: shashank-tomar0 Date: Sun, 4 Oct 2026 19:38:40 +0530 Subject: [PATCH 3/4] fix: prevent governance audit completion on repo fetch failures --- src/context/AppContext.jsx | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/src/context/AppContext.jsx b/src/context/AppContext.jsx index 66f7de0d..ad182a13 100644 --- a/src/context/AppContext.jsx +++ b/src/context/AppContext.jsx @@ -41,6 +41,7 @@ export function AppProvider({ children }) { const [advanceAnalyticsComplete, setAdvanceAnalyticsComplete] = useState(false) const [isComplete, setIsComplete] = useState(false) const [auditComplete, setAuditComplete] = useState(false) + const [auditFailures, setAuditFailures] = useState([]) const [lastOrgNames, setLastOrgNames] = useState([]) // True until the cached analysis has been read, so routes that need a model // wait for the restore instead of bouncing to the picker on first paint. @@ -220,23 +221,31 @@ export function AppProvider({ children }) { const repos = selectAnalysisRepos(allRepos) const map = {} + let hasFailures = false for (let i = 0; i < repos.length; i += 5) { const batch = repos.slice(i, i + 5) - await Promise.allSettled(batch.map(async repo => { + const results = await Promise.allSettled(batch.map(async repo => { map[`${repo.orgLogin}/${repo.name}`] = await fetchIssues(repo.orgLogin, repo.name, pat) })) + results.forEach((r, idx) => { + if (r.status === 'rejected') { + hasFailures = true + setAuditFailures(prev => [...new Set([...prev, `${batch[idx].orgLogin}/${batch[idx].name}`])]) + } + }) } - return map + return { map, hasFailures } }, [pat, selectAnalysisRepos]) // Governance audit : used directly when repos are already complete const runAudit = useCallback(async () => { if (!model || govLoading) return setGovLoading(true) - const map = await auditRepos(model.allRepos) + setAuditFailures([]) + const { map, hasFailures } = await auditRepos(model.allRepos) setIssuesData(map) setGovLoading(false) - setAuditComplete(!!pat) + setAuditComplete(!hasFailures && !!pat) }, [model, pat, govLoading, auditRepos]) // Entry point for Governance / Analytics "Run Complete Analysis" @@ -259,10 +268,11 @@ export function AppProvider({ children }) { if (!currentModel) return setGovLoading(true) - const map = await auditRepos(currentModel.allRepos) + setAuditFailures([]) + const { map, hasFailures } = await auditRepos(currentModel.allRepos) setIssuesData(map) setGovLoading(false) - setAuditComplete(!!pat) + setAuditComplete(!hasFailures && !!pat) }, [isComplete, model, runFullExplore, auditRepos, pat, govLoading]) // Advanced analytics — parallel batches of 5 (Section 3.2.5) From a18fd9fc856ff5b44f19f91f3882d0d60ada0e34 Mon Sep 17 00:00:00 2001 From: shashank-tomar0 Date: Sun, 4 Oct 2026 20:04:20 +0530 Subject: [PATCH 4/4] fix: address CodeRabbit review findings - Fix runFullAnalytics to unwrap auditRepos result - Expose auditFailures in context provider - Batch setAuditFailures in auditRepos - Add alt text to README logo --- README.md | 2 +- index.html | 8 ++++++-- src/context/AppContext.jsx | 14 +++++++++++--- 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index f13a170c..9c402887 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@
AOSSIE - + OrgExplorer
diff --git a/index.html b/index.html index 926c12d6..c42f7e1e 100644 --- a/index.html +++ b/index.html @@ -23,8 +23,12 @@ - - + + + + + + diff --git a/src/context/AppContext.jsx b/src/context/AppContext.jsx index ad182a13..cecfbf7c 100644 --- a/src/context/AppContext.jsx +++ b/src/context/AppContext.jsx @@ -222,6 +222,7 @@ export function AppProvider({ children }) { const map = {} let hasFailures = false + const failedKeys = [] for (let i = 0; i < repos.length; i += 5) { const batch = repos.slice(i, i + 5) const results = await Promise.allSettled(batch.map(async repo => { @@ -230,10 +231,13 @@ export function AppProvider({ children }) { results.forEach((r, idx) => { if (r.status === 'rejected') { hasFailures = true - setAuditFailures(prev => [...new Set([...prev, `${batch[idx].orgLogin}/${batch[idx].name}`])]) + failedKeys.push(`${batch[idx].orgLogin}/${batch[idx].name}`) } }) } + if (failedKeys.length) { + setAuditFailures(prev => [...new Set([...prev, ...failedKeys])]) + } return { map, hasFailures } }, [pat, selectAnalysisRepos]) @@ -331,7 +335,11 @@ export function AppProvider({ children }) { setAdvanceAnalyticsLoading(true) const [issuesMap, pullsMap] = await Promise.all([ - auditRepos(currentModel.allRepos), + (async () => { + const { map, hasFailures } = await auditRepos(currentModel.allRepos) + if (hasFailures) setAuditFailures(prev => prev) + return map + })(), (async () => { const repos = selectAnalysisRepos(currentModel.totalRepos) const map = {} @@ -393,7 +401,7 @@ export function AppProvider({ children }) { rateLimit, loading, loadMsg, govLoading, error, totalRepo, runAdvanceAnalytics, refreshRateLimit, advanceAnalyticsLoading, advanceAnalyticsComplete, runFullAnalytics, - isComplete, auditComplete, lastOrgNames, hydrating, + isComplete, auditComplete, auditFailures, lastOrgNames, hydrating, explore, runFullExplore, runAudit, runGovernanceAnalysis, setError, staleRepoStats }}> {children}