Skip to content

Commit a509b88

Browse files
feat: add Graplix agent skill (#28)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent dd22590 commit a509b88

13 files changed

Lines changed: 1640 additions & 0 deletions

File tree

.changeset/bright-carrots-wash.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
"@graplix/codegen": patch
3+
"@graplix/engine": patch
4+
---
5+
6+
docs: add skills

.github/workflows/deploy-packages.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ jobs:
2727

2828
- run: yarn build
2929

30+
- run: yarn build:docs
31+
3032
- name: Create Release Pull Request or Publish to npm
3133
id: changesets
3234
uses: changesets/action@v1
Lines changed: 165 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,165 @@
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 확인

package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
],
1313
"scripts": {
1414
"build": "ultra -r build",
15+
"build:docs": "yarn workspace @graplix/engine build:docs",
1516
"changeset:publish": "changeset publish",
1617
"changeset:version": "changeset version && yarn install --mode update-lockfile",
1718
"format": "biome check --fix --unsafe",
@@ -21,6 +22,7 @@
2122
"@biomejs/biome": "^2.3.15",
2223
"@changesets/cli": "^2.29.8",
2324
"@types/node": "24.10.13",
25+
"tsx": "^4.19.4",
2426
"typescript": "^5.9.3",
2527
"ultra-runner": "^3.10.5"
2628
},

packages/engine/package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@
3434
],
3535
"scripts": {
3636
"build": "tsdown",
37+
"build:docs": "tsx ../../scripts/generate-docs.ts",
38+
"prepack": "yarn build:docs",
3739
"test": "vitest --run --passWithNoTests"
3840
},
3941
"dependencies": {

scripts/generate-docs.ts

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
import { copyFile, mkdir, readdir } from "node:fs/promises";
2+
import { dirname, resolve } from "node:path";
3+
import { fileURLToPath } from "node:url";
4+
5+
const SCRIPT_DIR = dirname(fileURLToPath(import.meta.url));
6+
const REPO_ROOT = resolve(SCRIPT_DIR, "..");
7+
const PACKAGES_DIR = resolve(REPO_ROOT, "packages");
8+
const DOCS_OUT = resolve(PACKAGES_DIR, "engine/dist/docs");
9+
10+
const SOURCES: Array<{ src: string; dest: string }> = [
11+
{
12+
src: resolve(PACKAGES_DIR, "engine/README.md"),
13+
dest: resolve(DOCS_OUT, "engine.md"),
14+
},
15+
{
16+
src: resolve(PACKAGES_DIR, "language/README.md"),
17+
dest: resolve(DOCS_OUT, "language.md"),
18+
},
19+
{
20+
src: resolve(PACKAGES_DIR, "codegen/README.md"),
21+
dest: resolve(DOCS_OUT, "codegen.md"),
22+
},
23+
];
24+
25+
async function main() {
26+
let distExists = true;
27+
try {
28+
await readdir(resolve(PACKAGES_DIR, "engine/dist"));
29+
} catch {
30+
distExists = false;
31+
}
32+
33+
if (!distExists) {
34+
console.warn(
35+
"Skipping docs generation: packages/engine/dist/ not found. Run `yarn workspace @graplix/engine build` first.",
36+
);
37+
return;
38+
}
39+
40+
await mkdir(DOCS_OUT, { recursive: true });
41+
42+
let count = 0;
43+
for (const { src, dest } of SOURCES) {
44+
try {
45+
await copyFile(src, dest);
46+
console.log(` ${src.replace(REPO_ROOT + "/", "")}${dest.replace(REPO_ROOT + "/", "")}`);
47+
count++;
48+
} catch {
49+
console.warn(` Skipping ${src.replace(REPO_ROOT + "/", "")} — not found`);
50+
}
51+
}
52+
53+
console.log(`\nGenerated ${count} docs in packages/engine/dist/docs/`);
54+
}
55+
56+
main().catch((error) => {
57+
console.error("Failed to generate docs:", error);
58+
process.exit(1);
59+
});

skill/README.md

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
# Graplix Skill
2+
3+
Agent skill for the [Graplix](https://github.com/daangn/graplix) TypeScript ReBAC (Relation-Based Access Control) toolkit.
4+
5+
Graplix Skills are folders of instructions and resources that coding agents can discover and use to gain Graplix knowledge. They contain setup instructions, best practices, and methods for retrieving current documentation.
6+
7+
## Installation
8+
9+
Install using any coding agent that supports the [Skills standard](https://agentskills.io):
10+
11+
```bash
12+
npx skills add daangn/graplix
13+
```
14+
15+
```bash
16+
pnpm dlx skills add daangn/graplix
17+
```
18+
19+
```bash
20+
yarn dlx skills add daangn/graplix
21+
```
22+
23+
```bash
24+
bun x skills add daangn/graplix
25+
```
26+
27+
## Compatibility
28+
29+
Works with any coding agent that supports the Skills standard, including:
30+
31+
- [Claude Code](https://docs.anthropic.com/en/docs/claude-code)
32+
- [Cursor](https://cursor.com)
33+
- [Codex](https://openai.com/codex)
34+
- [OpenCode](https://opencode.ai)
35+
36+
Also available on [GitHub](https://github.com/daangn/graplix).
37+
38+
## What's Included
39+
40+
- **SKILL.md** - Core Graplix knowledge: schema syntax, buildEngine, resolvers, resolveType, check/explain, and critical rules
41+
- **references/quick-start.md** - Installation and first permission check guide
42+
- **references/schema-syntax.md** - `.graplix` schema language reference
43+
- **references/embedded-docs.md** - How to find API documentation in installed packages
44+
- **references/common-errors.md** - Troubleshooting guide for frequent errors
45+
46+
## License
47+
48+
MIT

0 commit comments

Comments
 (0)