리소스 허브로

기술 문서 (프로토타입 버전)

CLAUDE.md

저장소의 CLAUDE.md 와 동일한 원문입니다. 아래에서 Markdown과 HTML 변환 결과를 각각 복사할 수 있습니다.

공개 문서 원문 (Markdown)

# CLAUDE.md — 워크스페이스 가이드

> Claude Code 공식 Best Practice 기반 | 2026-03 업데이트

**공식 규칙**: CLAUDE.md, Skills, Memory 상세 → @docs/claude-official-rules.md

---

## 필수 우선순위 (Cursor·Claude Code·에이전트) ⭐

**충돌 시 아래 순서를 따른다.** (Cursor: `.cursor/rules/openclaw-claude-md-cursor-priority.mdc`)

| 순위 | 출처 | 용도 |
|------|------|------|
| **0** | **`./CLAUDE.Ingest.md`** | **수집·1차편집·L0·프론트매터·daily-reflection SSOT** — 해당 작업 시 **최우선 필수 참조** |
| **0b** | **`../../../CLAUDE.Governance.md`** (+ `AGENTS.Governance.md` · `CLAUDE.Governance.Eval.md`) | Admin · LC/LS/VS · saas **운영** Governance **전역 정본** (WORKSPACE_CLEAN 루트; 로컬 동명은 포인터) |
| **1** | **이 파일 (`./CLAUDE.md`)** | openclaw **단독 클론** 일상 SSOT — **§ Git 추적**, **§ Vercel 배포** |
| **2** | **`.cursor/rules/`** | Cursor 필수 — `claude-ingest-ssot`, `vercel-deploy-openclaw`, `git-plus-priority` 등 |
| **3** | **`docs/` SSOT** | `git-workflow-openclaw.md`, **`vercel-deployment-rules.md`**, `deployment-registry.md` |
| **4** | **프로젝트 Skills** | **`/git-plus`**, **`/deploy-plus`**, **`/learning-control-ingest-plus`** — `docs/workspace-targets-registry.md` |
| **5** | bkit·전역 Skills | 0~4와 충돌 없을 때만 |

- **수집 / Ingest / 1차편집 / 프론트매터 / daily-reflection / L0** → **반드시 `@CLAUDE.Ingest.md`** (이 repo 루트). Cursor: **`.cursor/rules/claude-ingest-ssot.mdc`**. 워크스페이스 포인터: `WORKSPACE_CLEAN/CLAUDE.Ingest.md`.
- **Admin / LC / LS / VS / saas 운영** → **`@CLAUDE.Governance.md`** (WORKSPACE_CLEAN 루트 전역 정본; 이 폴더 동명 파일은 포인터). 공용 에이전트 `@AGENTS.Governance.md` · 평가 `@CLAUDE.Governance.Eval.md`. Cursor: **`admin-console-governance.mdc`**.
- **2019↔2020 경로:** `@docs/machine-hosts-ssot.md` (문서·스킬은 `~/` · 전역 Cursor는 `~/Desktop/WORKSPACE_CLEAN/scripts/sync-ingest-cursor-global.sh`).
- **`/git-plus`**, **「깃추적」**, **「깃추적 saas|hermes|detailpage」** → **git-plus** (`.cursor/skills/git-plus/SKILL.md`). 대상 없으면 AskQuestion. **「깃추적 openclaw」= saas** (repo). 전역 커밋 휴리스틱 **대체 금지**.
- **`/deploy-plus`**, **「규칙대로 버셀배포」**, **「규칙대로 배포 saas|detailpage」** → **deploy-plus** — Vercel **saas·detailpage만**. **hermes·openclaw는 배포 대상 아님** (Hermes=Docker).
- 레거시 **「규칙대로 배포하자」** → **deploy-plus** (대상 AskQuestion). **saas** 선택 시 Preview `./deploy saas` → (prod 제외 없으면) `./deploy saas --prod`.
- **`/youtube-script-builder-pro`**, **대본 작성**, **영상 대본**, **유튜브 대본**, **스크립트 작성**, **Screen Studio 대본**, **벤치마킹 분석** → **youtube-script-builder-pro** (`.cursor/skills/youtube-script-builder-pro/SKILL.md` + `ask-questions.md`). Phase 0 브리프 후 모드 라우팅. 검증: `node .agents/skills/youtube-script-builder-pro/scripts/verify-youtube-script-builder-pro.mjs`. 상세 → **@docs/SKILLS.md** § Content production.
- 그 외 Vercel → **§ Vercel 배포** + `docs/vercel-deployment-rules.md` + `vercel-deploy-openclaw.mdc`.

### 분리형 메모리 (항상 참조 · Phase 6)

| 순서 | 참조 | 용도 |
|------|------|------|
| **M1** | **`@MEMORY_INDEX.md`** | 분리형 메모리 **진입점** — 7개 주제 `memory/*.md` 링크 |
| **M2** | **`memory/workflow-principles.md`** | Phase·완료보고·삭제 금지·commit/push/deploy 금지 (**모든 작업**) |
| **M3** | **`memory/accounts-env-policy.md`** | secret/token/env 분리 (**모든 작업**) |
| **M4+** | **`memory/*.md` (주제별)** | cursor-rules · saas-engine · learning-studio · hermes-openclaw · slack-automation |

Cursor: **`.cursor/rules/memory-index-baseline.mdc`** (`alwaysApply`). 검증: `node scripts/verify-memory-structure.mjs`

---

## Cursor Rules — Claude Code 자동 로드

> `.cursor/rules/*.mdc` → Claude Code `@` import 동기화. 원본 파일을 단일 소스로 공유.

### 항상 적용 (alwaysApply: true)

@.cursor/rules/openclaw-claude-md-cursor-priority.mdc
@.cursor/rules/memory-index-baseline.mdc
@.cursor/rules/claude-ingest-ssot.mdc
@.cursor/rules/git-plus-priority.mdc
@.cursor/rules/deploy-plus-priority.mdc
@.cursor/rules/deploy-by-rules-chat.mdc
@.cursor/rules/vercel-deploy-openclaw.mdc
@.cursor/rules/git-commit-separation.mdc
@.cursor/rules/pre-commit-build-validation.mdc
@.cursor/rules/bundled-file-placement.mdc
@.cursor/rules/env-secrets-security.mdc
@.cursor/rules/git-remote-monorepo-push.mdc
@.cursor/rules/gitignore-monorepo-hierarchy.mdc
@.cursor/rules/cron-gitignore-check.mdc
@.cursor/rules/korean-encoding.mdc
@.cursor/rules/learning-control-phase-discipline.mdc
@.cursor/rules/pdca-folder-guard.mdc
@.cursor/rules/prioritize-rules-skills.mdc
@.cursor/rules/project-context-and-logging.mdc
@.cursor/rules/project-startup-automation.mdc
@.cursor/rules/claude-code-guide.mdc
@.cursor/rules/apple-theme-ui-components.mdc
@.cursor/rules/detailpage-hub-isolation.mdc
@.cursor/rules/detailpage-pipeline2-execution-first.mdc
@.cursor/rules/youtube-script-builder-pro-priority.mdc
@.cursor/rules/cursor-instruction-output-format.mdc

### 조건부 (glob 트리거)

@.cursor/rules/admin-agents-kanban.mdc
@.cursor/rules/admin-learning-control.mdc
@.cursor/rules/saas-engine-document-workflow.mdc
@.cursor/rules/openclaw-design-skill-discipline.mdc
@.cursor/rules/projects-status.mdc

---

## 프로젝트 시작 시 참조 (필수)

새 대화·작업을 시작할 때 아래 순서로 참조한다.

| 순서 | 참조 | 용도 |
|------|------|------|
| 0 | **@CLAUDE.Ingest.md** | **수집·1차편집·L0·프론트매터 SSOT (해당 작업 시 최우선)** |
| 1 | **이 파일 (CLAUDE.md)** | **필수 우선순위**, Git·배포 SSOT, 프로젝트 요약 |
| 2 | **@MEMORY_INDEX.md** + **`memory/workflow-principles.md`** | **분리형 메모리** — Phase·보고·민감정보 공통 원칙 (항상) |
| 3 | **@index.md** | 프로젝트별 문서 위치·docs 맵 |
| 3 | **@docs/workspace-targets-registry.md** | **git-plus / deploy-plus** 대상 (hermes · saas · detailpage) |
| 4 | **@docs/git-workflow-openclaw.md** | **이 클론** Git 루트·커밋·push vs 배포 |
| 5 | **@docs/vercel-deployment-rules.md** | **saas-engine** Vercel 수동·자동 배포 SSOT |
| 6 | **official-agent-skills-plugins/** | 공식 에이전트·스킬 참조 (bkit 플러그인 13종/21종 등) — @official-agent-skills-plugins/README.md |
| 7 | **@docs/SKILLS.md**, **@docs/agents-map.md** | 스킬·에이전트 상세 맵 |
| 8 | **@docs/openclaw-saas-engine 심층 분석-20260514.md** | 구조·스택·제품 범위 + **`openclaw-projects`와의 관계 검증(§9)** (2026-05-14) |
| 9 | **@docs/deployment-registry.md** | 배포 레지스트리: **이 Git 루트**의 실제 경로 vs 목표 SSOT·`projects/openclaw/...`·`.vercel` 주의 |
| 10 | **@docs/kanban/SKOOLCHEF-KANBAN-DESIGN-PRINCIPLES.md** | Kanban Hub / Admin / Hermes 역할 분리 — **Admin = Master Control Center** |
| 11 | **`.cursor/rules/admin-agents-kanban.mdc`** | Admin Agents Kanban 작업 시 Cursor 필수 규칙 |
| 12 | **`@DESIGN.md`** | **시각 디자인 SSOT** — Ops(hub/admin) · Marketing(apple-theme-ui) · Cursor workbench 토큰 |
| 13 | **`@docs/design/openclaw-design-skill-operating-rule.md`** | **UI 개선 운영 규칙** — Design Skill 작업 전 체크리스트 · Phase 범위 1~2개 · 8가지 품질 기준 |

### Admin Agents Kanban · Master Control Center (필수 · PR-3C-1)

**OpenClaw Admin Console Agents Kanban** (`/admin/agents-kanban`) 및 Kanban 통제 작업 시 **항상** 아래를 기준으로 한다. 상세 SSOT: **`docs/kanban/SKOOLCHEF-KANBAN-DESIGN-PRINCIPLES.md`**, Cursor: **`.cursor/rules/admin-agents-kanban.mdc`**.

| 표면 | 역할 |
|------|------|
| **Hub** (`/projects/openclaw/hub`) | **상태 SoT** — read-only 상태 허브 |
| **Hermes `:9119`** | **실행 현장** — DnD · dispatch · orchestration |
| **Admin Agents Kanban** | **Master Control Center / 종합관리센터** — Hermes Kanban 기능을 **포함·확장**하는 상위 통제판 |

**Notify (PR-3D-1~5 · PR-3E-1~8 완료 — 시리즈 마감)**  
구현: notify-list read · target options · subscribe/unsubscribe API · 승인형 Panel/Detail UI · **validation-only dry-run Preview** (`POST /api/admin/kanban/notify-preview`) · notify-list 기반 preview warnings · **warning label 통일** (`labelNotifyPreviewWarningCode`). E2E: `admin-agents-kanban-authenticated` §21–24 (preview) · **§26 subscribe** · **§27 unsubscribe** (성공 시 notify-list refresh · Audit MCC · Detail Timeline; 실패 시 safe error만). 문서: [architecture](docs/kanban/ADMIN-MCC-NOTIFY-SUBSCRIBE-ARCHITECTURE.md) · [dry-run](docs/kanban/ADMIN-MCC-NOTIFY-DRY-RUN-PREVIEW.md) · [runbook](docs/kanban/ADMIN-MCC-NOTIFY-RUNBOOK.md) (승인 절차 · **§6 Preview warning FAQ**) · [legacy rows](docs/kanban/ADMIN-MCC-NOTIFY-LEGACY-ROWS.md). **Slack message send·Bridge write는 범위 밖** (Bridge → **PR-4**).

**고정 원칙**

1. Admin은 **슬림판·축소판이 아니다.** Hermes Kanban을 **포함**하는 **상위 확장판**이다.
2. Hub와 Admin의 차이는 **UI 크기가 아니라 권한·역할** (Hub: read-only 확인 · Admin: 운영·관리·통제).
3. Admin은 **Create · Assign · Move · Edit(관리) · Notify · Audit · Events · Timeline · Comment · Link · Board Admin** 을 **유지·강화**한다.
4. Admin의 stats·L0–L3·blocked 등 **상태·운영 정보**는 통제 판단을 돕는 **운영 UI**로 **유지·강화 가능** — 「Hub 중복이므로 Admin 상태 UI 제거」는 **금지**.
5. 향후 Admin Phase는 **축소가 아니라 확장·증보·통제 강화** 방향.

**ICC 고정 UI (삭제 금지)**  
**새로운 보드 생성하기** · **새로운 업무 만들기** 섹션(제목 + card-block 폼)은 **항상 표시**. Hermes 브리지 미설정이어도 폼을 **통째로 숨기지 않음** — 비활성 + 안내만. (`.cursor/rules/admin-agents-kanban.mdc` § ICC 고정 섹션)

**금지 (문서·구현 공통)**  
「Admin slim」「Admin 축소」「Hub 중복 → Admin 상태 UI 제거」를 **목표**로 삼지 않는다. (PR-3B의 카드→Detail 통제 집중은 **슬림화 목표가 아님**.)

### Learning Control · 문서 분류→공개→Hub→영상 (필수)

**수집·Ingest·프론트매터:** **반드시 `@CLAUDE.Ingest.md`** (파이프라인 계층·슬래시 맵·FM 키·사고기록·Forbidden). Cursor: `.cursor/rules/claude-ingest-ssot.mdc`.

**최종 목적:** 모든 문서를 **Admin Console**에서 통제하고 **SaaS 공개 · Learning Hub · 영상 · Publish**까지 이어지는 파이프라인을 완성한다.

```
Raw Source → Prepared Docs → Open Candidates → SaaS Public Docs → Learning User Hub → Video → Publish/Deploy
```

| 항목 | SSOT |
|------|------|
| **마스터 문서** | **`docs/learning-control/README.md`** — Stage 1~11 · Phase · Run · manifest 관계 |
| **Admin UI** | `/admin/learning-control` · manifest `content/learning-sources/control-plane/manifest.json` |
| **문서 분류 산출물** | `docs/learning-studio/docs-inventory.json` · `docs-visibility-classification.json` |
| **통합 분류 인덱스** | `lib/control-plane/document-classification-index.ts` |
| **Corpus·헤더 분류 SSOT (7헤더 동일)** | `lib/control-plane/document-classification-corpus-ssot.ts` |
| **corpus 재스캔** | `pnpm learning-control:scan-corpus:write` |
| **SaaS 헤더 매핑** | `lib/learning-studio/public-docs-menu-config.ts` |
| **Hub registry** | `lib/hub-assistant/hub-document-registry.ts` |
| **명명·lifecycle** | `docs/learning-studio/naming-canonical-registry.md` |
| **INGEST API** | `POST /api/admin/learning-control/ingest` — `dry_run` · `commit_plan` · `commit_apply` |

**원칙:** 승인 전 manifest·`content/public-docs`·파일 **쓰기 금지** — `commit_plan` preview → `commit_apply` + approvalToken만 writer 허용.

### 필참 · SaaS 엔진과 Git 원격 두 개 (에이전트·인간 공통)

**새 대화·배포·동기화·경로 설계를 시작하기 전에 반드시 아래를 읽고 따른다.** 모호하면 **`@docs/openclaw-saas-engine 심층 분석-20260514.md` §9** 를 먼저 연다.

| 구분 | 정확한 저장소 명칭 | GitHub URL | 앱 코드 위치 |
|------|-------------------|------------|----------------|
| **모노레포** | `SkoolChef/openclaw-projects` | https://github.com/SkoolChef/openclaw-projects | **`projects/openclaw/saas-engine/`** (통합 후 **목표** 레이아웃; 그 안이 Next 앱 루트) |
| **단독 레포** | `SkoolChef/openclaw-saas-engine` | https://github.com/SkoolChef/openclaw-saas-engine | **저장소 Git 루트 = Next 앱 루트** (`app/`, `package.json` 등) |

- **`openclaw-saas-engine` 단독 클론(이 저장소):** Next 앱 루트 = **Git 루트 `./`**, 루트 `package.json`의 **`name: saas-engine`**. 루트 직하위 **`saas-engine/`** 폴더는 **npm/Vercel 앱 루트가 아님**. **`projects/openclaw/...`** 는 **이 클론의 실행 cwd가 아니라** `openclaw-projects` 통합 시 **목표 정책 경로**다 — **`@docs/deployment-registry.md` §3·§5.**
- 위 둘은 **동일 제품 계열(OpenClaw SaaS 허브 / `saas-engine`)**이나 **별도 `origin`·별도 `main`** 이다. **서브모듈·자동 미러가 아니다.** 한쪽만 수정하면 **드리프트**가 생긴다.
- `git remote -v`로 **지금 클론이 어느 저장소인지** 먼저 확인하고, 문서·커밋·배포 대상 경로를 그에 맞춘다.
- 두 원격의 관계·검증 절차·운영 주의는 **`@docs/openclaw-saas-engine 심층 분석-20260514.md` §9** 가 **확정 근거(SSOT)** 이다. **필참.**

**원칙**: 한 프로젝트의 모든 작업·문서·산출물은 **해당 프로젝트 폴더 안**에 둔다. 공통 메타만 루트 `docs/` 또는 `official-agent-skills-plugins/`에 둔다.

---

## Git 추적 및 커밋 (openclaw 단독 클론 · 필수)

**이 저장소(`SkoolChef/openclaw-saas-engine` 단독 클론)** 의 깃 추적·커밋·푸시는 **아래 SSOT**를 따른다. 상위 `CLAUDE/` 모노레포 push 규칙(§3 「Git push 규칙」)은 **이 클론에 적용하지 않는다** — 실행 cwd는 **항상 `git rev-parse --show-toplevel`(= `./`)**.

| 항목 | 규정 |
|------|------|
| **일상 SSOT** | **`docs/git-workflow-openclaw.md`** |
| **슬래시·채팅** | **`/git-plus`** · **깃추적** · **깃추적 saas|hermes|detailpage** → **git-plus** (`docs/workspace-targets-registry.md`) |
| **에이전트·Cursor** | **`.cursor/skills/git-plus/SKILL.md`** — 대상 없으면 AskQuestion. **깃추적 openclaw** = **saas**. **푸시** 명시 시만 |
| **Cursor 규칙** | **`git-plus-priority.mdc`**, **`openclaw-claude-md-cursor-priority.mdc`**, **`git-commit-separation.mdc`**, **`env-secrets-security.mdc`** |
| **CLI 일괄** | `bash scripts/git-plus-interactive.sh [pathspec]` (채팅은 SKILL ①②③ + 번호 선택) |

### Git Plus 절차 (요약)

1. **① 맥락** — `git status -sb`, `origin/main` 대비 ahead 여부.
2. **② 스테이징** — `git add -n` 미리보기 → **번호로 동의** 후에만 `git add` (한 주제 한 커밋).
3. **③ 마무리** — `feat|fix|docs|chore:` 커밋 메시지 → **푸시는 사용자가 명시할 때만** `git push origin $(git rev-parse --abbrev-ref HEAD)`.

### 금지

- **git-plus 없이** 임의 `git add -A`·무문 **`git push`**.
- **`.env*`·키·인증서** 커밋·푸시.
- **요청 없이** `docs/vercel-deployment-rules.md` 등 배포 SSOT 문서 수정.
- **`detailpage-ai-engine` 추적 검증 없이** `git clean -fd` / `git clean -fdx` (아래 「detailpage Git 추적 함정」).

**전역 Cursor/사용자 커밋 휴리스틱**은 **openclaw 깃 추적 요청 시 git-plus보다 우선하지 않는다.**

---

## Vercel 배포 (saas-engine · 필수 SSOT)

**상세 원문·체크리스트·보안 키 교체:** **`docs/vercel-deployment-rules.md`** (단일 기준). **Cursor:** **`.cursor/rules/vercel-deploy-openclaw.mdc`**. **레지스트리:** **`docs/vercel-projects-registry.md`**, **`docs/deployment-registry.md`**.

| 항목 | 값 |
|------|-----|
| **Vercel Project** | `saas-engine` |
| **CLI·빌드 cwd** | **Git 루트 `./`** (`cd "$(git rev-parse --show-toplevel)"`) |
| **링크 메타** | **`./.vercel/project.json`** (`projectName` = `saas-engine`) |
| **공유 URL (고정 별칭)** | `https://saas-engine-xi.vercel.app` |
| **소스 저장소** | `SkoolChef/openclaw-saas-engine` |

### Deploy Plus (Vercel · saas · detailpage)

**진입:** **`/deploy-plus`**, **규칙대로 버셀배포 saas|detailpage**, 레거시 **규칙대로 배포하자** (대상 없으면 AskQuestion). Skill: **`.cursor/skills/deploy-plus/SKILL.md`**.

**배포 대상 아님:** **hermes** (Docker iMac), **openclaw** (repo 이름 — Vercel 앱은 **saas-engine**).

| 대상 | Preview | Production |
|------|---------|------------|
| **saas** | `./deploy saas` | `./deploy saas --prod` (prod 제외 명시 시 생략) |
| **detailpage** | `detailpage-ai-engine/dashboard/` → `npx vercel deploy` | `./deploy.sh` |

**Production만 제외 (saas):** **preview만**, **production 제외**, **prod 빼** 등 명시 시 Preview만.

### 수동 배포 명령 (일반)

| 단계 | 명령 | 결과 |
|------|------|------|
| **Preview (기본)** | `./deploy saas` | Preview URL — **Production 아님** |
| **Production** | `./deploy saas --prod` | 프로덕션·고정 별칭 (`https://saas-engine-xi.vercel.app`) |

배포 전: `vercel whoami`, **`./.vercel/project.json`** 확인. 링크 오염 시: `vercel link --project saas-engine --yes` (**Git 루트 `./`**).

### `git push` vs Vercel (혼동 금지)

| 동작 | 설명 |
|------|------|
| **`git push`** | GitHub에 커밋만 반영. Vercel Git 연동이 있으면 빌드가 **따라올 수 있으나**, 실패·무관 경로·잘못된 프로젝트 연결 시 **프로덕션이 안 바뀔 수 있음**. **`push`만으로 배포 완료라고 말하지 않는다.** |
| **`./deploy saas`** | **Preview** CLI 배포 (규칙대로 검증용). |
| **`./deploy saas --prod`** | **Production** CLI 배포 (승인·Preview 검증 후). |
| **macOS 자동 배포** | **제거됨 (2026-07-18).** 매시/자정 git+Vercel 자동화 없음. 배포는 수동 `/deploy-plus` · `./deploy saas` 만. |

**금지:** `saas-engine/` 하위만 `cd`한 뒤 `vercel deploy`, 임시 `*.vercel.app` URL을 문서·공유 고정 링크로 사용.

**detailpage 별도 배포:** **`docs/detailpage-ai-engine-deployment-rules.md`** — 루트는 **`detailpage-ai-engine/dashboard/`** 만; 내부 엔진은 Vercel 배포 금지.

**배포 후 검증(최소):** `GET /api/health`, 허브 예: `/projects/ai-coding-tools/hub`, `/projects/detailpage-ai-engine/hub`.

---

## 배포 레지스트리 (현재 클론 vs 목표 정책)

**이 Git 루트 `./`** 가 **현재 메인 Next 앱 루트**다. 루트 `package.json`의 **`name: saas-engine`** 이 제품·Vercel 슬러그 정렬에 쓰인다.

루트 직하위 **`saas-engine/`**, **`detailpage-ai-engine/`**, **`detailpage-ai-engine/dashboard/`** 는 **디렉터리로 존재**하나, **`saas-engine/` 폴더는 앱 루트가 아니다**. **`detailpage-ai-engine/dashboard/`** 는 별도 Vercel 후보이며 **현재 트리 상태**는 **`docs/deployment-registry.md`** §3·§6을 따른다.

**경로 혼선 방지:** 루트에 **`dashboard/`** 디렉터리는 두지 않는다. 엔진 대시보드에 대해 문서·스크립트에 `cd dashboard`만 적혀 있으면, **선행 `cd detailpage-ai-engine`**(또는 저장소 루트에서 `cd detailpage-ai-engine/dashboard`) 전제인지 반드시 확인한다.

**목표 SSOT** 저장소는 **`SkoolChef/openclaw-projects`**이며, **`projects/openclaw/...`** 는 **통합 후 정책 경로**일 뿐 **이 클론의 일상 cwd가 아니다**.

현재 구조와 목표 구조는 **다르다**. 슬러그·원격·`.vercel` 기준의 상세·주의사항은 **`docs/deployment-registry.md`**를 따르며, **실제 디렉터리 이동·삭제는 별도 Phase에서만** 수행한다.

**Restore 완료 스냅샷(운영 재확인용):** **`docs/deployment-registry.md`** §8.

### detailpage-ai-engine — Git 추적 함정·소스 «삭제» 인시던트 (고정, 2026-05)

운영·에이전트 작업에서 **`detailpage-ai-engine` 소스가 통째로 없어진 것처럼 보인 사례**에 대해, **저장소 Git 이력으로 검증 가능한 사실**과 **재발 방지 대책**을 여기에 고정한다. (임의 `rm` 한 번만이 원인이라는 가정은 하지 않는다.)

#### 사실 관계 (Git으로 재현·검증)

- 커밋 **`f70c20b`** (`chore: track detailpage-ai-engine workspace…`): `detailpage-ai-engine/**` 아래 **추적 파일이 10개뿐**이었다 — `.cursor/rules/*.mdc` 8개와 `docs/.bkit-memory.json`, `docs/.pdca-status.json` **만** 포함. **`package.json`, 각 엔진 `src/**`, `dashboard/` Next 앱 등 제품 소스는 이 커밋에 없었다.**
- 커밋 **`c36e7f7`** (`restore(detailpage): recover engine source and fix builds`): 동일 트리에 **수백 개**의 제품 파일이 추가되어 엔진·대시보드가 **Git에 복구**되었다.

따라서 «소스가 임의로 삭제되었다»는 체감의 상당 부분은 **`git clone` / 새 머신 / `git clean` / 미추적만 로컬에 있던 카피 상실** 등으로, **Git에 제품 트리가 없던 구간**과 맞물린 현상으로 설명하는 것이 정확하다.

#### 원인 분석 (심층)

1. **부분 추적(Partial tracking) + 커밋 범위 오해**  
   메시지에 *workspace*가 들어가도 **스테이징은 메타데이터·규칙 파일만**인 경우가 있다. 나머지 `detailpage-ai-engine` 트리를 **`??` 미추적**으로 남긴 채 «추적 완료»로 착각하면, 이후 **한 번의 정리**로 제품 소스가 통째로 사라질 수 있다.

2. **미추적 소스의 생존 조건**  
   미추적 파일은 **`git clone` / `git archive` / 다른 PC로의 순수 Git 이동**에 실리지 않는다. 로컬 전용이면 **`git clean -fd`**, IDE «Discard», 스크립트 오류, 디스크 문제로 **복구 없이 소실**될 수 있다.

3. **에이전트·자동화 리스크**  
   «클린», «리셋», «불필요 파일 제거»류 지시가 **`git clean`** 등과 결합되면 **추적되지 않은 대량 소스가 우선 제거**된다. (본 사례의 **1차 구조적 원인**은 여전히 **Git에 제품 소스가 없던 기간**이다.)

4. **이중 저장소·경로 혼선 (보조)**  
   `SkoolChef/openclaw-saas-engine` vs `SkoolChef/openclaw-projects` 등 **다른 `origin` 클론**에만 디스크 카피가 있었을 때, 현재 클론에서는 «갑자기 없어짐»으로 보일 수 있다. 상단 **「SaaS 엔진과 Git 원격 두 개」** 표를 작업 전에 확인한다.

#### 재발 방지 대책 (필수)

**「워크스페이스를 Git에 올렸다»고 말하기 전에** 아래를 **숫자로** 확인한다.

| 검증 | 기대 |
|------|------|
| `git ls-files detailpage-ai-engine -- '*.ts' '*.tsx' \| wc -l` | **`0`이면 즉시 중단** — 제품 TS가 추적되지 않은 것이다. (복구 후 `main` 기준에서는 **수백 개** 규모가 정상.) |
| `git ls-files detailpage-ai-engine -- '**/package.json' \| head` | `dashboard/package.json`, 엔진 패키지 `package.json` 등이 보여야 한다. |
| `git status --short detailpage-ai-engine/` | **대량 `??` 소스**가 남아 있으면 → **별도 논리 커밋으로 추적**할 때까지 «추적 완료»라고 하지 않는다. |

**금지·주의 (에이전트·인간 공통)**

- **`detailpage-ai-engine` 추적 상태를 확인하지 않은 채 `git clean -fd` / `git clean -fdx`를 실행하지 않는다.**
- **부분 추적 커밋**(규칙·문서만) 직후, 엔진·대시보드 소스가 **`??`로 남아 있으면** 그대로 두지 말고 **추가 커밋으로 제품 트리를 반드시 포함**한다.
- **신규 클론** 직후 엔진이 비어 보이면 **삭제보다 «미수록·미러 클론»** 가능성을 먼저 의심하고 위 표를 실행한다.

**관련 문서:** `docs/deployment-registry.md` §8(복구 스냅샷), 복구 커밋 **`c36e7f7`**.

---

## 1. 에이전트 & Skills 우선 적용 ⭐

**전역 필수 우선순위:** **「필수 우선순위 (Cursor·Claude Code·에이전트)」** — **이 `CLAUDE.md`와 `.cursor/rules`가 bkit·전역 휴리스틱보다 위**다.

### 우선순위 규칙 (bkit·기능 Skills)
1. **bkit Plugin Skills** (21종) — **위 전역 우선순위와 충돌 없을 때** 해당 Skill 실행
2. **Custom Sub-Agents** (`.claude/agents/`) — 전문화된 작업은 위임
3. **bkit Plugin Agents** (13종) — 분석·검증·보고 자동 트리거
4. **직접 구현** — 위 3가지 적용 불가 시에만

### Skill 실행 기준
| 상황 | 실행 Skill / Agent |
|------|-------------------|
| 새 기능 계획 | `/pdca plan {feature}` |
| 코드 리뷰 요청 | `/code-review` 또는 `code-reviewer` agent |
| 프론트엔드 작업 | `bkit:frontend-architect` agent |
| 백엔드/DB 작업 | `bkit:bkend-expert` agent |
| 보안 검토 | `bkit:security-architect` agent |
| Gap 분석 | `bkit:gap-detector` agent |
| 반복 개선 | `bkit:pdca-iterator` agent |
| Python 파일 추가 | `korean-encoding` skill 적용 |
| 상세페이지 생성 | `detail-page` skill 적용 |
| 유튜브 대본·화면녹화 패키지 | `/youtube-script-builder-pro` → `.cursor/skills/youtube-script-builder-pro/SKILL.md` |

자세한 매핑 → @docs/SKILLS.md | 에이전트 맵 → @docs/agents-map.md  
**공식 Agents/Skills 참조** → @official-agent-skills-plugins/README.md (별도 독립 폴더)

---

## 2. 워크스페이스 구조

**이 절의 시야 구분 (이 클론):** 아래 ASCII 트리는 **상위 `CLAUDE/` 워크스페이스**(형제 `projects/*` 포함)를 가리키는 **문서적 참조**가 섞여 있다. **지금 이 저장소**의 **Git root**는 **`.../CLAUDE/projects/openclaw`**(이 폴더)이며, **메인 Next 앱 루트는 `./`**(루트 `package.json` `name: saas-engine`)다. **`projects/openclaw/...`** 표기는 **목표 SSOT(`openclaw-projects`) 경로** 또는 **상위 워크스페이스 정책 관례**로 읽는다 — **이 클론의 실제 cwd 기본값이 아니다**. 실제 vs 목표 경로의 **단일 기준**은 **`docs/deployment-registry.md`**다.

```
CLAUDE/
├── CLAUDE.md               ← 이 파일 (공식: ./CLAUDE.md 또는 ./.claude/CLAUDE.md)
├── index.md                ← 프로젝트별 문서 맵 (프로젝트 시작 시 참조)
├── projects/               ← 일부 프로젝트 (ai-coding-tools, claude-connector, openclaw/saas-engine, …)
│   ├── README.md
│   ├── ai-coding-tools/
│   ├── claude-connector/
│   ├── detail_page_agents/
│   ├── detail-image-generator/
│   ├── ppt-automation/
│   ├── saas-vibecoding-1/
│   ├── openclaw/           ← saas-engine, detailpage-ai-engine 등
│   ├── slack-automation1/
│   ├── slack-automation2/
│   └── vibecoding-slides/
├── official-agent-skills-plugins/   ← 공식 에이전트·스킬 참조 (agents: 목록만 / skills: Anthropic 예제 소스 포함)
│   ├── README.md
│   ├── agents/             ← 공식 Agents 참조 (bkit 13종 등)
│   └── skills/             ← Anthropic 예제 스킬 소스 (docx, pdf, pptx 등) + 스펙·템플릿
├── MEMORY_INDEX.md         ← 분리형 메모리 진입점 (항상 참조)
├── memory/                 ← 주제별 축약 정본 (Phase 6)
├── docs/
│   ├── SKILLS.md           ← Skills 인덱스 (공식 SKILL.md는 .claude/skills/)
│   ├── agents-map.md       ← 에이전트 계층 맵
│   ├── claude-official-rules.md  ← 공식 규칙 상세
│   └── migration/          ← 문서·폴더 이동 이력
├── .claude/
│   ├── agents/             ← 커스텀 서브에이전트 4종
│   ├── skills/             ← 프로젝트 Skills (.claude/skills/<name>/SKILL.md)
│   └── settings.json       ← 권한 + Hooks
└── .mcp.json               ← 앱 커넥터

# Memory: ~/.claude/projects/<project>/memory/MEMORY.md (Claude 자동) + **프로젝트 정본 `./MEMORY_INDEX.md` + `memory/*.md`** (Phase 6, `node scripts/verify-memory-structure.mjs`)
```

**용어 규정:** 이 워크스페이스에서 **「프로젝트 폴더」** 또는 **@projects** 로 지칭하면, 항상 루트의 **`projects/`** 폴더를 가리킨다. 개별 서브폴더(예: `projects/skoolchef-tutorial`)는 「해당 프로젝트」·「그 프로젝트 폴더」 등으로 구체명으로 지칭한다.

---

## 3. 작업 기본 규칙

- **프로젝트별 포함 원칙**: 한 프로젝트의 **모든** 작업·문서·산출물은 해당 프로젝트 폴더 내에 둔다. (예: Plan/Design/Report → `{프로젝트}/docs/`, 아카이브 → `{프로젝트}/docs/archive/`)
- 작업 시작 시 **어느 프로젝트에서 작업할지** 먼저 확인한다
- **프로젝트 시작 시 환경 파일 확인(필수)**: 해당 프로젝트 루트에 `.env.local`과 `.env.example`(또는 `.env.sample`)이 있는지 확인하고, 없으면 생성한 뒤 진행한다. (상세: `.cursor/rules/env-secrets-security.mdc`)
- 출력물·요약·이력은 **해당 프로젝트 하위 폴더**에 기록한다
- **새 프로젝트 폴더를 생성할 때만** (기존 프로젝트에서 작업을 "시작"할 때마다가 아님) 즉시 `git add {프로젝트}/`로 **로컬 저장소 추적**을 시작하고, 필요 시 초기 커밋을 제안한다. 이 추적은 CLAUDE 루트 하나의 Git 저장소 안에서 해당 폴더를 스테이징하는 것이며, GitHub에 새 레포를 만드는 것은 포함하지 않는다.
- 새 기능 개발 전 PDCA Plan 문서 확인 (`docs/01-plan/features/` 또는 프로젝트별 `docs/`)
- 구현 완료 후 Gap 분석 제안 (`/pdca analyze {feature}`)

### Git 추적·원격 전략

**`openclaw-saas-engine` 단독 클론(이 저장소):** **「Git 추적 및 커밋」**, **`docs/git-workflow-openclaw.md`**, **git-plus**가 SSOT다. 아래 표는 **상위 `CLAUDE/` 모노레포** 작업 시에만 해당한다.

| 구분 | 규칙 |
|------|------|
| **이 클론 (우선)** | **git-plus** → `origin` 하나 · 루트 `./`에서 status/add/commit/push |
| **로컬 추적 (모노레포)** | 새 프로젝트 폴더 생성 시에만 `git add {프로젝트}/` — **이 클론에는 루트 `projects/` 없음** |
| **원격 (모노레포)** | CLAUDE 루트 하나·`origin` 하나 → **@docs/github-structure-and-maintenance.md** |

### Git push 규칙

| 맥락 | 규정 |
|------|------|
| **이 클론** | **git-plus** · **`docs/git-workflow-openclaw.md` §3** · push 전 시크릿 검사 · 배포는 **「Vercel 배포 (saas-engine · 필수 SSOT)」** |
| **상위 CLAUDE 모노레포** | **`CLAUDE/` 루트**에서 push · **`.cursor/rules/git-remote-monorepo-push.mdc`** |

에이전트·Cursor: **이 클론** → **`git-plus-priority.mdc`** · 모노레포 → **`git-remote-monorepo-push.mdc`**

### 모노레포 `.gitignore` 규칙 (통합 참조)

| 요지 | 내용 |
|------|------|
| **기본 규칙** | **저장소 루트** `.gitignore`가 워크스페이스 전체에 걸친 기본이다. 공통 패턴(`.env*`, `node_modules/`, `.env.master` 등)은 **루트에 두고** 하위 파일과 중복 나열을 줄인다. |
| **프로젝트별** | `projects/<이름>/.gitignore`는 해당 폴더 트리에만 적용되는 **추가·보완**이다. 루트 규칙을 덮어쓰지 않는다. |
| **`.env.example` 예외** | 커밋 허용(`!.env.example` 등) 줄은 `.env.*` 무시 규칙 **바로 다음**에 둔다. |
| **상세 원문** | **`.cursor/rules/gitignore-monorepo-hierarchy.mdc`**, §4.5 환경 파일·**`.cursor/rules/env-secrets-security.mdc`** |

### Vercel 배포 (통합 참조)

**OpenClaw `saas-engine`:** 본 문서 **「Vercel 배포 (saas-engine · 필수 SSOT)」** + **`docs/vercel-deployment-rules.md`**. **워크스페이스 전체 목록:** **`docs/vercel-projects-registry.md`**.

| 참조 | 용도 |
|------|------|
| **saas-engine 절차** | **「Vercel 배포」절(상단)**, **`docs/vercel-deployment-rules.md`**, **`.cursor/rules/vercel-deploy-openclaw.mdc`** |
| **경로·`.vercel`** | **`docs/deployment-registry.md`** §3·§7 |
| **detailpage 별도** | **`docs/detailpage-ai-engine-deployment-rules.md`** |
| **그 외 Vercel 앱** | 레지스트리 표 · 해당 **`CLAUDE.md`** / **`README`** |

### macOS 자동 배포 (launchd) — 제거됨 (2026-07-18)

매시 git+Vercel(`hourly-git-deploy`) · 자정 Prod(`daily-deploy`) 자동화는 **완전 삭제**했다.

- LaunchAgent plist · Application Support 진입점 · `scripts/daily-production-deploy.sh` · `scripts/launchd/` · `HOURLY-SAAS-GIT-DEPLOY.md` 제거
- **재설치·재등록 금지.** 배포는 **수동** `/deploy-plus` 또는 `./deploy saas` / `./deploy saas --prod` 만
- Hermes 등 다른 `com.skoolchef.*` LaunchAgent 는 본 제거와 무관

### PDCA 폴더 생성 규칙


bkit 플러그인이 PDCA 스캐폴딩 폴더(`01-plan/`, `02-design/`, `03-analysis/`, `04-report/` 등)를 자동 생성할 수 있다. 다음 규칙을 따른다:

1. **각 프로젝트의 `CLAUDE.md`를 먼저 확인** — 해당 프로젝트가 PDCA 폴더를 사용하는지 명시되어 있음
2. **PDCA 폴더를 사용하는 프로젝트** (ppt-automation, skoolchef-ai-studio 등): 기존 구조 유지, 빈 폴더 추가 생성 금지
3. **PDCA 폴더를 사용하지 않는 프로젝트**: 루트에 `01-plan/`, `02-design/`, `03-implementation/`, `03-analysis/`, `04-report/` 등 빈 폴더를 생성하지 않는다
4. **새 프로젝트 생성 시**: `CLAUDE.md`에 문서 구조를 반드시 명시하고, 불필요한 PDCA 스캐폴딩 폴더가 생성되지 않도록 한다

### claude-connector 작업 시 필수 참조

**오류 발생·설계 결정·배포 시** 아래 문서를 먼저 확인하고, 새 사항 발생 시 반드시 기록한다:

```
@projects/claude-connector/docs/work-log.md
```

| 확인 시점 | 참조 섹션 |
|-----------|-----------|
| 오류 발생 | `## 오류 & 원인 & 해결` — 동일 오류 재발 방지 |
| 설계 결정 | `## 아키텍처 설계 결정` — 기존 결정과의 일관성 유지 |
| 배포 전 | `## 배포 명령` — 올바른 scope·token 사용 확인 |
| 새 기능 시작 | `## 미완료 / 다음 기능 후보` — 우선순위 확인 |

---

## 4. 필수: 한글 인코딩 ⚠️

Python 파일 추가·수정 시 `korean-encoding` skill 패턴 **필수** 적용:

```python
# -*- coding: utf-8 -*-
import sys
if hasattr(sys.stdout, "reconfigure"):
    sys.stdout.reconfigure(encoding="utf-8")
    sys.stderr.reconfigure(encoding="utf-8")
# 파일 I/O: open(path, encoding="utf-8")
# JSON: json.dump(..., ensure_ascii=False)
# HTML: <meta charset="UTF-8">
```

---

## 4.5 필수: 환경 변수·시크릿 보안 ⚠️

**모든 프로젝트**에서 API 키, 비밀번호, 토큰 등 시크릿은 반드시 아래 규칙을 따른다.

**Cursor 규칙**: 동일 내용은 `.cursor/rules/env-secrets-security.mdc` 에서 항상 적용된다. **요지**: 전역 API 키·토큰은 기능에 맞게 `~/.zshrc`(export) 또는 워크스페이스 루트 **`.env.master`**(gitignore)에 기록하고, **루트 `.env`에는 참조 규정(주석)만** 둔다. 각 프로젝트는 **`projects/<이름>/.env.local`을 우선**하며, 필요 시 `~/.zshrc`·`.env.master` 규정을 참조한다.

### 원칙

- **시크릿은 Git에 커밋하지 않는다.** 로컬·CI/배포에서만 주입한다.
- **환경 변수로만** 시크릿을 다루고, 코드·문서·예제에 실제 값을 넣지 않는다.

### 환경 파일 규칙

| 파일 | 용도 | Git |
|------|------|-----|
| **`.env.local`** | 실제 시크릿·로컬 전용 값 (API 키, DB URL, 비밀키 등) | **추적 금지** |
| **`.env`** | 기본값(비시크릿)만 사용할 경우에 한함. 시크릿이 있으면 `.env.local`로 이전 | **추적 금지** |
| **`.env.example`** | 변수 이름과 설명만 기재. **실제 값·시크릿 절대 포함 금지** | **커밋** |

### .gitignore 필수 항목

프로젝트 루트 `.gitignore`에 다음을 포함한다:

```gitignore
.env
.env.local
.env.*
!.env.example
```

### 작업 시 적용

- 새 프로젝트 생성 시: `.env.example`만 커밋하고, `.env` / `.env.local`은 `.gitignore`로 제외한다.
- 기존에 `.env`에 시크릿이 있는 경우: 내용을 `.env.local`로 옮기고 `.env`를 삭제한 뒤, `.env.example`에는 변수 이름과 placeholder만 둔다.
- 문서·README에서 환경 설정 안내 시: “`.env.example`을 참고해 `.env.local`에 값을 채우세요”라고 안내하고, 실제 시크릿을 문서에 적지 않는다.

---

## 5. "Show me" 출력 규칙 ✨

사용자가 **"Show me"** 키워드를 사용할 때마다 반드시 아래 규칙을 따른다.

### 핵심 원칙
- **절대 ASCII/텍스트 다이어그램 금지** — 마크다운 테이블·코드블록 ASCII art로 대체하지 않는다
- **항상 HTML Artifact로 출력** — 브라우저에서 바로 렌더링되는 완성형 HTML을 생성한다
- **비주얼 퀄리티 기준**: 스타트업 프로덕트 수준의 UI (Notion · Linear · Vercel 대시보드 스타일)

### 필수 디자인 요소
| 요소 | 적용 방법 |
|------|-----------|
| **카드 그리드** | CSS Grid 2-3열, 각 카드에 아이콘·제목·설명·태그 포함 |
| **태그/뱃지** | 둥근 pill 형태, 파스텔 배경색 |
| **타이포그래피** | 제목 24px bold, 본문 14px, 한글 지원 폰트(Noto Sans KR 또는 system-ui) |
| **색상 팔레트** | 배경 #FAFAF8(크림), 카드 #FFFFFF, 강조 #4F46E5(인디고) 또는 컨텍스트 맞춤 |
| **여백·그림자** | 카드 padding 24px, box-shadow: 0 1px 3px rgba(0,0,0,0.08) |
| **호버 효과** | transform: translateY(-2px), shadow 강화 |
| **반응형** | max-width 900px 중앙 정렬 |

### 출력 형식
```
1. <html> 전체 문서 (<!DOCTYPE html> 포함)
2. <style> 인라인 CSS (외부 CDN 의존 최소화, Google Fonts 허용)
3. 콘텐츠에 맞는 레이아웃 선택:
   - 정보 비교 → 카드 그리드
   - 단계/플로우 → 타임라인 or 스텝 카드
   - 데이터 → 테이블 + 차트 스타일
   - 개념 설명 → 히어로 + 섹션
4. 한국어 콘텐츠 → lang="ko" + Noto Sans KR
```

### 레퍼런스 스타일
스크린샷 참조: 카드에 아이콘(이모지 박스) + 제목 + 설명 + 태그 pill + 우측 상단 점 인디케이터(레벨/강도 표시)

---

### slack-automation1
- **목적**: Solo-entrepreneur 의사결정 → Slack 자동화
- **실행**: `daily-brief.sh`(08:30), `weekly-review.sh`(월 09:00)
- **Bot**: `@skoolkorea_slackmcp` | 채널 맵 → `docs/channel-id-map.md`
- **경로**: `projects/slack-automation1/`

### slack-automation2
- **목적**: Slack + Buttondown 뉴스레터 파이프라인
- **스택**: Next.js 16 + Vercel + Buttondown API
- **커맨드**: `/subscribe`, `/newsletter`, `/subscribers`
- **경로**: `projects/slack-automation2/`

### detail_page_agents
- **목적**: 이커머스 상세페이지 13섹션 자동 생성
- **실행**: `python scripts/run_pipeline.py --product_name "상품명"`
- **경로**: `projects/detail_page_agents/`

### detail-image-generator
- **목적**: 제품 정보 → 13섹션 고전환 상세페이지 이미지 생성
- **실행**: `python scripts/generate_page.py`
- **경로**: `projects/detail-image-generator/`

### themango
- **목적**: 더망고 상품 대량 업데이트 자동화
- **실행**: 더망고 업데이트 페이지 → F12 Console → `src/batch-update-auto.js`

### ppt-automation
- **목적**: 마크다운 → HTML/PPTX 프레젠테이션
- **경로**: `projects/ppt-automation/`

### claude-connector
- **목적**: Claude Connector MCP 대시보드 (Next.js 14 + Vercel KV + NextAuth)
- **프로덕션**: https://claude-connector-gamma.vercel.app
- **경로**: `projects/claude-connector/`
- **작업 로그**: `projects/claude-connector/docs/work-log.md` ← **오류·설계결정·배포 명령 기록**
- **구조도**: `projects/claude-connector/docs/claude-connector-structure.md`

### vibecoding-slides
- **목적**: 바이브코딩 기초·시나리오 슬라이드
- **문서**: `projects/vibecoding-slides/docs/`
- **경로**: `projects/vibecoding-slides/`

### ai-coding-tools
- **목적**: AI 코딩 도구(Cursor, Antigravity, Claude Code) 경쟁사 분석 슬라이드
- **문서**: `projects/ai-coding-tools/docs/`
- **경로**: `projects/ai-coding-tools/`

### Claude Update
- **목적**: Anthropic Claude 업데이트 추적·정리 (docs, Marp 슬라이드, Slack 다이제스트)
- **실행**: `bash "Claude Update/scripts/update-check.sh"` | 수동 주제: `manual-update.sh --topic "주제"`
- **경로**: `Claude Update/`

### Cursor Update
- **목적**: Cursor IDE 업데이트 추적·정리 (형식: Claude Update 준용)
- **위치**: **CURSOR 워크스페이스**에만 존재 — `CURSOR/Cursor Update/`
- **실행**: CURSOR 루트에서 `bash "Cursor Update/scripts/update-check.sh"`

### saas-vibecoding 1
- **목적**: 바이브코딩 기반 SaaS (구체 기획 추후 제출)
- **문서**: `projects/saas-vibecoding-1/docs/`
- **경로**: `projects/saas-vibecoding-1/`

### saas-engine
- **목적**: 로그인 · 인증 · 체크아웃(결제) 플로우 + 재사용 가능한 SaaS 엔진 플랫폼
- **문서**: **`docs/`** (이 저장소 Git 루트 기준)
- **경로(앱 루트)**: **`./`** — Git 루트 = Next 앱 루트; 루트 `package.json` `name: saas-engine`
- **참고**: 루트 직하위 **`saas-engine/`** 폴더는 **현재 앱 루트가 아님** (`@docs/deployment-registry.md` §3). **`projects/openclaw/saas-engine`** 은 **`openclaw-projects` 통합 후 목표 경로**다.
- **우선 참조**: **루트 `./CLAUDE.md`**, **`@docs/deployment-registry.md`**

### skoolchef-tutorial
- **목적**: 스쿨용 AI 바이브코딩 커리큘럼 사이트 (Cursor · Claude Code · Gemini CLI · Google Workspace CLI)
- **실행**: `pnpm dev` → http://localhost:3000
- **경로**: `projects/skoolchef-tutorial/`
- **가이드**: `projects/skoolchef-tutorial/CLAUDE.md`
- **본문 타이포 SSOT** (`projects/skoolchef-tutorial/CLAUDE.md` §1.1과 동일):

| 항목 | 값 |
|------|-----|
| 폰트 패밀리 | Geist Sans → 한글 시스템 산세리프 (`--font-sans` / `app/layout.tsx`) |
| Tailwind | `text-sm` + `font-semibold` |
| 크기 | **13px** (`text-[13px]` 권장 — `text-sm` 기본 14px과 구분) |
| 굵기 | **600** (Semibold) |
| 행간 | `text-sm` 기본 **20px** (1.25rem) |

- **구현 클래스**: `lib/hub-korean-body-typography.ts` (`HUB_KOREAN_BODY_*`) — 허브·도구 카드 본문. 신규 스쿨셰프 UI는 이 SSOT 또는 동일 토큰으로 맞춘다.

### SkoolChef AI Studio
- **목적**: 스쿨셰프 1인 기업가 브랜드·강사/컨설트 대외 포트폴리오·회사소개 + AI 디지털 팀(Mangchi·Pochi)·PDCA 문서
- **경로**: `projects/skoolchef-ai-studio/`
- **가이드**: `projects/skoolchef-ai-studio/CLAUDE.md`(대시보드·saas-engine 방침 포함), `CLAUDE.me.md`(목적 1·2)
- **SaaS 제품**: 별도 — **이 저장소(`openclaw`) 루트 허브** 연결은 Studio 쪽 `docs/reference/saas-engine.md` 및 프로젝트 `CLAUDE.md` 「Studio와 saas-engine」 참고 (`projects/openclaw/saas-engine` 은 **목표 SSOT 레이아웃**일 때의 경로)

### openclaw
- **목적**: OpenClaw(자율 에이전트·게이트웨이) 관련 지속 작업 — 문서·통합·실험
- **경로(이 클론)**: **Git 루트 `./`** — 상위 모노레포 문서의 `projects/openclaw/` 는 **그 레포 안에서의 위치**를 가리키며, **이 단독 클론과 동일 경로 문자열이 아닐 수 있음**
- **가이드**: **`./CLAUDE.md`**, `docs/work-log.md`

---

## 6. 커밋 & 브랜치 규칙

- 브랜치: `feat/`, `fix/`, `docs/`, `chore/` 접두사 사용
- 커밋: 한글 또는 영문 모두 가능, 변경 이유 중심으로 작성
- PR 전: 테스트 실행 확인 필수
- **원격 반영(`git push`)**: **「Git 추적 및 커밋」** · **git-plus** · **@docs/git-workflow-openclaw.md** (이 클론). 상위 모노레포만 **@docs/github-structure-and-maintenance.md**.

---

## 워크스페이스 정책 보강 (2019 cleanup replay)

아래 항목은 **로컬 전용·비밀·생성물**이 저장소에 올라가지 않도록 `.gitignore`에도 반영한다.

- 로컬 에이전트 상태: **`.omc/`** 및 중첩 **`**/.omc/**`**.
- Supabase/문서 스냅샷: **`supabase/.temp/`**, **`docs/.pdca-snapshots/`** (이미 상단 블록에 있으면 중복 추가하지 않는다).
- Gemini 앱 로컬 메타(경로 고정): **`apps/gemini-saas/docs/.pdca-status.json`**, **`apps/gemini-saas/docs/.bkit-memory.json`**.
- 로컬 메모·실험·참고: **`DEVLOG.md`**, **`write-post.md`**, **`_reference/`**, **`playground/`**.
- 복구용 디렉터리: **`.git-recovery-checks/`**.

배포·Polar·detailpage 등 **운영 규칙 문장**은 본문 기존 절과 `docs/`가 우선이다.

공개 문서 변환 코드 (HTML)

<h1>CLAUDE.md — 워크스페이스 가이드</h1>
<blockquote>
<p>Claude Code 공식 Best Practice 기반 | 2026-03 업데이트</p>
</blockquote>
<p><strong>공식 규칙</strong>: CLAUDE.md, Skills, Memory 상세 → @docs/claude-official-rules.md</p>
<hr>
<h2>필수 우선순위 (Cursor·Claude Code·에이전트) ⭐</h2>
<p><strong>충돌 시 아래 순서를 따른다.</strong> (Cursor: <code>.cursor/rules/openclaw-claude-md-cursor-priority.mdc</code>)</p>
<table>
<thead>
<tr>
<th>순위</th>
<th>출처</th>
<th>용도</th>
</tr>
</thead>
<tbody><tr>
<td><strong>0</strong></td>
<td><strong><code>./CLAUDE.Ingest.md</code></strong></td>
<td><strong>수집·1차편집·L0·프론트매터·daily-reflection SSOT</strong> — 해당 작업 시 <strong>최우선 필수 참조</strong></td>
</tr>
<tr>
<td><strong>0b</strong></td>
<td><strong><code>../../../CLAUDE.Governance.md</code></strong> (+ <code>AGENTS.Governance.md</code> · <code>CLAUDE.Governance.Eval.md</code>)</td>
<td>Admin · LC/LS/VS · saas <strong>운영</strong> Governance <strong>전역 정본</strong> (WORKSPACE_CLEAN 루트; 로컬 동명은 포인터)</td>
</tr>
<tr>
<td><strong>1</strong></td>
<td><strong>이 파일 (<code>./CLAUDE.md</code>)</strong></td>
<td>openclaw <strong>단독 클론</strong> 일상 SSOT — <strong>§ Git 추적</strong>, <strong>§ Vercel 배포</strong></td>
</tr>
<tr>
<td><strong>2</strong></td>
<td><strong><code>.cursor/rules/</code></strong></td>
<td>Cursor 필수 — <code>claude-ingest-ssot</code>, <code>vercel-deploy-openclaw</code>, <code>git-plus-priority</code> 등</td>
</tr>
<tr>
<td><strong>3</strong></td>
<td><strong><code>docs/</code> SSOT</strong></td>
<td><code>git-workflow-openclaw.md</code>, <strong><code>vercel-deployment-rules.md</code></strong>, <code>deployment-registry.md</code></td>
</tr>
<tr>
<td><strong>4</strong></td>
<td><strong>프로젝트 Skills</strong></td>
<td><strong><code>/git-plus</code></strong>, <strong><code>/deploy-plus</code></strong>, <strong><code>/learning-control-ingest-plus</code></strong> — <code>docs/workspace-targets-registry.md</code></td>
</tr>
<tr>
<td><strong>5</strong></td>
<td>bkit·전역 Skills</td>
<td>0~4와 충돌 없을 때만</td>
</tr>
</tbody></table>
<ul>
<li><strong>수집 / Ingest / 1차편집 / 프론트매터 / daily-reflection / L0</strong> → <strong>반드시 <code>@CLAUDE.Ingest.md</code></strong> (이 repo 루트). Cursor: <strong><code>.cursor/rules/claude-ingest-ssot.mdc</code></strong>. 워크스페이스 포인터: <code>WORKSPACE_CLEAN/CLAUDE.Ingest.md</code>.</li>
<li><strong>Admin / LC / LS / VS / saas 운영</strong> → <strong><code>@CLAUDE.Governance.md</code></strong> (WORKSPACE_CLEAN 루트 전역 정본; 이 폴더 동명 파일은 포인터). 공용 에이전트 <code>@AGENTS.Governance.md</code> · 평가 <code>@CLAUDE.Governance.Eval.md</code>. Cursor: <strong><code>admin-console-governance.mdc</code></strong>.</li>
<li><strong>2019↔2020 경로:</strong> <code>@docs/machine-hosts-ssot.md</code> (문서·스킬은 <code>~/</code> · 전역 Cursor는 <code>~/Desktop/WORKSPACE_CLEAN/scripts/sync-ingest-cursor-global.sh</code>).</li>
<li><strong><code>/git-plus</code></strong>, <strong>「깃추적」</strong>, <strong>「깃추적 saas|hermes|detailpage」</strong> → <strong>git-plus</strong> (<code>.cursor/skills/git-plus/SKILL.md</code>). 대상 없으면 AskQuestion. <strong>「깃추적 openclaw」= saas</strong> (repo). 전역 커밋 휴리스틱 <strong>대체 금지</strong>.</li>
<li><strong><code>/deploy-plus</code></strong>, <strong>「규칙대로 버셀배포」</strong>, <strong>「규칙대로 배포 saas|detailpage」</strong> → <strong>deploy-plus</strong> — Vercel <strong>saas·detailpage만</strong>. <strong>hermes·openclaw는 배포 대상 아님</strong> (Hermes=Docker).</li>
<li>레거시 <strong>「규칙대로 배포하자」</strong> → <strong>deploy-plus</strong> (대상 AskQuestion). <strong>saas</strong> 선택 시 Preview <code>./deploy saas</code> → (prod 제외 없으면) <code>./deploy saas --prod</code>.</li>
<li><strong><code>/youtube-script-builder-pro</code></strong>, <strong>대본 작성</strong>, <strong>영상 대본</strong>, <strong>유튜브 대본</strong>, <strong>스크립트 작성</strong>, <strong>Screen Studio 대본</strong>, <strong>벤치마킹 분석</strong> → <strong>youtube-script-builder-pro</strong> (<code>.cursor/skills/youtube-script-builder-pro/SKILL.md</code> + <code>ask-questions.md</code>). Phase 0 브리프 후 모드 라우팅. 검증: <code>node .agents/skills/youtube-script-builder-pro/scripts/verify-youtube-script-builder-pro.mjs</code>. 상세 → <strong>@docs/SKILLS.md</strong> § Content production.</li>
<li>그 외 Vercel → <strong>§ Vercel 배포</strong> + <code>docs/vercel-deployment-rules.md</code> + <code>vercel-deploy-openclaw.mdc</code>.</li>
</ul>
<h3>분리형 메모리 (항상 참조 · Phase 6)</h3>
<table>
<thead>
<tr>
<th>순서</th>
<th>참조</th>
<th>용도</th>
</tr>
</thead>
<tbody><tr>
<td><strong>M1</strong></td>
<td><strong><code>@MEMORY_INDEX.md</code></strong></td>
<td>분리형 메모리 <strong>진입점</strong> — 7개 주제 <code>memory/*.md</code> 링크</td>
</tr>
<tr>
<td><strong>M2</strong></td>
<td><strong><code>memory/workflow-principles.md</code></strong></td>
<td>Phase·완료보고·삭제 금지·commit/push/deploy 금지 (<strong>모든 작업</strong>)</td>
</tr>
<tr>
<td><strong>M3</strong></td>
<td><strong><code>memory/accounts-env-policy.md</code></strong></td>
<td>secret/token/env 분리 (<strong>모든 작업</strong>)</td>
</tr>
<tr>
<td><strong>M4+</strong></td>
<td><strong><code>memory/*.md</code> (주제별)</strong></td>
<td>cursor-rules · saas-engine · learning-studio · hermes-openclaw · slack-automation</td>
</tr>
</tbody></table>
<p>Cursor: <strong><code>.cursor/rules/memory-index-baseline.mdc</code></strong> (<code>alwaysApply</code>). 검증: <code>node scripts/verify-memory-structure.mjs</code></p>
<hr>
<h2>Cursor Rules — Claude Code 자동 로드</h2>
<blockquote>
<p><code>.cursor/rules/*.mdc</code> → Claude Code <code>@</code> import 동기화. 원본 파일을 단일 소스로 공유.</p>
</blockquote>
<h3>항상 적용 (alwaysApply: true)</h3>
<p>@.cursor/rules/openclaw-claude-md-cursor-priority.mdc
@.cursor/rules/memory-index-baseline.mdc
@.cursor/rules/claude-ingest-ssot.mdc
@.cursor/rules/git-plus-priority.mdc
@.cursor/rules/deploy-plus-priority.mdc
@.cursor/rules/deploy-by-rules-chat.mdc
@.cursor/rules/vercel-deploy-openclaw.mdc
@.cursor/rules/git-commit-separation.mdc
@.cursor/rules/pre-commit-build-validation.mdc
@.cursor/rules/bundled-file-placement.mdc
@.cursor/rules/env-secrets-security.mdc
@.cursor/rules/git-remote-monorepo-push.mdc
@.cursor/rules/gitignore-monorepo-hierarchy.mdc
@.cursor/rules/cron-gitignore-check.mdc
@.cursor/rules/korean-encoding.mdc
@.cursor/rules/learning-control-phase-discipline.mdc
@.cursor/rules/pdca-folder-guard.mdc
@.cursor/rules/prioritize-rules-skills.mdc
@.cursor/rules/project-context-and-logging.mdc
@.cursor/rules/project-startup-automation.mdc
@.cursor/rules/claude-code-guide.mdc
@.cursor/rules/apple-theme-ui-components.mdc
@.cursor/rules/detailpage-hub-isolation.mdc
@.cursor/rules/detailpage-pipeline2-execution-first.mdc
@.cursor/rules/youtube-script-builder-pro-priority.mdc
@.cursor/rules/cursor-instruction-output-format.mdc</p>
<h3>조건부 (glob 트리거)</h3>
<p>@.cursor/rules/admin-agents-kanban.mdc
@.cursor/rules/admin-learning-control.mdc
@.cursor/rules/saas-engine-document-workflow.mdc
@.cursor/rules/openclaw-design-skill-discipline.mdc
@.cursor/rules/projects-status.mdc</p>
<hr>
<h2>프로젝트 시작 시 참조 (필수)</h2>
<p>새 대화·작업을 시작할 때 아래 순서로 참조한다.</p>
<table>
<thead>
<tr>
<th>순서</th>
<th>참조</th>
<th>용도</th>
</tr>
</thead>
<tbody><tr>
<td>0</td>
<td><strong>@CLAUDE.Ingest.md</strong></td>
<td><strong>수집·1차편집·L0·프론트매터 SSOT (해당 작업 시 최우선)</strong></td>
</tr>
<tr>
<td>1</td>
<td><strong>이 파일 (CLAUDE.md)</strong></td>
<td><strong>필수 우선순위</strong>, Git·배포 SSOT, 프로젝트 요약</td>
</tr>
<tr>
<td>2</td>
<td><strong>@MEMORY_INDEX.md</strong> + <strong><code>memory/workflow-principles.md</code></strong></td>
<td><strong>분리형 메모리</strong> — Phase·보고·민감정보 공통 원칙 (항상)</td>
</tr>
<tr>
<td>3</td>
<td><strong>@index.md</strong></td>
<td>프로젝트별 문서 위치·docs 맵</td>
</tr>
<tr>
<td>3</td>
<td><strong>@docs/workspace-targets-registry.md</strong></td>
<td><strong>git-plus / deploy-plus</strong> 대상 (hermes · saas · detailpage)</td>
</tr>
<tr>
<td>4</td>
<td><strong>@docs/git-workflow-openclaw.md</strong></td>
<td><strong>이 클론</strong> Git 루트·커밋·push vs 배포</td>
</tr>
<tr>
<td>5</td>
<td><strong>@docs/vercel-deployment-rules.md</strong></td>
<td><strong>saas-engine</strong> Vercel 수동·자동 배포 SSOT</td>
</tr>
<tr>
<td>6</td>
<td><strong>official-agent-skills-plugins/</strong></td>
<td>공식 에이전트·스킬 참조 (bkit 플러그인 13종/21종 등) — @official-agent-skills-plugins/README.md</td>
</tr>
<tr>
<td>7</td>
<td><strong>@docs/SKILLS.md</strong>, <strong>@docs/agents-map.md</strong></td>
<td>스킬·에이전트 상세 맵</td>
</tr>
<tr>
<td>8</td>
<td><strong>@docs/openclaw-saas-engine 심층 분석-20260514.md</strong></td>
<td>구조·스택·제품 범위 + <strong><code>openclaw-projects</code>와의 관계 검증(§9)</strong> (2026-05-14)</td>
</tr>
<tr>
<td>9</td>
<td><strong>@docs/deployment-registry.md</strong></td>
<td>배포 레지스트리: <strong>이 Git 루트</strong>의 실제 경로 vs 목표 SSOT·<code>projects/openclaw/...</code>·<code>.vercel</code> 주의</td>
</tr>
<tr>
<td>10</td>
<td><strong>@docs/kanban/SKOOLCHEF-KANBAN-DESIGN-PRINCIPLES.md</strong></td>
<td>Kanban Hub / Admin / Hermes 역할 분리 — <strong>Admin = Master Control Center</strong></td>
</tr>
<tr>
<td>11</td>
<td><strong><code>.cursor/rules/admin-agents-kanban.mdc</code></strong></td>
<td>Admin Agents Kanban 작업 시 Cursor 필수 규칙</td>
</tr>
<tr>
<td>12</td>
<td><strong><code>@DESIGN.md</code></strong></td>
<td><strong>시각 디자인 SSOT</strong> — Ops(hub/admin) · Marketing(apple-theme-ui) · Cursor workbench 토큰</td>
</tr>
<tr>
<td>13</td>
<td><strong><code>@docs/design/openclaw-design-skill-operating-rule.md</code></strong></td>
<td><strong>UI 개선 운영 규칙</strong> — Design Skill 작업 전 체크리스트 · Phase 범위 1~2개 · 8가지 품질 기준</td>
</tr>
</tbody></table>
<h3>Admin Agents Kanban · Master Control Center (필수 · PR-3C-1)</h3>
<p><strong>OpenClaw Admin Console Agents Kanban</strong> (<code>/admin/agents-kanban</code>) 및 Kanban 통제 작업 시 <strong>항상</strong> 아래를 기준으로 한다. 상세 SSOT: <strong><code>docs/kanban/SKOOLCHEF-KANBAN-DESIGN-PRINCIPLES.md</code></strong>, Cursor: <strong><code>.cursor/rules/admin-agents-kanban.mdc</code></strong>.</p>
<table>
<thead>
<tr>
<th>표면</th>
<th>역할</th>
</tr>
</thead>
<tbody><tr>
<td><strong>Hub</strong> (<code>/projects/openclaw/hub</code>)</td>
<td><strong>상태 SoT</strong> — read-only 상태 허브</td>
</tr>
<tr>
<td><strong>Hermes <code>:9119</code></strong></td>
<td><strong>실행 현장</strong> — DnD · dispatch · orchestration</td>
</tr>
<tr>
<td><strong>Admin Agents Kanban</strong></td>
<td><strong>Master Control Center / 종합관리센터</strong> — Hermes Kanban 기능을 <strong>포함·확장</strong>하는 상위 통제판</td>
</tr>
</tbody></table>
<p><strong>Notify (PR-3D-1<del>5 · PR-3E-1</del>8 완료 — 시리즈 마감)</strong><br>구현: notify-list read · target options · subscribe/unsubscribe API · 승인형 Panel/Detail UI · <strong>validation-only dry-run Preview</strong> (<code>POST /api/admin/kanban/notify-preview</code>) · notify-list 기반 preview warnings · <strong>warning label 통일</strong> (<code>labelNotifyPreviewWarningCode</code>). E2E: <code>admin-agents-kanban-authenticated</code> §21–24 (preview) · <strong>§26 subscribe</strong> · <strong>§27 unsubscribe</strong> (성공 시 notify-list refresh · Audit MCC · Detail Timeline; 실패 시 safe error만). 문서: <a href="docs/kanban/ADMIN-MCC-NOTIFY-SUBSCRIBE-ARCHITECTURE.md">architecture</a> · <a href="docs/kanban/ADMIN-MCC-NOTIFY-DRY-RUN-PREVIEW.md">dry-run</a> · <a href="docs/kanban/ADMIN-MCC-NOTIFY-RUNBOOK.md">runbook</a> (승인 절차 · <strong>§6 Preview warning FAQ</strong>) · <a href="docs/kanban/ADMIN-MCC-NOTIFY-LEGACY-ROWS.md">legacy rows</a>. <strong>Slack message send·Bridge write는 범위 밖</strong> (Bridge → <strong>PR-4</strong>).</p>
<p><strong>고정 원칙</strong></p>
<ol>
<li>Admin은 <strong>슬림판·축소판이 아니다.</strong> Hermes Kanban을 <strong>포함</strong>하는 <strong>상위 확장판</strong>이다.</li>
<li>Hub와 Admin의 차이는 <strong>UI 크기가 아니라 권한·역할</strong> (Hub: read-only 확인 · Admin: 운영·관리·통제).</li>
<li>Admin은 <strong>Create · Assign · Move · Edit(관리) · Notify · Audit · Events · Timeline · Comment · Link · Board Admin</strong> 을 <strong>유지·강화</strong>한다.</li>
<li>Admin의 stats·L0–L3·blocked 등 <strong>상태·운영 정보</strong>는 통제 판단을 돕는 <strong>운영 UI</strong>로 <strong>유지·강화 가능</strong> — 「Hub 중복이므로 Admin 상태 UI 제거」는 <strong>금지</strong>.</li>
<li>향후 Admin Phase는 <strong>축소가 아니라 확장·증보·통제 강화</strong> 방향.</li>
</ol>
<p><strong>ICC 고정 UI (삭제 금지)</strong><br><strong>새로운 보드 생성하기</strong> · <strong>새로운 업무 만들기</strong> 섹션(제목 + card-block 폼)은 <strong>항상 표시</strong>. Hermes 브리지 미설정이어도 폼을 <strong>통째로 숨기지 않음</strong> — 비활성 + 안내만. (<code>.cursor/rules/admin-agents-kanban.mdc</code> § ICC 고정 섹션)</p>
<p><strong>금지 (문서·구현 공통)</strong><br>「Admin slim」「Admin 축소」「Hub 중복 → Admin 상태 UI 제거」를 <strong>목표</strong>로 삼지 않는다. (PR-3B의 카드→Detail 통제 집중은 <strong>슬림화 목표가 아님</strong>.)</p>
<h3>Learning Control · 문서 분류→공개→Hub→영상 (필수)</h3>
<p><strong>수집·Ingest·프론트매터:</strong> <strong>반드시 <code>@CLAUDE.Ingest.md</code></strong> (파이프라인 계층·슬래시 맵·FM 키·사고기록·Forbidden). Cursor: <code>.cursor/rules/claude-ingest-ssot.mdc</code>.</p>
<p><strong>최종 목적:</strong> 모든 문서를 <strong>Admin Console</strong>에서 통제하고 <strong>SaaS 공개 · Learning Hub · 영상 · Publish</strong>까지 이어지는 파이프라인을 완성한다.</p>
<pre><code>Raw Source → Prepared Docs → Open Candidates → SaaS Public Docs → Learning User Hub → Video → Publish/Deploy
</code></pre>
<table>
<thead>
<tr>
<th>항목</th>
<th>SSOT</th>
</tr>
</thead>
<tbody><tr>
<td><strong>마스터 문서</strong></td>
<td><strong><code>docs/learning-control/README.md</code></strong> — Stage 1~11 · Phase · Run · manifest 관계</td>
</tr>
<tr>
<td><strong>Admin UI</strong></td>
<td><code>/admin/learning-control</code> · manifest <code>content/learning-sources/control-plane/manifest.json</code></td>
</tr>
<tr>
<td><strong>문서 분류 산출물</strong></td>
<td><code>docs/learning-studio/docs-inventory.json</code> · <code>docs-visibility-classification.json</code></td>
</tr>
<tr>
<td><strong>통합 분류 인덱스</strong></td>
<td><code>lib/control-plane/document-classification-index.ts</code></td>
</tr>
<tr>
<td><strong>Corpus·헤더 분류 SSOT (7헤더 동일)</strong></td>
<td><code>lib/control-plane/document-classification-corpus-ssot.ts</code></td>
</tr>
<tr>
<td><strong>corpus 재스캔</strong></td>
<td><code>pnpm learning-control:scan-corpus:write</code></td>
</tr>
<tr>
<td><strong>SaaS 헤더 매핑</strong></td>
<td><code>lib/learning-studio/public-docs-menu-config.ts</code></td>
</tr>
<tr>
<td><strong>Hub registry</strong></td>
<td><code>lib/hub-assistant/hub-document-registry.ts</code></td>
</tr>
<tr>
<td><strong>명명·lifecycle</strong></td>
<td><code>docs/learning-studio/naming-canonical-registry.md</code></td>
</tr>
<tr>
<td><strong>INGEST API</strong></td>
<td><code>POST /api/admin/learning-control/ingest</code> — <code>dry_run</code> · <code>commit_plan</code> · <code>commit_apply</code></td>
</tr>
</tbody></table>
<p><strong>원칙:</strong> 승인 전 manifest·<code>content/public-docs</code>·파일 <strong>쓰기 금지</strong> — <code>commit_plan</code> preview → <code>commit_apply</code> + approvalToken만 writer 허용.</p>
<h3>필참 · SaaS 엔진과 Git 원격 두 개 (에이전트·인간 공통)</h3>
<p><strong>새 대화·배포·동기화·경로 설계를 시작하기 전에 반드시 아래를 읽고 따른다.</strong> 모호하면 <strong><code>@docs/openclaw-saas-engine 심층 분석-20260514.md</code> §9</strong> 를 먼저 연다.</p>
<table>
<thead>
<tr>
<th>구분</th>
<th>정확한 저장소 명칭</th>
<th>GitHub URL</th>
<th>앱 코드 위치</th>
</tr>
</thead>
<tbody><tr>
<td><strong>모노레포</strong></td>
<td><code>SkoolChef/openclaw-projects</code></td>
<td><a href="https://github.com/SkoolChef/openclaw-projects">https://github.com/SkoolChef/openclaw-projects</a></td>
<td><strong><code>projects/openclaw/saas-engine/</code></strong> (통합 후 <strong>목표</strong> 레이아웃; 그 안이 Next 앱 루트)</td>
</tr>
<tr>
<td><strong>단독 레포</strong></td>
<td><code>SkoolChef/openclaw-saas-engine</code></td>
<td><a href="https://github.com/SkoolChef/openclaw-saas-engine">https://github.com/SkoolChef/openclaw-saas-engine</a></td>
<td><strong>저장소 Git 루트 = Next 앱 루트</strong> (<code>app/</code>, <code>package.json</code> 등)</td>
</tr>
</tbody></table>
<ul>
<li><strong><code>openclaw-saas-engine</code> 단독 클론(이 저장소):</strong> Next 앱 루트 = <strong>Git 루트 <code>./</code></strong>, 루트 <code>package.json</code>의 <strong><code>name: saas-engine</code></strong>. 루트 직하위 <strong><code>saas-engine/</code></strong> 폴더는 <strong>npm/Vercel 앱 루트가 아님</strong>. <strong><code>projects/openclaw/...</code></strong> 는 <strong>이 클론의 실행 cwd가 아니라</strong> <code>openclaw-projects</code> 통합 시 <strong>목표 정책 경로</strong>다 — <strong><code>@docs/deployment-registry.md</code> §3·§5.</strong></li>
<li>위 둘은 **동일 제품 계열(OpenClaw SaaS 허브 / <code>saas-engine</code>)**이나 <strong>별도 <code>origin</code>·별도 <code>main</code></strong> 이다. <strong>서브모듈·자동 미러가 아니다.</strong> 한쪽만 수정하면 <strong>드리프트</strong>가 생긴다.</li>
<li><code>git remote -v</code>로 <strong>지금 클론이 어느 저장소인지</strong> 먼저 확인하고, 문서·커밋·배포 대상 경로를 그에 맞춘다.</li>
<li>두 원격의 관계·검증 절차·운영 주의는 <strong><code>@docs/openclaw-saas-engine 심층 분석-20260514.md</code> §9</strong> 가 <strong>확정 근거(SSOT)</strong> 이다. <strong>필참.</strong></li>
</ul>
<p><strong>원칙</strong>: 한 프로젝트의 모든 작업·문서·산출물은 <strong>해당 프로젝트 폴더 안</strong>에 둔다. 공통 메타만 루트 <code>docs/</code> 또는 <code>official-agent-skills-plugins/</code>에 둔다.</p>
<hr>
<h2>Git 추적 및 커밋 (openclaw 단독 클론 · 필수)</h2>
<p><strong>이 저장소(<code>SkoolChef/openclaw-saas-engine</code> 단독 클론)</strong> 의 깃 추적·커밋·푸시는 <strong>아래 SSOT</strong>를 따른다. 상위 <code>CLAUDE/</code> 모노레포 push 규칙(§3 「Git push 규칙」)은 <strong>이 클론에 적용하지 않는다</strong> — 실행 cwd는 <strong>항상 <code>git rev-parse --show-toplevel</code>(= <code>./</code>)</strong>.</p>
<table>
<thead>
<tr>
<th>항목</th>
<th>규정</th>
</tr>
</thead>
<tbody><tr>
<td><strong>일상 SSOT</strong></td>
<td><strong><code>docs/git-workflow-openclaw.md</code></strong></td>
</tr>
<tr>
<td><strong>슬래시·채팅</strong></td>
<td><strong><code>/git-plus</code></strong> · <strong>깃추적</strong> · **깃추적 saas</td>
</tr>
<tr>
<td><strong>에이전트·Cursor</strong></td>
<td><strong><code>.cursor/skills/git-plus/SKILL.md</code></strong> — 대상 없으면 AskQuestion. <strong>깃추적 openclaw</strong> = <strong>saas</strong>. <strong>푸시</strong> 명시 시만</td>
</tr>
<tr>
<td><strong>Cursor 규칙</strong></td>
<td><strong><code>git-plus-priority.mdc</code></strong>, <strong><code>openclaw-claude-md-cursor-priority.mdc</code></strong>, <strong><code>git-commit-separation.mdc</code></strong>, <strong><code>env-secrets-security.mdc</code></strong></td>
</tr>
<tr>
<td><strong>CLI 일괄</strong></td>
<td><code>bash scripts/git-plus-interactive.sh [pathspec]</code> (채팅은 SKILL ①②③ + 번호 선택)</td>
</tr>
</tbody></table>
<h3>Git Plus 절차 (요약)</h3>
<ol>
<li><strong>① 맥락</strong> — <code>git status -sb</code>, <code>origin/main</code> 대비 ahead 여부.</li>
<li><strong>② 스테이징</strong> — <code>git add -n</code> 미리보기 → <strong>번호로 동의</strong> 후에만 <code>git add</code> (한 주제 한 커밋).</li>
<li><strong>③ 마무리</strong> — <code>feat|fix|docs|chore:</code> 커밋 메시지 → <strong>푸시는 사용자가 명시할 때만</strong> <code>git push origin $(git rev-parse --abbrev-ref HEAD)</code>.</li>
</ol>
<h3>금지</h3>
<ul>
<li><strong>git-plus 없이</strong> 임의 <code>git add -A</code>·무문 <strong><code>git push</code></strong>.</li>
<li><strong><code>.env*</code>·키·인증서</strong> 커밋·푸시.</li>
<li><strong>요청 없이</strong> <code>docs/vercel-deployment-rules.md</code> 등 배포 SSOT 문서 수정.</li>
<li><strong><code>detailpage-ai-engine</code> 추적 검증 없이</strong> <code>git clean -fd</code> / <code>git clean -fdx</code> (아래 「detailpage Git 추적 함정」).</li>
</ul>
<p><strong>전역 Cursor/사용자 커밋 휴리스틱</strong>은 <strong>openclaw 깃 추적 요청 시 git-plus보다 우선하지 않는다.</strong></p>
<hr>
<h2>Vercel 배포 (saas-engine · 필수 SSOT)</h2>
<p><strong>상세 원문·체크리스트·보안 키 교체:</strong> <strong><code>docs/vercel-deployment-rules.md</code></strong> (단일 기준). <strong>Cursor:</strong> <strong><code>.cursor/rules/vercel-deploy-openclaw.mdc</code></strong>. <strong>레지스트리:</strong> <strong><code>docs/vercel-projects-registry.md</code></strong>, <strong><code>docs/deployment-registry.md</code></strong>.</p>
<table>
<thead>
<tr>
<th>항목</th>
<th>값</th>
</tr>
</thead>
<tbody><tr>
<td><strong>Vercel Project</strong></td>
<td><code>saas-engine</code></td>
</tr>
<tr>
<td><strong>CLI·빌드 cwd</strong></td>
<td><strong>Git 루트 <code>./</code></strong> (<code>cd &quot;$(git rev-parse --show-toplevel)&quot;</code>)</td>
</tr>
<tr>
<td><strong>링크 메타</strong></td>
<td><strong><code>./.vercel/project.json</code></strong> (<code>projectName</code> = <code>saas-engine</code>)</td>
</tr>
<tr>
<td><strong>공유 URL (고정 별칭)</strong></td>
<td><code>https://saas-engine-xi.vercel.app</code></td>
</tr>
<tr>
<td><strong>소스 저장소</strong></td>
<td><code>SkoolChef/openclaw-saas-engine</code></td>
</tr>
</tbody></table>
<h3>Deploy Plus (Vercel · saas · detailpage)</h3>
<p><strong>진입:</strong> <strong><code>/deploy-plus</code></strong>, <strong>규칙대로 버셀배포 saas|detailpage</strong>, 레거시 <strong>규칙대로 배포하자</strong> (대상 없으면 AskQuestion). Skill: <strong><code>.cursor/skills/deploy-plus/SKILL.md</code></strong>.</p>
<p><strong>배포 대상 아님:</strong> <strong>hermes</strong> (Docker iMac), <strong>openclaw</strong> (repo 이름 — Vercel 앱은 <strong>saas-engine</strong>).</p>
<table>
<thead>
<tr>
<th>대상</th>
<th>Preview</th>
<th>Production</th>
</tr>
</thead>
<tbody><tr>
<td><strong>saas</strong></td>
<td><code>./deploy saas</code></td>
<td><code>./deploy saas --prod</code> (prod 제외 명시 시 생략)</td>
</tr>
<tr>
<td><strong>detailpage</strong></td>
<td><code>detailpage-ai-engine/dashboard/</code> → <code>npx vercel deploy</code></td>
<td><code>./deploy.sh</code></td>
</tr>
</tbody></table>
<p><strong>Production만 제외 (saas):</strong> <strong>preview만</strong>, <strong>production 제외</strong>, <strong>prod 빼</strong> 등 명시 시 Preview만.</p>
<h3>수동 배포 명령 (일반)</h3>
<table>
<thead>
<tr>
<th>단계</th>
<th>명령</th>
<th>결과</th>
</tr>
</thead>
<tbody><tr>
<td><strong>Preview (기본)</strong></td>
<td><code>./deploy saas</code></td>
<td>Preview URL — <strong>Production 아님</strong></td>
</tr>
<tr>
<td><strong>Production</strong></td>
<td><code>./deploy saas --prod</code></td>
<td>프로덕션·고정 별칭 (<code>https://saas-engine-xi.vercel.app</code>)</td>
</tr>
</tbody></table>
<p>배포 전: <code>vercel whoami</code>, <strong><code>./.vercel/project.json</code></strong> 확인. 링크 오염 시: <code>vercel link --project saas-engine --yes</code> (<strong>Git 루트 <code>./</code></strong>).</p>
<h3><code>git push</code> vs Vercel (혼동 금지)</h3>
<table>
<thead>
<tr>
<th>동작</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td><strong><code>git push</code></strong></td>
<td>GitHub에 커밋만 반영. Vercel Git 연동이 있으면 빌드가 <strong>따라올 수 있으나</strong>, 실패·무관 경로·잘못된 프로젝트 연결 시 <strong>프로덕션이 안 바뀔 수 있음</strong>. <strong><code>push</code>만으로 배포 완료라고 말하지 않는다.</strong></td>
</tr>
<tr>
<td><strong><code>./deploy saas</code></strong></td>
<td><strong>Preview</strong> CLI 배포 (규칙대로 검증용).</td>
</tr>
<tr>
<td><strong><code>./deploy saas --prod</code></strong></td>
<td><strong>Production</strong> CLI 배포 (승인·Preview 검증 후).</td>
</tr>
<tr>
<td><strong>macOS 자동 배포</strong></td>
<td><strong>제거됨 (2026-07-18).</strong> 매시/자정 git+Vercel 자동화 없음. 배포는 수동 <code>/deploy-plus</code> · <code>./deploy saas</code> 만.</td>
</tr>
</tbody></table>
<p><strong>금지:</strong> <code>saas-engine/</code> 하위만 <code>cd</code>한 뒤 <code>vercel deploy</code>, 임시 <code>*.vercel.app</code> URL을 문서·공유 고정 링크로 사용.</p>
<p><strong>detailpage 별도 배포:</strong> <strong><code>docs/detailpage-ai-engine-deployment-rules.md</code></strong> — 루트는 <strong><code>detailpage-ai-engine/dashboard/</code></strong> 만; 내부 엔진은 Vercel 배포 금지.</p>
<p><strong>배포 후 검증(최소):</strong> <code>GET /api/health</code>, 허브 예: <code>/projects/ai-coding-tools/hub</code>, <code>/projects/detailpage-ai-engine/hub</code>.</p>
<hr>
<h2>배포 레지스트리 (현재 클론 vs 목표 정책)</h2>
<p><strong>이 Git 루트 <code>./</code></strong> 가 <strong>현재 메인 Next 앱 루트</strong>다. 루트 <code>package.json</code>의 <strong><code>name: saas-engine</code></strong> 이 제품·Vercel 슬러그 정렬에 쓰인다.</p>
<p>루트 직하위 <strong><code>saas-engine/</code></strong>, <strong><code>detailpage-ai-engine/</code></strong>, <strong><code>detailpage-ai-engine/dashboard/</code></strong> 는 <strong>디렉터리로 존재</strong>하나, <strong><code>saas-engine/</code> 폴더는 앱 루트가 아니다</strong>. <strong><code>detailpage-ai-engine/dashboard/</code></strong> 는 별도 Vercel 후보이며 <strong>현재 트리 상태</strong>는 <strong><code>docs/deployment-registry.md</code></strong> §3·§6을 따른다.</p>
<p><strong>경로 혼선 방지:</strong> 루트에 <strong><code>dashboard/</code></strong> 디렉터리는 두지 않는다. 엔진 대시보드에 대해 문서·스크립트에 <code>cd dashboard</code>만 적혀 있으면, <strong>선행 <code>cd detailpage-ai-engine</code></strong>(또는 저장소 루트에서 <code>cd detailpage-ai-engine/dashboard</code>) 전제인지 반드시 확인한다.</p>
<p><strong>목표 SSOT</strong> 저장소는 **<code>SkoolChef/openclaw-projects</code>**이며, <strong><code>projects/openclaw/...</code></strong> 는 <strong>통합 후 정책 경로</strong>일 뿐 <strong>이 클론의 일상 cwd가 아니다</strong>.</p>
<p>현재 구조와 목표 구조는 <strong>다르다</strong>. 슬러그·원격·<code>.vercel</code> 기준의 상세·주의사항은 **<code>docs/deployment-registry.md</code>**를 따르며, <strong>실제 디렉터리 이동·삭제는 별도 Phase에서만</strong> 수행한다.</p>
<p><strong>Restore 완료 스냅샷(운영 재확인용):</strong> <strong><code>docs/deployment-registry.md</code></strong> §8.</p>
<h3>detailpage-ai-engine — Git 추적 함정·소스 «삭제» 인시던트 (고정, 2026-05)</h3>
<p>운영·에이전트 작업에서 <strong><code>detailpage-ai-engine</code> 소스가 통째로 없어진 것처럼 보인 사례</strong>에 대해, <strong>저장소 Git 이력으로 검증 가능한 사실</strong>과 <strong>재발 방지 대책</strong>을 여기에 고정한다. (임의 <code>rm</code> 한 번만이 원인이라는 가정은 하지 않는다.)</p>
<h4>사실 관계 (Git으로 재현·검증)</h4>
<ul>
<li>커밋 <strong><code>f70c20b</code></strong> (<code>chore: track detailpage-ai-engine workspace…</code>): <code>detailpage-ai-engine/**</code> 아래 <strong>추적 파일이 10개뿐</strong>이었다 — <code>.cursor/rules/*.mdc</code> 8개와 <code>docs/.bkit-memory.json</code>, <code>docs/.pdca-status.json</code> <strong>만</strong> 포함. <strong><code>package.json</code>, 각 엔진 <code>src/**</code>, <code>dashboard/</code> Next 앱 등 제품 소스는 이 커밋에 없었다.</strong></li>
<li>커밋 <strong><code>c36e7f7</code></strong> (<code>restore(detailpage): recover engine source and fix builds</code>): 동일 트리에 <strong>수백 개</strong>의 제품 파일이 추가되어 엔진·대시보드가 <strong>Git에 복구</strong>되었다.</li>
</ul>
<p>따라서 «소스가 임의로 삭제되었다»는 체감의 상당 부분은 <strong><code>git clone</code> / 새 머신 / <code>git clean</code> / 미추적만 로컬에 있던 카피 상실</strong> 등으로, <strong>Git에 제품 트리가 없던 구간</strong>과 맞물린 현상으로 설명하는 것이 정확하다.</p>
<h4>원인 분석 (심층)</h4>
<ol>
<li><p><strong>부분 추적(Partial tracking) + 커밋 범위 오해</strong><br>메시지에 <em>workspace</em>가 들어가도 <strong>스테이징은 메타데이터·규칙 파일만</strong>인 경우가 있다. 나머지 <code>detailpage-ai-engine</code> 트리를 <strong><code>??</code> 미추적</strong>으로 남긴 채 «추적 완료»로 착각하면, 이후 <strong>한 번의 정리</strong>로 제품 소스가 통째로 사라질 수 있다.</p>
</li>
<li><p><strong>미추적 소스의 생존 조건</strong><br>미추적 파일은 <strong><code>git clone</code> / <code>git archive</code> / 다른 PC로의 순수 Git 이동</strong>에 실리지 않는다. 로컬 전용이면 <strong><code>git clean -fd</code></strong>, IDE «Discard», 스크립트 오류, 디스크 문제로 <strong>복구 없이 소실</strong>될 수 있다.</p>
</li>
<li><p><strong>에이전트·자동화 리스크</strong><br>«클린», «리셋», «불필요 파일 제거»류 지시가 <strong><code>git clean</code></strong> 등과 결합되면 <strong>추적되지 않은 대량 소스가 우선 제거</strong>된다. (본 사례의 <strong>1차 구조적 원인</strong>은 여전히 <strong>Git에 제품 소스가 없던 기간</strong>이다.)</p>
</li>
<li><p><strong>이중 저장소·경로 혼선 (보조)</strong><br><code>SkoolChef/openclaw-saas-engine</code> vs <code>SkoolChef/openclaw-projects</code> 등 <strong>다른 <code>origin</code> 클론</strong>에만 디스크 카피가 있었을 때, 현재 클론에서는 «갑자기 없어짐»으로 보일 수 있다. 상단 <strong>「SaaS 엔진과 Git 원격 두 개」</strong> 표를 작업 전에 확인한다.</p>
</li>
</ol>
<h4>재발 방지 대책 (필수)</h4>
<p><strong>「워크스페이스를 Git에 올렸다»고 말하기 전에</strong> 아래를 <strong>숫자로</strong> 확인한다.</p>
<table>
<thead>
<tr>
<th>검증</th>
<th>기대</th>
</tr>
</thead>
<tbody><tr>
<td><code>git ls-files detailpage-ai-engine -- &#39;*.ts&#39; &#39;*.tsx&#39; | wc -l</code></td>
<td><strong><code>0</code>이면 즉시 중단</strong> — 제품 TS가 추적되지 않은 것이다. (복구 후 <code>main</code> 기준에서는 <strong>수백 개</strong> 규모가 정상.)</td>
</tr>
<tr>
<td><code>git ls-files detailpage-ai-engine -- &#39;**/package.json&#39; | head</code></td>
<td><code>dashboard/package.json</code>, 엔진 패키지 <code>package.json</code> 등이 보여야 한다.</td>
</tr>
<tr>
<td><code>git status --short detailpage-ai-engine/</code></td>
<td><strong>대량 <code>??</code> 소스</strong>가 남아 있으면 → <strong>별도 논리 커밋으로 추적</strong>할 때까지 «추적 완료»라고 하지 않는다.</td>
</tr>
</tbody></table>
<p><strong>금지·주의 (에이전트·인간 공통)</strong></p>
<ul>
<li><strong><code>detailpage-ai-engine</code> 추적 상태를 확인하지 않은 채 <code>git clean -fd</code> / <code>git clean -fdx</code>를 실행하지 않는다.</strong></li>
<li><strong>부분 추적 커밋</strong>(규칙·문서만) 직후, 엔진·대시보드 소스가 <strong><code>??</code>로 남아 있으면</strong> 그대로 두지 말고 <strong>추가 커밋으로 제품 트리를 반드시 포함</strong>한다.</li>
<li><strong>신규 클론</strong> 직후 엔진이 비어 보이면 <strong>삭제보다 «미수록·미러 클론»</strong> 가능성을 먼저 의심하고 위 표를 실행한다.</li>
</ul>
<p><strong>관련 문서:</strong> <code>docs/deployment-registry.md</code> §8(복구 스냅샷), 복구 커밋 <strong><code>c36e7f7</code></strong>.</p>
<hr>
<h2>1. 에이전트 &amp; Skills 우선 적용 ⭐</h2>
<p><strong>전역 필수 우선순위:</strong> <strong>「필수 우선순위 (Cursor·Claude Code·에이전트)」</strong> — <strong>이 <code>CLAUDE.md</code>와 <code>.cursor/rules</code>가 bkit·전역 휴리스틱보다 위</strong>다.</p>
<h3>우선순위 규칙 (bkit·기능 Skills)</h3>
<ol>
<li><strong>bkit Plugin Skills</strong> (21종) — <strong>위 전역 우선순위와 충돌 없을 때</strong> 해당 Skill 실행</li>
<li><strong>Custom Sub-Agents</strong> (<code>.claude/agents/</code>) — 전문화된 작업은 위임</li>
<li><strong>bkit Plugin Agents</strong> (13종) — 분석·검증·보고 자동 트리거</li>
<li><strong>직접 구현</strong> — 위 3가지 적용 불가 시에만</li>
</ol>
<h3>Skill 실행 기준</h3>
<table>
<thead>
<tr>
<th>상황</th>
<th>실행 Skill / Agent</th>
</tr>
</thead>
<tbody><tr>
<td>새 기능 계획</td>
<td><code>/pdca plan {feature}</code></td>
</tr>
<tr>
<td>코드 리뷰 요청</td>
<td><code>/code-review</code> 또는 <code>code-reviewer</code> agent</td>
</tr>
<tr>
<td>프론트엔드 작업</td>
<td><code>bkit:frontend-architect</code> agent</td>
</tr>
<tr>
<td>백엔드/DB 작업</td>
<td><code>bkit:bkend-expert</code> agent</td>
</tr>
<tr>
<td>보안 검토</td>
<td><code>bkit:security-architect</code> agent</td>
</tr>
<tr>
<td>Gap 분석</td>
<td><code>bkit:gap-detector</code> agent</td>
</tr>
<tr>
<td>반복 개선</td>
<td><code>bkit:pdca-iterator</code> agent</td>
</tr>
<tr>
<td>Python 파일 추가</td>
<td><code>korean-encoding</code> skill 적용</td>
</tr>
<tr>
<td>상세페이지 생성</td>
<td><code>detail-page</code> skill 적용</td>
</tr>
<tr>
<td>유튜브 대본·화면녹화 패키지</td>
<td><code>/youtube-script-builder-pro</code> → <code>.cursor/skills/youtube-script-builder-pro/SKILL.md</code></td>
</tr>
</tbody></table>
<p>자세한 매핑 → @docs/SKILLS.md | 에이전트 맵 → @docs/agents-map.md<br><strong>공식 Agents/Skills 참조</strong> → @official-agent-skills-plugins/README.md (별도 독립 폴더)</p>
<hr>
<h2>2. 워크스페이스 구조</h2>
<p><strong>이 절의 시야 구분 (이 클론):</strong> 아래 ASCII 트리는 <strong>상위 <code>CLAUDE/</code> 워크스페이스</strong>(형제 <code>projects/*</code> 포함)를 가리키는 <strong>문서적 참조</strong>가 섞여 있다. <strong>지금 이 저장소</strong>의 <strong>Git root</strong>는 <strong><code>.../CLAUDE/projects/openclaw</code></strong>(이 폴더)이며, <strong>메인 Next 앱 루트는 <code>./</code></strong>(루트 <code>package.json</code> <code>name: saas-engine</code>)다. <strong><code>projects/openclaw/...</code></strong> 표기는 <strong>목표 SSOT(<code>openclaw-projects</code>) 경로</strong> 또는 <strong>상위 워크스페이스 정책 관례</strong>로 읽는다 — <strong>이 클론의 실제 cwd 기본값이 아니다</strong>. 실제 vs 목표 경로의 <strong>단일 기준</strong>은 **<code>docs/deployment-registry.md</code>**다.</p>
<pre><code>CLAUDE/
├── CLAUDE.md               ← 이 파일 (공식: ./CLAUDE.md 또는 ./.claude/CLAUDE.md)
├── index.md                ← 프로젝트별 문서 맵 (프로젝트 시작 시 참조)
├── projects/               ← 일부 프로젝트 (ai-coding-tools, claude-connector, openclaw/saas-engine, …)
│   ├── README.md
│   ├── ai-coding-tools/
│   ├── claude-connector/
│   ├── detail_page_agents/
│   ├── detail-image-generator/
│   ├── ppt-automation/
│   ├── saas-vibecoding-1/
│   ├── openclaw/           ← saas-engine, detailpage-ai-engine 등
│   ├── slack-automation1/
│   ├── slack-automation2/
│   └── vibecoding-slides/
├── official-agent-skills-plugins/   ← 공식 에이전트·스킬 참조 (agents: 목록만 / skills: Anthropic 예제 소스 포함)
│   ├── README.md
│   ├── agents/             ← 공식 Agents 참조 (bkit 13종 등)
│   └── skills/             ← Anthropic 예제 스킬 소스 (docx, pdf, pptx 등) + 스펙·템플릿
├── MEMORY_INDEX.md         ← 분리형 메모리 진입점 (항상 참조)
├── memory/                 ← 주제별 축약 정본 (Phase 6)
├── docs/
│   ├── SKILLS.md           ← Skills 인덱스 (공식 SKILL.md는 .claude/skills/)
│   ├── agents-map.md       ← 에이전트 계층 맵
│   ├── claude-official-rules.md  ← 공식 규칙 상세
│   └── migration/          ← 문서·폴더 이동 이력
├── .claude/
│   ├── agents/             ← 커스텀 서브에이전트 4종
│   ├── skills/             ← 프로젝트 Skills (.claude/skills/&lt;name&gt;/SKILL.md)
│   └── settings.json       ← 권한 + Hooks
└── .mcp.json               ← 앱 커넥터

# Memory: ~/.claude/projects/&lt;project&gt;/memory/MEMORY.md (Claude 자동) + **프로젝트 정본 `./MEMORY_INDEX.md` + `memory/*.md`** (Phase 6, `node scripts/verify-memory-structure.mjs`)
</code></pre>
<p><strong>용어 규정:</strong> 이 워크스페이스에서 <strong>「프로젝트 폴더」</strong> 또는 <strong>@projects</strong> 로 지칭하면, 항상 루트의 <strong><code>projects/</code></strong> 폴더를 가리킨다. 개별 서브폴더(예: <code>projects/skoolchef-tutorial</code>)는 「해당 프로젝트」·「그 프로젝트 폴더」 등으로 구체명으로 지칭한다.</p>
<hr>
<h2>3. 작업 기본 규칙</h2>
<ul>
<li><strong>프로젝트별 포함 원칙</strong>: 한 프로젝트의 <strong>모든</strong> 작업·문서·산출물은 해당 프로젝트 폴더 내에 둔다. (예: Plan/Design/Report → <code>{프로젝트}/docs/</code>, 아카이브 → <code>{프로젝트}/docs/archive/</code>)</li>
<li>작업 시작 시 <strong>어느 프로젝트에서 작업할지</strong> 먼저 확인한다</li>
<li><strong>프로젝트 시작 시 환경 파일 확인(필수)</strong>: 해당 프로젝트 루트에 <code>.env.local</code>과 <code>.env.example</code>(또는 <code>.env.sample</code>)이 있는지 확인하고, 없으면 생성한 뒤 진행한다. (상세: <code>.cursor/rules/env-secrets-security.mdc</code>)</li>
<li>출력물·요약·이력은 <strong>해당 프로젝트 하위 폴더</strong>에 기록한다</li>
<li><strong>새 프로젝트 폴더를 생성할 때만</strong> (기존 프로젝트에서 작업을 &quot;시작&quot;할 때마다가 아님) 즉시 <code>git add {프로젝트}/</code>로 <strong>로컬 저장소 추적</strong>을 시작하고, 필요 시 초기 커밋을 제안한다. 이 추적은 CLAUDE 루트 하나의 Git 저장소 안에서 해당 폴더를 스테이징하는 것이며, GitHub에 새 레포를 만드는 것은 포함하지 않는다.</li>
<li>새 기능 개발 전 PDCA Plan 문서 확인 (<code>docs/01-plan/features/</code> 또는 프로젝트별 <code>docs/</code>)</li>
<li>구현 완료 후 Gap 분석 제안 (<code>/pdca analyze {feature}</code>)</li>
</ul>
<h3>Git 추적·원격 전략</h3>
<p><strong><code>openclaw-saas-engine</code> 단독 클론(이 저장소):</strong> <strong>「Git 추적 및 커밋」</strong>, <strong><code>docs/git-workflow-openclaw.md</code></strong>, <strong>git-plus</strong>가 SSOT다. 아래 표는 <strong>상위 <code>CLAUDE/</code> 모노레포</strong> 작업 시에만 해당한다.</p>
<table>
<thead>
<tr>
<th>구분</th>
<th>규칙</th>
</tr>
</thead>
<tbody><tr>
<td><strong>이 클론 (우선)</strong></td>
<td><strong>git-plus</strong> → <code>origin</code> 하나 · 루트 <code>./</code>에서 status/add/commit/push</td>
</tr>
<tr>
<td><strong>로컬 추적 (모노레포)</strong></td>
<td>새 프로젝트 폴더 생성 시에만 <code>git add {프로젝트}/</code> — <strong>이 클론에는 루트 <code>projects/</code> 없음</strong></td>
</tr>
<tr>
<td><strong>원격 (모노레포)</strong></td>
<td>CLAUDE 루트 하나·<code>origin</code> 하나 → <strong>@docs/github-structure-and-maintenance.md</strong></td>
</tr>
</tbody></table>
<h3>Git push 규칙</h3>
<table>
<thead>
<tr>
<th>맥락</th>
<th>규정</th>
</tr>
</thead>
<tbody><tr>
<td><strong>이 클론</strong></td>
<td><strong>git-plus</strong> · <strong><code>docs/git-workflow-openclaw.md</code> §3</strong> · push 전 시크릿 검사 · 배포는 <strong>「Vercel 배포 (saas-engine · 필수 SSOT)」</strong></td>
</tr>
<tr>
<td><strong>상위 CLAUDE 모노레포</strong></td>
<td><strong><code>CLAUDE/</code> 루트</strong>에서 push · <strong><code>.cursor/rules/git-remote-monorepo-push.mdc</code></strong></td>
</tr>
</tbody></table>
<p>에이전트·Cursor: <strong>이 클론</strong> → <strong><code>git-plus-priority.mdc</code></strong> · 모노레포 → <strong><code>git-remote-monorepo-push.mdc</code></strong></p>
<h3>모노레포 <code>.gitignore</code> 규칙 (통합 참조)</h3>
<table>
<thead>
<tr>
<th>요지</th>
<th>내용</th>
</tr>
</thead>
<tbody><tr>
<td><strong>기본 규칙</strong></td>
<td><strong>저장소 루트</strong> <code>.gitignore</code>가 워크스페이스 전체에 걸친 기본이다. 공통 패턴(<code>.env*</code>, <code>node_modules/</code>, <code>.env.master</code> 등)은 <strong>루트에 두고</strong> 하위 파일과 중복 나열을 줄인다.</td>
</tr>
<tr>
<td><strong>프로젝트별</strong></td>
<td><code>projects/&lt;이름&gt;/.gitignore</code>는 해당 폴더 트리에만 적용되는 <strong>추가·보완</strong>이다. 루트 규칙을 덮어쓰지 않는다.</td>
</tr>
<tr>
<td><strong><code>.env.example</code> 예외</strong></td>
<td>커밋 허용(<code>!.env.example</code> 등) 줄은 <code>.env.*</code> 무시 규칙 <strong>바로 다음</strong>에 둔다.</td>
</tr>
<tr>
<td><strong>상세 원문</strong></td>
<td><strong><code>.cursor/rules/gitignore-monorepo-hierarchy.mdc</code></strong>, §4.5 환경 파일·<strong><code>.cursor/rules/env-secrets-security.mdc</code></strong></td>
</tr>
</tbody></table>
<h3>Vercel 배포 (통합 참조)</h3>
<p><strong>OpenClaw <code>saas-engine</code>:</strong> 본 문서 <strong>「Vercel 배포 (saas-engine · 필수 SSOT)」</strong> + <strong><code>docs/vercel-deployment-rules.md</code></strong>. <strong>워크스페이스 전체 목록:</strong> <strong><code>docs/vercel-projects-registry.md</code></strong>.</p>
<table>
<thead>
<tr>
<th>참조</th>
<th>용도</th>
</tr>
</thead>
<tbody><tr>
<td><strong>saas-engine 절차</strong></td>
<td><strong>「Vercel 배포」절(상단)</strong>, <strong><code>docs/vercel-deployment-rules.md</code></strong>, <strong><code>.cursor/rules/vercel-deploy-openclaw.mdc</code></strong></td>
</tr>
<tr>
<td><strong>경로·<code>.vercel</code></strong></td>
<td><strong><code>docs/deployment-registry.md</code></strong> §3·§7</td>
</tr>
<tr>
<td><strong>detailpage 별도</strong></td>
<td><strong><code>docs/detailpage-ai-engine-deployment-rules.md</code></strong></td>
</tr>
<tr>
<td><strong>그 외 Vercel 앱</strong></td>
<td>레지스트리 표 · 해당 <strong><code>CLAUDE.md</code></strong> / <strong><code>README</code></strong></td>
</tr>
</tbody></table>
<h3>macOS 자동 배포 (launchd) — 제거됨 (2026-07-18)</h3>
<p>매시 git+Vercel(<code>hourly-git-deploy</code>) · 자정 Prod(<code>daily-deploy</code>) 자동화는 <strong>완전 삭제</strong>했다.</p>
<ul>
<li>LaunchAgent plist · Application Support 진입점 · <code>scripts/daily-production-deploy.sh</code> · <code>scripts/launchd/</code> · <code>HOURLY-SAAS-GIT-DEPLOY.md</code> 제거</li>
<li><strong>재설치·재등록 금지.</strong> 배포는 <strong>수동</strong> <code>/deploy-plus</code> 또는 <code>./deploy saas</code> / <code>./deploy saas --prod</code> 만</li>
<li>Hermes 등 다른 <code>com.skoolchef.*</code> LaunchAgent 는 본 제거와 무관</li>
</ul>
<h3>PDCA 폴더 생성 규칙</h3>
<p>bkit 플러그인이 PDCA 스캐폴딩 폴더(<code>01-plan/</code>, <code>02-design/</code>, <code>03-analysis/</code>, <code>04-report/</code> 등)를 자동 생성할 수 있다. 다음 규칙을 따른다:</p>
<ol>
<li><strong>각 프로젝트의 <code>CLAUDE.md</code>를 먼저 확인</strong> — 해당 프로젝트가 PDCA 폴더를 사용하는지 명시되어 있음</li>
<li><strong>PDCA 폴더를 사용하는 프로젝트</strong> (ppt-automation, skoolchef-ai-studio 등): 기존 구조 유지, 빈 폴더 추가 생성 금지</li>
<li><strong>PDCA 폴더를 사용하지 않는 프로젝트</strong>: 루트에 <code>01-plan/</code>, <code>02-design/</code>, <code>03-implementation/</code>, <code>03-analysis/</code>, <code>04-report/</code> 등 빈 폴더를 생성하지 않는다</li>
<li><strong>새 프로젝트 생성 시</strong>: <code>CLAUDE.md</code>에 문서 구조를 반드시 명시하고, 불필요한 PDCA 스캐폴딩 폴더가 생성되지 않도록 한다</li>
</ol>
<h3>claude-connector 작업 시 필수 참조</h3>
<p><strong>오류 발생·설계 결정·배포 시</strong> 아래 문서를 먼저 확인하고, 새 사항 발생 시 반드시 기록한다:</p>
<pre><code>@projects/claude-connector/docs/work-log.md
</code></pre>
<table>
<thead>
<tr>
<th>확인 시점</th>
<th>참조 섹션</th>
</tr>
</thead>
<tbody><tr>
<td>오류 발생</td>
<td><code>## 오류 &amp; 원인 &amp; 해결</code> — 동일 오류 재발 방지</td>
</tr>
<tr>
<td>설계 결정</td>
<td><code>## 아키텍처 설계 결정</code> — 기존 결정과의 일관성 유지</td>
</tr>
<tr>
<td>배포 전</td>
<td><code>## 배포 명령</code> — 올바른 scope·token 사용 확인</td>
</tr>
<tr>
<td>새 기능 시작</td>
<td><code>## 미완료 / 다음 기능 후보</code> — 우선순위 확인</td>
</tr>
</tbody></table>
<hr>
<h2>4. 필수: 한글 인코딩 ⚠️</h2>
<p>Python 파일 추가·수정 시 <code>korean-encoding</code> skill 패턴 <strong>필수</strong> 적용:</p>
<pre><code class="language-python"># -*- coding: utf-8 -*-
import sys
if hasattr(sys.stdout, &quot;reconfigure&quot;):
    sys.stdout.reconfigure(encoding=&quot;utf-8&quot;)
    sys.stderr.reconfigure(encoding=&quot;utf-8&quot;)
# 파일 I/O: open(path, encoding=&quot;utf-8&quot;)
# JSON: json.dump(..., ensure_ascii=False)
# HTML: &lt;meta charset=&quot;UTF-8&quot;&gt;
</code></pre>
<hr>
<h2>4.5 필수: 환경 변수·시크릿 보안 ⚠️</h2>
<p><strong>모든 프로젝트</strong>에서 API 키, 비밀번호, 토큰 등 시크릿은 반드시 아래 규칙을 따른다.</p>
<p><strong>Cursor 규칙</strong>: 동일 내용은 <code>.cursor/rules/env-secrets-security.mdc</code> 에서 항상 적용된다. <strong>요지</strong>: 전역 API 키·토큰은 기능에 맞게 <code>~/.zshrc</code>(export) 또는 워크스페이스 루트 <strong><code>.env.master</code></strong>(gitignore)에 기록하고, <strong>루트 <code>.env</code>에는 참조 규정(주석)만</strong> 둔다. 각 프로젝트는 <strong><code>projects/&lt;이름&gt;/.env.local</code>을 우선</strong>하며, 필요 시 <code>~/.zshrc</code>·<code>.env.master</code> 규정을 참조한다.</p>
<h3>원칙</h3>
<ul>
<li><strong>시크릿은 Git에 커밋하지 않는다.</strong> 로컬·CI/배포에서만 주입한다.</li>
<li><strong>환경 변수로만</strong> 시크릿을 다루고, 코드·문서·예제에 실제 값을 넣지 않는다.</li>
</ul>
<h3>환경 파일 규칙</h3>
<table>
<thead>
<tr>
<th>파일</th>
<th>용도</th>
<th>Git</th>
</tr>
</thead>
<tbody><tr>
<td><strong><code>.env.local</code></strong></td>
<td>실제 시크릿·로컬 전용 값 (API 키, DB URL, 비밀키 등)</td>
<td><strong>추적 금지</strong></td>
</tr>
<tr>
<td><strong><code>.env</code></strong></td>
<td>기본값(비시크릿)만 사용할 경우에 한함. 시크릿이 있으면 <code>.env.local</code>로 이전</td>
<td><strong>추적 금지</strong></td>
</tr>
<tr>
<td><strong><code>.env.example</code></strong></td>
<td>변수 이름과 설명만 기재. <strong>실제 값·시크릿 절대 포함 금지</strong></td>
<td><strong>커밋</strong></td>
</tr>
</tbody></table>
<h3>.gitignore 필수 항목</h3>
<p>프로젝트 루트 <code>.gitignore</code>에 다음을 포함한다:</p>
<pre><code class="language-gitignore">.env
.env.local
.env.*
!.env.example
</code></pre>
<h3>작업 시 적용</h3>
<ul>
<li>새 프로젝트 생성 시: <code>.env.example</code>만 커밋하고, <code>.env</code> / <code>.env.local</code>은 <code>.gitignore</code>로 제외한다.</li>
<li>기존에 <code>.env</code>에 시크릿이 있는 경우: 내용을 <code>.env.local</code>로 옮기고 <code>.env</code>를 삭제한 뒤, <code>.env.example</code>에는 변수 이름과 placeholder만 둔다.</li>
<li>문서·README에서 환경 설정 안내 시: “<code>.env.example</code>을 참고해 <code>.env.local</code>에 값을 채우세요”라고 안내하고, 실제 시크릿을 문서에 적지 않는다.</li>
</ul>
<hr>
<h2>5. &quot;Show me&quot; 출력 규칙 ✨</h2>
<p>사용자가 <strong>&quot;Show me&quot;</strong> 키워드를 사용할 때마다 반드시 아래 규칙을 따른다.</p>
<h3>핵심 원칙</h3>
<ul>
<li><strong>절대 ASCII/텍스트 다이어그램 금지</strong> — 마크다운 테이블·코드블록 ASCII art로 대체하지 않는다</li>
<li><strong>항상 HTML Artifact로 출력</strong> — 브라우저에서 바로 렌더링되는 완성형 HTML을 생성한다</li>
<li><strong>비주얼 퀄리티 기준</strong>: 스타트업 프로덕트 수준의 UI (Notion · Linear · Vercel 대시보드 스타일)</li>
</ul>
<h3>필수 디자인 요소</h3>
<table>
<thead>
<tr>
<th>요소</th>
<th>적용 방법</th>
</tr>
</thead>
<tbody><tr>
<td><strong>카드 그리드</strong></td>
<td>CSS Grid 2-3열, 각 카드에 아이콘·제목·설명·태그 포함</td>
</tr>
<tr>
<td><strong>태그/뱃지</strong></td>
<td>둥근 pill 형태, 파스텔 배경색</td>
</tr>
<tr>
<td><strong>타이포그래피</strong></td>
<td>제목 24px bold, 본문 14px, 한글 지원 폰트(Noto Sans KR 또는 system-ui)</td>
</tr>
<tr>
<td><strong>색상 팔레트</strong></td>
<td>배경 #FAFAF8(크림), 카드 #FFFFFF, 강조 #4F46E5(인디고) 또는 컨텍스트 맞춤</td>
</tr>
<tr>
<td><strong>여백·그림자</strong></td>
<td>카드 padding 24px, box-shadow: 0 1px 3px rgba(0,0,0,0.08)</td>
</tr>
<tr>
<td><strong>호버 효과</strong></td>
<td>transform: translateY(-2px), shadow 강화</td>
</tr>
<tr>
<td><strong>반응형</strong></td>
<td>max-width 900px 중앙 정렬</td>
</tr>
</tbody></table>
<h3>출력 형식</h3>
<pre><code>1. &lt;html&gt; 전체 문서 (&lt;!DOCTYPE html&gt; 포함)
2. &lt;style&gt; 인라인 CSS (외부 CDN 의존 최소화, Google Fonts 허용)
3. 콘텐츠에 맞는 레이아웃 선택:
   - 정보 비교 → 카드 그리드
   - 단계/플로우 → 타임라인 or 스텝 카드
   - 데이터 → 테이블 + 차트 스타일
   - 개념 설명 → 히어로 + 섹션
4. 한국어 콘텐츠 → lang=&quot;ko&quot; + Noto Sans KR
</code></pre>
<h3>레퍼런스 스타일</h3>
<p>스크린샷 참조: 카드에 아이콘(이모지 박스) + 제목 + 설명 + 태그 pill + 우측 상단 점 인디케이터(레벨/강도 표시)</p>
<hr>
<h3>slack-automation1</h3>
<ul>
<li><strong>목적</strong>: Solo-entrepreneur 의사결정 → Slack 자동화</li>
<li><strong>실행</strong>: <code>daily-brief.sh</code>(08:30), <code>weekly-review.sh</code>(월 09:00)</li>
<li><strong>Bot</strong>: <code>@skoolkorea_slackmcp</code> | 채널 맵 → <code>docs/channel-id-map.md</code></li>
<li><strong>경로</strong>: <code>projects/slack-automation1/</code></li>
</ul>
<h3>slack-automation2</h3>
<ul>
<li><strong>목적</strong>: Slack + Buttondown 뉴스레터 파이프라인</li>
<li><strong>스택</strong>: Next.js 16 + Vercel + Buttondown API</li>
<li><strong>커맨드</strong>: <code>/subscribe</code>, <code>/newsletter</code>, <code>/subscribers</code></li>
<li><strong>경로</strong>: <code>projects/slack-automation2/</code></li>
</ul>
<h3>detail_page_agents</h3>
<ul>
<li><strong>목적</strong>: 이커머스 상세페이지 13섹션 자동 생성</li>
<li><strong>실행</strong>: <code>python scripts/run_pipeline.py --product_name &quot;상품명&quot;</code></li>
<li><strong>경로</strong>: <code>projects/detail_page_agents/</code></li>
</ul>
<h3>detail-image-generator</h3>
<ul>
<li><strong>목적</strong>: 제품 정보 → 13섹션 고전환 상세페이지 이미지 생성</li>
<li><strong>실행</strong>: <code>python scripts/generate_page.py</code></li>
<li><strong>경로</strong>: <code>projects/detail-image-generator/</code></li>
</ul>
<h3>themango</h3>
<ul>
<li><strong>목적</strong>: 더망고 상품 대량 업데이트 자동화</li>
<li><strong>실행</strong>: 더망고 업데이트 페이지 → F12 Console → <code>src/batch-update-auto.js</code></li>
</ul>
<h3>ppt-automation</h3>
<ul>
<li><strong>목적</strong>: 마크다운 → HTML/PPTX 프레젠테이션</li>
<li><strong>경로</strong>: <code>projects/ppt-automation/</code></li>
</ul>
<h3>claude-connector</h3>
<ul>
<li><strong>목적</strong>: Claude Connector MCP 대시보드 (Next.js 14 + Vercel KV + NextAuth)</li>
<li><strong>프로덕션</strong>: <a href="https://claude-connector-gamma.vercel.app">https://claude-connector-gamma.vercel.app</a></li>
<li><strong>경로</strong>: <code>projects/claude-connector/</code></li>
<li><strong>작업 로그</strong>: <code>projects/claude-connector/docs/work-log.md</code> ← <strong>오류·설계결정·배포 명령 기록</strong></li>
<li><strong>구조도</strong>: <code>projects/claude-connector/docs/claude-connector-structure.md</code></li>
</ul>
<h3>vibecoding-slides</h3>
<ul>
<li><strong>목적</strong>: 바이브코딩 기초·시나리오 슬라이드</li>
<li><strong>문서</strong>: <code>projects/vibecoding-slides/docs/</code></li>
<li><strong>경로</strong>: <code>projects/vibecoding-slides/</code></li>
</ul>
<h3>ai-coding-tools</h3>
<ul>
<li><strong>목적</strong>: AI 코딩 도구(Cursor, Antigravity, Claude Code) 경쟁사 분석 슬라이드</li>
<li><strong>문서</strong>: <code>projects/ai-coding-tools/docs/</code></li>
<li><strong>경로</strong>: <code>projects/ai-coding-tools/</code></li>
</ul>
<h3>Claude Update</h3>
<ul>
<li><strong>목적</strong>: Anthropic Claude 업데이트 추적·정리 (docs, Marp 슬라이드, Slack 다이제스트)</li>
<li><strong>실행</strong>: <code>bash &quot;Claude Update/scripts/update-check.sh&quot;</code> | 수동 주제: <code>manual-update.sh --topic &quot;주제&quot;</code></li>
<li><strong>경로</strong>: <code>Claude Update/</code></li>
</ul>
<h3>Cursor Update</h3>
<ul>
<li><strong>목적</strong>: Cursor IDE 업데이트 추적·정리 (형식: Claude Update 준용)</li>
<li><strong>위치</strong>: <strong>CURSOR 워크스페이스</strong>에만 존재 — <code>CURSOR/Cursor Update/</code></li>
<li><strong>실행</strong>: CURSOR 루트에서 <code>bash &quot;Cursor Update/scripts/update-check.sh&quot;</code></li>
</ul>
<h3>saas-vibecoding 1</h3>
<ul>
<li><strong>목적</strong>: 바이브코딩 기반 SaaS (구체 기획 추후 제출)</li>
<li><strong>문서</strong>: <code>projects/saas-vibecoding-1/docs/</code></li>
<li><strong>경로</strong>: <code>projects/saas-vibecoding-1/</code></li>
</ul>
<h3>saas-engine</h3>
<ul>
<li><strong>목적</strong>: 로그인 · 인증 · 체크아웃(결제) 플로우 + 재사용 가능한 SaaS 엔진 플랫폼</li>
<li><strong>문서</strong>: <strong><code>docs/</code></strong> (이 저장소 Git 루트 기준)</li>
<li><strong>경로(앱 루트)</strong>: <strong><code>./</code></strong> — Git 루트 = Next 앱 루트; 루트 <code>package.json</code> <code>name: saas-engine</code></li>
<li><strong>참고</strong>: 루트 직하위 <strong><code>saas-engine/</code></strong> 폴더는 <strong>현재 앱 루트가 아님</strong> (<code>@docs/deployment-registry.md</code> §3). <strong><code>projects/openclaw/saas-engine</code></strong> 은 <strong><code>openclaw-projects</code> 통합 후 목표 경로</strong>다.</li>
<li><strong>우선 참조</strong>: <strong>루트 <code>./CLAUDE.md</code></strong>, <strong><code>@docs/deployment-registry.md</code></strong></li>
</ul>
<h3>skoolchef-tutorial</h3>
<ul>
<li><strong>목적</strong>: 스쿨용 AI 바이브코딩 커리큘럼 사이트 (Cursor · Claude Code · Gemini CLI · Google Workspace CLI)</li>
<li><strong>실행</strong>: <code>pnpm dev</code> → <a href="http://localhost:3000">http://localhost:3000</a></li>
<li><strong>경로</strong>: <code>projects/skoolchef-tutorial/</code></li>
<li><strong>가이드</strong>: <code>projects/skoolchef-tutorial/CLAUDE.md</code></li>
<li><strong>본문 타이포 SSOT</strong> (<code>projects/skoolchef-tutorial/CLAUDE.md</code> §1.1과 동일):</li>
</ul>
<table>
<thead>
<tr>
<th>항목</th>
<th>값</th>
</tr>
</thead>
<tbody><tr>
<td>폰트 패밀리</td>
<td>Geist Sans → 한글 시스템 산세리프 (<code>--font-sans</code> / <code>app/layout.tsx</code>)</td>
</tr>
<tr>
<td>Tailwind</td>
<td><code>text-sm</code> + <code>font-semibold</code></td>
</tr>
<tr>
<td>크기</td>
<td><strong>13px</strong> (<code>text-[13px]</code> 권장 — <code>text-sm</code> 기본 14px과 구분)</td>
</tr>
<tr>
<td>굵기</td>
<td><strong>600</strong> (Semibold)</td>
</tr>
<tr>
<td>행간</td>
<td><code>text-sm</code> 기본 <strong>20px</strong> (1.25rem)</td>
</tr>
</tbody></table>
<ul>
<li><strong>구현 클래스</strong>: <code>lib/hub-korean-body-typography.ts</code> (<code>HUB_KOREAN_BODY_*</code>) — 허브·도구 카드 본문. 신규 스쿨셰프 UI는 이 SSOT 또는 동일 토큰으로 맞춘다.</li>
</ul>
<h3>SkoolChef AI Studio</h3>
<ul>
<li><strong>목적</strong>: 스쿨셰프 1인 기업가 브랜드·강사/컨설트 대외 포트폴리오·회사소개 + AI 디지털 팀(Mangchi·Pochi)·PDCA 문서</li>
<li><strong>경로</strong>: <code>projects/skoolchef-ai-studio/</code></li>
<li><strong>가이드</strong>: <code>projects/skoolchef-ai-studio/CLAUDE.md</code>(대시보드·saas-engine 방침 포함), <code>CLAUDE.me.md</code>(목적 1·2)</li>
<li><strong>SaaS 제품</strong>: 별도 — <strong>이 저장소(<code>openclaw</code>) 루트 허브</strong> 연결은 Studio 쪽 <code>docs/reference/saas-engine.md</code> 및 프로젝트 <code>CLAUDE.md</code> 「Studio와 saas-engine」 참고 (<code>projects/openclaw/saas-engine</code> 은 <strong>목표 SSOT 레이아웃</strong>일 때의 경로)</li>
</ul>
<h3>openclaw</h3>
<ul>
<li><strong>목적</strong>: OpenClaw(자율 에이전트·게이트웨이) 관련 지속 작업 — 문서·통합·실험</li>
<li><strong>경로(이 클론)</strong>: <strong>Git 루트 <code>./</code></strong> — 상위 모노레포 문서의 <code>projects/openclaw/</code> 는 <strong>그 레포 안에서의 위치</strong>를 가리키며, <strong>이 단독 클론과 동일 경로 문자열이 아닐 수 있음</strong></li>
<li><strong>가이드</strong>: <strong><code>./CLAUDE.md</code></strong>, <code>docs/work-log.md</code></li>
</ul>
<hr>
<h2>6. 커밋 &amp; 브랜치 규칙</h2>
<ul>
<li>브랜치: <code>feat/</code>, <code>fix/</code>, <code>docs/</code>, <code>chore/</code> 접두사 사용</li>
<li>커밋: 한글 또는 영문 모두 가능, 변경 이유 중심으로 작성</li>
<li>PR 전: 테스트 실행 확인 필수</li>
<li><strong>원격 반영(<code>git push</code>)</strong>: <strong>「Git 추적 및 커밋」</strong> · <strong>git-plus</strong> · <strong>@docs/git-workflow-openclaw.md</strong> (이 클론). 상위 모노레포만 <strong>@docs/github-structure-and-maintenance.md</strong>.</li>
</ul>
<hr>
<h2>워크스페이스 정책 보강 (2019 cleanup replay)</h2>
<p>아래 항목은 <strong>로컬 전용·비밀·생성물</strong>이 저장소에 올라가지 않도록 <code>.gitignore</code>에도 반영한다.</p>
<ul>
<li>로컬 에이전트 상태: <strong><code>.omc/</code></strong> 및 중첩 <strong><code>**/.omc/**</code></strong>.</li>
<li>Supabase/문서 스냅샷: <strong><code>supabase/.temp/</code></strong>, <strong><code>docs/.pdca-snapshots/</code></strong> (이미 상단 블록에 있으면 중복 추가하지 않는다).</li>
<li>Gemini 앱 로컬 메타(경로 고정): <strong><code>apps/gemini-saas/docs/.pdca-status.json</code></strong>, <strong><code>apps/gemini-saas/docs/.bkit-memory.json</code></strong>.</li>
<li>로컬 메모·실험·참고: <strong><code>DEVLOG.md</code></strong>, <strong><code>write-post.md</code></strong>, <strong><code>_reference/</code></strong>, <strong><code>playground/</code></strong>.</li>
<li>복구용 디렉터리: <strong><code>.git-recovery-checks/</code></strong>.</li>
</ul>
<p>배포·Polar·detailpage 등 <strong>운영 규칙 문장</strong>은 본문 기존 절과 <code>docs/</code>가 우선이다.</p>