|
| 1 | +# Agent Skill for Graplix |
| 2 | + |
| 3 | +**참고 PR:** daangn/ventyd#85, #87, #89, #91 |
| 4 | + |
| 5 | +--- |
| 6 | + |
| 7 | +## 목표 |
| 8 | + |
| 9 | +에이전트(Claude Code, Cursor 등)가 Graplix를 올바르게 사용할 수 있도록 [Agent Skills Specification](https://agentskills.io) 형식의 `skill/` 디렉터리를 추가한다. |
| 10 | + |
| 11 | +`npx skills add daangn/graplix` 명령 하나로 설치 가능하게 한다. |
| 12 | + |
| 13 | +--- |
| 14 | + |
| 15 | +## 배경 |
| 16 | + |
| 17 | +ventyd 프로젝트(daangn/ventyd#85~91)에서 동일한 패턴을 먼저 구현했다. Graplix도 같은 방식을 따른다. |
| 18 | + |
| 19 | +핵심 아이디어는 두 가지다: |
| 20 | +1. **`skill/`** — 리포지토리에 체크인되는 에이전트 지식 베이스. SKILL.md + references/. |
| 21 | +2. **embedded docs** — npm 패키지(`@graplix/engine`)에 `dist/docs/*.md`로 번들링된 문서. 에이전트가 설치된 버전에 정확히 매칭되는 문서를 `node_modules`에서 직접 읽을 수 있다. |
| 22 | + |
| 23 | +ventyd와 다른 점: Graplix는 별도 문서 사이트가 없으므로, `generate-docs.ts`는 docs 사이트 빌드 결과 대신 각 패키지의 `README.md`를 소스로 사용한다. |
| 24 | + |
| 25 | +--- |
| 26 | + |
| 27 | +## 작업 범위 |
| 28 | + |
| 29 | +### 1. `skill/` 디렉터리 (PR #85 상당) |
| 30 | + |
| 31 | +루트에 생성. `@graplix/engine` 기준으로 작성한다. |
| 32 | + |
| 33 | +``` |
| 34 | +skill/ |
| 35 | + SKILL.md # 핵심 지식: 스키마 문법, buildEngine, check/explain, resolver, resolveType |
| 36 | + README.md # 설치 안내 (npx skills add daangn/graplix) |
| 37 | + references/ |
| 38 | + quick-start.md # 설치부터 첫 번째 권한 체크까지 |
| 39 | + schema-syntax.md # .graplix 스키마 문법 레퍼런스 (type, relations, define, direct/from/or) |
| 40 | + embedded-docs.md # node_modules/@graplix/engine/dist/docs/ 읽는 방법 |
| 41 | + common-errors.md # 자주 발생하는 에러와 해결책 |
| 42 | +``` |
| 43 | + |
| 44 | +**ventyd의 `remote-docs.md`에 해당하는 파일을 만들지 않는다.** Graplix는 공개 문서 사이트가 없으므로, 대신 `schema-syntax.md`로 스키마 문법을 다룬다. |
| 45 | + |
| 46 | +#### `SKILL.md` 주요 내용 |
| 47 | + |
| 48 | +- frontmatter: `name: graplix`, description, license, metadata |
| 49 | +- "Do not trust internal knowledge" 경고 (embedded docs 우선 참조) |
| 50 | +- Available Files Reference 표 |
| 51 | +- 핵심 개념: ReBAC, schema 문법, `buildEngine` 옵션, `check`/`explain`, `Resolver` 인터페이스, `resolveType`, `ResolverInfo` |
| 52 | +- 완전한 예제 (User + Repository 시나리오) |
| 53 | +- Critical Rules: resolveType 필수, context 필수, relation resolver는 도메인 엔티티 반환, EntityRef 직접 사용 금지 |
| 54 | + |
| 55 | +#### `skill/references/schema-syntax.md` 주요 내용 |
| 56 | + |
| 57 | +- `.graplix` 파일 전체 문법 (Langium 기반) |
| 58 | +- `type`, `relations`, `define` 키워드 |
| 59 | +- Term 종류: direct(`[TypeA, TypeB]`), from(`relation from source`), or(`term or term`) |
| 60 | +- 네이밍 규칙: `snake_case` |
| 61 | +- 완전한 예제 스키마 |
| 62 | + |
| 63 | +### 2. `scripts/generate-docs.ts` (PR #85 상당) |
| 64 | + |
| 65 | +`@graplix/engine` 패키지의 `dist/docs/`에 번들링될 Markdown 파일을 생성하는 스크립트. |
| 66 | + |
| 67 | +**소스**: docs 사이트가 없으므로, 각 패키지의 `README.md`를 복사한다. |
| 68 | + |
| 69 | +``` |
| 70 | +packages/engine/README.md → dist/docs/engine.md |
| 71 | +packages/language/README.md → dist/docs/language.md |
| 72 | +packages/codegen/README.md → dist/docs/codegen.md |
| 73 | +``` |
| 74 | + |
| 75 | +추가로, `packages/language/src/graplix.langium`의 문법 정의를 읽어 `dist/docs/schema-syntax.md`로 생성한다 (실제 문법 소스 기반). |
| 76 | + |
| 77 | +구현 요점: |
| 78 | +- `dist/docs/` 없으면 생성 |
| 79 | +- 소스 파일이 없으면 `console.warn`하고 skip (exit code 0 유지) — PR #89 교훈 |
| 80 | + |
| 81 | +### 3. `packages/engine/package.json` 업데이트 (PR #85, #87 상당) |
| 82 | + |
| 83 | +```json |
| 84 | +{ |
| 85 | + "files": ["dist"], // dist/docs/ 자동 포함됨 (변경 불필요) |
| 86 | + "scripts": { |
| 87 | + "build": "tsdown", |
| 88 | + "build:docs": "tsx ../../scripts/generate-docs.ts", |
| 89 | + "prepack": "yarn build:docs", |
| 90 | + "test": "vitest --run --passWithNoTests" |
| 91 | + } |
| 92 | +} |
| 93 | +``` |
| 94 | + |
| 95 | +`prepack`은 `npm publish` / `yarn npm publish` 직전에 자동 실행된다. |
| 96 | +`build:docs`는 수동으로도 실행 가능하다. |
| 97 | + |
| 98 | +루트 `package.json`에도 편의 스크립트 추가: |
| 99 | + |
| 100 | +```json |
| 101 | +{ |
| 102 | + "scripts": { |
| 103 | + "build:docs": "yarn workspace @graplix/engine build:docs" |
| 104 | + } |
| 105 | +} |
| 106 | +``` |
| 107 | + |
| 108 | +### 4. `devDependencies` 추가 |
| 109 | + |
| 110 | +`scripts/generate-docs.ts` 실행에 필요: |
| 111 | + |
| 112 | +- `tsx` — 루트 devDependencies에 추가 |
| 113 | + |
| 114 | +### 5. CI 워크플로우 업데이트 (PR #91 상당) |
| 115 | + |
| 116 | +`.github/workflows/deploy-packages.yml`의 `yarn build`와 publish 사이에 `yarn build:docs` 스텝 추가: |
| 117 | + |
| 118 | +```yaml |
| 119 | +- run: yarn build |
| 120 | + |
| 121 | +- run: yarn build:docs # ← 추가 |
| 122 | + |
| 123 | +- name: Create Release Pull Request or Publish to npm |
| 124 | + ... |
| 125 | +``` |
| 126 | +
|
| 127 | +--- |
| 128 | +
|
| 129 | +## 결정 사항 |
| 130 | +
|
| 131 | +| 항목 | 결정 | 근거 | |
| 132 | +|------|------|------| |
| 133 | +| embedded docs 소스 | 각 패키지 README.md | 문서 사이트 없음, README가 가장 권위 있는 소스 | |
| 134 | +| `remote-docs.md` | 만들지 않음 | 공개 URL 없음 | |
| 135 | +| `schema-syntax.md` 추가 | ventyd에 없는 파일 | ReBAC 스키마 문법은 Graplix 고유 개념이라 별도 레퍼런스 필요 | |
| 136 | +| 스크립트 위치 | 루트 `scripts/` | 모노레포 패턴, 루트 devDep(tsx) 활용 | |
| 137 | +| embedded docs 위치 | `@graplix/engine`만 | 에이전트가 가장 많이 사용하는 패키지, 단일 진입점 | |
| 138 | +| prepack 실패 처리 | warn + skip (exit 0) | PR #89 패턴: CI 릴리즈 실패 방지 | |
| 139 | + |
| 140 | +--- |
| 141 | + |
| 142 | +## 파일 변경 목록 |
| 143 | + |
| 144 | +| 파일 | 변경 | |
| 145 | +|------|------| |
| 146 | +| `skill/SKILL.md` | 신규 | |
| 147 | +| `skill/README.md` | 신규 | |
| 148 | +| `skill/references/quick-start.md` | 신규 | |
| 149 | +| `skill/references/schema-syntax.md` | 신규 | |
| 150 | +| `skill/references/embedded-docs.md` | 신규 | |
| 151 | +| `skill/references/common-errors.md` | 신규 | |
| 152 | +| `scripts/generate-docs.ts` | 신규 | |
| 153 | +| `packages/engine/package.json` | `build:docs`, `prepack` 스크립트 추가 | |
| 154 | +| `package.json` | `build:docs` 스크립트, `tsx` devDep 추가 | |
| 155 | +| `.github/workflows/deploy-packages.yml` | `yarn build:docs` 스텝 추가 | |
| 156 | + |
| 157 | +--- |
| 158 | + |
| 159 | +## 검증 계획 |
| 160 | + |
| 161 | +1. `yarn build:docs` 실행 → `packages/engine/dist/docs/*.md` 생성 확인 |
| 162 | +2. `packages/engine/dist/docs/` 파일에 README 내용이 올바르게 복사됐는지 확인 |
| 163 | +3. `skill/SKILL.md` frontmatter가 Agent Skills Specification을 통과하는지 확인 |
| 164 | +4. `yarn workspace @graplix/engine pack --dry-run`으로 `dist/docs/` 포함 확인 |
| 165 | +5. `scripts/generate-docs.ts`를 소스 없이 실행 → warn 출력 후 exit 0 확인 |
0 commit comments