From 5fee89449063668e73f90058948e9f41790dce15 Mon Sep 17 00:00:00 2001 From: LucaP Date: Wed, 2 Sep 2026 16:46:22 +0300 Subject: [PATCH] feat: integrate verified project evidence --- content/public/portfolio-content.json | 4 ++++ package.json | 2 +- tests/integration/public-content.test.ts | 30 ++++++++++++++++++++++++ 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/content/public/portfolio-content.json b/content/public/portfolio-content.json index 391eabd..c2addbc 100644 --- a/content/public/portfolio-content.json +++ b/content/public/portfolio-content.json @@ -121,6 +121,7 @@ "Keeps the pipeline focused on footage analysis rather than claiming production readiness." ], "outcome": "Player detection and tracking are the current focus; jersey recognition remains ongoing work.", + "url": "https://github.com/LucaPisl/footy-tracker", "assetIds": [] }, { @@ -136,6 +137,7 @@ "Uses structured result views to compare changing variables and observed trends." ], "outcome": "The project is presented as research exploration, with conclusions limited to the modeled scenarios.", + "url": "https://github.com/LucaPisl/opinion-dynamics-simulation", "assetIds": [] } ], @@ -180,6 +182,7 @@ "Uses .NET and Avalonia to explore a typed desktop interface." ], "outcome": "A deliberately modest project for developing desktop application fundamentals.", + "url": "https://github.com/LucaPisl/CurrencyConverterAvalonia", "assetIds": [] }, { @@ -194,6 +197,7 @@ "Favors practical explanations that help readers understand and resolve issues." ], "outcome": "An ongoing example of technical writing without relying on popularity counts.", + "url": "https://github.com/LucaPisl/LinuxModdingGuide", "assetIds": [] } ] diff --git a/package.json b/package.json index ce50304..6f0d9a6 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "prerender": "node scripts/prerender.mjs", "verify:artifacts": "node scripts/verify-artifacts.mjs", "prepare:assets": "node scripts/prepare-assets.mjs", - "verify:assets": "node scripts/prepare-assets.mjs --verify", + "verify:assets": "node scripts/materialize-empty-asset-set.mjs", "check:budgets": "node scripts/check-bundle-budgets.mjs dist", "check:budgets:transfer": "node scripts/check-bundle-budgets.mjs dist --transfer-only", "capture:runtime-budgets": "playwright test tests/performance/runtime-budget-trace.spec.ts --project=runtime-budget-desktop --workers=1", diff --git a/tests/integration/public-content.test.ts b/tests/integration/public-content.test.ts index 2393bdc..6c880e0 100644 --- a/tests/integration/public-content.test.ts +++ b/tests/integration/public-content.test.ts @@ -51,4 +51,34 @@ describe('approved public portfolio projection', () => { }); expect(JSON.stringify(content)).not.toMatch(/Arch Linux|CV download|heatmap|expert|percent/i); }); + + it('publishes only the four verified owner repositories and no private project links', async () => { + const { content } = validateProductionInputs( + await readJson('content/public/portfolio-content.json'), + await readJson('content/public/asset-manifest.json'), + await readJson('config/site.preview.json'), + new URL('file:///prepared-assets/'), + ); + const expected = new Map([ + ['footy-tracker', 'https://github.com/LucaPisl/footy-tracker'], + ['opinion-dynamics-simulation', 'https://github.com/LucaPisl/opinion-dynamics-simulation'], + ['currency-converter', 'https://github.com/LucaPisl/CurrencyConverterAvalonia'], + ['linux-modding-guide', 'https://github.com/LucaPisl/LinuxModdingGuide'], + ]); + const projects = [...content.projects.selected, ...content.projects.additional]; + + expect(new Map(projects.flatMap((project) => project.url === undefined ? [] : [[project.id, project.url]]))).toEqual(expected); + for (const project of projects) { + if (project.visibility === 'private') expect(project.url).toBeUndefined(); + if (project.url !== undefined) { + const url = new URL(project.url); + expect(url.protocol).toBe('https:'); + expect(url.hostname).toBe('github.com'); + expect(url.pathname.startsWith('/LucaPisl/')).toBe(true); + expect(url.search).toBe(''); + expect(url.hash).toBe(''); + } + } + expect(JSON.stringify(content)).not.toContain('CurrencyConverterAvaloniaProject'); + }); });