Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 4 additions & 15 deletions .github/workflows/deploy-pages.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
name: Deploy to GitHub Pages
name: Redirect legacy GitHub Pages URL

on:
push:
Expand All @@ -15,35 +15,24 @@ concurrency:
cancel-in-progress: true

jobs:
build:
prepare:
runs-on: ubuntu-latest
steps:
- name: Check out repository
uses: actions/checkout@v4
- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: 22
cache: npm
- name: Install dependencies
run: npm ci
- name: Build static site
run: npm run build
env:
VITE_BASE_PATH: /${{ github.event.repository.name }}/
- name: Configure Pages
uses: actions/configure-pages@v5
- name: Upload Pages artifact
uses: actions/upload-pages-artifact@v3
with:
path: dist
path: redirect

deploy:
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
runs-on: ubuntu-latest
needs: build
needs: prepare
steps:
- name: Deploy to GitHub Pages
id: deployment
Expand Down
6 changes: 4 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,11 @@ All notable changes to RepoReady are documented here. The project follows [Seman

## [Unreleased]

### Planned
### Changed

- First public deployment to GitHub Pages.
- Moved the live application to the nested portfolio route at `https://aminhanifm.github.io/projects/repo-ready/`.
- Kept the legacy repository Pages URL as a redirect.
- Replaced em dashes throughout project copy and generated Markdown reports.

## [1.0.0] - 2026-07-20

Expand Down
9 changes: 3 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

RepoReady is an open-source, browser-only readiness report for public GitHub repositories. It gives maintainers, contributors, recruiters, and users an evidence-based answer to a practical question: **is this repository understandable, trustworthy, maintainable, and ready to share publicly?**

[Live demo](https://aminhanifm.github.io/RepoReady/) · [Scoring methodology](SCORING.md) · [Report an issue](https://github.com/aminhanifm/RepoReady/issues)
[Live demo](https://aminhanifm.github.io/projects/repo-ready/) · [Scoring methodology](SCORING.md) · [Report an issue](https://github.com/aminhanifm/RepoReady/issues)

![RepoReady showing the bundled CSV Health readiness report](docs/screenshots/repo-ready-overview.png)

Expand Down Expand Up @@ -117,14 +117,11 @@ The build is a static Vite bundle. `VITE_BASE_PATH` controls asset URLs:
# Root domain
VITE_BASE_PATH=/ npm run build

# GitHub repository Pages
VITE_BASE_PATH=/RepoReady/ npm run build

# Nested portfolio route
VITE_BASE_PATH=/tools/repo-ready/ npm run build
VITE_BASE_PATH=/projects/repo-ready/ npm run build
```

The included Pages workflow derives the repository base path automatically. In GitHub, choose **Settings → Pages → Build and deployment → Source: GitHub Actions** before the first deployment.
The live application is built into the portfolio Pages artifact at `/projects/repo-ready/`. The included Pages workflow keeps the legacy `/RepoReady/` URL available as a redirect. In both repositories, choose **Settings → Pages → Build and deployment → Source: GitHub Actions** before the first deployment.

## Known limitations

Expand Down
10 changes: 5 additions & 5 deletions SCORING.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ Recommendations come only from failed checks, are ordered by points descending,
- API-dependent checks become unknown when their endpoint fails, is malformed, or is unavailable. A successful empty response is observable and can fail a check.
- Direct GitHub URLs are attached whenever an exact file, workflow, release, or settings page is known.

## 1. Discoverability — 20 points
## 1. Discoverability: 20 points

| ID | Rule | Points | Passing evidence | Limitations | Why it matters / failed recommendation |
| ----------------------------- | --------------------------------------------- | -----: | -------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
Expand All @@ -47,7 +47,7 @@ Recommendations come only from failed checks, are ordered by points descending,
| `discoverability.homepage` | Homepage or live demo configured | 5 | The repository `homepage` field contains a valid `http` or `https` URL. | RepoReady does not request the URL or verify uptime. | A configured demo lets visitors evaluate the project quickly. Add a working demo or project homepage in repository settings. |
| `discoverability.visual` | README includes a demo link or visual example | 5 | README contains Markdown image syntax, an HTML `<img>` tag, a video/image URL, or a link whose nearby text includes demo, preview, screenshot, video, or live. | Linked media is not fetched and dead links may pass. | A visual example reduces the time needed to understand the result. Add a screenshot, short demo, or clearly labeled live-demo link. |

## 2. Documentation — 25 points
## 2. Documentation: 25 points

| ID | Rule | Points | Passing evidence | Limitations | Why it matters / failed recommendation |
| ---------------------------- | ---------------------------------------- | -----: | ----------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- |
Expand All @@ -58,7 +58,7 @@ Recommendations come only from failed checks, are ordered by points descending,
| `documentation.license` | License is present | 3 | Community profile reports a license or the tree contains `LICENSE`, `LICENSE.md`, `LICENSE.txt`, `COPYING`, or `COPYING.md`. | RepoReady does not interpret compatibility or legal validity. | Without a license, reuse and contribution rights are unclear. Add an appropriate open-source license. |
| `documentation.roadmap` | Limitations or roadmap documented | 2 | README contains a limitations, known issues, caveats, roadmap, future work, or non-goals heading. | RepoReady does not judge completeness or currency. | Explicit boundaries create realistic expectations. Document known limitations, non-goals, or a short roadmap. |

## 3. Engineering quality — 25 points
## 3. Engineering quality: 25 points

| ID | Rule | Points | Passing evidence | Limitations | Why it matters / failed recommendation |
| ---------------------- | ----------------------------------------------------- | -----: | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- |
Expand All @@ -68,7 +68,7 @@ Recommendations come only from failed checks, are ordered by points descending,
| `engineering.lockfile` | Appropriate dependency lockfile exists | 3 | A recognized manifest is paired with the ecosystem’s lockfile: for example `package.json` with npm/yarn/pnpm/bun lock, `Gemfile` with `Gemfile.lock`, or `Cargo.toml` with `Cargo.lock`. Repositories with no recognized dependency manifest are unknown. | Some libraries intentionally omit lockfiles; RepoReady cannot infer every packaging policy. Tree failure makes this unknown. | Lockfiles improve reproducibility for applications. Commit the appropriate lockfile, or document why it is intentionally omitted. |
| `engineering.checks` | Latest observable default-branch checks pass | 3 | The latest commit’s combined status/check runs are observable, contain at least one check, and none are failing, cancelled, or pending. | GitHub may expose no checks to unauthenticated clients; that is unknown, not failed. A conclusively failing or pending check fails. | A green default branch gives visitors a current health signal. Fix or rerun failing default-branch checks. |

## 4. Community readiness — 15 points
## 4. Community readiness: 15 points

| ID | Rule | Points | Passing evidence | Limitations | Why it matters / failed recommendation |
| --------------------------- | ---------------------- | -----: | ------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ |
Expand All @@ -78,7 +78,7 @@ Recommendations come only from failed checks, are ordered by points descending,
| `community.issue_template` | Issue template or form | 2 | A recognized template or YAML form exists under `.github/ISSUE_TEMPLATE/`, or community profile reports issue templates. | Template usefulness is not evaluated. Tree failure makes this unknown unless profile data answers it. | Structured reports provide the context maintainers need. Add a bug report or feature request form. |
| `community.pr_template` | Pull-request template | 2 | A pull-request template exists in the root, `docs/`, or `.github/`, including `.github/PULL_REQUEST_TEMPLATE/`. | Template usefulness is not evaluated. | A checklist improves consistency and review readiness. Add a concise pull-request template. |

## 5. Release readiness — 15 points
## 5. Release readiness: 15 points

| ID | Rule | Points | Passing evidence | Limitations | Why it matters / failed recommendation |
| ------------------------ | --------------------------------------- | -----: | --------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- |
Expand Down
4 changes: 3 additions & 1 deletion index.html
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,9 @@
name="description"
content="RepoReady creates deterministic, evidence-based readiness reports for public GitHub repositories."
/>
<title>RepoReady — Know what your repository communicates</title>
<link rel="canonical" href="https://aminhanifm.github.io/projects/repo-ready/" />
<meta property="og:url" content="https://aminhanifm.github.io/projects/repo-ready/" />
<title>RepoReady | Know what your repository communicates</title>
</head>
<body>
<div id="root"></div>
Expand Down
22 changes: 22 additions & 0 deletions redirect/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="refresh" content="0; url=https://aminhanifm.github.io/projects/repo-ready/" />
<link rel="canonical" href="https://aminhanifm.github.io/projects/repo-ready/" />
<title>RepoReady moved</title>
<script>
const destination = new URL("https://aminhanifm.github.io/projects/repo-ready/");
destination.search = window.location.search;
destination.hash = window.location.hash;
window.location.replace(destination);
</script>
</head>
<body>
RepoReady moved to
<a href="https://aminhanifm.github.io/projects/repo-ready/">
aminhanifm.github.io/projects/repo-ready/
</a>
</body>
</html>
4 changes: 2 additions & 2 deletions src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -197,7 +197,7 @@ function Landing({
<ShieldCheck aria-hidden="true" size={22} />
<p>
RepoReady never uses stars, forks, watchers, or popularity in the score. Unknown
evidence stays unknown—it is never quietly treated as a failure.
evidence stays unknown. It is never quietly treated as a failure.
</p>
<a href={SCORING_URL} target="_blank" rel="noreferrer">
Read the scoring rules <ExternalLink aria-hidden="true" size={13} />
Expand Down Expand Up @@ -249,7 +249,7 @@ function Results({ report, onAnother }: { report: ReadinessReport; onAnother():
{report.source === "fixture" && (
<div className="fixture-banner">
<Sparkles aria-hidden="true" size={17} />
Bundled CSV Health sample — loaded entirely offline with no GitHub API request.
Bundled CSV Health sample, loaded entirely offline with no GitHub API request.
</div>
)}
<RepositorySummary repository={report.repository} />
Expand Down
3 changes: 2 additions & 1 deletion src/components/CheckList.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,8 @@ export function CheckList({ report, category, status, onCategory, onStatus }: Ch
</span>
<span className={`status-pill ${check.status}`}>{check.status}</span>
<span className="check-points">
{check.status === "unknown" ? "—" : check.pointsEarned}/{check.pointsPossible} pts
{check.status === "unknown" ? "N/A" : check.pointsEarned}/{check.pointsPossible}{" "}
pts
</span>
</summary>
<div className="check-details">
Expand Down
2 changes: 1 addition & 1 deletion src/components/RateLimitStatus.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ export function RateLimitStatus({ rateLimit }: { rateLimit: RateLimitInfo | null
<div>
<strong>{exhausted ? "Public API limit exhausted" : "GitHub API allowance"}</strong>
<span>
{rateLimit.remaining ?? "—"} of {rateLimit.limit ?? "—"} requests remaining
{rateLimit.remaining ?? "Unknown"} of {rateLimit.limit ?? "Unknown"} requests remaining
</span>
</div>
<span className="reset-time">
Expand Down
4 changes: 2 additions & 2 deletions src/components/ScoreSummary.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ export function ScoreSummary({ report, onCategory }: ScoreSummaryProps) {
<div className="progress-track" aria-hidden="true">
<span style={{ width: `${report.coverage}%` }} />
</div>
<p>Unknown evidence is excluded—not scored as failure.</p>
<p>Unknown evidence is excluded and not scored as failure.</p>
</div>
</div>

Expand All @@ -64,7 +64,7 @@ export function ScoreSummary({ report, onCategory }: ScoreSummaryProps) {
aria-label={`Filter checks to ${category.title}`}
>
<span>{category.title}</span>
<strong>{category.score === null ? "—" : category.score}</strong>
<strong>{category.score === null ? "N/A" : category.score}</strong>
<small>{category.score === null ? "Unknown" : "out of 100"}</small>
<div className="category-bar" aria-hidden="true">
<span style={{ width: `${category.score ?? 0}%` }} />
Expand Down
4 changes: 2 additions & 2 deletions src/exporters/markdown.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ export function reportToMarkdown(report: ReadinessReport): string {
? report.recommendations
.map(
(item, index) =>
`${index + 1}. **${item.title} (+${item.impact} pts)** — ${item.action}\n - Evidence: ${item.evidence}${item.evidenceUrl ? ` ([source](${item.evidenceUrl}))` : ""}`,
`${index + 1}. **${item.title} (+${item.impact} pts)**: ${item.action}\n - Evidence: ${item.evidence}${item.evidenceUrl ? ` ([source](${item.evidenceUrl}))` : ""}`,
)
.join("\n")
: "No failed observable checks produced recommendations.";
Expand All @@ -36,7 +36,7 @@ export function reportToMarkdown(report: ReadinessReport): string {
- Repository: [${report.repository.fullName}](${report.repository.url})
- Analysis date: ${report.analyzedAt}
- Ruleset: ${report.rulesetVersion}
- Readiness: **${report.score}% — ${report.label}**
- Readiness: **${report.score}%: ${report.label}**
- Scan coverage: **${report.coverage}%**

## Category scores
Expand Down
Loading