@qualisoft/ai-skills 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +234 -0
  3. package/bin/cli.mjs +331 -0
  4. package/package.json +53 -0
  5. package/skills/erd-visual/SKILL.md +294 -0
  6. package/skills/erd-visual/build.mjs +404 -0
  7. package/skills/erd-visual/engine/dbml.mjs +133 -0
  8. package/skills/erd-visual/engine/ingest.mjs +273 -0
  9. package/skills/erd-visual/engine/layout.mjs +165 -0
  10. package/skills/erd-visual/engine/overview.mjs +314 -0
  11. package/skills/erd-visual/engine/render.mjs +144 -0
  12. package/skills/erd-visual/engine/router.mjs +401 -0
  13. package/skills/erd-visual/engine/verify.mjs +138 -0
  14. package/skills/erd-visual/engine/wire.mjs +115 -0
  15. package/skills/erd-visual/fixtures/crm-large.dbml +1337 -0
  16. package/skills/erd-visual/fixtures/edge-cases.dbml +43 -0
  17. package/skills/erd-visual/fixtures/map-dynamics.json +32 -0
  18. package/skills/erd-visual/fixtures/shop-basic.dbml +78 -0
  19. package/skills/erd-visual/fixtures/src-json/api.json +38 -0
  20. package/skills/erd-visual/fixtures/src-prisma/schema.prisma +44 -0
  21. package/skills/erd-visual/fixtures/src-sql/shop.sql +62 -0
  22. package/skills/erd-visual/readers/csv.mjs +81 -0
  23. package/skills/erd-visual/readers/index.mjs +55 -0
  24. package/skills/erd-visual/readers/jsonschema.mjs +86 -0
  25. package/skills/erd-visual/readers/prisma.mjs +102 -0
  26. package/skills/erd-visual/readers/sql.mjs +205 -0
  27. package/skills/erd-visual/readers/xlsx.mjs +220 -0
  28. package/skills/erd-visual/readers/xml.mjs +130 -0
  29. package/skills/erd-visual/readers/zip.mjs +74 -0
  30. package/skills/erd-visual/viewer/index.html +539 -0
  31. package/skills/project-build/SKILL.md +171 -0
  32. package/skills/project-build/templates/build-rules.md +88 -0
  33. package/skills/project-build/templates/change-log.md +29 -0
  34. package/skills/project-build/templates/coverage.md +49 -0
  35. package/skills/project-build/templates/parity.html +375 -0
  36. package/skills/project-build/templates/theme.css +45 -0
  37. package/skills/project-design/MEDIUMS.md +104 -0
  38. package/skills/project-design/QUESTIONS.md +126 -0
  39. package/skills/project-design/SKILL.md +365 -0
  40. package/skills/project-design/templates/audit.html +689 -0
  41. package/skills/project-design/templates/change-log.md +53 -0
  42. package/skills/project-design/templates/design-rules.md +118 -0
  43. package/skills/project-design/templates/mockup-app.html +96 -0
  44. package/skills/project-design/templates/mockup-slides.html +82 -0
  45. package/skills/project-design/templates/mockup-web.html +45 -0
  46. package/skills/project-design/templates/styleguide.html +436 -0
  47. package/skills/project-design/templates/tokens.css +69 -0
  48. package/skills/project-design/templates/tone-options.html +138 -0
  49. package/skills/project-init/GUIDE.md +370 -0
  50. package/skills/project-init/RUNBOOK.md +192 -0
  51. package/skills/project-init/SKILL.md +382 -0
  52. package/skills/project-init/build.mjs +2898 -0
  53. package/skills/project-init/evals/RUBRIC.md +81 -0
  54. package/skills/project-init/evals/cases/conflicting.expect.json +17 -0
  55. package/skills/project-init/evals/cases/conflicting.md +9 -0
  56. package/skills/project-init/evals/cases/vague-idea.expect.json +11 -0
  57. package/skills/project-init/evals/cases/vague-idea.md +7 -0
  58. package/skills/project-init/evals/cases/well-formed.expect.json +18 -0
  59. package/skills/project-init/evals/cases/well-formed.md +28 -0
  60. package/skills/project-init/markdown.mjs +0 -0
  61. package/skills/project-init/modules/a11y.json +46 -0
  62. package/skills/project-init/modules/ai.json +77 -0
  63. package/skills/project-init/modules/audience.json +48 -0
  64. package/skills/project-init/modules/backend.json +129 -0
  65. package/skills/project-init/modules/brand.json +78 -0
  66. package/skills/project-init/modules/core.json +132 -0
  67. package/skills/project-init/modules/design.json +72 -0
  68. package/skills/project-init/modules/engineering.json +86 -0
  69. package/skills/project-init/modules/mobile.json +22 -0
  70. package/skills/project-init/modules/ops.json +122 -0
  71. package/skills/project-init/modules/process.json +104 -0
  72. package/skills/project-init/modules/product.json +37 -0
  73. package/skills/project-init/modules/ux.json +52 -0
  74. package/skills/project-init/modules/web.json +129 -0
  75. package/skills/project-init/presets/ai-product.json +12 -0
  76. package/skills/project-init/presets/internal-system.json +15 -0
  77. package/skills/project-init/presets/mobile-app.json +20 -0
  78. package/skills/project-init/presets/web-corporate.json +116 -0
  79. package/skills/project-init/schema.json +80 -0
  80. package/skills/project-init/templates/log.md +54 -0
  81. package/skills/project-init/templates/readme.md +62 -0
  82. package/skills/project-init/templates/reference.md +34 -0
  83. package/skills/project-init/templates/register.md +63 -0
  84. package/skills/project-init/templates/spec.md +46 -0
  85. package/skills/project-interview/INTERVIEW.md +221 -0
  86. package/skills/project-interview/SKILL.md +156 -0
  87. package/skills/project-interview/fixtures/brief.md +49 -0
  88. package/skills/project-interview/fixtures/decisions.md +13 -0
  89. package/skills/project-interview/fixtures/open-questions.md +9 -0
  90. package/skills/project-interview/templates/brief.md +179 -0
  91. package/skills/project-interview/templates/decisions.md +55 -0
  92. package/skills/project-interview/templates/open-questions.md +40 -0
  93. package/skills/project-interview/validate.mjs +49 -0
@@ -0,0 +1,129 @@
1
+ {
2
+ "name": "web",
3
+ "label": "웹 — IA · 콘텐츠 · 검색 노출",
4
+ "docs": [
5
+ {
6
+ "name": "information-architecture",
7
+ "template": "spec",
8
+ "phase": "20. 설계",
9
+ "title": "IA — 정보 구조",
10
+ "summary": "사이트맵, URL 규칙, 내비게이션, 내부 링크 설계.",
11
+ "outline": [
12
+ [
13
+ "사이트맵",
14
+ null
15
+ ],
16
+ [
17
+ "URL 규칙",
18
+ "표기, 언어, 후행 슬래시, 최대 깊이, 변경 시 리다이렉트 정책"
19
+ ],
20
+ [
21
+ "전역 내비게이션",
22
+ "헤더·푸터 구성과 CTA"
23
+ ],
24
+ [
25
+ "페이지 구성 순서",
26
+ "섹션 순서와 그 근거(방문자 심리 흐름)"
27
+ ],
28
+ [
29
+ "내부 링크 설계",
30
+ "각 페이지에서 이어질 다음 행동. 막다른 페이지를 만들지 않는다"
31
+ ],
32
+ [
33
+ "빈 상태 처리",
34
+ "데이터 0건일 때 섹션을 렌더할지. 렌더하지 않으면 위아래 리듬이 깨지지 않아야 한다"
35
+ ],
36
+ [
37
+ "다국어 라우팅",
38
+ "언어별 URL 전략, 기본 언어, 미번역 콘텐츠 처리",
39
+ "i18n"
40
+ ]
41
+ ]
42
+ },
43
+ {
44
+ "name": "content-model",
45
+ "template": "spec",
46
+ "phase": "20. 설계",
47
+ "title": "콘텐츠 모델",
48
+ "summary": "콘텐츠 타입별 필드 정의. CMS 이관을 전제로 한 스키마.",
49
+ "outline": [
50
+ [
51
+ "원칙",
52
+ "콘텐츠와 레이아웃을 분리한다. UI는 데이터를 받기만 한다"
53
+ ],
54
+ [
55
+ "저장 위치",
56
+ "파일 기반 / CMS 이관 대상 구분"
57
+ ],
58
+ [
59
+ "스키마",
60
+ "타입별 필드와 필수 여부. 검증되지 않은 값을 넣지 말아야 할 필드를 명시"
61
+ ],
62
+ [
63
+ "빈 상태 규칙",
64
+ "선택 필드가 비면 화면에서 해당 블록이 사라져야 한다"
65
+ ],
66
+ [
67
+ "CMS 이관 시 고려",
68
+ "이관해도 컴포넌트는 바뀌지 않아야 한다",
69
+ "cms"
70
+ ]
71
+ ],
72
+ "minScale": "small"
73
+ },
74
+ {
75
+ "name": "seo-spec",
76
+ "template": "spec",
77
+ "phase": "50. 오픈 · 안정화",
78
+ "title": "검색 · AI 노출 정의서",
79
+ "summary": "메타데이터·구조화 데이터·URL 정책, 네이버 대응, 생성형 AI 노출(GEO).",
80
+ "outline": [
81
+ [
82
+ "페이지별 필수 메타데이터",
83
+ "title / description / canonical / Open Graph / Twitter Card. **페이지마다 고유해야 한다**",
84
+ "seo"
85
+ ],
86
+ [
87
+ "마크업 규칙",
88
+ "시맨틱 HTML, 페이지당 h1 하나, 의미 있는 alt, 그 자체로 읽히는 링크 텍스트",
89
+ "seo"
90
+ ],
91
+ [
92
+ "구조화 데이터 (JSON-LD)",
93
+ "Organization / WebSite / Article / BreadcrumbList / Service. **확인된 정보만 넣는다** — 허위 구조화 데이터는 검색 페널티 대상",
94
+ "seo"
95
+ ],
96
+ [
97
+ "URL 정책",
98
+ "읽기 쉬운 구조. 발행 후 변경 시 301",
99
+ "seo"
100
+ ],
101
+ [
102
+ "사이트맵 / robots",
103
+ "미발행 콘텐츠는 sitemap에서 제외",
104
+ "seo"
105
+ ],
106
+ [
107
+ "네이버 대응",
108
+ "서치어드바이저 소유확인 + 사이트맵 제출. 네이버는 자체 문서(블로그·카페·지식iN)를 우선하므로 기업 사이트는 **브랜드 검색 중심**으로 접근한다. OG 태그는 네이버 공유 카드에도 쓰인다",
109
+ "naver"
110
+ ],
111
+ [
112
+ "GEO — 생성형 AI 노출",
113
+ "① **AI 크롤러 허용 정책** (GPTBot / ClaudeBot / PerplexityBot / Google-Extended) — 차단하면 인용 자체가 불가능하므로 허용 여부를 명시적으로 결정한다 ② `llms.txt` 제공 여부 ③ 인용 가능한 문장 구조 — 한 문단에 하나의 사실, 명확한 주어 ④ **엔티티 일관성** — 회사명·서비스명·주소가 사이트와 외부(GitHub, 링크드인, 디렉터리)에서 동일해야 한다 ⑤ 구조화 데이터 재사용",
114
+ "geo"
115
+ ],
116
+ [
117
+ "GEO의 한계",
118
+ "`llms.txt`는 아직 확정된 표준이 아니다. GEO는 측정 도구도 없어서 주요 AI에 직접 질의해 언급 여부를 수동 확인하는 수준이다. **KPI로 잡으면 허수가 된다.** 효과를 단정해 쓰지 않는다",
119
+ "geo"
120
+ ],
121
+ [
122
+ "검색 노출 성과",
123
+ "서치콘솔 · 서치어드바이저 지표(노출수, 클릭률, 색인 상태)",
124
+ "seo"
125
+ ]
126
+ ]
127
+ }
128
+ ]
129
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "name": "ai-product",
3
+ "label": "AI 제품 / LLM 기능",
4
+ "description": "모델을 쓰는 제품. 평가 기준·실패 모드·비용·데이터 취급이 일반 소프트웨어와 다르다.",
5
+ "modules": [
6
+ "core",
7
+ "product",
8
+ "ai",
9
+ "design",
10
+ "ops"
11
+ ]
12
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "name": "internal-system",
3
+ "label": "사내 시스템 / 어드민",
4
+ "description": "업무 시스템. 권한·업무 프로세스·기존 시스템 연동·데이터 이관이 핵심이다.",
5
+ "modules": [
6
+ "core",
7
+ "process",
8
+ "product",
9
+ "ux",
10
+ "design",
11
+ "backend",
12
+ "engineering",
13
+ "ops"
14
+ ]
15
+ }
@@ -0,0 +1,20 @@
1
+ {
2
+ "name": "mobile-app",
3
+ "label": "모바일 앱",
4
+ "description": "iOS/Android 앱. 스토어 심사·권한·오프라인·푸시가 웹과 다른 축이다.",
5
+ "modules": [
6
+ "core",
7
+ "audience",
8
+ "product",
9
+ "ux",
10
+ "design",
11
+ "a11y",
12
+ "backend",
13
+ "mobile",
14
+ "engineering",
15
+ "ops"
16
+ ],
17
+ "exclude": [
18
+ "security-audit"
19
+ ]
20
+ }
@@ -0,0 +1,116 @@
1
+ {
2
+ "name": "web-corporate",
3
+ "label": "기업 웹사이트 / 코퍼릿 사이트",
4
+ "description": "마케팅 목적의 다중 페이지 웹사이트. 브랜드·콘텐츠·SEO 비중이 크다.",
5
+ "modules": [
6
+ "core",
7
+ "brand",
8
+ "audience",
9
+ "product",
10
+ "ux",
11
+ "design",
12
+ "a11y",
13
+ "web",
14
+ "engineering",
15
+ "ops"
16
+ ],
17
+ "options": [
18
+ {
19
+ "id": "seo",
20
+ "label": "SEO — 검색엔진 노출",
21
+ "default": true,
22
+ "detail": "메타데이터, 구조화 데이터, 사이트맵. 공개 웹사이트면 거의 항상 켠다."
23
+ },
24
+ {
25
+ "id": "naver",
26
+ "label": "네이버 대응",
27
+ "default": true,
28
+ "detail": "서치어드바이저 등록, 브랜드 검색 전략. 국내 대상이면 켠다."
29
+ },
30
+ {
31
+ "id": "geo",
32
+ "label": "GEO — 생성형 AI 노출",
33
+ "default": false,
34
+ "detail": "AI 크롤러 허용 정책, 엔티티 일관성. 측정 도구가 없어 효과 검증이 어렵다는 점을 알고 켠다."
35
+ },
36
+ {
37
+ "id": "analytics",
38
+ "label": "웹 애널리틱스 (GA4 등)",
39
+ "default": true,
40
+ "detail": "방문자 행동 측정. 쿠키를 쓰면 동의 배너 검토가 따라온다.",
41
+ "cost": "도구는 무료로 시작 가능. 운영 시 이벤트 설계·검수 시간이 든다."
42
+ },
43
+ {
44
+ "id": "tagmanager",
45
+ "label": "태그 관리 (GTM)",
46
+ "default": false,
47
+ "detail": "코드 수정 없이 태그를 관리한다. 스크립트가 늘어 성능 예산과 충돌할 수 있다.",
48
+ "cost": "도구 자체는 무료. 태그 운영·품질 관리 시간이 든다.",
49
+ "conflicts": [
50
+ "perfbudget"
51
+ ]
52
+ },
53
+ {
54
+ "id": "adtracking",
55
+ "label": "전환 추적 · 광고 픽셀",
56
+ "default": false,
57
+ "detail": "광고를 집행할 때만 필요. 개인정보 동의 대상이다.",
58
+ "requires": [
59
+ "consent"
60
+ ],
61
+ "cost": "매체 계정 비용 외에 동의·태그 운영 시간이 든다."
62
+ },
63
+ {
64
+ "id": "consent",
65
+ "label": "쿠키 · 개인정보 동의",
66
+ "default": false,
67
+ "detail": "법무 판단이 필요하다. 추적 도구를 쓰면 대체로 필요해진다.",
68
+ "cost": "동의 관리 도구를 쓰면 월 비용 또는 트래픽 기반 비용이 생길 수 있다."
69
+ },
70
+ {
71
+ "id": "a11y",
72
+ "label": "접근성 (WCAG AA)",
73
+ "default": true,
74
+ "detail": "끄지 않기를 권한다. 공공·금융은 사실상 필수."
75
+ },
76
+ {
77
+ "id": "perfbudget",
78
+ "label": "성능 예산 게이트",
79
+ "default": true,
80
+ "detail": "릴리즈를 막는 수치 기준을 둘지. 끄면 목표만 남고 강제력이 없다."
81
+ },
82
+ {
83
+ "id": "i18n",
84
+ "label": "다국어",
85
+ "default": false,
86
+ "detail": "켜면 IA·라우팅·콘텐츠 모델이 모두 바뀐다. 나중에 켜기 가장 비싼 항목이다.",
87
+ "cost": "번역·검수·콘텐츠 운영 비용이 언어 수에 따라 반복된다.",
88
+ "laterEnableCost": "high"
89
+ },
90
+ {
91
+ "id": "cms",
92
+ "label": "CMS 연동",
93
+ "default": false,
94
+ "detail": "지금 안 쓰더라도 CMS-ready 구조는 유지한다.",
95
+ "cost": "실제 CMS 도입 시 서비스 요금과 콘텐츠 모델 운영 부담이 생긴다."
96
+ },
97
+ {
98
+ "id": "contactform",
99
+ "label": "문의 폼",
100
+ "default": true,
101
+ "detail": "백엔드가 없으면 데모 상태임을 명시해야 한다.",
102
+ "modes": [
103
+ "external",
104
+ "custom-api",
105
+ "mailto"
106
+ ],
107
+ "cost": "외부 폼은 사용량 요금, custom-api는 서버·메일·스팸 대응 운영비가 들 수 있다."
108
+ },
109
+ {
110
+ "id": "darkmode",
111
+ "label": "다크 모드",
112
+ "default": false,
113
+ "detail": "토큰을 이중으로 유지하는 비용이 든다."
114
+ }
115
+ ]
116
+ }
@@ -0,0 +1,80 @@
1
+ {
2
+ "$comment": "기획 문서 표준. build.mjs check 가 이 파일을 근거로 빌드를 통과/차단한다.",
3
+
4
+ "frontmatter": {
5
+ "required": [
6
+ "id",
7
+ "title",
8
+ "phase",
9
+ "status",
10
+ "owner",
11
+ "summary",
12
+ "template",
13
+ "updated"
14
+ ],
15
+ "enums": {
16
+ "status": ["draft", "review", "approved"],
17
+ "template": ["spec", "register", "log", "reference", "readme"]
18
+ },
19
+ "patterns": {
20
+ "id": "^[0-9]{2}-[a-z0-9-]+$",
21
+ "phase": "^[0-9]{2}\\. .+$",
22
+ "updated": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$"
23
+ },
24
+ "maxLength": {
25
+ "summary": 120
26
+ }
27
+ },
28
+
29
+ "$comment_sections": "문서 종류마다 성격이 달라 필수 섹션을 종류별로 둔다. 면제는 개별 예외가 아니라 '이 종류는 원래 필요 없다'는 타입 결정으로만 가능하다.",
30
+
31
+ "$comment_eli5": "'한 줄로 말하면'은 고객·현업이 읽을 수 있는 평문 요약이다. 지침으로 두면 지켜지지 않으므로 필수 섹션으로 강제한다. log(시간순 기록)와 reference(표 자체가 정의), readme(체계 설명)는 면제한다.",
32
+ "eli5": {
33
+ "section": "한 줄로 말하면",
34
+ "appliesTo": ["spec", "register"],
35
+ "maxSentenceChars": 60,
36
+ "rules": [
37
+ "왜 필요한지를 먼저 쓰고 무엇인지를 나중에 쓴다",
38
+ "약어는 첫 등장에 괄호로 풀어 쓴다 (예: UAT(고객이 직접 써보는 최종 검사))",
39
+ "비유를 한 개 넣는다",
40
+ "한 문장을 60자 이내로 끊는다"
41
+ ]
42
+ },
43
+ "sectionsByTemplate": {
44
+ "spec": {
45
+ "required": ["한 줄로 말하면", "미결정", "변경 이력"],
46
+ "note": "정의서. 결정된 것과 남은 것을 함께 적는다."
47
+ },
48
+ "register": {
49
+ "required": ["한 줄로 말하면", "변경 이력"],
50
+ "note": "대장(臺帳). 문서 전체가 열린 항목의 목록이라 미결정 섹션이 중복된다."
51
+ },
52
+ "log": {
53
+ "required": [],
54
+ "note": "기록. 확정된 항목만 시간순으로 쌓인다."
55
+ },
56
+ "reference": {
57
+ "required": ["변경 이력"],
58
+ "note": "참조표. 용어집처럼 조회용. 표 자체가 정의이므로 ELI5를 중복시키지 않는다."
59
+ },
60
+ "readme": {
61
+ "required": [],
62
+ "note": "문서 체계 자체를 설명하는 메타 문서. 문서당 1개."
63
+ }
64
+ },
65
+
66
+ "$comment_ids": "추적 대상 ID는 PREFIX-번호 형식만 인정한다. 하이픈 없는 형태(B2B 등)와 충돌하지 않기 위함이다.",
67
+ "traceability": {
68
+ "idPattern": "\\b([A-Z]{1,3}-\\d{1,3})\\b",
69
+ "blockerPrefix": "B",
70
+ "todoPattern": "TODO\\(([a-z]+)\\)"
71
+ },
72
+
73
+ "rules": {
74
+ "filenameMatchesId": true,
75
+ "uniqueIds": true,
76
+ "wikiLinksResolve": true,
77
+ "referencedIdsMustBeDefined": true,
78
+ "warnOnPlainDocReference": true
79
+ }
80
+ }
@@ -0,0 +1,54 @@
1
+ ---
2
+ id: {{id}}
3
+ title: {{title}}
4
+ phase: {{phase}}
5
+ status: approved
6
+ owner: TBD
7
+ summary: {{summary}}
8
+ template: log
9
+ updated: {{updated}}
10
+ ---
11
+
12
+ # {{title}}
13
+
14
+ ## 기록 규칙
15
+
16
+ - 결정이 **바뀌었을 때**가 아니라 **내려졌을 때** 즉시 기록한다.
17
+ - 새 의존성 추가, 스택 변경, 범위 변경은 반드시 기록한다.
18
+ - 형식: 배경 → 선택지 → 결정 → 근거 → 영향.
19
+ - 추적 ID는 `D-001` 형식으로 붙인다.
20
+
21
+ ---
22
+
23
+ ## {{updated}}
24
+
25
+ ### D-001. 제목
26
+
27
+ | 일자 | AI | 계정 |
28
+ | --- | --- | --- |
29
+ | {{timestamp}} | {{ai}} | {{account}} |
30
+
31
+ **배경**
32
+ **선택지**
33
+ **결정**
34
+ **근거**
35
+ **영향**
36
+
37
+ ---
38
+
39
+ ## 템플릿
40
+
41
+ ```
42
+ ## YYYY-MM-DD
43
+
44
+ ### D-00N. 제목
45
+
46
+ | 일자 | AI | 계정 |
47
+ | --- | --- | --- |
48
+ | YYYY-MM-DD HH:mm | Claude Code / Codex / Cursor | 계정 이름 |
49
+ **배경**
50
+ **선택지**
51
+ **결정**
52
+ **근거**
53
+ **영향**
54
+ ```
@@ -0,0 +1,62 @@
1
+ ---
2
+ id: {{id}}
3
+ title: {{title}}
4
+ phase: {{phase}}
5
+ status: approved
6
+ owner: TBD
7
+ summary: {{summary}}
8
+ template: readme
9
+ updated: {{updated}}
10
+ ---
11
+
12
+ # {{title}}
13
+
14
+ 이 폴더는 **구현 이전에 정립되어야 하는 모든 정의**를 담는다.
15
+ 코드가 아니라 합의를 저장하는 곳이다.
16
+
17
+ ## 원칙
18
+
19
+ 1. **하나의 문서 = 하나의 의사결정 영역.** 같은 내용을 두 문서에 쓰지 않는다.
20
+ 2. **모르는 것은 비워두고 표시한다.** 추측으로 채우지 않는다. 미정은 `TODO(주체)` 또는 리스크 대장으로 보낸다.
21
+ 3. **문서는 코드보다 먼저, 그러나 코드보다 짧게.** 읽히지 않는 문서는 없는 문서다.
22
+ 4. **결정이 바뀌면 문서를 고치고 의사결정 기록에 남긴다.**
23
+
24
+ ## 상태 값
25
+
26
+ | status | 뜻 |
27
+ | --- | --- |
28
+ | `draft` | 초안. 내용이 비어 있거나 검증되지 않음 |
29
+ | `review` | 검토 요청 상태 |
30
+ | `approved` | 합의 완료. 변경 시 의사결정 기록 필요 |
31
+
32
+ ## 문서 종류
33
+
34
+ | template | 필수 섹션 | 성격 |
35
+ | --- | --- | --- |
36
+ | `spec` | 미결정, 변경 이력 | 정의서 |
37
+ | `register` | 변경 이력 | 대장 — 열린 항목 목록 |
38
+ | `log` | 없음 | 기록 — 확정 항목 누적 |
39
+ | `reference` | 변경 이력 | 참조표 |
40
+ | `readme` | 없음 | 이 문서 |
41
+
42
+ ## 읽는 방법
43
+
44
+ - **사람**: `index.html`을 브라우저로 연다.
45
+ - **에이전트**: 개별 `.md`를 읽는다. 프론트매터 `summary`로 필요한 문서만 고른다.
46
+
47
+ ## 표기 규칙
48
+
49
+ | 표기 | 뜻 |
50
+ | --- | --- |
51
+ | `[[문서-id]]` | 문서 간 링크. 깨지면 빌드가 실패한다 |
52
+ | `TODO(client)` | 정보 제공 대기. `design` `copy` `legal` 등으로 주체를 밝힌다 |
53
+ | `B-01` `F-01` `D-001` | 추적 ID. `PREFIX-번호` 형식만 매트릭스에 잡힌다 |
54
+
55
+ ## 검증과 빌드
56
+
57
+ ```bash
58
+ node ~/.claude/skills/project-init/build.mjs check
59
+ node ~/.claude/skills/project-init/build.mjs build
60
+ ```
61
+
62
+ 검증에 실패하면 빌드되지 않는다. 이것이 표준이 유지되는 유일한 이유다.
@@ -0,0 +1,34 @@
1
+ ---
2
+ id: {{id}}
3
+ title: {{title}}
4
+ phase: {{phase}}
5
+ status: draft
6
+ owner: TBD
7
+ summary: {{summary}}
8
+ template: reference
9
+ updated: {{updated}}
10
+ ---
11
+
12
+ # {{title}}
13
+
14
+ ## 분류 A
15
+
16
+ | 항목 | 정의 |
17
+ | --- | --- |
18
+ | | |
19
+
20
+ ## 분류 B
21
+
22
+ | 항목 | 정의 |
23
+ | --- | --- |
24
+ | | |
25
+
26
+ ## 변경 이력
27
+
28
+ ### {{updated}}
29
+
30
+ | 일자 | AI | 계정 |
31
+ | --- | --- | --- |
32
+ | {{timestamp}} | {{ai}} | {{account}} |
33
+
34
+ - 최초 작성
@@ -0,0 +1,63 @@
1
+ ---
2
+ id: {{id}}
3
+ title: {{title}}
4
+ phase: {{phase}}
5
+ status: draft
6
+ owner: TBD
7
+ summary: {{summary}}
8
+ template: register
9
+ updated: {{updated}}
10
+ ---
11
+
12
+ # {{title}}
13
+
14
+ ## 한 줄로 말하면
15
+
16
+ > TODO(owner) — 이 문서가 하는 일을 한 문장으로. 전문용어 없이, 60자 이내.
17
+
18
+ **왜 필요한가** — 이게 없으면 무엇이 문제인가. 두 문장 이내.
19
+
20
+ **비유하자면** — 익숙한 것에 견준다. 한 문장.
21
+
22
+ **이 문서를 읽어야 하는 사람** — 역할 이름으로 적는다.
23
+
24
+ ## 등급
25
+
26
+ | 등급 | 뜻 |
27
+ | --- | --- |
28
+ | `Blocker` | 해소 전 다음 단계 진입 불가 |
29
+ | `High` | 늦어질수록 재작업 비용이 큼 |
30
+ | `Medium` | 진행하며 병행 결정 가능 |
31
+
32
+ ## 항목
33
+
34
+ > 추적 ID는 `PREFIX-번호` 형식으로 붙인다 (`B-01`, `H-01`, `M-01`).
35
+ > 이 형식만 문서 간 추적 매트릭스에 잡힌다.
36
+
37
+ 아직 등록된 항목이 없다. 아래 형식을 복사해 추가한다.
38
+
39
+ ```
40
+ ### B-01. 항목 제목
41
+
42
+ | | |
43
+ | --- | --- |
44
+ | **일자** | YYYY-MM-DD HH:mm |
45
+ | **AI** | Claude Code / Codex / Cursor |
46
+ | **계정** | 계정 이름 |
47
+ | **차단 단계** | design / implementation / release |
48
+ | **문제** | |
49
+ | **영향** | |
50
+ | **필요 결정** | |
51
+ | **결정 주체** | |
52
+ | **상태** | 미해소 |
53
+ ```
54
+
55
+ ## 변경 이력
56
+
57
+ ### {{updated}}
58
+
59
+ | 일자 | AI | 계정 |
60
+ | --- | --- | --- |
61
+ | {{timestamp}} | {{ai}} | {{account}} |
62
+
63
+ - 최초 작성
@@ -0,0 +1,46 @@
1
+ ---
2
+ id: {{id}}
3
+ title: {{title}}
4
+ phase: {{phase}}
5
+ status: draft
6
+ owner: TBD
7
+ summary: {{summary}}
8
+ template: spec
9
+ updated: {{updated}}
10
+ ---
11
+
12
+ # {{title}}
13
+
14
+ ## 한 줄로 말하면
15
+
16
+ > TODO(owner) — 이 문서가 하는 일을 한 문장으로. 전문용어 없이, 60자 이내.
17
+
18
+ **왜 필요한가** — 이게 없으면 무엇이 문제인가. 두 문장 이내.
19
+
20
+ **비유하자면** — 익숙한 것에 견준다. 한 문장.
21
+
22
+ **이 문서를 읽어야 하는 사람** — 역할 이름으로 적는다.
23
+
24
+ ## 목적
25
+
26
+ 이 문서가 답하는 질문은 무엇인가. 두세 문장.
27
+
28
+ {{outline}}
29
+
30
+ ## 미결정
31
+
32
+ | 항목 | 결정 주체 | 영향 |
33
+ | --- | --- | --- |
34
+ | | | |
35
+
36
+ 큰 항목은 [[{{riskDoc}}]]로 올린다.
37
+
38
+ ## 변경 이력
39
+
40
+ ### {{updated}}
41
+
42
+ | 일자 | AI | 계정 |
43
+ | --- | --- | --- |
44
+ | {{timestamp}} | {{ai}} | {{account}} |
45
+
46
+ - 최초 작성