본문으로 건너뛰기
5분 AI.
GITHUB TRENDING WEEKLY #8 딥다이브 · 2026-10-23 분석

plugins 딥다이브
— AI에게 일하는 방법을 배포하는 설계

플러그인 모음·규격

빠른 판단

무엇
규칙·스킬·외부 도구·이벤트 훅을 설치 단위로 묶는 Cursor 플러그인 명세와 공식 사례 저장소
이럴 때
팀의 에이전트 지침과 연결 도구를 플러그인으로 배포하고 매니페스트·검증·기억 갱신 구조를 참고할 때
cursor/plugins는 Cursor의 플러그인 명세와 공식 플러그인을 모은 저장소입니다. JSON으로 구성 요소를 연결하고, Markdown으로 작업 절차를 설명하며, 필요한 부분은 TypeScript로 제어합니다. 작은 설정 파일에서 출발해 검증기·기억 갱신·에이전트 조정·다른 실행 환경으로의 변환까지 읽어 보는 공부자료입니다. 2026-10-23 GitHub 기준 스타 13,682개 · 포크 1,354개 · 주 언어 TypeScript. 코드 설명과 집계는 커밋 8b3326d 기준입니다.
목차
  1. 프로젝트 한줄 요약
  2. 왜 주목받는가
  3. 기술 스택 전체 지도
  4. 아키텍처 심화 분석
  5. 디렉토리 구조 해부
  6. 학습 포인트 (기술별)
  7. 하드웨어 / 시스템 요구사항
  8. 직접 해볼 수 있는 실습 과제
  9. 관련 기술 심화 학습 로드맵
  10. 핵심 키워드 사전
  11. 참고 링크

1프로젝트 한줄 요약

AI 에이전트의 지침과 도구를 묶어 나누는 플러그인 시장

plugins는 AI 에이전트가 따를 규칙, 특정 작업의 절차, 외부 도구 연결, 이벤트 처리 코드를 하나의 설치 단위로 묶는 방법과 사례를 제공합니다. 이 저장소에서 배울 핵심은 프롬프트 한 줄보다, 지침과 코드를 함께 검증하고 배포하는 구조입니다.

중심에는 두 종류의 JSON이 있습니다. .cursor-plugin/marketplace.json은 전체 상품 목록이고, 각 플러그인의 .cursor-plugin/plugin.json은 그 상품의 설명서입니다. 목록의 source로 디렉토리를 찾고, 개별 명세에서 스킬·규칙·훅·MCP 설정의 위치를 알아냅니다.

한 문장 비유

플러그인은 새 직원에게 주는 업무 가방입니다

Rules는 회사의 공통 수칙, Skills는 업무별 매뉴얼, MCP는 외부 시스템의 도구함, Hooks는 특정 순간에 울리는 자동 알림에 해당합니다.

plugin.json은 가방 안의 물품 목록입니다. 가방을 설치했다고 직원이 모든 일을 올바르게 끝낸 것은 아닙니다. 매뉴얼을 읽는 주체와 실제 도구를 실행하는 환경이 함께 있어야 합니다.

구성 요소실제 사례초보자가 구분할 점
목록.cursor-plugin/marketplace.json119개 항목의 이름과 소스 위치를 연결합니다.
스킬create-plugin/skills/create-plugin-scaffold/SKILL.md새 플러그인을 만드는 작업 절차를 자연어로 기술합니다.
훅continual-learning/hooks/continual-learning-stop.ts작업 종료 이벤트를 받아 후속 학습을 요청할지 결정합니다.
MCP 설정third_party/vanta/mcp.json원격 서버에 접속할 주소를 선언합니다. 서버 자체는 여기에 없습니다.
조정 도구orchestrate/skills/orchestrate/scripts/core/loop.ts에이전트 작업의 의존 관계와 상태를 코드로 다룹니다.
용어 이해
명세 파일 · 매니페스트 (manifest)
프로그램에 필요한 이름·버전·구성 요소 위치를 적어 둔 구조화된 설명서입니다. 여기서는 JSON이 그 역할을 합니다. 파일을 읽는 실행 환경이 각 필드의 의미를 구현해야 실제 동작으로 이어집니다.

1-1. 처음에는 파일 세 개의 연결만 보자

# 아래는 연결 관계를 설명하기 위한 학습용 축약입니다.
.cursor-plugin/marketplace.json
  plugins[...].name   = "continual-learning"
  plugins[...].source = "continual-learning"

continual-learning/.cursor-plugin/plugin.json
  hooks = "./hooks/hooks.json"

continual-learning/hooks/hooks.json
  stop 이벤트 → Bun으로 continual-learning-stop.ts 실행

이 연결을 이해하면 거대한 파일 목록이 덜 막막해집니다. 전체 목록에서 하나를 고르고, 그 명세를 읽고, 명세가 가리키는 파일로 이동하면 됩니다. 이 글에서는 명세 → 검증 → 실행 조건 → 상태 관리 순서로 난도를 높입니다.

2왜 주목받는가

인기 수치와 별개로, 소스에서 읽히는 학습 가치

2-1. 일회성 지시를 재사용 가능한 단위로 만든다

AI에게 매번 같은 작업 방식과 도구 사용법을 설명하는 일은 번거롭습니다. 플러그인은 그 설명을 파일에 담아 버전으로 관리하고, 다른 사람도 같은 구성으로 사용할 수 있게 합니다. Cursor 공식 문서도 규칙·스킬·에이전트·명령·MCP 서버·훅을 배포 가능한 묶음으로 설명합니다.

GitHub Trending Weekly #8이라는 순위와 스타 13,682개는 관심의 크기를 보여 줍니다. 다만 별 증가의 직접 원인을 입증하는 자료는 아닙니다. 아래의 주목 요인은 저장소 구성에서 읽어 낸 해석이며, 특정 발표가 순위를 만들었다고 단정하지 않습니다.

2-2. 비슷한 확장 방식과 무엇이 다른가

방식주로 확장하는 것이 저장소와 비교한 특징
Cursor 플러그인에이전트의 절차·규칙·도구 연결한 명세에 여러 구성 요소를 묶을 수 있고 공식 사례를 바로 따라 읽기 좋습니다.
Claude Code 플러그인스킬·에이전트·훅·MCP 등목적이 가깝습니다. 그러나 이 커밋의 Claude 목록은 2개이므로 전체 119개가 그대로 호환된다고 볼 수 없습니다.
VS Code 확장편집기 기능·화면·언어 도구Extension API로 명령·Tree View·Webview 등을 구현합니다. 이 저장소는 에이전트 지침과 연결을 묶는 데 초점이 있습니다.
개별 MCP 서버도구·자원 등을 제공하는 통신 창구플러그인의 한 구성 요소가 될 수 있습니다. 연결 설정만으로 업무 절차 전체가 정의되지는 않습니다.

비교 근거는 Claude Code 플러그인 문서, VS Code 확장 가이드와 두 마켓플레이스 파일입니다. 기능 범위가 다르므로 어느 쪽의 성능이나 품질이 더 높다는 비교로 읽으면 안 됩니다.

입문자에게 좋은 이유
작게 읽고도 실제 설계 문제를 만난다

처음부터 2,000줄이 넘는 조정 코드 파일을 이해할 필요는 없습니다. name 하나를 검증하는 규칙에서 시작해, 잘못된 경로·중복 이벤트·실행 중단 같은 실무 문제로 자연스럽게 확장할 수 있습니다.

2-3. 공식 목록도 여러 층으로 읽어야 한다

Cursor 목록의 119개 항목은 루트 디렉토리의 플러그인 17개와 third_party/의 102개로 나뉩니다. 외부 서비스 이름이 붙은 디렉토리에 그 서비스의 백엔드 구현까지 들어 있다고 생각하면 규모를 잘못 해석하게 됩니다. Vanta 사례에서 이 저장소가 제공하는 것은 원격 연결의 선언과 사용 설명입니다.

플러그인의 설치 단위를 이해하려면, 저장소에 있는 파일과 외부 실행 환경이 맡은 일을 나눠 읽어야 합니다.

3기술 스택 전체 지도

하나의 웹앱 스택 대신, 플러그인별 실행 계층을 구분한다

3-1. 전체 기술 지형

루트에는 package.json, Cargo.toml, pyproject.toml, go.mod, Dockerfile이 없습니다. 저장소 전체를 하나의 서버로 설치하는 구조로 설명하면 부정확합니다. 의존성은 일부 스킬의 scripts/ 아래에 있고, 나머지 많은 플러그인은 문서와 JSON으로 구성됩니다.

계층실제 기술역할과 범위
명세JSON Schema draft-07, JSON플러그인·마켓플레이스 문서의 허용 필드와 타입을 정의합니다.
지침Markdown, YAML frontmatter, MDC스킬·에이전트의 설명과 규칙 적용 정보를 표현합니다.
실행 보조TypeScript, Bun, Node.js ESM훅·CLI·상태 루프·검증기·파일 생성기를 실행하는 계층입니다.
외부 연결Cursor SDK, Slack Web API, MCP클라우드 에이전트와 서비스에 연결합니다. 전체 서비스의 서버 코드는 포함하지 않습니다.
화면HTML, CSS, 일반 JavaScript일부 리뷰 캔버스의 정적 화면과 차이 표시를 제공합니다.
자동 검사GitHub Actions, Ajv, Node 테스트명세 검증과 생성 트리 일치 여부, 특정 스킬의 테스트를 검사합니다.

3-2. 백엔드에 해당하는 실행 코드

orchestrate/skills/orchestrate/scripts/package.json은 클라우드 에이전트를 조정하는 독립 패키지입니다. 주요 진입점은 orchestrate/skills/orchestrate/scripts/cli.ts이며, 실행 제어는 orchestrate/skills/orchestrate/scripts/core/loop.ts와 orchestrate/skills/orchestrate/scripts/core/agent-manager.ts가 맡습니다. orchestrate/skills/orchestrate/scripts/schemas.ts는 계획과 상태 데이터를 검사하며, 저장과 복구는 파일·Git·SDK에 걸쳐 이루어집니다.

의존성package.json 선언bun.lock 해석 결과
Cursor SDK@cursor/sdk ^1.0.121.0.18 — 에이전트 실행·조회
Slack API@slack/web-api ^7.15.17.15.1 — 실행 현황 전달
CLI 인자commander ^12.0.012.1.0 — 명령과 옵션 해석
데이터 검증zod ^4.3.64.3.6 — 단, 소스는 zod/v3를 가져옵니다.
스키마 변환zod-to-json-schema ^3.25.23.25.2 — 계획·상태 스키마 출력
TypeScript6.0.36.0.3 — 타입 검사
타입·정적 검사bun-types 1.3.13, @biomejs/biome ^2.4.81.3.13, 2.4.13

여기서 ^가 붙은 숫자는 허용 범위이고, 잠금 파일의 숫자는 그 범위를 실제로 해석한 버전입니다. bun-types 1.3.13은 타입 정의 패키지의 버전이므로 Bun 실행 파일의 고정 버전으로 바꿔 읽으면 안 됩니다.

orchestrate/skills/orchestrate/scripts/tsconfig.json에는 strict: true, noEmit: true, moduleResolution: "bundler", allowImportingTsExtensions: true가 있습니다. 타입 검사에서는 JavaScript 파일을 출력하지 않고, 실행은 Bun이 맡도록 구성한 사례입니다.

3-3. 다른 스킬은 다른 의존성을 가진다

pstack/skills/poteto-mode/scripts/package.json은 commander 14.0.0을 고정하지만, bun-types와 typescript는 latest로 선언합니다. pstack/skills/poteto-mode/scripts/bun.lock에는 각각 1.3.14, 7.0.2가 기록되어 있습니다. 따라서 저장소 전체의 TypeScript 버전이 하나라고 표현할 수 없습니다.

용어 이해
잠금 파일 (lockfile)
허용 범위에서 실제로 선택한 패키지 버전과 무결성 정보를 남기는 파일입니다. 버전 범위만 읽으면 서로 다른 시점의 설치 결과 차이를 놓칠 수 있습니다.

3-4. 프론트엔드는 어디에 있는가

추적 파일에는 .tsx가 없고, React·Next.js 앱용 루트 패키지도 없습니다. 화면 코드의 구체적 사례는 cursor-team-kit/skills/pr-review-canvas/template.html, cursor-team-kit/skills/pr-review-canvas/styles.css, cursor-team-kit/skills/pr-review-canvas/renderer.js입니다.

renderer.js의 loadPrDiffs()는 문서에 포함된 차이 데이터를 읽고, renderDiff()는 가져오기 문장과 공백만 바뀐 차이를 정리한 뒤 표를 만듭니다. detectMoves()는 최소 3줄과 비교 구간의 70% 일치라는 경험적 조건으로 이동을 추정합니다. 이는 정밀한 구문 분석기가 아니라 리뷰 표시를 돕는 휴리스틱입니다.

esc()가 코드 문자열의 특수문자를 이스케이프하는 점도 배울 만합니다. 표시할 코드가 HTML 구조로 해석되지 않게 하는 기본 경계입니다. 소스 경로가 비슷해 보여도 독립 플러그인 pr-review-canvas/와 이 보조 자산의 위치는 구분해야 합니다.

3-5. 인프라·빌드: CI가 실제로 하는 일

.github/workflows/validate-plugins.yml은 지정 경로가 바뀐 Pull Request에 반응합니다. ubuntu-latest에서 actions/checkout@v4, actions/setup-node@v4를 쓰고 Node.js 20을 선택합니다. 이 값은 CI 환경의 선택이지 모든 플러그인의 최소 실행 버전 선언은 아닙니다.

# CI 설정에 기록된 검사 순서. 실행 명령의 구조를 읽기 위한 예시입니다.
npm install --no-save ajv ajv-formats
node scripts/validate-plugins.mjs
node scripts/generate-pstack-harness-trees.mjs --check
node --test pstack/skills/*/scripts/test/*.test.mjs

ajv와 ajv-formats는 이 명령에 버전이 고정되어 있지 않습니다. 또 이 워크플로에는 orchestrate의 bun test 단계가 없습니다. 테스트 파일이 많다는 사실과 CI가 그 테스트를 실제로 실행한다는 사실은 별도로 확인해야 합니다.

기술 스택을 읽을 때는 선언된 의존성, 잠금 버전, 실제 import, CI 실행 경로를 함께 대조해야 합니다.

4아키텍처 심화 분석

선언을 읽는 계층과 실제 일을 수행하는 계층을 연결한다

4-0. 전체 시스템 구조

[저장소: 배포할 파일과 검사 도구] .cursor-plugin/marketplace.json │ source: 디렉토리 위치 ▼ 각 플러그인/.cursor-plugin/plugin.json │ ┌─────┼──────────┬────────────┐ ▼ ▼ ▼ ▼ skills/ rules/ hooks/ mcp.json agents/ *.mdc 실행 코드 원격 주소 │ │ │ │ ───────┼─────┼──────────┼────────────┼──── 실행 환경의 경계 ▼ ▼ ▼ ▼ 에이전트가 지침 해석 Bun·Node MCP 클라이언트 │ │ │ ▼ ▼ ▼ 파일·도구 작업 후속 요청 외부 서비스 [변경을 검토하는 경로] Pull Request └── GitHub Actions ├── validate-plugins.mjs → 스키마·이름·버전 검사 ├── 생성기 --check → harness/ 불일치 검사 └── Node 테스트 → pstack의 지정 테스트 [복잡한 플러그인의 내부 예: orchestrate] 실행 디렉토리의 plan.json·state.json → AgentManager.load() AgentManager.load() → 관리자 객체 → runOrchestrateLoop(관리자 객체) runOrchestrateLoop() → AgentManager ↔ Cursor SDK ↔ 클라우드 실행 ├── handoffs/ 결과 인계 파일 작성 └── state.json 상태 저장

윗부분은 플러그인의 공통 포장 방식입니다. 아랫부분의 상태 루프는 orchestrate라는 개별 플러그인의 구현입니다. 모든 플러그인이 이 루프를 통과하거나 같은 저장소를 사용하는 구조는 아닙니다.

4-1. 패턴 ① 선언적 계약과 여러 단계의 검증

schemas/plugin.schema.json의 required는 ["name"]입니다. 설명·버전·작성자는 실용적으로 중요해도 스키마상 필수는 아닙니다. additionalProperties: false는 최상위의 알 수 없는 필드를 거부합니다.

// schemas/plugin.schema.json의 핵심 부분
{
  "type": "object",
  "required": ["name"],
  "additionalProperties": false,
  "properties": {
    "name": {
      "type": "string",
      "minLength": 1,
      "pattern": "^[a-z0-9]([a-z0-9.-]*[a-z0-9])?$"
    }
  }
}

예를 들어 displayName을 displayNmae으로 잘못 쓰면 허용 필드가 아니므로 거부됩니다. 반면 version은 일반 문자열로만 검사합니다. 엄격한 버전 정규식은 minClientVersions가 참조하는 semver 정의에 붙어 있습니다.

용어 이해
선언적 구성 (declarative configuration)
작업의 세부 절차를 모두 쓰는 대신, 원하는 구성과 제약을 데이터로 적는 방식입니다. JSON은 무엇이 있는지 선언하고, 검증기와 클라이언트가 그 선언을 읽어 처리합니다.

scripts/validate-plugins.mjs는 154줄입니다. loadJSON()으로 파일을 읽고, new Ajv({ allErrors: true })로 검증기를 만든 뒤 addFormats()로 URI·이메일 같은 형식 검사를 추가합니다. fail()은 오류 수를 누적하고 마지막 종료 코드에 반영합니다.

  1. 전체 목록 검사: Cursor 마켓플레이스를 marketplace.schema.json으로 검증합니다.
  2. 개별 항목 검사: resolve(root, entry.source)로 디렉토리를 찾고 명세의 존재와 스키마를 검사합니다.
  3. 교차 검사: 목록의 이름과 명세의 이름이 일치하는지 확인합니다.
  4. 호환 명세 검사: Claude 목록의 명세 존재·이름을 확인하고, 같은 소스의 여러 매니페스트 버전을 비교합니다.

여기서 allErrors: true는 스키마 오류를 여러 개 모으는 설정입니다. loadJSON()에는 별도 예외 처리가 없어, JSON 문법 자체가 잘못되면 파싱 예외로 중단될 수 있습니다. 모든 종류의 오류가 끝까지 누적된다고 일반화하면 안 됩니다.

검사 대상실제 검증 범위추가로 생각할 문제
Cursor 명세JSON Schema, 존재, 이름 일치스킬 본문이 올바른지는 별개입니다.
Claude 명세존재와 이름 일치이 검증기는 Claude 전용 스키마를 컴파일하지 않습니다.
구성 요소 경로명세 필드의 타입각 스킬·로고·훅 경로의 존재를 모두 검사하지는 않습니다.
목록의 source로컬 경로로 해석 후 존재 확인스키마 설명은 원격 URL도 언급하지만, 이 검증기에 다운로드 분기는 없습니다.
유일성·경로 경계별도 확인 로직 없음이름 중복과 루트 바깥 경로를 명시적으로 검사할 여지가 있습니다.

create-plugin/skills/review-plugin-submission/SKILL.md는 중복 이름·frontmatter·선언 경로도 점검하라고 안내합니다. 이는 검토 절차의 범위이며, 루트 검증기가 전부 자동화했다는 뜻은 아닙니다.

4-2. 패턴 ② 이벤트를 조건으로 거르는 기억 갱신 훅

continual-learning/hooks/continual-learning-stop.ts의 main()은 표준 입력의 JSON 이벤트를 읽습니다. shouldCountTurn()은 status === "completed"이면서 loop_count === 0인 경우만 횟수로 셉니다.

// 실제 shouldTrigger 조건. 모든 조건을 동시에 만족해야 합니다.
const shouldTrigger =
  countedTurn &&
  turnsSinceLastRun >= effectiveMinTurns &&
  minutesSinceLastRun >= effectiveMinMinutes &&
  hasTranscriptAdvanced;

기본 문턱은 완료 10회와 120분입니다. 대화 기록 파일의 수정 시각도 앞으로 나아가야 합니다. lastRunAtMs가 0인 첫 실행에서는 지난 시간을 Infinity로 보므로, 최초 갱신 전에 반드시 120분을 기다리는 로직은 아닙니다.

조건이 맞으면 상태를 저장하고 followup_message를 JSON으로 출력합니다. 훅이 직접 AGENTS.md를 편집하는 것은 아닙니다. 후속 메시지가 스킬과 기억 갱신 에이전트에게 증분 처리를 요청합니다.

종료 이벤트 │ ├── 같은 generation_id인가? ── 예 → 빈 JSON 응답 │ ├── 완료 상태 + loop_count 0인가? │ ├── 누적 횟수 · 시간 · 기록 수정 시각 조건 │ ├── 충족 → 상태 저장 → followup_message 출력 │ │ │ ▼ │ 스킬·에이전트의 기억 갱신 └── 미충족 → 횟수 저장 → 빈 JSON 응답

직전의 generation_id를 저장하는 것은 같은 이벤트를 연속으로 다시 처리하지 않으려는 장치입니다. 전체 이벤트 이력을 보관하는 중복 제거 시스템은 아닙니다. 같은 이벤트가 항상 정확히 한 번만 처리된다는 보장으로 확대해서 읽으면 안 됩니다.

문서와 코드 대조
시험 모드의 기본 활성화는 설정에서 확인되지 않는다

continual-learning/README.md는 시험 모드가 훅 설정에서 켜져 있다고 설명합니다. 그러나 continual-learning/hooks/hooks.json에는 실행 명령만 있고, 시험 모드를 켜는 환경변수는 없습니다.

parseBoolean()은 값이 없으면 false입니다. 외부 환경에서 변수를 설정했을 가능성은 있으나, 이 커밋만으로 기본 활성화를 확인할 수는 없습니다. 시험 모드를 켰을 때의 기본값은 3회·15분·24시간입니다.

상태 파일이 없거나 손상되었거나 버전이 다르면 loadState()는 초기 상태를 반환합니다. 입력 파싱·상태 저장 등의 오류가 main()의 예외 처리에 도달하면 표준 오류로 기록하고, 표준 출력에는 빈 JSON을 내보내며 종료 코드 0을 반환합니다. 보조 학습 기능의 실패로 주 작업을 중단시키지 않으려는 선택이며, 그만큼 오류 로그를 따로 살펴야 합니다.

4-3. 패턴 ③ 상태를 다시 맞추는 조정 루프

orchestrate/skills/orchestrate/scripts/core/agent-manager.ts의 AgentManager.load()가 계획과 저장된 상태를 읽어 관리자 객체를 만듭니다. runOrchestrateLoop()는 이 객체를 받아 기존 실행에 재연결을 시도한 뒤, 의존 조건을 만족한 대기 작업을 시작하는 과정을 반복합니다. 한 번의 명령 호출보다, 중단 후 다시 호출했을 때의 동작이 중요한 코드입니다.

plan.json: 작업과 dependsOn │ ▼ state.json: pending ── 의존 작업 인계 완료 ──▶ running ▲ │ │ 결과 인계 파일 작성 │ ▼ 재실행으로 다시 판단 handed-off 별도 상태: error / cancelled / pruned 상위 작업 오류 → 하위 작업은 pending에 남을 수 있음 재시작 → recoverRunning()으로 기존 실행에 재연결 시도

orchestrate/skills/orchestrate/scripts/schemas.ts의 상태 열거형은 pending, running, handed-off, error, cancelled, pruned입니다. 작업 종류는 worker, subplanner, verifier로 구분합니다.

// orchestrate/skills/orchestrate/scripts/core/agent-manager.ts — depsSatisfied() 원문
depsSatisfied(task: TaskState): boolean {
  for (const dep of task.dependsOn ?? []) {
    const ds = this.getTask(dep);
    if (!ds || ds.status !== "handed-off") return false;
  }
  return true;
}

이 함수의 조건은 의존 작업의 인계 완료입니다. handed-off 자체가 제품의 정확성 검증을 뜻하지는 않습니다. 인계 메시지에 보고된 검증 수준은 live-ui-verified, unit-test-verified, type-check-only 같은 별도 verification 값으로 기록합니다. 이 값은 작업자나 검증자가 보고한 내용을 파싱한 것이므로, 값 자체가 검증의 증거는 아닙니다.

루프는 spawnReadyPending()으로 시작 가능한 작업을 살피며, 진행할 일이 남으면 다음 순회까지 최대 10초를 기다립니다. 중지 신호인 Andon이 활성화되어 있으면 새 작업 생성을 멈춥니다. pendingCouldStillSpawn()는 의존 관계를 재귀적으로 보면서 실패한 의존성이나 순환 때문에 진행할 수 없는 경우를 판별합니다.

설정·함수코드에서 확인한 동작설계에서 배울 점
DEFAULT_MAX_RUNTIME_SEC3_600, 기본 실행 시간 한도긴 실행도 재시작 경로를 전제로 구성합니다.
PLANNED_CHECKPOINT_EXIT_CODE100, 진행할 일이 남은 채 시간 한도에 도달계획된 중단을 일반 실패와 구별합니다.
exitOnError기본 true, 이번 실행의 새 오류에 반응기존 오류와 새 상태 전이를 구분합니다.
recoverRunning()저장된 agentId·runId로 SDK 실행 조회프로세스 재시작을 작업 재생성과 구분합니다.
saveState()임시 파일 작성 후 renameSync()독자가 덜 써진 JSON을 읽을 위험을 줄입니다.

waitAndHandoff()는 결과 인계 파일을 먼저 쓴 뒤 상태를 바꾸도록 구성되어 있습니다. 다음 작업이 handed-off를 보았는데 정작 읽을 결과 파일이 없는 순서를 피하려는 설계입니다. 다만 파일 이름 변경만으로 여러 프로세스의 동시 쓰기나 전체 Git 작업까지 트랜잭션이 되는 것은 아닙니다.

syncStateToGit()는 우선 로컬 상태를 저장하며, 계획의 syncStateToGit 설정이 켜졌을 때 Git 스냅샷도 기록합니다. 함수 이름만 보고 모든 실행에서 원격 동기화가 보장된다고 해석하지 않는 것이 중요합니다.

오래 실행되는 자동화에서는 일을 시작하는 코드만큼, 상태를 남기고 다시 이어 가는 코드가 중요합니다.

4-4. 패턴 ④ 하나의 원본에서 실행 환경별 산출물 생성

scripts/generate-pstack-harness-trees.mjs는 pstack/의 내용을 바탕으로 harness/pstack/claude-code/를 만듭니다. 호환판을 사람이 따로 편집해 두 벌의 문서가 서서히 어긋나는 문제를 줄이는 방식입니다.

  1. walk()가 파일을 순회합니다. node_modules와 .DS_Store는 제외합니다.
  2. classify()가 Cursor 전용 용어 사용 여부를 모읍니다. 별도의 검사 루프가 스킬 폴더 이름과 frontmatter 이름을 비교합니다.
  3. render()가 스킬·에이전트·가이드·호환 문서·라이선스·명세를 복사 대상으로 구성합니다.
  4. 필요한 스킬에는 Claude Code용 어댑터 문서를 읽으라는 안내를 넣고, 포함하지 않는 파일의 링크를 GitHub 주소로 바꿉니다.
  5. --check에서는 예상 파일과 현재 파일의 바이트·실행 권한 차이를 비교해 불일치가 있으면 실패합니다.
비유

같은 설명서의 지점별 배포판을 만드는 인쇄소와 같습니다. 원본 문서는 하나로 유지하고, 지점별 안내문과 링크만 바꿔 인쇄합니다. CI는 실제 배포판이 원본에서 다시 만든 결과와 같은지 검사합니다.

이 생성기는 모든 문장을 다른 실행 환경에 맞게 자동 번역하는 도구는 아닙니다. 알려진 용어 목록과 어댑터 안내를 이용한 변환입니다. 또한 harness/를 pstack/ 밖에 두어 Cursor가 플러그인 폴더를 복사할 때 호환판까지 함께 설치하지 않게 했습니다.

4-5. 최신 커밋에서 읽는 작은 설계 사례: Vanta 지역 선택

커밋 8b3326d의 제목은 Vanta 지역 선택 PR의 병합을 가리킵니다. 현재 파일에서는 third_party/vanta/.cursor-plugin/plugin.json의 variables.properties.VANTA_MCP_HOST.enum에 미국·유럽·호주의 세 호스트가 선언되어 있습니다.

// third_party/vanta/mcp.json 원문 구조
{
  "mcpServers": {
    "vanta": {
      "type": "http",
      "url": "https://${VANTA_MCP_HOST}/mcp",
      "placement": "server"
    }
  }
}

서버 URL을 지역마다 복사해 별도 플러그인을 만드는 대신, 설정 변수를 끼워 넣습니다. minClientVersions.cursor는 3.13.0입니다. 변수 값의 저장과 URL 치환은 클라이언트가 담당하며, 이 저장소의 JSON은 허용 값과 URL 형식을 선언합니다.

third_party/vanta/README.md 기준으로 인증은 OAuth 로그인 방식이며, 지역을 바꾸면 다시 로그인해야 합니다. 도구 호출 권한은 연결을 승인한 Vanta 사용자의 권한을 따릅니다.

5디렉토리 구조 해부

파일을 외우는 대신, 진입점과 책임을 찾는다
cursor/plugins/ ├── .cursor-plugin/ │ └── marketplace.json Cursor 목록: 119개 ├── .claude-plugin/ │ └── marketplace.json Claude Code 목록: 2개 ├── schemas/ │ ├── marketplace.schema.json 전체 목록의 계약 │ └── plugin.schema.json 개별 플러그인의 계약 ├── scripts/ │ ├── validate-plugins.mjs 명세·이름·버전 검사 │ ├── generate-pstack-harness-trees.mjs │ └── check-pstack-docs.mjs 문서와 파일 구성 대조 ├── .github/workflows/ │ └── validate-plugins.yml Pull Request 자동 검사 ├── create-plugin/ 제작·검토 절차의 예시 ├── continual-learning/ 종료 훅과 기억 갱신 지침 ├── orchestrate/ │ └── skills/orchestrate/ │ ├── SKILL.md │ ├── schemas/ 생성된 계획·상태 스키마 │ └── scripts/ │ ├── package.json · bun.lock │ ├── schemas.ts 데이터 계약의 원본 │ ├── core/ 실행·인계·복구 로직 │ ├── adapters/ Slack 연동 경계 │ ├── cli/ 명령 처리 │ └── __tests__/ 테스트와 지원 코드 ├── pstack/ 원본 스킬·가이드·도구 ├── harness/pstack/claude-code/ pstack의 생성된 호환판 ├── cursor-team-kit/ 팀 업무 스킬·리뷰 자산 ├── third_party/ 외부 서비스 플러그인 102개 │ └── vanta/ │ ├── .cursor-plugin/plugin.json │ ├── mcp.json │ ├── README.md │ └── LICENSE └── README.md 전체 목록과 개요 ※ 주요 경로만 표시했습니다. 일부 플러그인과 세부 파일은 생략했습니다.
읽을 대상먼저 찾을 질문얻게 되는 감각
schemas/무엇이 필수이고 무엇이 허용되는가?데이터 계약
scripts/문서의 약속 중 무엇을 자동 검사하는가?검증 경계와 자동화
create-plugin/사람이나 에이전트에게 어떤 제작 순서를 요구하는가?실행 가능한 지침의 구성
continual-learning/어떤 사건에 반응하고 언제 아무것도 하지 않는가?이벤트와 상태
orchestrate/실행이 끊겼을 때 무엇을 근거로 이어 가는가?상태 머신과 복구
harness/직접 고치는 원본인가, 다시 만드는 산출물인가?생성 코드의 관리

5-1. 파일 수와 코드 규모를 오해하지 않는 법

커밋 8b3326d에는 추적 파일이 1,223개 있습니다. 이 중 171개 파일은 harness/ 아래에 있으므로, 이를 제외한 파일은 1,052개입니다. 생성된 호환판이 원본 내용을 상당 부분 포함하므로 전체 줄 수만으로 독립 구현량을 판단하면 부풀려질 수 있습니다.

SKILL.md는 전체 171개, 생성 트리를 제외하면 114개입니다. 플러그인 119개와 스킬 114개는 서로 다른 단위입니다. MCP 설정 중심의 플러그인에는 스킬이 없을 수 있고, 하나의 플러그인에는 여러 스킬이 들어갈 수 있습니다.

5-2. 추천하는 소스 읽기 순서

  1. .cursor-plugin/marketplace.json에서 이름 하나와 source를 찾습니다.
  2. 그 디렉토리의 .cursor-plugin/plugin.json에서 명시된 구성 요소를 찾습니다.
  3. SKILL.md의 frontmatter와 본문을 구분하고, 호출되는 스크립트가 있는지 확인합니다.
  4. 실행 코드가 있다면 입력·판단·출력·저장 위치를 각각 적습니다.
  5. 검증기와 CI가 그 파일의 어떤 성질을 확인하는지 역으로 추적합니다.

디렉토리를 이해했다는 것은 파일 이름을 외웠다는 뜻보다, 변경할 책임과 검사할 책임을 구분했다는 뜻입니다.

6학습 포인트 (기술별)

기술 이름마다 하나의 질문과 작은 실습을 연결한다

6-1. JSON Schema: 타입과 업무 규칙은 다르다

name이 문자열인지 확인하는 것과, 다른 플러그인과 이름이 겹치지 않는지 확인하는 것은 다른 문제입니다. 스키마는 문서의 모양을, 검증기 코드는 파일 사이의 관계를 주로 담당합니다.

6-2. Markdown·frontmatter: 문서도 인터페이스다

create-plugin/skills/create-plugin-scaffold/SKILL.md의 앞부분은 이름과 설명을 제공하고, 본문은 입력·절차·결과를 안내합니다. 같은 파일 안에서 발견을 위한 메타데이터와 작업을 위한 지침이 역할을 나눕니다.

# 학습용 스킬 예시
---
name: explain-manifest
description: 플러그인 명세의 필수 필드와 연결 경로를 설명할 때 사용합니다.
---

# 명세 설명
1. name과 구성 요소 경로를 찾는다.
2. 스키마에 있는 제약과 비교한다.
3. 확인된 사실과 확인하지 못한 동작을 나눠 설명한다.

Agent Skills 명세는 SKILL.md의 frontmatter와 name·description을 정의합니다. 플러그인 이름의 정규식과 스킬 이름의 제약이 완전히 같다고 가정하지 말고 각각 확인하는 연습을 해 보세요.

6-3. TypeScript·Zod: 정적 타입 밖에서 들어오는 데이터

외부 JSON을 as SomeType으로 단언해도 데이터의 실제 내용이 바뀌지는 않습니다. orchestrate/skills/orchestrate/scripts/schemas.ts는 Zod로 런타임 검증을 하고, orchestrate/skills/orchestrate/scripts/tools/generate-json-schemas.ts의 writeSchema()는 같은 정의를 JSON Schema로 내보냅니다.

용어 이해
판별 유니온 (discriminated union)
공통 필드의 값으로 데이터 종류를 구분하는 방식입니다. 여기서는 type이 verifier이면 검증 대상인 verifies가 필요합니다. 종류마다 가능한 필드를 명확히 하여 잘못된 조합을 줄입니다.

6-4. 파일 입출력·이벤트: 아무 일도 하지 않는 경우를 설계한다

continual-learning 훅은 매번 학습을 실행하지 않습니다. 상태·횟수·시간·기록 변경을 함께 확인합니다. 자동화를 만들 때는 성공 조건뿐 아니라 반복 호출, 입력 누락, 손상된 상태 파일의 처리도 중요합니다.

6-5. 상태 머신·테스트: 시간이 걸리는 기능을 빠르게 검토한다

runOrchestrateLoop()는 now와 sleep을 옵션으로 받습니다. 테스트가 실제 한 시간을 기다리는 대신 가짜 시계를 주입할 수 있게 만든 것입니다. orchestrate/skills/orchestrate/scripts/__tests__/checkpoint-restart.test.ts는 제한 시간 뒤 종료 코드 100과 상태 저장 요청을 확인합니다.

orchestrate/skills/orchestrate/scripts/core/handoff.ts의 parseHandoffVerification()도 좋은 입문 사례입니다. 예전 형식의 pass를 가장 강한 검증 성공이 아닌 type-check-only로 보수적으로 옮깁니다. orchestrate/skills/orchestrate/scripts/__tests__/handoff-verification-parser.test.ts는 잘못된 값·빈 값·줄바꿈 차이·이전 형식 등을 나눠 다룹니다.

좋은 테스트를 설계하려면 성공 여부 하나보다, 입력 조건에 따라 달라지는 관찰 가능한 결과를 먼저 정해야 합니다.

6-6. HTML·JavaScript: 코드를 화면에 안전하게 표시하기

renderer.js의 esc()는 문자열의 &, <, >를 바꿉니다. 차이 내용에 태그처럼 생긴 코드가 있어도 화면의 구조로 해석되지 않게 하려는 처리입니다.

실습 아이디어: 문자열 <div>안녕</div>를 그대로 표시하려면 어떤 문자가 바뀌어야 하는지 적어 보세요. 코드를 보여 주는 기능에서는 표시 대상과 문서 구조를 구분하는 일이 기본입니다.

7하드웨어 / 시스템 요구사항

소스를 공부하는 조건과 플러그인을 실제 사용하는 조건은 다르다

저장소 전체에 적용되는 공식 CPU·RAM 최소 사양은 명시되어 있지 않습니다. 아래 표는 파일에서 확인할 수 있는 실행 조건과, 소스 학습에 필요한 조건을 구분한 것입니다.

목적필요한 환경해석할 때의 주의점
소스 읽기UTF-8 텍스트 편집기, 선택적으로 Git코드 분석 자체에는 GPU나 로컬 모델이 필요하지 않습니다.
명세 CI 이해설정상 Ubuntu, Node.js 20, npm이는 CI 구성입니다. 모든 개별 플러그인의 지원 OS 범위를 뜻하지 않습니다.
기억 갱신 훅 사용훅을 지원하는 Cursor 환경, Bun, 상태 파일 쓰기 권한bun run으로 호출하며 프로젝트 상대 경로에 상태를 남깁니다.
orchestrate 사용Bun, Git, Cursor SDK 인증과 클라우드 실행 접근 권한원격 실행·네트워크·계정 조건이 추가됩니다. 로컬 CPU 성능만으로 결정되지 않습니다.
Vanta 연결명세상 Cursor 3.13.0 이상, 네트워크, Vanta 계정계정·OAuth 설명은 해당 README 기준입니다.
리뷰 캔버스 보기HTML·CSS·JavaScript를 표시하는 브라우저원본 템플릿의 글꼴에는 외부 링크가 있어 오프라인 표시가 달라질 수 있습니다.

추적 파일의 내용 크기는 합계 약 10.5MB이며 .git과 설치 의존성은 포함하지 않은 값입니다. 원격 에이전트의 자원 사용량이나 패키지 설치 후 디스크 사용량을 이 숫자로 추정해서는 안 됩니다.

가벼운 학습 경로
서버 계정 없이도 핵심 구조를 공부할 수 있다

명세 읽기, 경로 연결도 그리기, 훅 조건표 작성, 상태 전이 추적은 외부 서비스 연결 없이 가능합니다. 실행 환경을 준비하기 전에 읽기만으로 설계의 상당 부분을 이해할 수 있습니다.

orchestrate가 사용하는 인증 값과 선택적 Slack 연동은 기능 사용을 위한 조건입니다. 읽기 중심 실습에는 실제 계정·인증 정보·네트워크 요청이 필요하지 않습니다.

8직접 해볼 수 있는 실습 과제

읽기와 독립 예제로, 자신의 이해를 결과물로 남긴다

다섯 과제는 저장소 스크립트 실행이나 외부 서비스 접속 없이 진행할 수 있습니다. 원본은 읽기 대상으로 두고, 학습용 메모·JSON 예제·상태표를 별도 파일에 작성하세요. 각 과제의 완료 기준은 다음 단계로 넘어갈 만큼 이해했는지 판단하는 기준입니다.

과제 1 · 입문

플러그인 하나의 연결도를 그리기

목표: 목록과 명세와 구성 파일의 차이를 설명합니다.

대상: continual-learning. 마켓플레이스 항목에서 출발해 continual-learning/.cursor-plugin/plugin.json, continual-learning/hooks/hooks.json, TypeScript 훅으로 이어지는 화살표를 그립니다.

제출물: 파일 경로 네 개와 각 파일의 책임 한 문장. 화살표마다 실제로 연결을 만드는 필드 이름을 적습니다.

완료 기준: 훅이 직접 기억 파일을 편집하는지, 후속 작업을 요청하는지 소스의 출력 필드로 설명할 수 있습니다.

과제 2 · 입문

허용되는 명세와 거부되는 명세 구분하기

목표: 추천 필드와 필수 필드, 타입과 의미를 구별합니다.

절차: 아래 입력을 schemas/plugin.schema.json과 대조해 예상 판정을 적습니다. 일반 JSON 파싱과 스키마 검증은 별개라는 점도 설명하세요.

{ "name": "study-plugin" }
{ "name": "Study_Plugin" }
{ "name": "study-plugin", "displayNmae": "학습" }
{ "name": "study-plugin", "version": "banana" }

제출물: 네 입력의 허용 여부와 근거 필드. 마지막 입력은 권장 버전 형식과 스키마가 실제 검사하는 범위가 다르다는 점을 확인합니다.

완료 기준: 두 번째는 이름 정규식, 세 번째는 허용하지 않는 최상위 필드가 문제이며, 첫 번째와 네 번째는 이 스키마의 해당 제약만 보면 통과할 수 있음을 설명합니다.

과제 3 · 중급

기억 갱신 훅의 조건표 만들기

목표: 여러 조건이 결합된 자동화의 경계를 이해합니다.

가정: 각 행은 독립 사례입니다. 시험 모드와 환경변수 재정의는 없고, 이전 실행 시각은 기록되어 있으며, generation_id도 직전 것과 다릅니다. 표의 횟수는 이번 이벤트를 포함한 값입니다.

완료·반복 조건횟수경과 시간기록 변경후속 요청
충족9200분있음없음
충족10119분있음없음
충족10120분없음없음
충족10120분있음있음
미충족10120분있음없음

제출물: 표의 각 판정에 대응하는 조건식과, 첫 실행·직전 generation_id 중복·기록 경로 누락 사례 세 개.

완료 기준: 경계값 120분의 비교 연산자와, 이전 실행 기록이 없을 때의 Infinity 처리를 설명합니다.

과제 4 · 중급

세 작업의 중단·복구 시나리오 쓰기

목표: 병렬 실행보다 먼저 의존 관계와 상태를 이해합니다.

절차: A는 독립 작업, B는 A에 의존, C는 B를 검증하는 작업이라고 정합니다. 처음 상태, A 인계 후, B 실행 중 프로세스 중단, 재시작 후의 표를 그립니다.

제출물: pending·running·handed-off 상태표와, recoverRunning()이 사용할 식별자 두 개. C의 verifies와 dependsOn의 역할도 구분합니다.

완료 기준: B를 새로 시작하는 것과 기존 runId에 다시 연결하는 것의 차이를 설명하고, A가 오류가 되었을 때 하위 작업이 자동 성공 처리되지 않는 이유를 적습니다.

과제 5 · 고급

검증기 개선안을 테스트 사례와 함께 설계하기

목표: 현재 보장 범위를 존중하면서 누락된 검사를 제안합니다.

절차: 중복 이름, 소스 경로의 루트 이탈, 선언한 훅 파일의 부재 중 하나를 고릅니다. scripts/validate-plugins.mjs의 어느 검사 뒤에 넣을지 정하고 의사코드를 작성합니다.

제출물: 정상 입력 2개, 실패 입력 3개, 기대 오류 메시지, 그리고 기존 명세와의 호환성을 유지할 방법을 담은 검토 메모.

완료 기준: 경로 검사라면 단순 문자열 접두사 비교만으로 충분한지, 심볼릭 링크와 원격 source를 어떻게 취급할지까지 질문을 남깁니다. 구현을 실행하지 않아도 설계의 결정 사항과 미결 사항이 구분되어야 합니다.

실습을 평가하는 관점

파일을 많이 읽었다는 기록보다, 잘못된 입력 하나가 어느 단계에서 막히는지 설명하는 그림 한 장이 더 유용합니다. 자신의 말로 입력·판단·결과를 연결해 보세요.

9관련 기술 심화 학습 로드맵

설정 파일 읽기에서 복구 가능한 자동화 설계까지, 6주 경로

주당 학습량은 개인의 경험에 따라 조절하세요. 앞 주의 결과물이 다음 주의 입력이 되도록 순서를 잡았습니다. 운영 계정이나 실제 에이전트 실행은 이 로드맵의 필수 조건이 아닙니다.

주차학습 주제읽을 코드·문서남길 결과물
1주차Git·JSON·경로두 마켓플레이스와 개별 명세플러그인 3개의 연결도와 구성 비교표
2주차JSON Schema와 검증schemas/, scripts/validate-plugins.mjs정상·실패 입력표와 자동 검사 범위 지도
3주차스킬 문서와 TypeScript 입력제작 스킬, 기억 갱신 훅작업 절차 하나와 훅 경계값 조건표
4주차런타임 데이터 계약·테스트orchestrate/skills/orchestrate/scripts/schemas.ts, 인계 파서와 테스트판별 유니온 요약과 이전 형식 변환 사례
5주차상태 머신·중단·복구orchestrate/skills/orchestrate/scripts/core/loop.ts, recoverRunning()작업 의존 그래프와 중단·재시작 시나리오
6주차생성 산출물·CI·호환성harness 생성기와 워크플로원본·생성물 구분표와 개선 제안서

9-1. 진도가 막힐 때 돌아갈 지점

9-2. 다음 저장소에서도 사용할 읽기 질문

어떤 데이터가 들어오는가? 그 데이터는 어디서 검사되는가? 무엇이 상태로 남는가? 프로세스가 사라져도 일을 이어 갈 수 있는가? 문서의 약속 중 CI가 확인하는 것은 무엇인가? 이 다섯 질문은 플러그인뿐 아니라 배치 처리·작업 큐·외부 API 연동을 읽을 때도 유용합니다.

학습의 도착점은 모든 파일을 읽는 것이 아니라, 작은 설계 변경의 영향과 검증 방법을 설명할 수 있는 상태입니다.

10핵심 키워드 사전

이름을 외우기보다, 코드에서 맡은 역할을 연결한다
용어쉬운 설명
플러그인지침·설정·보조 코드를 함께 설치하고 관리하는 묶음입니다.
마켓플레이스설치할 플러그인의 이름과 소스 위치를 모은 목록입니다. 목록 파일 자체가 모든 실행 기능을 제공하지는 않습니다.
매니페스트플러그인의 이름·메타데이터·구성 요소 위치를 적은 설명서입니다.
스킬특정 일을 할 때 따를 지침과 필요한 보조 자원의 묶음입니다. 보통 SKILL.md가 진입점입니다.
frontmatterMarkdown 맨 앞의 구분선 사이에 적는 메타데이터입니다. 여기서는 이름·설명 등이 들어갑니다.
Rules · MDC에이전트에게 적용할 규칙과 적용 정보를 담는 파일 형식입니다. 작업별 스킬과 역할이 다릅니다.
훅 (hook)종료 같은 특정 이벤트에 맞춰 실행하는 코드입니다. 실행 시점과 입력 형식이 계약의 일부입니다.
MCPAI 애플리케이션과 도구·자원을 제공하는 서버 사이의 표준 통신 규약입니다.
OAuth서비스 계정의 권한을 승인받아 연결하는 방식입니다. 비밀번호를 명세 파일에 적는 것과 다릅니다.
JSON SchemaJSON 데이터에 어떤 필드와 값이 올 수 있는지 정의하는 규칙입니다.
AjvJSON Schema를 이용해 실제 데이터를 검사하는 JavaScript 라이브러리입니다.
Zod실행 중 데이터의 모양을 검사하고 타입과 연결하는 라이브러리입니다. 이 코드에서는 계획·상태에 사용합니다.
런타임 검증컴파일 단계가 끝난 뒤에도, 외부에서 들어온 값이 실제 규칙을 만족하는지 확인하는 일입니다.
판별 유니온type 같은 공통 필드로 종류를 구분하고, 종류마다 다른 데이터 규칙을 적용하는 방식입니다.
SemVer주.부.수정 형태의 버전 표기 규칙입니다. 설명문에 적혀 있어도 검사 코드가 강제하는지는 따로 봐야 합니다.
잠금 파일설치 시 선택된 구체적인 패키지 버전과 무결성 정보를 기록하는 파일입니다.
Bun · Node.jsJavaScript 계열 코드를 실행하는 환경입니다. 이 저장소에서는 도구에 따라 나누어 사용합니다.
CLI터미널에서 명령과 옵션을 주어 프로그램을 다루는 방식입니다.
상태 머신가능한 상태와 상태 사이를 이동하는 조건을 명확히 정리한 모델입니다.
조정 루프원하는 작업 계획과 현재 상태를 반복 비교하고, 필요한 다음 행동을 수행하는 제어 흐름입니다.
체크포인트중단 후 이어 갈 수 있도록 현재 진행 상태를 남기는 지점입니다.
인계 (handoff)작업 결과를 다음 작업이나 검토자에게 넘기는 것입니다. 전달 완료와 검증 완료는 구분해야 합니다.
멱등성같은 요청을 반복해도 의도한 결과가 불필요하게 중복되지 않는 성질입니다. 반복에 안전한 범위를 구체적으로 확인해야 합니다.
Andon문제를 알리고 흐름을 멈추게 하는 신호입니다. 이 루프에서는 활성화되면 새 작업 시작을 일시 중지합니다.
어댑터환경마다 다른 기능 이름이나 사용 방식을 연결하는 층입니다. 코드 인터페이스나 호환 안내 문서로 구현될 수 있습니다.
CI변경이 들어왔을 때 자동으로 정해진 검사를 수행하는 과정입니다. 설정된 검사 범위만 보장합니다.
생성 산출물원본과 도구로부터 만들어진 파일입니다. 원본과 함께 관리하되 재생성 결과와 같은지 검사할 수 있습니다.
이스케이프특별한 의미를 가진 문자를 표시용 문자로 바꾸는 처리입니다. HTML에서 코드를 보여 줄 때 특히 중요합니다.

11참고 링크

원본 근거를 따라 읽고, 수치와 확인 범위를 함께 본다

11-1. 공식 저장소와 분석에 사용한 소스

11-2. 관련 기술의 공식 문서

11-3. 현재 상태 (2026-10-23 GitHub 기준)

항목확인 내용
저장소cursor/plugins — Cursor 플러그인 명세와 공식 플러그인.
주간 선정 순위GitHub Trending Weekly #8, 2026-10-23 분석.
스타 / 포크13,682 / 1,354 — 2026-10-23 GitHub 기준.
생성일 / 최근 push2026-01-23 / 2026-10-23 — 최근 push와 기준 커밋의 작성일은 다른 값입니다.
주 언어TypeScript — GitHub 분류. 문서와 JSON도 상당한 비중을 차지합니다.
최신 릴리스없음. 개별 명세의 version 필드와 GitHub Release는 구분해야 합니다.
최근 커밋8b3326d · 2026-10-22 · Vanta 지역 선택 PR #768을 병합한 커밋.
등록 플러그인Cursor 119개: 루트 17개 + third_party/ 102개. Claude Code 목록은 2개.
파일 / 스킬추적 파일 1,223개, SKILL.md 171개. 생성 트리 제외 시 각각 1,052개, 114개.
라이선스GitHub 메타데이터상 없음, 루트 LICENSE 없음. README는 MIT로 표기하며 개별 플러그인에는 MIT 라이선스 파일이 있습니다.

11-4. 언어별 대략적인 줄 수

추적 파일의 확장자별 줄바꿈 수를 합산했습니다. 빈 줄·주석·테스트를 포함하며 바이너리 이미지는 아래 집계에서 제외했습니다. 오른쪽 열은 harness/ 전체를 뺀 값입니다. 서로 다른 언어의 줄 수는 개발 난이도나 품질의 점수가 아닙니다.

언어·형식전체 파일 수 / 줄 수생성 트리 제외
TypeScript · .ts88개 / 27,865줄73개 / 21,018줄
JavaScript · .mjs19개 / 15,012줄11개 / 7,753줄
JavaScript · .js1개 / 170줄1개 / 170줄
Markdown · .md591개 / 30,635줄463개 / 24,019줄
JSON236개 / 7,402줄232개 / 7,331줄
Shell · .sh11개 / 665줄9개 / 497줄
HTML / CSSHTML 1개 / 18줄 · CSS 1개 / 96줄HTML 1개 / 18줄 · CSS 1개 / 96줄
YAML · .yml + .yaml2개 / 119줄2개 / 119줄
TLA+ · .tla2개 / 352줄1개 / 176줄

TypeScript 테스트·지원 파일은 생성 트리 제외 기준 34개, 7,883줄입니다. 이 수치는 __tests__/ 또는 이름에 .test.가 있는 TypeScript 파일을 센 값입니다. 다른 언어의 테스트는 포함하지 않으며, 모든 테스트의 실행 성공을 뜻하지 않습니다.

쓰기 전에 알아둘 한계
명세·코드·외부 서비스의 보장 범위

커밋 8b3326d의 명세가 유효해도 실제 설치·실행에는 클라이언트 버전과 계정 권한 등 각 플러그인의 조건이 적용됩니다. 스키마 통과는 외부 MCP의 인증·호출 성공까지 보장하지 않습니다.

개별 커밋의 파일 구성만으로 저장소의 전체 커밋 수·기여자 활동·변경 원인을 판단할 수는 없습니다. 2026-10-23 GitHub 수치와 2026-10-22 기준 커밋을 구분해 읽으세요. 공개 문서와 클라이언트 기능은 이후 달라질 수 있습니다.

라이선스는 GitHub 분류와 README의 MIT 표기가 다릅니다. 개별 파일을 재사용할 때는 해당 플러그인의 실제 라이선스 파일과 적용 범위를 확인하세요. 생성기의 일부 외부 링크는 GitHub main을 가리켜 시간이 지나면 내용이 바뀔 수 있습니다.