Communitygithub.com

JamalMohafil/claude-skills

하나의 비즈니스 또는 여러 개의 독립된 비즈니스(예: 에이전시의 클라이언트)를 위한 로컬 AI '콘텐츠 운영 체제'를 구축합니다. 하나의 Next.js 엔진과 비즈니스별 폴더, 소유자 승인 브랜드 키트, 승인-전-생성 아이디어 저장소, 근거 있는 트렌드 레이더, 경쟁사 추적, HTML→PNG 내보내기, 선택적 AI 이미지/비디오/애니메이션, 메모리가 있는 채팅 어시스턴트, 소유자 확인 게시, CRM 및 선택적 지식 보관소 그래프를 제공합니다. 모든 생성된 AI 에이전트는 격리됩니다(쉘 없음, 다른 비즈니스 접근 불가). 모든 코딩 에이전트(Claude Code, Codex, Cursor, Kimi…)와 함께 작동합니다. 항상 먼저 인터뷰를 진행하며, "하나의 비즈니스입니까, 아니면 여러 개의 독립된 비즈니스입니까?"로 시작한 후 구축합니다.

claude-skills란 무엇인가요?

이 스킬은 개발자가 하나의 비즈니스나 여러 개의 격리된 비즈니스를 위한 로컬 '콘텐츠 운영 체제(Content OS)'를 구축할 수 있게 해줍니다. 사용자가 '콘텐츠 OS를 만들어 줘', '내 친구가 만든 콘텐츠 OS 같은 것', '내 콘텐츠를 운영할 대시보드', '내 클라이언트의 콘텐츠를 운영할 시스템', '내 에이전시를 위한 AI 콘텐츠 OS'와 같은 요청을 할 때 사용하도록 설계되었습니다. 핵심 아키텍처는 하나의 Next.js 엔진(engine/app)과 각 비즈니스(tenant)를 위한 개별 폴더(tenants/<id>/)로 구성됩니다. 모든 API 라우트는 정확히 하나의 테넌트를 식별하고 해당 폴더 내에서만 읽고 씁니다. 이는 파일 시스템을 데이터베이스로 사용하여 별도의 DB나 ORM이 필요 없습니다. AI 작업은 사용자의 코딩 에이전트 CLI(보통 claude)를 헤드리스로 실행하며, cwd를 테넌트 폴더로 설정하고 쉘 없이 인라인 거부 규칙으로 해당 폴더 내에서만 작업하도록 제한합니다. 핵심 특징으로는 엄격한 인터뷰 기반 개인화(모든 값은 인터뷰에서 비롯됨), 단일/다중 테넌트 모두 동일한 엔진 사용, 선택적 모듈(미디어 엔진, 레이더, 채팅, CRM, 지식 보관소 등)을 지원하며 14단계의 체계적인 빌드 순서와 각 단계별 검증 체크포인트를 제공합니다. 보안이 매우 중요하며, 어떤 생성된 에이전트도 쉘에 접근할 수 없고 다른 비즈니스의 파일을 읽을 수 없습니다.

지원 대상✓Claude Code✓Codex CLI✓Cursor
npx skills add https://github.com/JamalMohafil/claude-skills/tree/HEAD/content-os-builder

즐겨 사용하는 AI에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

문서

콘텐츠 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.mjsengine/app/src/lib/tenant.mjs테넌트 검색, 매니페스트 + 비즈니스별 settings 검증, 경로 탐색 방지 가드, 테넌트별 환경 변수 (계정 키는 절대 상속되지 않음)
assets/agent-flags.mjsengine/app/src/lib/agent-flags.mjs에이전트 격리가 구축되는 유일한 장소: 프로필, 인라인 거부 규칙, 환경 변수 허용 목록
assets/proxy.tsengine/app/src/proxy.ts모든 /api 라우트 앞의 동일 출처 가드 (루프백 호스트, 교차 사이트 요청 없음, JSON 또는 multipart 본문만 허용)
assets/export-project.mjsengine/app/scripts/export-project.mjs기본 거부 요청 방화벽이 있는 신뢰할 수 있는 HTML→PNG 내보내기 도구
assets/shapes.mjsengine/app/src/lib/shapes.mjs텍스트 중복 제거가 볼 수 없는 두 가지 반복 방지 축 (모양과 교훈) + 종류별 시작 모양
assets/ideas-core.mjsengine/app/src/lib/ideas-core.mjs아이디어 저장소: 키트에 대한 검증, 결정론적 중복 제거, 격리, 원자적 쓰기, 뮤텍스
assets/extract-json.mjsengine/app/src/lib/extract-json.mjs레이더 검증기와 수집기가 공유하는 하나의 관용적 JSON 리더
assets/radar-verify.mjsengine/app/src/lib/radar-verify.mjs레이더의 근거 확인: SSRF 차단 가져오기, 페이지 날짜, 인용 샤클, 언어 게이트, 입증되지 않은 숫자
assets/proposals.mjsengine/app/src/lib/proposals.mjs채팅의 위조 불가능한 게시 제안: 하나의 메시지에 바인딩, 단일 사용, 원자적 클레임
assets/new-tenant.mjsengine/tools/new-tenant.mjs유효하고 비어 있으며 게이트된 테넌트 폴더를 스캐폴딩합니다. 전부 아니면 전무; --from은 일회용 테스트 복사본을 만듭니다.
assets/sync-tenant.mjsengine/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 --all3-security-and-agents.md예
3브랜드 키트 (스키마, 렌더러, 인터뷰, 리서치 초안, 승인) 및 아이디어 저장소 (+ 모양 및 교훈 축)4-brand-kit-and-ideas.md예
4대시보드 셸 + 디자인 시스템: 선택기, 테넌트 셸, 홈, 전략, 아이디어, 설정, 토큰, RTL, 모바일 레이아웃5-dashboard-and-design.md예
5프로덕션: 생성 작업, 스캐폴드, 신뢰할 수 있는 내보내기, «편집», 빌더 스킬, 제품 라이브러리, 제작/갤러리/스크립트 뷰; 그 다음 sync-tenant --all6-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캘린더 예; 게시는 선택 사항
10CRM + 파트너 (서비스 비즈니스)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: 가정하지 말고 점검하라

각 항목을 독립적으로 테스트하십시오:

  1. Node ≥ 20 및 pnpm (또는 사용자가 선택한 패키지 관리자). Node가 없으면 사용자에게 설치하도록 요청하십시오 (Node 없이는 아무것도 실행되지 않음). Node는 작동하지만 Next 앱을 설치할 수 없으면 Lite 모드(아래 참조)를 사용하십시오.
  2. 심볼릭 링크. 임시 디렉토리에 하나를 만드십시오 (ln -s / fs.symlinkSync). Windows에서 개발자 모드 또는 관리자 권한 없이 실패합니다: 그러면 new-tenant.mjs는 AGENTS.md를 생성된 복사본으로 쓰고 node_modules를 디렉토리 접합으로 연결하며 verify-tenants는 둘 다 허용합니다. 사용 가능한 경우 WSL을 권장하십시오; Linux처럼 작동합니다.
  3. 런타임 에이전트 CLI. Node 프로세스가 헤드리스 (claude --print 스타일)로 실행할 수 있으며, 로그인되어 있습니까? 닫힌 도구 목록, 거부 규칙이 있는 인라인 설정 및 비대화형 권한 모드를 지원합니까? 격리 계층은 claude CLI용으로 작성되었습니다. 다른 CLI의 경우 참조 3의 "다른 에이전트 CLI에 적용하기"를 읽으십시오. 에이전트를 격리할 수 없으면 다중 테넌트 시스템의 생성은 프롬프트 핸드오프로 저하되어야 합니다. 격리되지 않은 에이전트는 모든 비즈니스를 읽을 수 있기 때문입니다.
  4. 선택적 도구는 인터뷰에서 해당 모듈을 활성화한 경우에만: ffmpeg, yt-dlp, codex CLI, Google Chrome.
  5. 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.json settings에 있습니다; 코드의 유일한 기본값은 인터뷰가 제안하는 중립적인 운영 기본값(DEFAULT_SETTINGS)이며, 소유자에게 묻지 않은 것은 설정되지 않은 상태로 남고 절대 추측되지 않습니다.
  • ⭐ 어디에도 기본 테넌트 없음. 라우트, CLI 도구 및 크론은 테넌트를 명명해야 합니다. 잊혀진 테넌트는 큰 소리로 실패해야 합니다; 대안은 다른 비즈니스의 데이터를 조용히 읽거나 쓰는 것입니다.
  • ⭐ 생성된 에이전트는 절대 쉘을 얻지 않습니다. node와 같은 자식 프로세스는 운영자의 전체 파일 시스템 접근 권한으로 실행되며, 어떤 CLI 플래그도 이를 제한하지 않습니다. 이것은 측정되었습니다: 쉘을 가진 테넌트 에이전트는 다른 테넌트의 파일을 읽었습니다. 따라서 라우트는 생성 전에 스캐폴딩하고 그 후에 신뢰할 수 있는 내보내기 또는 렌더러를 실행합니다. 에이전트는 단어와 코드를 씁니다; 엔진이 실행합니다. 절대 --dangerously-skip-permission과 같은 플래그를 내보내지 마십시오.

Individual skills in this repo

This repo contains 2 individual skills — each has its own dedicated page.

관련 스킬