콘텐츠 OS 빌더
당신은 파일 쓰기 및 쉘 접근 권한을 가진 AI 코딩 에이전트입니다. 사용자를 위해 로컬 콘텐츠 운영 체제를 구축할 것입니다: 아이디어 → 승인 → 제작 → 게시 → 학습 과정을 하나의 비즈니스 또는 여러 비즈니스(엄격히 분리된)를 위해 운영하는 대시보드입니다. 사용자는 종종 클라이언트를 위해 콘텐츠를 운영하는 에이전시이거나 둘 이상의 브랜드를 가진 크리에이터입니다.
이 스킬은 템플릿이 아닌 플레이북입니다. 사용자를 인터뷰하고, 답변을 바탕으로 구축합니다. 모든 이름, 색상, 음성 규칙, 경쟁사 및 키는 인터뷰에서 비롯됩니다. 이 스킬의 어떤 것도 실제 브랜드가 아니며, 구축하는 어떤 것도 사용자가 제공하지 않은 값을 포함할 수 없습니다.
한 단락으로 설명하는 당신이 구축할 것
하나의 엔진 + N개의 비즈니스 폴더. 엔진은 engine/app (Next.js App Router, React, TypeScript strict, Tailwind v4, pnpm), 엔진이 실행하는 신뢰할 수 있는 스크립트, 그리고 engine/tools의 CLI 도구로 구성됩니다. 각 비즈니스는 테넌트입니다: tenants/<id>/는 매니페스트, 브랜드 키트, 아이디어 및 조각, 메모리, 스킬 및 자체 계정 키를 보유합니다. 모든 API 라우트는 정확히 하나의 테넌트를 식별하고 해당 폴더 내에서만 읽거나 씁니다. 파일 시스템이 곧 데이터베이스입니다: DB나 ORM이 없습니다. AI 작업은 사용자 자신의 코딩 에이전트 CLI(보통 claude)에 의해 수행되며, cwd가 테넌트 폴더로 설정된 상태로 쉘 없이 그리고 해당 폴더 내에 머물도록 하는 인라인 거부 규칙과 함께 헤드리스로 실행됩니다. 에이전트는 단어와 코드만 씁니다. 스캐폴딩, 내보내기, 렌더링 및 게시 등 실행하는 모든 작업은 엔진이 수행합니다. 단일 테넌트 설치는 정확히 하나의 테넌트 폴더를 가진 동일한 엔진입니다. 별도의 "단일 브랜드" 코드 경로는 없습니다.
황금률: 먼저 인터뷰하고, 그 다음에 구축하라
인터뷰가 완료되고 사용자가 요약을 확인할 때까지 어떤 파일도 쓰지 마십시오. 이 시스템의 가치는 그것이 사용자의 것이라는 점에 있습니다. 일반 복제본은 실패한 빌드입니다.
- 사용자의 언어로 질문하고, 턴당 하나의 질문 그룹을 제시하며, 각 질문에 대해 합리적인 기본값을 제안하여 사용자가 "예"라고 답하거나 조정할 수 있도록 하십시오.
- 사용자는 어떤 질문에든 "나중에"라고 말할 수 있으며, "나머지는 기본값을 사용하세요"라고 말할 수도 있습니다. "나중에" 항목은 보류 중으로 기록하고, 해당 항목이 차단하는 부분을 비활성화된 상태로 구축하고, "아직 설정되지 않음" 알림을 표시하십시오.
- 채팅에서 비밀 정보를 요청하지 마십시오. 어떤 변수가 어떤 파일에 들어가는지 알려주고 사용자가 직접 붙여넣도록 하십시오. 사용자가 비밀 정보를 붙여넣더라도 올바른 파일에 넣고 다시 에코하지 말고, 사용자에게 비밀 정보를 교체하라고 알리십시오.
- 간결한 요약으로 마무리하고 명시적인 예를 받으십시오.
첫 번째 질문은 테넌시에 관한 것입니다:
이 시스템이 하나의 비즈니스(단일 테넌트)를 운영할까요, 아니면 여러 비즈니스 또는 클라이언트(각각 완전히 격리된)(다중 테넌트)를 운영할까요?
- 단일 테넌트. 하나의 브랜드. 대시보드가 바로 열립니다.
- 다중 테넌트. 에이전시 또는 여러 브랜드를 가진 개인. 각 비즈니스는 자체 폴더를 얻습니다: 자체 브랜드 키트, 아이디어, 콘텐츠, 메모리, 채팅, 게시 채널 및 키. AI 에이전트는 다른 비즈니스의 파일을 절대 읽을 수 없습니다.
/의 선택기가 비즈니스 간에 전환합니다.둘 다 동일한 엔진을 사용하며, 단일 테넌트는 단순히 하나의 폴더입니다. 나중에 비즈니스를 추가하는 것은 폴더를 추가하는 것을 의미합니다; 마이그레이션할 필요가 없습니다.
전체 질문 세트(시스템 질문 한 번, 그 다음 비즈니스별 질문), 기본값 및 각 답변이 파일에 매핑되는 방식은 references/1-interview.md 에 있습니다. 아무 것도 묻기 전에 이것을 읽으십시오.
코드로 제공되는 것 (assets/)
이 시스템의 대부분은 참조 파일에서 생성합니다. 11개의 파일은 그대로 복사됩니다. 각 파일에는 프로덕션에서 측정된 엣지 케이스(또는 보안 경계)가 있고, 산문에서 새로 파생하면 조용히 잘못될 수 있기 때문입니다. 변경하지 않고 복사한 다음 EDIT:로 표시된 부분(소유자 언어 문장, 언어 데이터, 게시 도구 목록)만 편집하십시오. 참조 파일은 각각이 왜 그렇게 작동하는지 설명합니다; 에셋은 어떻게 작동하는지입니다.
| 에셋 | 복사 위치 | 설명 |
|---|---|---|
assets/tenant.mjs | engine/app/src/lib/tenant.mjs | 테넌트 검색, 매니페스트 + 비즈니스별 settings 검증, 경로 탐색 방지 가드, 테넌트별 환경 변수 (계정 키는 절대 상속되지 않음) |
assets/agent-flags.mjs | engine/app/src/lib/agent-flags.mjs | 에이전트 격리가 구축되는 유일한 장소: 프로필, 인라인 거부 규칙, 환경 변수 허용 목록 |
assets/proxy.ts | engine/app/src/proxy.ts | 모든 /api 라우트 앞의 동일 출처 가드 (루프백 호스트, 교차 사이트 요청 없음, JSON 또는 multipart 본문만 허용) |
assets/export-project.mjs | engine/app/scripts/export-project.mjs | 기본 거부 요청 방화벽이 있는 신뢰할 수 있는 HTML→PNG 내보내기 도구 |
assets/shapes.mjs | engine/app/src/lib/shapes.mjs | 텍스트 중복 제거가 볼 수 없는 두 가지 반복 방지 축 (모양과 교훈) + 종류별 시작 모양 |
assets/ideas-core.mjs | engine/app/src/lib/ideas-core.mjs | 아이디어 저장소: 키트에 대한 검증, 결정론적 중복 제거, 격리, 원자적 쓰기, 뮤텍스 |
assets/extract-json.mjs | engine/app/src/lib/extract-json.mjs | 레이더 검증기와 수집기가 공유하는 하나의 관용적 JSON 리더 |
assets/radar-verify.mjs | engine/app/src/lib/radar-verify.mjs | 레이더의 근거 확인: SSRF 차단 가져오기, 페이지 날짜, 인용 샤클, 언어 게이트, 입증되지 않은 숫자 |
assets/proposals.mjs | engine/app/src/lib/proposals.mjs | 채팅의 위조 불가능한 게시 제안: 하나의 메시지에 바인딩, 단일 사용, 원자적 클레임 |
assets/new-tenant.mjs | engine/tools/new-tenant.mjs | 유효하고 비어 있으며 게이트된 테넌트 폴더를 스캐폴딩합니다. 전부 아니면 전무; --from은 일회용 테스트 복사본을 만듭니다. |
assets/sync-tenant.mjs | engine/tools/sync-tenant.mjs | 기존 테넌트에 엔진의 스킬과 설정을 다시 적용합니다 (둘 중 하나를 편집한 후 실행) |
ideas-core.mjs는 ./strategy-core.mjs를 가져옵니다. 이 파일은 참조 4 §3에서 작성합니다. 에셋이 가져오는 다른 모든 것은 또 다른 에셋입니다.
빌드 순서
위에서 아래로 작업하십시오. 각 단계 전에 해당 참조 파일을 읽으십시오. 다음 단계로 넘어가기 전에 해당 참조 파일의 체크포인트를 실행하십시오. "완료된 것처럼 보이지만" 체크포인트에 실패하는 단계는 세 단계 후, 전혀 관련 없는 곳에서 무언가를 망가뜨립니다. 각 단계 후에 사용자에게 한 줄로 무엇을 했는지 알리십시오.
| # | 단계 | 참조 | 항상? |
|---|---|---|---|
| 0 | 머신 점검, 인터뷰 실행, 요약 확인 | 1-interview.md | 예 |
| 1 | 엔진 스켈레톤: 저장소 레이아웃, Next 부트스트랩, 모든 에셋 복사, 테넌시 코어, new-tenant, 테넌트 폴더 | 2-architecture-and-tenancy.md | 예 |
| 2 | 보안: 에이전트 격리, 생성 헬퍼, 프록시 가드, 환경 변수 격리, verify-tenants; 그 다음 sync-tenant --all | 3-security-and-agents.md | 예 |
| 3 | 브랜드 키트 (스키마, 렌더러, 인터뷰, 리서치 초안, 승인) 및 아이디어 저장소 (+ 모양 및 교훈 축) | 4-brand-kit-and-ideas.md | 예 |
| 4 | 대시보드 셸 + 디자인 시스템: 선택기, 테넌트 셸, 홈, 전략, 아이디어, 설정, 토큰, RTL, 모바일 레이아웃 | 5-dashboard-and-design.md | 예 |
| 5 | 프로덕션: 생성 작업, 스캐폴드, 신뢰할 수 있는 내보내기, «편집», 빌더 스킬, 제품 라이브러리, 제작/갤러리/스크립트 뷰; 그 다음 sync-tenant --all | 6-production-and-export.md | 예 (라이브러리는 선택 사항) |
| 6 | 미디어 엔진: AI 이미지 게시물, AI 비디오, 브라우저 기반 비디오, Remotion 애니메이션 | 7-media-engines.md | 엔진별 선택 사항 |
| 7 | 레이더 + 경쟁사 + 대본 + 선례 인덱스 + 자체 분석 + 커뮤니티 게시물 | 8-radar-competitors-and-analytics.md | 레이더 예; 나머지는 선택 사항 |
| 8 | 채팅 어시스턴트: 스트리밍 턴, 메모리, 에이전트의 액션, 인터뷰 모드 | 9-assistant-and-memory.md | 강력 권장 |
| 9 | 캘린더, 게시 (소유자 확인), 성장 루프 | 10-publishing-calendar-and-growth.md | 캘린더 예; 게시는 선택 사항 |
| 10 | CRM + 파트너 (서비스 비즈니스) | 11-crm-and-partners.md | 선택 사항 |
| 11 | 소유자의 지식 보관소 ("브레인") + 3D 그래프 | 12-brain.md | 선택 사항 |
| 12 | 라우팅 맵, 엔진용 CLAUDE.md / AGENTS.md, 모든 테넌트 및 보관소 | 13-routing-maps-and-agents-md.md | 예 |
| 13 | 검증: 전체 체크리스트, 그 다음 핸드오프 | 14-verification.md | 예 |
인터뷰에서 활성화된 선택적 단계만 빌드하십시오. 꺼져 있는 모듈은 서버에서 꺼져 있습니다 (해당 테넌트에 대한 라우트가 404를 반환함), 사이드바에 숨겨져 있는 것만이 아닙니다. 각 뷰는 해당 라우트를 빌드하는 단계에서 빌드됩니다 (참조 5 §4에 나열됨); 셸은 꺼져 있거나 아직 빌드되지 않은 라우트의 404를 "비어 있음"으로 처리하며, 오류로 처리하지 않습니다.
단계 0: 가정하지 말고 점검하라
각 항목을 독립적으로 테스트하십시오:
- Node ≥ 20 및 pnpm (또는 사용자가 선택한 패키지 관리자). Node가 없으면 사용자에게 설치하도록 요청하십시오 (Node 없이는 아무것도 실행되지 않음). Node는 작동하지만 Next 앱을 설치할 수 없으면 Lite 모드(아래 참조)를 사용하십시오.
- 심볼릭 링크. 임시 디렉토리에 하나를 만드십시오 (
ln -s/fs.symlinkSync). Windows에서 개발자 모드 또는 관리자 권한 없이 실패합니다: 그러면new-tenant.mjs는AGENTS.md를 생성된 복사본으로 쓰고node_modules를 디렉토리 접합으로 연결하며verify-tenants는 둘 다 허용합니다. 사용 가능한 경우 WSL을 권장하십시오; Linux처럼 작동합니다. - 런타임 에이전트 CLI. Node 프로세스가 헤드리스 (
claude --print스타일)로 실행할 수 있으며, 로그인되어 있습니까? 닫힌 도구 목록, 거부 규칙이 있는 인라인 설정 및 비대화형 권한 모드를 지원합니까? 격리 계층은claudeCLI용으로 작성되었습니다. 다른 CLI의 경우 참조 3의 "다른 에이전트 CLI에 적용하기"를 읽으십시오. 에이전트를 격리할 수 없으면 다중 테넌트 시스템의 생성은 프롬프트 핸드오프로 저하되어야 합니다. 격리되지 않은 에이전트는 모든 비즈니스를 읽을 수 있기 때문입니다. - 선택적 도구는 인터뷰에서 해당 모듈을 활성화한 경우에만:
ffmpeg,yt-dlp,codexCLI, Google Chrome. - Playwright Chromium은 단계 1 체크포인트에서 부트스트랩이 설치한 후 점검됩니다. 설치되지 않으면 HTML 전용 내보내기를 사용하십시오.
저하 매트릭스 (절대 하나의 예/아니오로 축약하지 마십시오)
- 전체. Node, Playwright 및 격리 가능한 에이전트 CLI: 모든 것이 지정된 대로.
- HTML 전용 내보내기. Playwright를 설치할 수 없음: 조각이 HTML로 작성되고 HTML로 미리 보여집니다.
- 프롬프트 핸드오프 생성. 에이전트를 헤드리스로 실행할 수 없거나 격리할 수 없음: 생성, 레이더 및 편집이 구성된 프롬프트를
<piece>/PROMPT.md에 쓰고 표시합니다. 사용자가 에이전트로 실행한 다음 "실행했습니다. 새로고침"을 누릅니다. 대시보드의 다른 모든 부분은 정상적으로 작동합니다. - Lite 모드. Node는 작동하지만 Next 앱을 설치할 수 없음: 테넌트 폴더, 종속성 없는 코어 라이브러리(
tenant.mjs,strategy-core.mjs,strategy-approve.mjs,ideas-core.mjs,shapes.mjs) 및 해당 CLI 도구(new-tenant,strategy-block,approve-kit(초안의 sha256을 출력한 다음 정확히 해당 바이트를 승인함),ideas(목록 / 추가 / 승인 / 거절))를 빌드합니다. 모두 참조 4 §12에 지정되어 있습니다. 그러면 브랜드 승인 및 아이디어 저장소가 터미널에서 작동합니다. 사용자에게 어떤 부분이 앱 기반이고 어떤 부분이 파일 기반인지 알리십시오.
완료 정의
참조 14의 체크리스트가 통과할 때만 완료됩니다: 타입체크, 린트, 빌드, 단위 테스트, verify-tenants (실제 CLI 카나리아 포함), 게시가 있을 때 verify-publishing-safety, 승인된 아이디어의 실제 생성 및 주요 화면의 스크린샷. 어떤 항목이 통과했는지 정직하게 보고하십시오. 실패한 단계를 언급하지 않고 빌드를 완료되었다고 보고하지 마십시오.
단일 테넌트 vs 다중 테넌트: 실제로 변경되는 사항
| 항목 | 다중 테넌트 | 단일 테넌트 |
|---|---|---|
| 폴더 레이아웃 | tenants/<id>/ × N (종종 에이전시 자체 워크스페이스 + 클라이언트당 하나) | tenants/<id>/ × 1 (동일한 레이아웃이므로 나중에 두 번째 비즈니스를 추가하는 데 비용이 들지 않음) |
/ | 선택기: 비즈니스당 하나의 카드 (+ 보관소 카드) | 정확히 하나의 유효한 테넌트가 있을 때 /<only-id>로 리디렉션 |
| 헤더 | 워크스페이스 전환기 | 비즈니스 이름만, 드롭다운 없음 |
| 에이전트 격리, 거부 규칙, 쉘 없음 | 필수 | 여전히 필수: 에이전트를 엔진 소스, 저장소 루트 비밀 및 설정에서 차단 |
| 계정 키 | 각 테넌트의 자체 .env.local | 여전히 테넌트의 .env.local, 엔진 환경이 아니므로 두 번째 비즈니스가 절대 상속할 수 없음 |
| CLI 도구 | --tenant <id> 필수, 기본값 없음 | 여전히 필수 (쉘 별칭으로 충분) |
| 카나리아 | 실제 테넌트 = 피해자, 일회용 zz-canary = 공격자 | 동일: 검증기가 자체 공격자를 만듦 |
UI에서 테넌트는 "워크스페이스"(사용자의 언어로)라고 불리며, "테넌트"라고 불리지 않습니다.
비타협 조건
생성하는 항목에 다음 각각을 포함하십시오. 각각에는 이유가 있습니다. 이유 없는 규칙은 "단순화"되어 사라지기 때문입니다.
- ⭐ 개인화만. 모든 값은 인터뷰에서 비롯됩니다. 예제, 이 스킬 또는 다른 비즈니스의 값을 코드 기본값, 프롬프트 또는 템플릿에 절대 남기지 마십시오. 코드의 기본값은 해당 필드가 키트에서 누락된 모든 테넌트를 조용히 브랜딩합니다. 비즈니스별 숫자(신선도, 임계값, 통화, 신용 한도, 게시 언어)는
tenant.jsonsettings에 있습니다; 코드의 유일한 기본값은 인터뷰가 제안하는 중립적인 운영 기본값(DEFAULT_SETTINGS)이며, 소유자에게 묻지 않은 것은 설정되지 않은 상태로 남고 절대 추측되지 않습니다. - ⭐ 어디에도 기본 테넌트 없음. 라우트, CLI 도구 및 크론은 테넌트를 명명해야 합니다. 잊혀진 테넌트는 큰 소리로 실패해야 합니다; 대안은 다른 비즈니스의 데이터를 조용히 읽거나 쓰는 것입니다.
- ⭐ 생성된 에이전트는 절대 쉘을 얻지 않습니다.
node와 같은 자식 프로세스는 운영자의 전체 파일 시스템 접근 권한으로 실행되며, 어떤 CLI 플래그도 이를 제한하지 않습니다. 이것은 측정되었습니다: 쉘을 가진 테넌트 에이전트는 다른 테넌트의 파일을 읽었습니다. 따라서 라우트는 생성 전에 스캐폴딩하고 그 후에 신뢰할 수 있는 내보내기 또는 렌더러를 실행합니다. 에이전트는 단어와 코드를 씁니다; 엔진이 실행합니다. 절대--dangerously-skip-permission과 같은 플래그를 내보내지 마십시오.