> ## Documentation Index
> Fetch the complete documentation index at: https://supastack.dev/llms.txt
> Use this file to discover all available pages before exploring further.
> For the full documentation corpus in one file, fetch: https://supastack.dev/llms-full.txt

# 콘텐츠 관리

자유로운 라이프사이클과 공개 읽기 경계를 갖춘 타입화된 CMS 엔트리.

## 초보자 연습

전제 조건: 아래 두 개의 초보자 가이드를 읽고, 웹 로컬 설정을 완료하고, 편집기의 루트에서 이 모노레포를 엽니다. 웹 설정은 `apps/web/.env.local`에 속합니다. Next.js는 ​​루트 `.env`를 읽지 않습니다. 기본 가짜 모드의 `/dashboard`는 데이터베이스가 없는 데모입니다. `/auth`에는 마이그레이션된 데이터베이스가 필요합니다.

빠른 용어: 작업 영역은 한 팀의 별도 사용자, 데이터 및 설정입니다. 서버는 신뢰할 수 있는 백엔드입니다. 제공업체 키를 브라우저 및 전화 코드에 보관하세요. 마이그레이션은 테이블을 생성하거나 업데이트하는 버전이 지정된 데이터베이스 변경입니다. AI 모델은 응답하는 엔진입니다. 모델 카탈로그는 서버의 사용 가능한 모델 ID 및 가격 목록입니다. 공급자는 AI, 이메일, 청구 서비스와 같은 외부 서비스입니다. 자격은 작업 영역에서 기능을 사용할 수 있도록 하는 부여입니다. 웹훅은 한 서비스가 다른 서비스의 URL에 보내는 메시지입니다.

1. 워크스페이스 소유자 또는 관리자로 로그인하고 `/content`를 열고 양식을 사용하여 고유한 슬러그가 있는 게시물, 페이지, 문서 또는 보고서를 만듭니다. 초안으로 저장한 후 게시하세요.

2. 상태가 게시됨으로 변경되었는지 확인합니다. 관리 액세스 권한이 없는 중복 슬러그 또는 멤버는 실패해야 합니다.

3. 게이트 테스트의 경우 `required_entitlement=ai.reference-task`를 사용합니다. 확인된 승인이 없으면 페이지에 티저만 표시되어야 합니다.

사용자 정의 코드의 경우 제공된 `prompts/README.md`로 시작하고 가장 가까운 프롬프트(앱 화면의 경우 `prompts/new-app-screen.md`, 공개 페이지의 경우 `prompts/new-landing-page.md`)를 복사합니다. 서버, 데이터베이스 또는 공급자 작업의 경우 코딩 에이전트에게 이 가이드의 작업을 제공하고 `AGENTS.md`, `.ai/PROJECT_CONTEXT.md` 및 일치하는 `.ai/` 미러를 읽도록 요청하세요. 여기에 이름이 지정된 정확한 소스 파일을 검사하십시오. 편집하기 전에 파일을 나열하고 확인합니다. 작업 공간 소유권과 서버 전용 비밀을 보존합니다. 차이점을 보여주세요. 원하는 동작, 입력 및 출력 필드, 허용된 역할, 예상되는 성공 및 오류, 테스트 계정, 공급자 또는 장치를 알려주십시오. 샘플 값을 사용하십시오. 절대 진짜 비밀을 붙여넣지 마세요.

[시작하기 전에](https://supastack.dev/ko/docs/web/before-you-start.md)

[단말기 기본사항](https://supastack.dev/ko/docs/web/terminal-basics.md)

[웹 로컬 설정](https://supastack.dev/ko/docs/web/ship-in-5-minutes.md)

[에이전트 프롬프트 및 프로젝트 메모리](https://supastack.dev/ko/docs/web/agents.md)


## 작업공간 항목 만들기

`/content` 관리자는 `post`, `page`, `doc` 및 `report` 항목을 처리합니다. `content_entry` 행에는 초안/게시됨/보관됨 상태, 작업공간 범위 슬러그 및 작성자가 있습니다. 관리 작업에는 적절한 소유자/관리자 역할이 필요합니다.

이 CMS는 `src/resources`에 있는 키트의 공개 docs/blog 카탈로그와 별개입니다. 제품은 자체 페이지 구성을 통해 CMS 항목을 렌더링할 수 있습니다.


## 서버에서 본체를 게이트로 이동하세요.

`required_entitlement`는 null을 허용합니다. 설정되지 않은 항목은 해제됩니다. 제한 항목의 경우 서버 전용 `content-queries.ts`는 읽을 수 있는 콘텐츠 또는 본문이 비어 있는 잠긴 티저를 프로젝트합니다. `content-access.ts`가 프로젝션을 소유합니다. 클라이언트가 제공한 권리 주장을 절대로 신뢰하지 마십시오.

게시하면 `content.published`가 방출됩니다. 예약된 다이제스트는 출판 팀의 최근 항목을 요약할 수 있습니다. 작성된 콘텐츠도 계정 내보내기에 참여합니다.


## 게시 및 액세스 확인

초안 가시성, 게시/보관 전환, 중복 슬러그, 잘못된 작업 공간, 무료 항목 및 비활성 유료 보조금을 테스트합니다. 서버가 액세스를 담당하는 동안 프리젠테이션을 위해 페이월 블록을 사용하십시오.

[유료 콘텐츠 튜토리얼](https://supastack.dev/ko/docs/web/setup-ai.md)

[컨텐츠 다이제스트](https://supastack.dev/ko/docs/web/project-structure.md)

[페이월 프리젠테이션](https://supastack.dev/ko/docs/web/project-structure.md)


## 설치 및 설정

/content 워크스페이스 표면은 CMS 엔트리를 관리합니다 — post, page, doc이 권장 타입이지만 컬럼은 URL 안전한 모든 제품 타입(소문자, 숫자, 대시, 밑줄, 최대 64자)을 허용합니다. content_entry 테이블은 모든 행을 workspaceId로 범위 지정하고 createdBy를 기록하며 slug를 워크스페이스와 타입별로 고유하게 유지합니다.

엔트리는 자유로운 draft ↔ published ↔ archived 라이프사이클을 이동합니다 — src/content.ts의 evaluateContentStatusChange가 유효하지 않거나 변화 없는 전환을 거부하고, publishedAt은 첫 게시 시 찍혀 이후 게시 취소에도 살아남아 독자가 원래 날짜를 유지합니다.

```
/content                    workspace CMS surface
src/content.ts              input + lifecycle rules
src/content-actions.ts      member+ mutations
content_entry               workspaceId, type, slug, status
```


## 구현 워크플로

member 이상이 엔트리를 작성합니다 — 모든 뮤테이션은 requireWorkspaceWriter(workspace-access.ts)를 통해 세션, 활성 워크스페이스, 최소 member 역할을 확인하므로 guest는 읽기 전용입니다. normalizeContentEntryInput은 쓰기 전에 타입, 1–255자 제목, URL 안전 slug를 검증합니다.

listPublishedContentEntries는 의도적인 공개 읽기 경계입니다: 명시적 workspaceId를 받고 세션이 필요 없으며 게시된 행만 반환합니다 — 스토어프런트 페이지, 블로그, 문서가 워크스페이스 콘텐츠를 렌더링하는 경로입니다. 게시 시 content.published 아웃바운드 웹훅이 발생하고 작성된 엔트리는 GDPR 데이터보내기에 포함됩니다.


## 검증 및 문제 해결

draft → publish → archive 왕복, 같은 타입 내 중복 slug, 크로스 워크스페이스 읽기를 시험하세요. 공개 경계가 초안이나 다른 워크스페이스의 행을 절대 반환하지 않는지, content.published가 게시 액션당 한 번만 발화하는지 확인하세요.


## 다음

[커머스](https://supastack.dev/ko/docs/web/commerce.md)
