Compare commits

...

2 Commits

Author SHA1 Message Date
Haewon Kam
9b717dbcfc fix(worker): 빌드마다 템플릿 화면 코드를 갱신 · 뷰 네이버 소유 확인 값
템플릿은 data 단계에서만 복사돼, --from build 로 돌리면 그 사이에 고친 화면 코드가
기존 병원 폴더에 닿지 않았다. 오늘 두 건이 이 이유로 배포되지 않았다.
- 검색엔진 소유 확인 메타: site.json 에 값이 들어갔는데 화면에 안 나왔다
- 회복 일정 플래너 계측(plan_procedure_select·plan_result·plan_save): 세 사이트 모두 없었다

refreshTemplateCode() 가 build 단계에서 화면 코드만 다시 덮는다.
src/layouts·components·pages·styles·lib 과 lib.ts·content.config.ts 가 대상이고,
병원 데이터·글·이미지는 건드리지 않는다. 병원별로 갈리는 astro.config.mjs·vercel.json 의
치환값, 구조 기준선, home_text 도 덮지 않는다. 내용이 같은 파일은 건너뛴다.

뷰 브리프에 네이버 서치어드바이저 소유 확인 값을 넣었다(viewpl.webforai.kr 용).
사이트마다 값이 달라 옮겨 쓰면 확인되지 않는다는 것을 주석에 적었다.

검증: 세 사이트 재배포 후 뷰에 소유 확인 메타가 나오고 다른 두 곳에는 안 나온다.
플래너 계측은 세 곳 모두 번들에 들어갔다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-14 16:01:44 +09:00
Haewon Kam
f68e4785bf chore(front): webforai.kr 네이버 소유 확인 메타 추가
네이버 서치어드바이저는 DNS TXT 를 받지 않아 메타 태그로만 소유가 확인된다.
구글은 webforai.kr 도메인 속성을 DNS TXT 로 확인해 메타가 필요 없다.

VITE_SITE=discovery 빌드에만 들어간다. infinith-demo 빌드에는 나가지 않는다.
서포터즈 사이트는 코드가 달라 briefs/<clinic>/clinic.json 의 site.naverSiteVerification
으로 각각 넣는다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-14 15:44:39 +09:00
3 changed files with 44 additions and 2 deletions

View File

@ -23,7 +23,9 @@
"alt": "뷰성형외과 건물 외관",
"width": 886,
"height": 885
}
},
"naverSiteVerification": "e47011473eef74d7b2c4f20e93f97a889cb699cc"
},
"_siteNote": "홈 히어로가 가슴 라인 일러스트로 잡혀 있었고 건물 사진의 alt 도 '가슴확대 시설 사진'으로 잘못 붙어 있었다. 건물 외관으로 고정한다."
"_siteNote": "홈 히어로가 가슴 라인 일러스트로 잡혀 있었고 건물 사진의 alt 도 '가슴확대 시설 사진'으로 잘못 붙어 있었다. 건물 외관으로 고정한다.",
"_verifyNote": "네이버 서치어드바이저 소유 확인 값(2026-09-14 발급, viewpl.webforai.kr 용). 사이트마다 값이 다르므로 다른 병원에 옮겨 쓰면 확인되지 않는다. 구글은 webforai.kr 도메인 속성을 DNS TXT 로 확인해 서브도메인 전부가 함께 확인된다."
}

View File

@ -19,6 +19,12 @@ export default defineConfig(({mode}) => {
title: 'INFINITH - Infinite Marketing',
description: 'AI 마케팅 분석 플랫폼. 채널을 진단하고 전략과 로드맵을 제안합니다.',
};
// 검색엔진 소유 확인. 배포마다 값이 다르므로 여기서 갈아끼운다.
// 네이버 서치어드바이저는 DNS 를 받지 않아 메타 태그로만 확인된다.
// 구글은 webforai.kr 도메인 속성을 DNS TXT 로 확인했으므로 메타가 필요 없다.
const verify = isDiscovery
? ['<meta name="naver-site-verification" content="6ebcb18640acf31bb3653822d178fcf071b94009" />']
: [];
const headHtml = [
`<title>${head.title}</title>`,
`<meta name="description" content="${head.description}" />`,
@ -26,6 +32,7 @@ export default defineConfig(({mode}) => {
`<meta property="og:title" content="${head.title}" />`,
`<meta property="og:description" content="${head.description}" />`,
`<meta property="og:locale" content="ko_KR" />`,
...verify,
].join('\n ');
return {

View File

@ -55,6 +55,38 @@ function applySiteUrl() {
return liveUrl;
}
// 템플릿의 코드 파일을 빌드 폴더에 다시 덮는다. 병원 데이터·글·이미지는 건드리지 않는다.
// 템플릿은 data 단계에서만 복사되므로, --from build 처럼 중간부터 돌리면 그 사이에 고친 화면 코드가
// 기존 병원 폴더에 닿지 않는다. 2026-09-14 에 소유 확인 메타와 플래너 계측이 이 이유로 배포되지 않았다.
// 병원별로 갈리는 것(astro.config.mjs·vercel.json 의 치환값, 구조 기준선, home_text)은 덮지 않는다.
const CODE_DIRS = ['src/layouts', 'src/components', 'src/pages', 'src/styles', 'src/lib'];
const CODE_FILES = ['src/lib.ts', 'src/content.config.ts'];
function refreshTemplateCode() {
if (!existsSync(TEMPLATE)) return '템플릿 없음';
let n = 0;
const copyIfDiff = (rel) => {
const from = join(TEMPLATE, rel), to = join(SITE, rel);
if (!existsSync(from)) return;
if (existsSync(to) && readFileSync(from).equals(readFileSync(to))) return;
mkdirSync(dirname(to), { recursive: true });
cpSync(from, to, { recursive: true });
n += 1;
};
for (const d of CODE_DIRS) {
const from = join(TEMPLATE, d);
if (!existsSync(from)) continue;
const walk = (sub) => {
for (const e of readdirSync(join(from, sub), { withFileTypes: true })) {
const rel = join(d, sub, e.name);
if (e.isDirectory()) walk(join(sub, e.name)); else copyIfDiff(rel);
}
};
walk('');
}
for (const f of CODE_FILES) copyIfDiff(f);
return n ? `화면 코드 ${n}개 갱신` : '화면 코드 최신';
}
// ---------- 상태 ----------
const statusPath = join(WORK, 'status.json');
const status = existsSync(statusPath) ? JSON.parse(readFileSync(statusPath, 'utf8')) : { clinic, url, status: 'queued', phases: [], posts: [], createdAt: new Date().toISOString() };
@ -456,6 +488,7 @@ await phase('heroes', () => {
await phase('build', () => {
// 주소·색인 설정을 먼저 적용한다. 원격 빌드가 이 값으로 canonical·사이트맵을 만든다.
applySiteUrl();
const refreshed = refreshTemplateCode();
const inst = run('npm', ['ci', '--no-audit', '--no-fund'], { cwd: SITE });
if (!inst.ok) throw new Error(`npm ci 실패\n${tail(inst.out)}`);
const b = run('npx', ['astro', 'build'], { cwd: SITE });