chore: complete tech log product identity
@@ -3,7 +3,7 @@ name: frontend-quality-gates
|
|||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches: [develop]
|
branches: [main]
|
||||||
tags: ["v*"]
|
tags: ["v*"]
|
||||||
pull_request:
|
pull_request:
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 83 KiB |
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 39 KiB |
|
Before Width: | Height: | Size: 9.4 KiB After Width: | Height: | Size: 46 KiB |
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||||||
"$id": "https://clean-architecture-frontend.local/schemas/dependency-inventory.schema.json",
|
"$id": "https://tech-log-frontend.local/schemas/dependency-inventory.schema.json",
|
||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
"properties": {
|
"properties": {
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||||||
"$id": "https://clean-architecture-frontend.local/schemas/supply-chain-verification.schema.json",
|
"$id": "https://tech-log-frontend.local/schemas/supply-chain-verification.schema.json",
|
||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
"properties": {
|
"properties": {
|
||||||
"dependencyDiff": {
|
"dependencyDiff": {
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ const ARTIFACT_SCHEMA_DEFINITIONS = Object.freeze([
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
relativePath: "schemas/artifacts/dependency-inventory.schema.json",
|
relativePath: "schemas/artifacts/dependency-inventory.schema.json",
|
||||||
id: "https://clean-architecture-frontend.local/schemas/dependency-inventory.schema.json",
|
id: "https://tech-log-frontend.local/schemas/dependency-inventory.schema.json",
|
||||||
schema: dependencyInventoryArtifactSchema,
|
schema: dependencyInventoryArtifactSchema,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -31,7 +31,7 @@ const ARTIFACT_SCHEMA_DEFINITIONS = Object.freeze([
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
relativePath: "schemas/artifacts/supply-chain-verification.schema.json",
|
relativePath: "schemas/artifacts/supply-chain-verification.schema.json",
|
||||||
id: "https://clean-architecture-frontend.local/schemas/supply-chain-verification.schema.json",
|
id: "https://tech-log-frontend.local/schemas/supply-chain-verification.schema.json",
|
||||||
schema: supplyChainVerificationArtifactSchema,
|
schema: supplyChainVerificationArtifactSchema,
|
||||||
},
|
},
|
||||||
] as const);
|
] as const);
|
||||||
|
|||||||
@@ -76,7 +76,7 @@ export function renderCiWorkflow(contract: CiGateContract): string {
|
|||||||
"",
|
"",
|
||||||
"on:",
|
"on:",
|
||||||
" push:",
|
" push:",
|
||||||
" branches: [develop]",
|
" branches: [main]",
|
||||||
' tags: ["v*"]',
|
' tags: ["v*"]',
|
||||||
" pull_request:",
|
" pull_request:",
|
||||||
" workflow_dispatch:",
|
" workflow_dispatch:",
|
||||||
|
|||||||
@@ -270,7 +270,7 @@ const provenance = {
|
|||||||
],
|
],
|
||||||
},
|
},
|
||||||
runDetails: {
|
runDetails: {
|
||||||
builder: { id: "local:clean-architecture-frontend-template" },
|
builder: { id: "local:tech-log-frontend" },
|
||||||
metadata: { invocationId: "LOCAL_UNSIGNED" },
|
metadata: { invocationId: "LOCAL_UNSIGNED" },
|
||||||
},
|
},
|
||||||
materials: {
|
materials: {
|
||||||
|
|||||||
@@ -304,7 +304,7 @@ export async function verifyLocalSupplyChainEvidence(
|
|||||||
}
|
}
|
||||||
|
|
||||||
export const LOCAL_EVIDENCE_VERIFIER_ID =
|
export const LOCAL_EVIDENCE_VERIFIER_ID =
|
||||||
"clean-architecture-frontend-template/local-evidence-verifier";
|
"tech-log-frontend/local-evidence-verifier";
|
||||||
export const LOCAL_EVIDENCE_VERIFIER_VERSION = "1";
|
export const LOCAL_EVIDENCE_VERIFIER_VERSION = "1";
|
||||||
export {
|
export {
|
||||||
LOCAL_EVIDENCE_POLICY_INPUT_PATHS,
|
LOCAL_EVIDENCE_POLICY_INPUT_PATHS,
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ import {
|
|||||||
export const PROVIDER_FUTURE_SKEW_MS = 5 * 60 * 1_000;
|
export const PROVIDER_FUTURE_SKEW_MS = 5 * 60 * 1_000;
|
||||||
export const PROVIDER_MAX_LIFETIME_MS = 2 * 60 * 60 * 1_000;
|
export const PROVIDER_MAX_LIFETIME_MS = 2 * 60 * 60 * 1_000;
|
||||||
export const PROMOTION_VERIFIER_ID =
|
export const PROMOTION_VERIFIER_ID =
|
||||||
"clean-architecture-frontend-template/promotion-verifier";
|
"tech-log-frontend/promotion-verifier";
|
||||||
export const PROMOTION_VERIFIER_VERSION = "3";
|
export const PROMOTION_VERIFIER_VERSION = "3";
|
||||||
|
|
||||||
const sha256 = z.string().regex(/^[a-f0-9]{64}$/u);
|
const sha256 = z.string().regex(/^[a-f0-9]{64}$/u);
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import { INSTALLED_MESSAGE_CATALOGS } from "../../features/installed-feature-mes
|
|||||||
const PLATFORM_KO_MESSAGES = {
|
const PLATFORM_KO_MESSAGES = {
|
||||||
"common.unavailable": "요청한 문구를 표시할 수 없습니다.",
|
"common.unavailable": "요청한 문구를 표시할 수 없습니다.",
|
||||||
"common.processing": "처리 중…",
|
"common.processing": "처리 중…",
|
||||||
"common.appName": "Frontend Skeleton",
|
"common.appName": "Tech Log",
|
||||||
"common.noDisplayValue": "표시 정보 없음",
|
"common.noDisplayValue": "표시 정보 없음",
|
||||||
"action.retry": "다시 시도",
|
"action.retry": "다시 시도",
|
||||||
"action.reauth": "로그인",
|
"action.reauth": "로그인",
|
||||||
@@ -41,7 +41,7 @@ const PLATFORM_KO_MESSAGES = {
|
|||||||
"shell.session.integrationFailed": "연동 필요",
|
"shell.session.integrationFailed": "연동 필요",
|
||||||
"shell.session.actionFailed": "세션 작업을 완료하지 못했습니다.",
|
"shell.session.actionFailed": "세션 작업을 완료하지 못했습니다.",
|
||||||
"route.APP_HOME.navigation": "홈",
|
"route.APP_HOME.navigation": "홈",
|
||||||
"route.APP_HOME.title": "Clean Architecture Frontend",
|
"route.APP_HOME.title": "Tech Log",
|
||||||
"route.EXAMPLES_PLATFORM.navigation": "플랫폼 구성",
|
"route.EXAMPLES_PLATFORM.navigation": "플랫폼 구성",
|
||||||
"route.EXAMPLES_PLATFORM.title": "플랫폼 구성",
|
"route.EXAMPLES_PLATFORM.title": "플랫폼 구성",
|
||||||
"route.EXAMPLES_UI.navigation": "UI 구성요소",
|
"route.EXAMPLES_UI.navigation": "UI 구성요소",
|
||||||
@@ -158,7 +158,7 @@ export type MessageKey = keyof typeof KO_MESSAGES;
|
|||||||
const PLATFORM_EN_MESSAGES = {
|
const PLATFORM_EN_MESSAGES = {
|
||||||
"common.unavailable": "This message is unavailable.",
|
"common.unavailable": "This message is unavailable.",
|
||||||
"common.processing": "Processing…",
|
"common.processing": "Processing…",
|
||||||
"common.appName": "Frontend Skeleton",
|
"common.appName": "Tech Log",
|
||||||
"common.noDisplayValue": "No display value",
|
"common.noDisplayValue": "No display value",
|
||||||
"action.retry": "Try again",
|
"action.retry": "Try again",
|
||||||
"action.reauth": "Sign in",
|
"action.reauth": "Sign in",
|
||||||
@@ -196,7 +196,7 @@ const PLATFORM_EN_MESSAGES = {
|
|||||||
"shell.session.integrationFailed": "Integration required",
|
"shell.session.integrationFailed": "Integration required",
|
||||||
"shell.session.actionFailed": "The session action could not be completed.",
|
"shell.session.actionFailed": "The session action could not be completed.",
|
||||||
"route.APP_HOME.navigation": "Home",
|
"route.APP_HOME.navigation": "Home",
|
||||||
"route.APP_HOME.title": "Clean Architecture Frontend",
|
"route.APP_HOME.title": "Tech Log",
|
||||||
"route.EXAMPLES_PLATFORM.navigation": "Platform composition",
|
"route.EXAMPLES_PLATFORM.navigation": "Platform composition",
|
||||||
"route.EXAMPLES_PLATFORM.title": "Platform composition",
|
"route.EXAMPLES_PLATFORM.title": "Platform composition",
|
||||||
"route.EXAMPLES_UI.navigation": "UI components",
|
"route.EXAMPLES_UI.navigation": "UI components",
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ export default function HomePage() {
|
|||||||
<section className="ui-page">
|
<section className="ui-page">
|
||||||
<PageHeader
|
<PageHeader
|
||||||
eyebrow="프로젝트 시작점"
|
eyebrow="프로젝트 시작점"
|
||||||
title="Clean Architecture Frontend"
|
title="Tech Log"
|
||||||
description="도메인을 추가하기 전에 실행 구조와 범용 사용자 경험을 확인할 수 있는 중립적인 스켈레톤입니다."
|
description="도메인을 추가하기 전에 실행 구조와 범용 사용자 경험을 확인할 수 있는 중립적인 스켈레톤입니다."
|
||||||
/>
|
/>
|
||||||
<div className="readiness-grid" aria-label="구현 준비 상태">
|
<div className="readiness-grid" aria-label="구현 준비 상태">
|
||||||
|
|||||||
@@ -71,7 +71,7 @@ describe("generic application router", () => {
|
|||||||
await screen.findByRole("heading", { name: "UI 구성요소", level: 1 }),
|
await screen.findByRole("heading", { name: "UI 구성요소", level: 1 }),
|
||||||
).toBeVisible();
|
).toBeVisible();
|
||||||
expect(window.location.pathname).toBe("/examples/ui");
|
expect(window.location.pathname).toBe("/examples/ui");
|
||||||
expect(document.title).toBe("UI 구성요소 · Frontend Skeleton");
|
expect(document.title).toBe("UI 구성요소 · Tech Log");
|
||||||
await waitFor(() =>
|
await waitFor(() =>
|
||||||
expect(
|
expect(
|
||||||
screen.getByRole("heading", { name: "UI 구성요소", level: 1 }),
|
screen.getByRole("heading", { name: "UI 구성요소", level: 1 }),
|
||||||
|
|||||||
@@ -62,7 +62,7 @@ describe("production runtime application tree", () => {
|
|||||||
|
|
||||||
expect(
|
expect(
|
||||||
await screen.findByRole("heading", {
|
await screen.findByRole("heading", {
|
||||||
name: "Clean Architecture Frontend",
|
name: "Tech Log",
|
||||||
}),
|
}),
|
||||||
).toBeVisible();
|
).toBeVisible();
|
||||||
expect(
|
expect(
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import { expect, test } from "../support/browser/strict-browser-test.ts";
|
|||||||
test("boots the public app shell", async ({ page }) => {
|
test("boots the public app shell", async ({ page }) => {
|
||||||
await page.goto("/");
|
await page.goto("/");
|
||||||
await expect(page.getByRole("heading", { level: 1 })).toHaveText(
|
await expect(page.getByRole("heading", { level: 1 })).toHaveText(
|
||||||
"Clean Architecture Frontend",
|
"Tech Log",
|
||||||
);
|
);
|
||||||
await expect(page.getByRole("navigation", { name: "주요 탐색" })).toBeVisible();
|
await expect(page.getByRole("navigation", { name: "주요 탐색" })).toBeVisible();
|
||||||
await expect(page.getByRole("main")).toBeVisible();
|
await expect(page.getByRole("main")).toBeVisible();
|
||||||
|
|||||||
@@ -228,7 +228,7 @@ describe("reference feature page states", () => {
|
|||||||
expect(
|
expect(
|
||||||
await screen.findByRole("heading", {
|
await screen.findByRole("heading", {
|
||||||
level: 1,
|
level: 1,
|
||||||
name: "Clean Architecture Frontend",
|
name: "Tech Log",
|
||||||
}),
|
}),
|
||||||
).toBeVisible();
|
).toBeVisible();
|
||||||
});
|
});
|
||||||
@@ -284,7 +284,7 @@ describe("reference feature page states", () => {
|
|||||||
expect(
|
expect(
|
||||||
await screen.findByRole("heading", {
|
await screen.findByRole("heading", {
|
||||||
level: 1,
|
level: 1,
|
||||||
name: "Clean Architecture Frontend",
|
name: "Tech Log",
|
||||||
}),
|
}),
|
||||||
).toBeVisible();
|
).toBeVisible();
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ name: frontend-quality-gates
|
|||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches: [develop]
|
branches: [main]
|
||||||
tags: ["v*"]
|
tags: ["v*"]
|
||||||
pull_request:
|
pull_request:
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ function passingAssessment(): any {
|
|||||||
generatedAt: "2026-08-02T00:00:00.000Z",
|
generatedAt: "2026-08-02T00:00:00.000Z",
|
||||||
status: "PASS" as const,
|
status: "PASS" as const,
|
||||||
verifier: {
|
verifier: {
|
||||||
id: "clean-architecture-frontend-template/local-evidence-verifier",
|
id: "tech-log-frontend/local-evidence-verifier",
|
||||||
version: "1",
|
version: "1",
|
||||||
sourceSha256: digest("verifier source"),
|
sourceSha256: digest("verifier source"),
|
||||||
},
|
},
|
||||||
@@ -1490,7 +1490,7 @@ function syntheticSignedPromotionBundle() {
|
|||||||
verifiedAt: "2026-08-02T01:00:00.000Z",
|
verifiedAt: "2026-08-02T01:00:00.000Z",
|
||||||
status: "PASS",
|
status: "PASS",
|
||||||
verifier: {
|
verifier: {
|
||||||
id: "clean-architecture-frontend-template/promotion-verifier",
|
id: "tech-log-frontend/promotion-verifier",
|
||||||
version: "3",
|
version: "3",
|
||||||
},
|
},
|
||||||
run,
|
run,
|
||||||
@@ -1806,7 +1806,7 @@ async function createArchivedAssessmentFixture(): Promise<{
|
|||||||
const assessment = localEvidenceAssessmentArtifactSchema.parse({
|
const assessment = localEvidenceAssessmentArtifactSchema.parse({
|
||||||
...passingAssessment(),
|
...passingAssessment(),
|
||||||
verifier: {
|
verifier: {
|
||||||
id: "clean-architecture-frontend-template/local-evidence-verifier",
|
id: "tech-log-frontend/local-evidence-verifier",
|
||||||
version: "1",
|
version: "1",
|
||||||
sourceSha256: supplyChainDigest(
|
sourceSha256: supplyChainDigest(
|
||||||
policyInputs.filter(({ path: policyPath }) => verifierPaths.has(policyPath)),
|
policyInputs.filter(({ path: policyPath }) => verifierPaths.has(policyPath)),
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 91 KiB After Width: | Height: | Size: 83 KiB |
|
Before Width: | Height: | Size: 396 KiB After Width: | Height: | Size: 392 KiB |