Skip to content

Commit 4d0437a

Browse files
committed
feat: v1.8.0 — open source section on projects city
- add an "open source" subsection to /projects positioned after the main project grid, listing public repos/packages without a new nav entry or competing with the primary showcase - introduce repocheckup as its first entry — a zero-config cli published on npm — linking out to github and npm - new src/lib/open-source.ts data model keeps the section data-driven and easy to extend with future packages
1 parent 346ad01 commit 4d0437a

5 files changed

Lines changed: 118 additions & 2 deletions

File tree

CHANGELOG.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,17 @@ InfraLens's history as a standalone product (2026-01-06 to 2026-08-10) is
99
frozen in [`docs/infralens/CHANGELOG.md`](docs/infralens/CHANGELOG.md).
1010
InfraLens changes since its native migration are recorded here.
1111

12+
## [1.8.0] — 2026-09-05
13+
14+
### Added
15+
16+
- **Open Source section on Projects City** (`/projects`) — new subsection
17+
listing public repositories and packages, positioned after the main
18+
projects grid without a new nav entry or competing with the primary
19+
showcase. First entry: RepoCheckup, a zero-config CLI (`npx repo-checkup`)
20+
that checks a JS/TypeScript repository's configuration, tooling, testing
21+
and CI, linking out to GitHub and npm.
22+
1223
## [1.7.4] — 2026-09-02
1324

1425
### Added

app/projects/page.tsx

Lines changed: 65 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
1+
import { GitHubIcon } from "@/components/github-icon";
12
import { PageShell } from "@/components/layout/page-shell";
23
import { brand } from "@/lib/brand";
4+
import { openSourceProjects } from "@/lib/open-source";
35
import { projects, statusLabel } from "@/lib/projects";
4-
import { ExternalLink, Wrench } from "lucide-react";
6+
import { ExternalLink, Package, Wrench } from "lucide-react";
57
import type { Metadata } from "next";
68
import Link from "next/link";
79

@@ -125,6 +127,68 @@ export default function ProjectsPage() {
125127
})}
126128
</div>
127129

130+
<section className="mt-16">
131+
<h2 className="mb-2 text-xl font-semibold text-white">Open Source</h2>
132+
<p className="mb-6 max-w-xl text-sm text-zinc-400">
133+
Des projets et packages publics conçus pour être utilisés, explorés et
134+
contribués.
135+
</p>
136+
<div className="flex flex-col gap-4 sm:max-w-sm">
137+
{openSourceProjects.map((project) => (
138+
<div
139+
key={project.name}
140+
className="flex flex-col gap-3 rounded-xl border p-5"
141+
style={{
142+
borderColor: `${brand.colors.blue[400]}18`,
143+
background: brand.colors.surface[2],
144+
}}
145+
>
146+
<div className="flex items-center gap-2">
147+
<Package
148+
size={15}
149+
aria-hidden="true"
150+
style={{ color: brand.colors.blue[400] }}
151+
/>
152+
<h3 className="text-base font-semibold text-white">
153+
{project.name}
154+
</h3>
155+
</div>
156+
<p className="text-[11px] font-medium text-zinc-500">
157+
{project.tags.join(" · ")}
158+
</p>
159+
<p className="text-sm text-zinc-400">{project.description}</p>
160+
<div className="mt-1 flex items-center gap-4">
161+
<a
162+
href={project.githubUrl}
163+
target="_blank"
164+
rel="noopener noreferrer"
165+
aria-label={`Voir ${project.name} sur GitHub`}
166+
className="inline-flex items-center gap-1.5 text-xs font-medium"
167+
style={{ color: brand.colors.blue[400] }}
168+
>
169+
<GitHubIcon size={13} />
170+
GitHub
171+
<ExternalLink size={10} />
172+
</a>
173+
{project.npmUrl && (
174+
<a
175+
href={project.npmUrl}
176+
target="_blank"
177+
rel="noopener noreferrer"
178+
aria-label={`Voir ${project.name} sur npm`}
179+
className="inline-flex items-center gap-1.5 text-xs font-medium"
180+
style={{ color: brand.colors.blue[400] }}
181+
>
182+
npm
183+
<ExternalLink size={10} />
184+
</a>
185+
)}
186+
</div>
187+
</div>
188+
))}
189+
</div>
190+
</section>
191+
128192
<div
129193
className="mt-12 rounded-xl border p-6"
130194
style={{ borderColor: `${brand.colors.blue[400]}30` }}

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "randy-code",
3-
"version": "1.7.4",
3+
"version": "1.8.0",
44
"private": true,
55
"packageManager": "pnpm@10.7.0",
66
"scripts": {
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import { describe, expect, it } from "vitest";
2+
import { openSourceProjects } from "../open-source";
3+
4+
describe("openSourceProjects", () => {
5+
it("is not empty", () => {
6+
expect(openSourceProjects.length).toBeGreaterThan(0);
7+
});
8+
9+
it("each project has required fields", () => {
10+
for (const project of openSourceProjects) {
11+
expect(project.name).toBeTruthy();
12+
expect(project.description).toBeTruthy();
13+
expect(project.tags.length).toBeGreaterThan(0);
14+
expect(project.githubUrl).toMatch(/^https:\/\/github\.com\//);
15+
}
16+
});
17+
18+
it("has unique names", () => {
19+
const names = openSourceProjects.map((p) => p.name);
20+
expect(new Set(names).size).toBe(names.length);
21+
});
22+
});

src/lib/open-source.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
export interface OpenSourceProject {
2+
name: string;
3+
description: string;
4+
tags: string[];
5+
href?: string;
6+
githubUrl: string;
7+
npmUrl?: string;
8+
}
9+
10+
export const openSourceProjects: OpenSourceProject[] = [
11+
{
12+
name: "RepoCheckup",
13+
description:
14+
"CLI zero-config qui inspecte un repository JavaScript/TypeScript — configuration, outillage, tests et CI — et signale les incohérences qu'un reviewer expérimenté relèverait.",
15+
tags: ["CLI", "TypeScript", "npm"],
16+
githubUrl: "https://github.com/Randy-R-code/repo-checkup",
17+
npmUrl: "https://www.npmjs.com/package/repo-checkup",
18+
},
19+
];

0 commit comments

Comments
 (0)