release: v0.9.1 (신규 쇼케이스 3종 정식 출시, CSS 변수 및 경로 무결성 게이트 강화)
Some checks failed
ci / build (push) Failing after 37s
release / release (push) Successful in 1m30s

This commit is contained in:
Yun Chan 2026-08-23 23:17:55 +09:00
parent e26b00a825
commit 225c1d9f42
75 changed files with 7406 additions and 224 deletions

View file

@ -1,36 +0,0 @@
import puppeteer from "puppeteer-core";
import path from "node:path";
import url from "node:url";
const here = path.dirname(url.fileURLToPath(import.meta.url));
const CHROME = "C:/Program Files/Google/Chrome/Application/chrome.exe";
const browser = await puppeteer.launch({ executablePath: CHROME, headless: "new", args: ["--force-device-scale-factor=1"] });
const page = await browser.newPage();
await page.setCacheEnabled(false);
// 라이브 배포 URL — 사용자가 보는 그대로
for (const w of [360, 390, 412]) {
await page.setViewport({ width: w, height: 844, isMobile: true, hasTouch: true });
await page.goto("https://designpaca.chanpaca.net/work/dure-enrollment/", { waitUntil: "networkidle0" });
await page.evaluate(() => document.fonts.ready);
await new Promise((r) => setTimeout(r, 250));
const m = await page.evaluate(() => {
const layout = document.querySelector(".layout");
const h2 = document.querySelector("#cat-h");
const card = document.querySelector(".course-row");
const appbar = document.querySelector(".appbar-inner");
const rl = (el) => (el ? Math.round(el.getBoundingClientRect().left) : null);
return {
cssV: (document.querySelector('link[rel="stylesheet"]')?.getAttribute("href") || "").match(/v=\d+/)?.[0],
layoutPad: getComputedStyle(layout).padding,
h2Left: rl(h2),
cardLeft: rl(card),
appbarPadLeft: getComputedStyle(appbar).paddingLeft,
over: document.documentElement.scrollWidth - document.documentElement.clientWidth,
};
});
console.log(`[${w}] css=${m.cssV} layoutPad="${m.layoutPad}" h2Left=${m.h2Left} cardLeft=${m.cardLeft} appbarPadL=${m.appbarPadLeft} over=+${m.over}`);
if (w === 390) await page.screenshot({ path: path.join(here, "__shots__", "diag3-dure-live-390.png") });
}
await browser.close();

View file

@ -1,30 +0,0 @@
// 임시 구문 스캐너 — 괄호·템플릿 리터럴 균형 줄 단위 추적
import fs from "node:fs";
const src = fs.readFileSync(process.argv[2], "utf8");
let inTpl = false, inStr = null, inInterp = 0, line = 1;
const stack = [];
const push = (t) => stack.push(t + "@" + line);
for (let i = 0; i < src.length; i++) {
const c = src[i], n = src[i + 1];
if (c === "\n") line++;
if (inStr) {
if (c === "\\") { i++; continue; }
if (c === inStr) inStr = null;
continue;
}
if (inTpl) {
if (c === "\\") { i++; continue; }
if (c === "$" && n === "{") { push("${"); inInterp++; i++; continue; }
if (c === "`") { inTpl = false; const m = stack.pop(); }
continue;
}
if (c === "`") { inTpl = true; push("tpl"); continue; }
if (c === "'" || c === '"') { inStr = c; continue; }
if (c === "/" && n === "/") { while (i < src.length && src[i] !== "\n") i++; continue; }
if (c === "(" || c === "[" || c === "{") push(c);
else if (c === ")" || c === "]" || c === "}") {
const m = stack.pop();
if (!m) { console.log("여분의 닫기", c, "줄", line); process.exit(0); }
}
}
console.log("미닫힘:", stack.slice(-8).join(", ") || "없음");

Binary file not shown.

Before

Width:  |  Height:  |  Size: 117 KiB

After

Width:  |  Height:  |  Size: 117 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

After

Width:  |  Height:  |  Size: 48 KiB

Before After
Before After

View file

@ -1,4 +1,4 @@
# E2E 시나리오 게이트 — 2026-08-23 06:30
# E2E 시나리오 게이트 — 2026-08-23 12:48
단언 1805 · 통과 1805 · 실패 0 — **GREEN — 전 단언 통과**

View file

@ -1,15 +1,15 @@
# 검증 리포트 — 2026-08-23 06:30
# 검증 리포트 — 2026-08-23 12:48
게이트: **전 계층 통과 — 배포 가능** · 총 103.6초
게이트: **전 계층 통과 — 배포 가능** · 총 96.5초
| 계층 | 결과 | 항목 | 소요 |
|---|---|---|---|
| L0-정적/stylelint | PASS | PASS — | 8.0s |
| L0-정적/stylelint | PASS | PASS — | 1.6s |
| L0-정식/html-validate | PASS | PASS — | 1.3s |
| L1-단위/계산로직 | PASS | PASS 41 | 0.1s |
| L2-기능/감사 | PASS | PASS 72 | 9.7s |
| L2-불변식/렌더 | PASS | PASS 10 | 17.2s |
| L3-시각회귀/diff | PASS | PASS 30 | 11.7s |
| L4-WebKit | PASS | PASS 8 | 3.9s |
| L5-탐색/키보드 | PASS | PASS 14 | 6.3s |
| L6-시나리오/E2E | PASS | PASS — | 45.4s |
| L2-기능/감사 | PASS | PASS 72 | 10.2s |
| L2-불변식/렌더 | PASS | PASS 10 | 17.5s |
| L3-시각회귀/diff | PASS | PASS 30 | 12.2s |
| L4-WebKit | PASS | PASS 8 | 4.7s |
| L5-탐색/키보드 | PASS | PASS 14 | 6.4s |
| L6-시나리오/E2E | PASS | PASS — | 42.6s |