JSON λ°μ΄ν°λ₯Ό LLM-friendly λ§ν¬λ€μ΄μΌλ‘ λ³ννλ ν νλ¦Ώ κΈ°λ° λꡬ λͺ¨μ
μ΄ λͺ¨λ Έλ ν¬λ λ€μ ν¨ν€μ§λ€μ ν¬ν¨ν©λλ€:
JSON λ°μ΄ν°λ₯Ό LLM-friendly λ§ν¬λ€μ΄μΌλ‘ λ³ννλ ν νλ¦Ώ κΈ°λ° μμ±κΈ°
- π λΈλΌμ°μ μ Node.js λͺ¨λ μ§μ
- π Liquid ν νλ¦Ώ λ¬Έλ² μ§μ
- π¨ ν νλ¦Ώ μ‘°ν© κΈ°λ₯ (partials, layouts)
- π TypeScript μλ²½ μ§μ
- β‘ Next.js, React, Vue, NestJS λ± λͺ¨λ νλ μμν¬ νΈν
npm install @comneed/textby곡μ ESLint μ€μ λͺ¨μ
@comneed/eslint-config/library- λΌμ΄λΈλ¬λ¦¬μ©@comneed/eslint-config/next- Next.jsμ©@comneed/eslint-config/react-internal- React λ΄λΆμ©
곡μ TypeScript μ€μ λͺ¨μ
base.json- κΈ°λ³Έ μ€μ nextjs.json- Next.js νλ‘μ νΈμ©react-library.json- React λΌμ΄λΈλ¬λ¦¬μ©
- Node.js 18 μ΄μ
- pnpm 8.15.6 μ΄μ
# μμ‘΄μ± μ€μΉ
pnpm install
# λͺ¨λ ν¨ν€μ§ λΉλ
pnpm build
# κ°λ° λͺ¨λλ‘ λͺ¨λ μ± μ€ν
pnpm devabiy/
βββ packages/ # 곡μ ν¨ν€μ§
β βββ textby/ # λ©μΈ λΌμ΄λΈλ¬λ¦¬
β βββ eslint/ # ESLint μ€μ
β βββ tsconfig/ # TypeScript μ€μ
β
βββ examples/ # μμ μ ν리μΌμ΄μ
β βββ nextjs-app/ # Next.js + TextBy ν΅ν©
β βββ nestjs-app/ # NestJS + TextBy ν΅ν©
β βββ react-app/ # React SPA μμ
β βββ vue-app/ # Vue SPA μμ
β
βββ apps/ # νλ‘λμ
μ± (μ νμ¬ν)
κ° μμ λ TextByλ₯Ό λ€μν νκ²½μμ μ¬μ©νλ λ°©λ²μ 보μ¬μ€λλ€.
cd examples/nextjs-app
pnpm dev
# http://localhost:3002 μ μ
# http://localhost:3002/llms.txt μμ μμ±λ λ§ν¬λ€μ΄ νμΈμ£Όμ κΈ°λ₯:
- App Router μ¬μ©
- νμΌ κΈ°λ° ν νλ¦Ώ
- JSON λ°μ΄ν° μλ λ‘λ©
- μ μ μμ± (
force-static)
cd examples/nestjs-app
pnpm dev
# http://localhost:3005 μ μ
# http://localhost:3005/llms.txt μμ API λ¬Έμ νμΈμ£Όμ κΈ°λ₯:
- Controllerμμ TextBy μ¬μ©
- API λ¬Έμ μλ μμ±
- νμΌ κΈ°λ° ν νλ¦Ώ
cd examples/react-app
pnpm dev
# http://localhost:3003 μ μμ£Όμ κΈ°λ₯:
- λΈλΌμ°μ νκ²½μμ λμ
- μΈλ©λͺ¨λ¦¬ ν νλ¦Ώ
- ν νλ¦Ώ μ‘°ν© (partials)
- μ€μκ° λ§ν¬λ€μ΄ μμ±
cd examples/vue-app
pnpm dev
# http://localhost:3004 μ μμ£Όμ κΈ°λ₯:
- Vue 3 Composition API
- λ°μν λ§ν¬λ€μ΄ μμ±
- μΈλ©λͺ¨λ¦¬ ν νλ¦Ώ
# λͺ¨λ ν¨ν€μ§ λΉλ
pnpm build
# νΉμ ν¨ν€μ§λ§ λΉλ
pnpm build --filter=@comneed/textby# λͺ¨λ ν¨ν€μ§λ₯Ό watch λͺ¨λλ‘ μ€ν
pnpm dev
# νΉμ ν¨ν€μ§λ§ watch
pnpm dev --filter=@comneed/textby# TextBy ν
μ€νΈ μ€ν
cd packages/textby
pnpm test# λͺ¨λ ν¨ν€μ§ λ¦°νΈ
pnpm lint
# νΉμ ν¨ν€μ§λ§ λ¦°νΈ
pnpm lint --filter=@comneed/textbypnpm formatμ΄ νλ‘μ νΈλ Changesetsλ₯Ό μ¬μ©νμ¬ λ²μ κ΄λ¦¬μ λ°°ν¬λ₯Ό μνν©λλ€.
λ³κ²½μ¬νμ΄ μμ λ changesetμ μμ±ν©λλ€:
pnpm changesetλνν ν둬ννΈκ° λνλλ©΄:
- λ³κ²½ν ν¨ν€μ§ μ ν (μ€νμ΄μ€λ°λ‘ μ ν)
- λ²μ νμ μ ν (patch/minor/major)
- λ³κ²½μ¬ν μμ½ μμ±
pnpm version-packagesμ΄ λͺ λ Ήμ΄λ:
- κ° ν¨ν€μ§μ
package.jsonλ²μ μ λ°μ΄νΈ CHANGELOG.mdμλ μμ±/μ λ°μ΄νΈ- changeset νμΌ μ κ±°
pnpm releaseλλ μλμΌλ‘:
# λΉλ
pnpm build --filter=@comneed/textby
# λ°°ν¬
cd packages/textby
pnpm publish --access public- λΉλ λꡬ: Turborepo
- ν¨ν€μ§ κ΄λ¦¬μ: pnpm
- λ²μ κ΄λ¦¬: Changesets
- μΈμ΄: TypeScript
- λ²λ€λ¬: tsup
- ν μ€νΈ: Vitest
- μ΄ μ μ₯μλ₯Ό Fork
- Feature λΈλμΉ μμ± (
git checkout -b feature/amazing-feature) - λ³κ²½μ¬ν μ»€λ° (
git commit -m 'Add amazing feature') - λΈλμΉμ Push (
git push origin feature/amazing-feature) - Pull Request μμ±
MIT
- llmstxt.org - LLM-friendly λ¬Έμ νμ€
- LiquidJS - ν νλ¦Ώ μμ§
- Turborepo - λͺ¨λ Έλ ν¬ λꡬ
AI μ΄μμ€ν΄νΈκ° λΉμ μ νλ‘μ νΈλ₯Ό μ΄ν΄ν μ μλλ‘ /llms.txt μλν¬μΈνΈλ₯Ό μ 곡νμΈμ.
OpenAPI μ€νμ΄λ JSON λ°μ΄ν°λ‘λΆν° μ½κΈ° μ¬μ΄ API λ¬Έμλ₯Ό μμ±ν©λλ€.
κ°μΈ μ 보λ₯Ό JSONμΌλ‘ κ΄λ¦¬νκ³ λ§ν¬λ€μ΄μΌλ‘ λ³ννμ¬ λ€μν νλ«νΌμ λ°°ν¬νμΈμ.
λ³κ²½ λ‘κ·Έλ₯Ό ꡬ쑰νλ λ°μ΄ν°λ‘ κ΄λ¦¬νκ³ λ³΄κΈ° μ’μ λ§ν¬λ€μ΄μΌλ‘ μμ±ν©λλ€.
A: μλμ. λΈλΌμ°μ νκ²½μμλ μΈλΌμΈ ν νλ¦Ώ λ¬Έμμ΄μ΄λ μΈλ©λͺ¨λ¦¬ ν νλ¦Ώμ μ¬μ©ν΄μΌ ν©λλ€.
A: LiquidJS λ¬Έλ²μ μ§μν©λλ€. λ³μ, λ°λ³΅λ¬Έ, 쑰건문, νν° λ±μ μ¬μ©ν μ μμ΅λλ€.
A: λ€! export const dynamic = 'force-static'μ μ¬μ©νλ©΄ λΉλ μμ μ μ νμΌλ‘ μμ±λ©λλ€.
A: λ€! textby.registerFilter()λ₯Ό μ¬μ©νμ¬ μ»€μ€ν
νν°λ₯Ό λ±λ‘ν μ μμ΅λλ€.
Made with β€οΈ for better LLM integration