@taejung3852/project-scaffold 0.1.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 (35) hide show
  1. package/.hooks/convention-check.sh +79 -0
  2. package/.hooks/devlog-auto.sh +55 -0
  3. package/.obsidian-template/appearance.json +6 -0
  4. package/.obsidian-template/core-plugins.json +20 -0
  5. package/.obsidian-template/graph.json +22 -0
  6. package/.obsidian-template/snippets/folder-colors.css +55 -0
  7. package/AGENT.md +55 -0
  8. package/README.kr.md +247 -0
  9. package/README.md +247 -0
  10. package/SOUL.md +54 -0
  11. package/THIRD_PARTY_NOTICES.md +14 -0
  12. package/bin/project-scaffold.js +122 -0
  13. package/lib/agents-registry.js +197 -0
  14. package/lib/agents.js +203 -0
  15. package/lib/install.js +342 -0
  16. package/package.json +33 -0
  17. package/skills/brief/SKILL.md +63 -0
  18. package/skills/brief/agents/openai.yaml +4 -0
  19. package/skills/brief/references/dashboard.md +140 -0
  20. package/skills/brief/references/handoff.md +130 -0
  21. package/skills/brief/references/report.md +163 -0
  22. package/skills/review/SKILL.md +123 -0
  23. package/skills/review/agents/openai.yaml +4 -0
  24. package/skills/wiki/SKILL.md +73 -0
  25. package/skills/wiki/agents/openai.yaml +4 -0
  26. package/skills/wiki/references/ambiguity-check.md +16 -0
  27. package/skills/wiki/references/capture.md +119 -0
  28. package/skills/wiki/references/clear-path.md +82 -0
  29. package/skills/wiki/references/devlog.md +111 -0
  30. package/skills/wiki/references/ingest.md +118 -0
  31. package/skills/wiki/references/lint.md +83 -0
  32. package/skills/wiki/references/query.md +81 -0
  33. package/skills/wiki/references/setup.md +397 -0
  34. package/skills/wiki/references/unclear-path.md +51 -0
  35. package/templates/gitignore +14 -0
@@ -0,0 +1,119 @@
1
+ # wiki capture — 회의·결정 기록
2
+
3
+ 작업 중 발생하는 회의와 결정을 `raw/`에 저장한다.
4
+ 저장된 파일은 `ingest_status: "⏳ pending"` 상태가 되어 `/wiki ingest`가 자동으로 탐지한다.
5
+
6
+ ## 목차
7
+
8
+ - 캡처 타입 결정
9
+ - 정보 수집
10
+ - raw 파일 생성
11
+ - ingest 확인
12
+ - 자동 devlog와 보존 규칙
13
+
14
+
15
+ ## Step 0 — 캡처 타입 결정
16
+
17
+ `/wiki capture` 실행 시 타입을 확인한다.
18
+
19
+ | 타입 | 트리거 | 저장 경로 |
20
+ |---|---|---|
21
+ | `meeting` | `/wiki capture meeting` | `raw/meetings/` |
22
+ | `decision` | `/wiki capture decision` | `raw/decisions/` |
23
+
24
+ 인자가 없으면 묻는다:
25
+
26
+ > "어떤 내용을 기록할까요?
27
+ > 1. meeting — 회의·논의 내용
28
+ > 2. decision — 아키텍처·기술 결정"
29
+
30
+ dev-log는 `/wiki devlog`를 사용한다.
31
+
32
+ ---
33
+
34
+ ## Step 1 — 정보 수집
35
+
36
+ ### meeting 타입
37
+
38
+ 다음을 한 번에 묻는다:
39
+
40
+ 1. 회의 제목이 뭐야?
41
+ 2. 참석자가 누구야?
42
+ 3. 주요 결정 사항이 뭐야?
43
+ 4. 다음 액션 아이템이 있어?
44
+
45
+ ### decision 타입
46
+
47
+ 다음을 한 번에 묻는다:
48
+
49
+ 1. 결정 제목이 뭐야? (예: "DB를 PostgreSQL로 선택")
50
+ 2. 선택지가 뭐였어? (A vs B vs C)
51
+ 3. 왜 이걸 선택했어?
52
+ 4. 이 결정의 트레이드오프는?
53
+ 5. 재검토 조건이 있어? (예: "사용자 1만 명 초과 시")
54
+
55
+ **decision은 ambiguity-check 적용**: `skills/wiki/references/ambiguity-check.md` 기준으로 이유와 트레이드오프가 구체적인지 확인. 모호하면 follow-up.
56
+
57
+ ---
58
+
59
+ ## Step 2 — 파일 생성
60
+
61
+ **파일명 규칙:**
62
+ - 제목에서 슬러그 생성: 공백 → `-`, 특수문자 제거, 최대 40자
63
+ - 날짜 자동: `YYYY-MM-DD`
64
+
65
+ | 타입 | 파일명 형식 |
66
+ |---|---|
67
+ | meeting | `raw/meetings/YYYY-MM-DD_meeting_슬러그.md` |
68
+ | decision | `raw/decisions/YYYY-MM-DD_decision_슬러그.md` |
69
+
70
+ **frontmatter 템플릿:**
71
+
72
+ ```yaml
73
+ ---
74
+ title: "[제목]"
75
+ raw_type: "[meeting|decision]"
76
+ date: YYYY-MM-DD
77
+ created: YYYY-MM-DD
78
+ ingest_status: "⏳ pending"
79
+ tags:
80
+ - "raw/[타입]"
81
+ ---
82
+ ```
83
+
84
+ 본문은 수집한 정보를 구조화해서 작성한다. 사용자 답변은 원문 그대로 유지.
85
+
86
+ ---
87
+
88
+ ## Step 3 — 확인 및 완료
89
+
90
+ 파일 생성 후:
91
+
92
+ 1. 생성된 경로와 내용 요약을 보여준다
93
+ 2. 바로 인제스트할지 묻는다:
94
+ - **Yes** → `/wiki ingest [파일경로]` 실행
95
+ - **No** → "저장 완료. `/wiki ingest` 로 나중에 처리하세요." 안내
96
+
97
+ ---
98
+
99
+ ## devlog 자동 생성 (git commit 연동)
100
+
101
+ `.hooks/devlog-auto.sh` 훅이 커밋 후 다음을 수행한다:
102
+
103
+ 1. 커밋 메시지·변경 파일 목록 수집
104
+ 2. `raw/dev-logs/YYYY-MM-DD_dev-log_auto.md` 자동 생성 (ingest_status: "⏳ pending")
105
+ 3. 당일 두 번째 이상 커밋이면 기존 dev-log 파일에 append
106
+
107
+ **일일 요약**: 하루가 끝날 때 `/wiki devlog`로 수동 보완한다.
108
+
109
+ ---
110
+
111
+ ## 규칙
112
+
113
+ | 항목 | 규칙 |
114
+ |---|---|
115
+ | raw/ 본문 | 사용자 답변 원문 유지. 과도한 편집 금지 |
116
+ | ingest_status | 항상 `"⏳ pending"` 으로 생성 |
117
+ | decision ambiguity | 이유·트레이드오프 모호하면 반드시 follow-up |
118
+ | 덮어쓰기 | 동일 파일명 존재 시 경고 후 확인 |
119
+ | 자동 devlog | 커밋마다 raw/ 파일 생성. 직접 편집하지 않음 |
@@ -0,0 +1,82 @@
1
+ # clear-path — CLEAR 경로 상세 절차
2
+
3
+ `ambiguity-check.md`에서 **CLEAR** 또는 **FENCE**로 분류된 항목의 처리 절차.
4
+
5
+ ---
6
+
7
+ ## Step 1 — 두 필터 (질문 생략 여부 결정)
8
+
9
+ 순서대로 적용한다. **두 필터가 모두 NO일 때만 실제 질문으로 제시한다.**
10
+
11
+ ```text
12
+ 필터 1. Step 0.5 스캔 결과로 답할 수 있나?
13
+ → YES: 질문 생략. "(감지: pytest) 이걸로 확정할게요." 제시 후 확인만
14
+
15
+ 필터 2. 합리적인 기본값(defensible default)으로 답할 수 있나?
16
+ → YES: 기본값 채택. "기본값으로 [X]로 설정했어. 다르면 말해줘." 기록 후 진행
17
+
18
+ → 둘 다 NO: 진짜 질문으로 제시 (WHY 한 줄 함께)
19
+ ```
20
+
21
+ **FENCE 예외:** 필터 결과와 관계없이 CLEAR 경로로 처리하되, 경계 확정을 위한 확인 질문을 정확히 1개만 제시한다. 질문을 생략하거나 2개 이상 제시하지 않는다.
22
+
23
+ ---
24
+
25
+ ## Step 2 — 평가 기준
26
+
27
+ 답변이 다음 조건을 **모두** 충족해야 통과다:
28
+
29
+ | 조건 | 판정 기준 |
30
+ |---|---|
31
+ | **구체성** | 두 개발자가 동일하게 해석할 수 있는가? |
32
+ | **실행 가능성** | 에이전트가 추가 질문 없이 따를 수 있는가? |
33
+ | **예시 가능성** | 올바른 예와 잘못된 예를 들 수 있는가? |
34
+ | **완결성** | 엣지케이스가 명확한가? |
35
+
36
+ ---
37
+
38
+ ## 모호한 답변 패턴 (즉시 follow-up)
39
+
40
+ - **과도한 유연성**: "상황에 따라", "적절히", "필요시", "가능하면"
41
+ - **재진술**: 질문을 그대로 돌려준 답변 ("네이밍은 읽기 쉽게")
42
+ - **미완성**: "아직 모르겠어", "나중에 정할게"
43
+ - **너무 짧음**: 단어 1~2개, 맥락 없는 답변
44
+ - **과도한 일반화**: "일반적인 방식으로", "표준적으로"
45
+
46
+ ---
47
+
48
+ ## Follow-up 방식
49
+
50
+ | 상황 | 전략 |
51
+ |---|---|
52
+ | 모호한 표현 | "'{표현}'이 구체적으로 어떤 의미야? 예시 하나만 들어줄 수 있어?" |
53
+ | 재진술 | "그 규칙을 따를 때 어떻게 보여야 해? 올바른 예 하나만 들어줘" |
54
+ | 미완성 | "지금 결정 안 해도 되는데, 가장 흔한 케이스 기준으로 일단 정해볼까?" |
55
+ | 너무 짧음 | "조금 더 풀어서 말해줄 수 있어? 이유도 같이 알고 싶어" |
56
+
57
+ 같은 질문 반복 금지. 답변 내용을 기반으로 구체화를 유도한다.
58
+
59
+ **루프 가드**: follow-up 2회 초과 후에도 모호하면 → `references/unclear-path.md`의 TBD 처리로 위임.
60
+
61
+ ---
62
+
63
+ ## 예시
64
+
65
+ **네이밍 컨벤션:**
66
+ - ❌ "읽기 쉽게 써줘" → "읽기 쉽다는 게 어떤 형식이야? snake_case? camelCase? 예시 하나만"
67
+ - ✅ "Python이니까 변수·함수는 snake_case, 클래스는 PascalCase, 상수는 UPPER_SNAKE_CASE"
68
+
69
+ **Git 컨벤션:**
70
+ - ❌ "커밋 잘 써줘" → "커밋 메시지 형식이 어때야 해? feat:/fix: 같은 접두사가 있어?"
71
+ - ✅ "feat:/fix:/chore: + 콜론 + 공백 + 한국어 설명. 예: feat: 로그인 기능 추가"
72
+
73
+ **TDD:**
74
+ - ❌ "테스트는 꼼꼼하게" → "꼼꼼하다는 게 커버리지 몇 %야? 단위·통합·E2E 중 어디까지?"
75
+ - ✅ "pytest, 커버리지 80% 이상, 단위+통합까지. E2E는 나중에"
76
+
77
+ ---
78
+
79
+ ## 판정 출력
80
+
81
+ - **통과 (or 필터 생략)**: 다음 서브 질문으로 진행. 별도 출력 없음.
82
+ - **실패**: follow-up 즉시 제시. 최대 2회. 초과 시 `unclear-path.md` TBD 처리.
@@ -0,0 +1,111 @@
1
+ # wiki devlog — 세션 기반 개발 기록
2
+
3
+ 현재 세션을 먼저 분석해 초안을 만들고 확인·보완만 받는다.
4
+
5
+ ## 목차
6
+
7
+ - 컨텍스트 자동 수집
8
+ - devlog 초안 작성
9
+ - 사용자 확인·보완
10
+ - raw 파일 생성과 ingest 연결
11
+
12
+
13
+ ## Step 0 — 컨텍스트 자동 수집
14
+
15
+ 다음을 병렬로 수집한다:
16
+
17
+ ```bash
18
+ git log --since="00:00" --oneline # 오늘 커밋
19
+ git diff HEAD~1 --stat 2>/dev/null # 변경 파일 목록
20
+ git status --short # 현재 상태
21
+ ```
22
+
23
+ 대화 컨텍스트(현재 세션에서 오간 내용)도 함께 참조한다.
24
+
25
+ ---
26
+
27
+ ## Step 1 — 에이전트가 초안 생성
28
+
29
+ 수집한 컨텍스트를 바탕으로 다음 5개 필드를 먼저 채운다:
30
+
31
+ | 필드 | 자동 추론 방법 |
32
+ |---|---|
33
+ | 제목 | 오늘 커밋 메시지 + 주요 변경 파일에서 추출 |
34
+ | 오늘 한 일 | 커밋 메시지 + 변경 파일 목록 기반 서술 |
35
+ | 막혔던 부분 | 대화에서 "왜", "에러", "안 돼", "해결" 키워드 감지 |
36
+ | 다음 할 일 | 대화의 미완 항목, TODO, 열린 질문 추출 |
37
+ | 배운 것 | 대화에서 새로운 발견·결정·인사이트 추출 |
38
+
39
+ 추론이 불가능한 필드는 빈 칸으로 두고 Step 2에서 확인한다.
40
+
41
+ ---
42
+
43
+ ## Step 2 — 확인·보완 (추천값 포함)
44
+
45
+ 초안을 보여주며 각 필드를 한 번에 확인한다. 형식:
46
+
47
+ ```
48
+ [devlog 초안]
49
+
50
+ 📌 제목: init.sh UX 개선 — 경로 입력 필수화
51
+ ✅ 오늘 한 일: Node CLI 수정, raw/ gitignore 추가, skills/wiki/SKILL.md 업데이트
52
+ ❓ 막혔던 부분: (감지 못했어. 있었어?)
53
+ ✅ 다음 할 일: devlog 스킬 추가, README 업데이트
54
+ ❓ 배운 것: (있으면 추가해줘)
55
+
56
+ 수정할 내용 있으면 말해줘. 없으면 그대로 저장할게.
57
+ ```
58
+
59
+ - `✅` — 자신 있게 추론된 항목
60
+ - `❓` — 확인 필요한 항목만 질문
61
+
62
+ 사용자가 "없어" / "그냥 저장해" 하면 빈 칸 그대로 저장한다. 억지로 채우지 않는다.
63
+
64
+ ---
65
+
66
+ ## Step 3 — 파일 생성
67
+
68
+ **저장 경로:** `raw/dev-logs/YYYY-MM-DD_dev-log_슬러그.md`
69
+
70
+ **슬러그 규칙:** 제목에서 추출, 공백 → `-`, 특수문자 제거, 최대 40자
71
+
72
+ **frontmatter 템플릿:**
73
+
74
+ ```yaml
75
+ ---
76
+ title: "[제목]"
77
+ raw_type: "dev-log"
78
+ date: YYYY-MM-DD
79
+ created: YYYY-MM-DD
80
+ ingest_status: "⏳ pending"
81
+ tags:
82
+ - "raw/dev-log"
83
+ ---
84
+ ```
85
+
86
+ 당일 파일이 이미 존재하면 덮어쓰지 않고 `_2`, `_3` suffix를 붙인다.
87
+
88
+ ---
89
+
90
+ ## Step 4 — 완료 안내
91
+
92
+ ```
93
+ 저장 완료: raw/dev-logs/2026-06-19_dev-log_init-sh-ux.md
94
+
95
+ 바로 wiki에 반영할까? (y/n)
96
+ ```
97
+
98
+ - **y** → `/wiki ingest [파일경로]` 실행
99
+ - **n** → "나중에 `/wiki ingest`로 처리하세요." 안내
100
+
101
+ ---
102
+
103
+ ## 규칙
104
+
105
+ | 항목 | 규칙 |
106
+ |---|---|
107
+ | 컨텍스트 우선 | 질문 전에 반드시 git log + 대화 먼저 읽기 |
108
+ | 추천값 제시 | 확인 질문엔 항상 에이전트 추론값을 함께 보여줌 |
109
+ | 빈 칸 허용 | 사용자가 건너뛰면 해당 필드 생략하고 저장 |
110
+ | 원문 유지 | 사용자 답변은 편집 없이 그대로 기록 |
111
+ | 덮어쓰기 금지 | 동일 날짜 파일 존재 시 suffix 붙이기 |
@@ -0,0 +1,118 @@
1
+ # wiki ingest — 원본을 wiki에 반영
2
+
3
+ `raw/` 에 새로운 소스가 추가됐을 때 실행한다.
4
+ 소스를 읽고 wiki/ 전체에 통합한다. 단일 소스가 10~15개 페이지에 영향을 줄 수 있다.
5
+
6
+ ## 목차
7
+
8
+ - 대상 raw 파일 결정
9
+ - 소스 요약
10
+ - wiki 페이지 생성·갱신
11
+ - index·log·상태 동기화
12
+ - Graphify 갱신
13
+
14
+
15
+ ## Step 0 — 대상 파일 결정
16
+
17
+ **인자가 있으면**: 해당 경로를 바로 사용한다.
18
+
19
+ **인자가 없으면**: `raw/` 하위 전체를 스캔하여 `ingest_status: "⏳ pending"` 인 파일을 수집한다.
20
+ - 1개 → 바로 진행
21
+ - 여러 개 → 목록 보여주고 선택 요청
22
+ - 0개 → "처리할 파일이 없습니다. raw/ 에 새 파일을 추가해주세요."
23
+
24
+ > raw/ 파일은 절대 수정하지 않는다. 읽기만 허용. (ingest_status 필드 제외)
25
+
26
+ ---
27
+
28
+ ## Step 1 — 소스 읽기 & 요약
29
+
30
+ 소스 파일을 읽고 다음 3개 섹션으로 요약한다:
31
+
32
+ **핵심 내용 (Key Points)**
33
+ - 번호 목록으로 5~8개
34
+
35
+ **관련 컨벤션**
36
+ - 이 소스가 `wiki/conventions/` 중 어떤 페이지와 연관되는지
37
+
38
+ **영향받는 wiki 페이지 예상 목록**
39
+ - 업데이트가 필요한 기존 페이지들
40
+
41
+ ---
42
+
43
+ ## Step 2 — wiki/ 반영
44
+
45
+ ### 2-1. 소스 요약 페이지 생성
46
+
47
+ `wiki/sources/[슬러그].md` 생성:
48
+
49
+ ```yaml
50
+ ---
51
+ title: "[소스 제목]"
52
+ type: source
53
+ tags: [관련태그]
54
+ source_path: "raw/[경로]"
55
+ created: YYYY-MM-DD
56
+ updated: YYYY-MM-DD
57
+ ---
58
+ ```
59
+
60
+ 섹션: Key Points / 관련 컨벤션 / 영향 범위
61
+
62
+ ### 2-2. 관련 wiki 페이지 업데이트
63
+
64
+ 다음 우선순위로 관련 페이지를 업데이트한다:
65
+
66
+ 1. **wiki/conventions/**: 이 소스가 기존 컨벤션을 확인·수정·보완하는가?
67
+ 2. **wiki/decisions/**: 이 소스가 새로운 아키텍처 결정을 담고 있는가?
68
+ 3. **wiki/devlog/**: 개발 진행 기록이면 devlog에 반영
69
+ 4. **wiki/index.md**: 새 페이지가 생성됐으면 반드시 업데이트
70
+
71
+ 모순 발견 시: `> ⚠️ 모순` 블록으로 양쪽 출처 모두 표시.
72
+
73
+ ### 2-3. log.md 기록
74
+
75
+ `wiki/log.md` 맨 위에 append:
76
+
77
+ ```text
78
+ ## [YYYY-MM-DD] ingest | [소스 제목]
79
+
80
+ - **소스:** `raw/[경로]`
81
+ - **생성된 페이지:** 목록
82
+ - **업데이트된 페이지:** 목록
83
+ - **컨벤션 변경:** 있으면 명시, 없으면 "없음"
84
+ ```
85
+
86
+ ### 2-4. raw/ 상태 업데이트
87
+
88
+ ```yaml
89
+ ingest_status: "✅ done"
90
+ ```
91
+
92
+ ---
93
+
94
+ ## Step 3 — Graphify 그래프 갱신
95
+
96
+ wiki/ 반영이 끝나면 Graphify 설치 여부를 확인한다.
97
+
98
+ ```bash
99
+ command -v graphify
100
+ ```
101
+
102
+ - **설치되어 있으면**: `graphify update wiki/` 를 실행해 그래프를 최신 wiki/ 상태로 동기화한다
103
+ - **설치 안 되어 있으면**: 조용히 건너뛰지 않는다. 안내한다 — "Graphify가 설치되어 있지 않아요. wiki/ 쿼리 토큰을 최대 71.5배 절감할 수 있는 도구인데, 설치할까요? (`pip install graphifyy && graphify install`)"
104
+ - 설치를 원하면: 안내한 명령어로 설치 후 `graphify update wiki/` 실행
105
+ - 원치 않으면: 그래프 갱신 없이 ingest를 종료 (wiki/ 반영 자체는 이미 완료된 상태)
106
+
107
+ ---
108
+
109
+ ## 규칙
110
+
111
+ | 항목 | 규칙 |
112
+ |---|---|
113
+ | raw/ 본문 | 절대 수정 금지 |
114
+ | raw/ frontmatter | `ingest_status` 필드만 수정 허용 |
115
+ | 모순 처리 | 덮어쓰지 말고 양쪽 인용 + ⚠️ 블록 |
116
+ | 기존 페이지 우선 | 신규 생성보다 기존 업데이트를 먼저 검토 |
117
+ | index.md | 새 페이지 생성 시 반드시 갱신 |
118
+ | graphify 갱신 | 미설치 시 건너뛰지 않고 설치 여부 확인 |
@@ -0,0 +1,83 @@
1
+ # wiki lint — wiki 품질 점검
2
+
3
+ wiki/ 전체를 스캔해서 구조적 문제를 탐지한다.
4
+ lint는 읽기 전용 — 자동 수정하지 않는다. 결과를 보고하고 사용자가 결정한다.
5
+
6
+
7
+ ## Step 1 — 전체 스캔
8
+
9
+ `wiki/` 하위 전체 파일을 스캔한다.
10
+
11
+ 스캔 항목:
12
+
13
+ | 항목 | 설명 |
14
+ |---|---|
15
+ | **고아 페이지** | inbound wikilink가 0개인 페이지 |
16
+ | **깨진 wikilink** | `[[페이지명]]` 이 존재하지 않는 파일을 가리키는 경우 |
17
+ | **누락 백링크** | A가 B를 언급하지만 B가 A를 가리키지 않는 경우 |
18
+ | **모순 블록** | `> ⚠️ 모순` 이 있는 페이지 (미해결 상태) |
19
+ | **stale 페이지** | `updated` 날짜가 90일 이상 지났고 소스도 없는 페이지 |
20
+ | **frontmatter 누락** | `title`, `type`, `created`, `updated` 중 하나라도 없는 경우 |
21
+ | **index.md 미등록** | wiki/ 에 페이지가 있지만 index.md에 없는 경우 |
22
+
23
+ ---
24
+
25
+ ## Step 2 — 결과 리포트
26
+
27
+ 다음 형식으로 결과를 보여준다:
28
+
29
+ ```text
30
+ ## /wiki lint 결과 — YYYY-MM-DD
31
+
32
+ ### 🔴 즉시 수정 필요
33
+ 1. [깨진 wikilink] wiki/concepts/Foo.md → [[Bar]] 없음
34
+ 2. [frontmatter 누락] wiki/projects/Baz.md — updated 필드 없음
35
+
36
+ ### 🟡 검토 권장
37
+ 3. [고아 페이지] wiki/concepts/Qux.md — 아무도 링크하지 않음
38
+ 4. [미해결 모순] wiki/synthesis/Alpha.md — ⚠️ 모순 블록 존재
39
+
40
+ ### 🟢 참고
41
+ 5. [stale] wiki/concepts/Beta.md — 120일 미업데이트
42
+ 6. [누락 백링크] wiki/projects/Gamma.md → [[Delta]] 언급하지만 역링크 없음
43
+
44
+ 전체: 🔴 2개 / 🟡 2개 / 🟢 2개
45
+ ```
46
+
47
+ ---
48
+
49
+ ## Step 3 — 사용자 결정 대기
50
+
51
+ 리포트 후 다음을 묻는다:
52
+
53
+ > "어떤 항목을 수정할까요? 번호를 입력하거나(예: 1 3 5), all이면 전체, skip이면 log만 기록합니다."
54
+
55
+ - 선택한 항목은 **사용자와 함께 수정** (AI가 수정안 제안 → 확인 후 적용)
56
+ - 자동 일괄 수정은 금지
57
+
58
+ ---
59
+
60
+ ## Step 4 — log.md 기록
61
+
62
+ `wiki/log.md` 맨 위에 append:
63
+
64
+ ```text
65
+ ## [YYYY-MM-DD] wiki-lint
66
+
67
+ - **🔴 즉시 수정:** n개
68
+ - **🟡 검토 권장:** n개
69
+ - **🟢 참고:** n개
70
+ - **처리 내역:** 수정한 항목 목록 또는 "skip"
71
+ ```
72
+
73
+ ---
74
+
75
+ ## 규칙
76
+
77
+ | 항목 | 규칙 |
78
+ |---|---|
79
+ | 자동 수정 | 금지. 리포트만 한다 |
80
+ | raw/ | 절대 스캔하지 않음 |
81
+ | 수정 범위 | 사용자가 명시적으로 선택한 항목만 |
82
+ | log.md | 수정 여부와 관계없이 항상 기록 |
83
+ | 실행 주기 | 수동 실행. 자동 스케줄 없음 |
@@ -0,0 +1,81 @@
1
+ # wiki query — 프로젝트 지식 질의응답
2
+
3
+ wiki/ 를 기반으로 질문에 답한다.
4
+ 좋은 답변은 wiki/synthesis/ 에 저장해 지식이 복리로 쌓이게 한다.
5
+
6
+
7
+ ## Step 0.5 — 그래프 우선 탐색
8
+
9
+ `graphify-out/graph.json` 존재 여부를 확인한다.
10
+
11
+ - **있으면**: 그래프에서 질문과 연관된 노드를 먼저 탐색해 관련 문서 범위를 좁힌다. 이 결과를 Step 1의 index.md 전체 스캔보다 우선한다
12
+ - **없으면**: `command -v graphify`로 설치 여부를 확인한다
13
+ - **설치는 됐지만 graph.json이 없는 경우(아직 update 안 함)**: `graphify update wiki/` 실행을 제안한다. 사용자가 거절하면 Step 1로 진행
14
+ - **설치 자체가 안 되어 있는 경우**: 조용히 건너뛰지 않는다. 안내한다 — "Graphify를 쓰면 쿼리 토큰을 최대 71.5배 절감할 수 있어요. 설치할까요? (`pip install graphifyy && graphify install`)" 원치 않으면 Step 1(index.md 우선)로 진행
15
+
16
+ ---
17
+
18
+ ## Step 1 — index.md 먼저 읽기
19
+
20
+ Step 0.5에서 충분히 좁혀지지 않았거나 Graphify를 안 쓰는 경우 여기서 진행한다.
21
+
22
+ `wiki/index.md` 를 읽어 질문과 관련된 페이지를 파악한다.
23
+
24
+ 우선순위:
25
+ 1. `wiki/conventions/` — 컨벤션 관련 질문
26
+ 2. `wiki/decisions/` — 아키텍처 결정 관련 질문
27
+ 3. `wiki/devlog/` — 개발 진행 관련 질문
28
+ 4. `wiki/dashboard.md` — 할 일·우선순위 관련 질문
29
+ 5. `wiki/meetings/` — 회의 결정 관련 질문
30
+
31
+ ---
32
+
33
+ ## Step 2 — 관련 페이지 읽기 & 답변 합성
34
+
35
+ 파악한 페이지들을 읽고 답변을 합성한다.
36
+
37
+ **답변 형식:**
38
+ - 출처는 반드시 `[[페이지명]]` wikilink로 인용
39
+ - 사실과 해석을 구분한다
40
+ - 모순이 있으면 `> ⚠️ 모순` 블록으로 양쪽 제시
41
+
42
+ **답변 유형별 형식:**
43
+ - 컨벤션 질문 → 규칙·이유·예시 포함
44
+ - 진행 상황 질문 → 타임라인 형식
45
+ - 의사결정 질문 → 결정 배경과 근거 포함
46
+
47
+ ---
48
+
49
+ ## Step 3 — raw/ 보충 (필요 시)
50
+
51
+ wiki/ 에 정보가 부족한 경우에만 `raw/` 를 추가로 읽는다.
52
+ raw/ 에서 가져온 정보는 "(raw/ 직접 참조)" 표시를 붙인다.
53
+
54
+ ---
55
+
56
+ ## Step 4 — 좋은 답변은 wiki에 저장
57
+
58
+ 다음 조건이면 `wiki/synthesis/[슬러그].md` 로 저장한다:
59
+ - 여러 소스를 종합했거나
60
+ - 새로운 연결 고리를 발견했거나
61
+ - 이 질문이 다시 올 가능성이 있으면
62
+
63
+ 저장 시 log.md에 기록:
64
+ ```text
65
+ ## [YYYY-MM-DD] query | [질문 요약]
66
+
67
+ - **참조 페이지:** 목록
68
+ - **Synthesis 저장:** [[페이지명]] 또는 "없음"
69
+ ```
70
+
71
+ ---
72
+
73
+ ## 규칙
74
+
75
+ | 항목 | 규칙 |
76
+ |---|---|
77
+ | 읽기 순서 | graph.json(있으면) → index.md → wiki/ → raw/ (raw/는 최후 수단) |
78
+ | 그래프 미설치 | 건너뛰지 않고 설치 여부 확인 후 index.md 폴백 |
79
+ | 인용 형식 | `[[페이지명]]` wikilink 필수 |
80
+ | raw/ | 절대 수정 금지 |
81
+ | 답변 없을 때 | "현재 wiki에 충분한 정보가 없습니다. /wiki ingest 로 관련 소스를 추가해보세요." |