@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,79 @@
1
+ #!/bin/bash
2
+ # wiki/conventions/ 규칙 기반 pre-commit 검사
3
+ # Node CLI 설치 시 .git/hooks/pre-commit 으로 복사됨
4
+
5
+ WIKI_CONVENTIONS="wiki/conventions"
6
+ FAILED=0
7
+
8
+ if [ ! -d "$WIKI_CONVENTIONS" ]; then
9
+ echo "⚠️ wiki/conventions/ 없음. /wiki를 실행해 초기 설정을 진행하세요."
10
+ exit 0
11
+ fi
12
+
13
+ STAGED_FILES=()
14
+ while IFS= read -r -d '' file; do
15
+ [ -f "$file" ] && STAGED_FILES+=("$file")
16
+ done < <(git diff --cached --name-only --diff-filter=ACM -z)
17
+
18
+ if [ ${#STAGED_FILES[@]} -eq 0 ]; then
19
+ exit 0
20
+ fi
21
+
22
+ echo "🔍 convention-check 실행 중..."
23
+
24
+ # staged blob을 검사한다. working tree가 staged 내용과 달라도 커밋 대상만 판정한다.
25
+ SECRET_PATTERN="(password|secret|api[_-]?key|token)[[:space:]]*[:=][[:space:]]*['\"][^'\"]{4,}"
26
+ for file in "${STAGED_FILES[@]}"; do
27
+ if ! git show ":$file" 2>/dev/null | grep -Iq .; then
28
+ continue
29
+ fi
30
+ matches=$(git show ":$file" 2>/dev/null | grep -nEI "$SECRET_PATTERN" || true)
31
+ if [ -n "$matches" ]; then
32
+ echo ""
33
+ printf '🔴 [security] 하드코딩된 시크릿 의심: %s\n' "$file"
34
+ printf '%s\n' "$matches" | sed 's/^/ /'
35
+ FAILED=1
36
+ fi
37
+ done
38
+
39
+ PY_FILES=()
40
+ JS_FILES=()
41
+ for file in "${STAGED_FILES[@]}"; do
42
+ case "$file" in
43
+ *.py) PY_FILES+=("$file") ;;
44
+ *.js|*.jsx|*.ts|*.tsx) JS_FILES+=("$file") ;;
45
+ esac
46
+ done
47
+
48
+ if [ ${#PY_FILES[@]} -gt 0 ] && command -v pylint >/dev/null 2>&1; then
49
+ if ! pylint --errors-only --score=no -- "${PY_FILES[@]}"; then
50
+ echo "🔴 [pylint] 에러 발견"
51
+ FAILED=1
52
+ fi
53
+ fi
54
+
55
+ ESLINT=""
56
+ if [ -x "node_modules/.bin/eslint" ]; then
57
+ ESLINT="node_modules/.bin/eslint"
58
+ elif command -v eslint >/dev/null 2>&1; then
59
+ ESLINT=$(command -v eslint)
60
+ fi
61
+
62
+ if [ ${#JS_FILES[@]} -gt 0 ] && [ -n "$ESLINT" ]; then
63
+ if compgen -G ".eslintrc*" >/dev/null 2>&1 || compgen -G "eslint.config.*" >/dev/null 2>&1; then
64
+ if ! "$ESLINT" --quiet -- "${JS_FILES[@]}"; then
65
+ echo "🔴 [eslint] 에러 발견"
66
+ FAILED=1
67
+ fi
68
+ fi
69
+ fi
70
+
71
+ echo ""
72
+ if [ "$FAILED" -eq 1 ]; then
73
+ echo "❌ convention-check 실패. 위반 사항을 수정 후 다시 커밋하세요."
74
+ echo " 상세 검사: /review"
75
+ exit 1
76
+ fi
77
+
78
+ echo "✅ convention-check 통과"
79
+ exit 0
@@ -0,0 +1,55 @@
1
+ #!/bin/bash
2
+ # 커밋 후 raw/dev-logs/ 에 자동으로 dev-log 항목 생성
3
+ # Node CLI 설치 시 .git/hooks/post-commit 으로 복사됨
4
+
5
+ DATE=$(date +%Y-%m-%d)
6
+ TIME=$(date +%H:%M)
7
+ COMMIT_MSG=$(git log -1 --pretty=%B)
8
+ COMMIT_HASH=$(git log -1 --pretty=%h)
9
+
10
+ CHANGED_FILES=()
11
+ while IFS= read -r -d '' file; do
12
+ CHANGED_FILES+=("$file")
13
+ [ ${#CHANGED_FILES[@]} -ge 20 ] && break
14
+ done < <(git diff-tree --root --no-commit-id -r --name-only -z HEAD 2>/dev/null)
15
+
16
+ DEV_LOG_DIR="raw/dev-logs"
17
+ DEV_LOG_FILE="$DEV_LOG_DIR/${DATE}_dev-log_auto.md"
18
+ mkdir -p "$DEV_LOG_DIR"
19
+
20
+ if [ ! -f "$DEV_LOG_FILE" ]; then
21
+ cat > "$DEV_LOG_FILE" << FRONTMATTER
22
+ ---
23
+ title: "${DATE} 개발 일지 (자동 생성)"
24
+ raw_type: "dev-log"
25
+ date: ${DATE}
26
+ created: ${DATE}
27
+ description: "${DATE} 커밋 기록 자동 수집"
28
+ ingest_status: "⏳ pending"
29
+ tags:
30
+ - "raw/dev-log"
31
+ - "auto-generated"
32
+ ---
33
+
34
+ # ${DATE} 개발 일지
35
+ FRONTMATTER
36
+ printf '📝 dev-log 생성: %s\n' "$DEV_LOG_FILE"
37
+ else
38
+ printf '📝 dev-log 갱신: %s\n' "$DEV_LOG_FILE"
39
+ fi
40
+
41
+ {
42
+ printf '\n### 커밋 `%s` — %s\n\n' "$COMMIT_HASH" "$TIME"
43
+ printf '**메시지:**\n\n'
44
+ printf '%s\n' "$COMMIT_MSG" | sed 's/^/ /'
45
+ printf '\n**변경 파일:**\n\n'
46
+ if [ ${#CHANGED_FILES[@]} -eq 0 ]; then
47
+ printf '%s\n' '- (없음)'
48
+ else
49
+ for file in "${CHANGED_FILES[@]}"; do
50
+ safe_file=${file//$'\n'/\\n}
51
+ safe_file=${safe_file//$'\r'/\\r}
52
+ printf -- '- %s\n' "$safe_file"
53
+ done
54
+ fi
55
+ } >> "$DEV_LOG_FILE"
@@ -0,0 +1,6 @@
1
+ {
2
+ "cssTheme": "",
3
+ "enabledCssSnippets": [
4
+ "folder-colors"
5
+ ]
6
+ }
@@ -0,0 +1,20 @@
1
+ {
2
+ "file-explorer": true,
3
+ "global-search": true,
4
+ "graph": true,
5
+ "backlink": true,
6
+ "outgoing-link": true,
7
+ "page-preview": true,
8
+ "properties": true,
9
+ "switcher": true,
10
+ "command-palette": true,
11
+ "tag-pane": false,
12
+ "templates": false,
13
+ "daily-notes": false,
14
+ "word-count": false,
15
+ "outline": false,
16
+ "note-composer": false,
17
+ "slides": false,
18
+ "audio-recorder": false,
19
+ "file-recovery": true
20
+ }
@@ -0,0 +1,22 @@
1
+ {
2
+ "collapse-filter": true,
3
+ "search": "",
4
+ "showTags": false,
5
+ "showAttachments": true,
6
+ "hideUnresolved": false,
7
+ "showOrphans": true,
8
+ "collapse-color-groups": true,
9
+ "colorGroups": [],
10
+ "collapse-display": true,
11
+ "showArrow": false,
12
+ "textFadeMultiplier": 0,
13
+ "nodeSizeMultiplier": 2,
14
+ "lineSizeMultiplier": 1,
15
+ "collapse-forces": true,
16
+ "centerStrength": 0.518713248970312,
17
+ "repelStrength": 10,
18
+ "linkStrength": 1,
19
+ "linkDistance": 100,
20
+ "scale": 1,
21
+ "close": false
22
+ }
@@ -0,0 +1,55 @@
1
+ /* project-scaffold — wiki/ 폴더 색상 그룹 */
2
+
3
+ /* conventions/ — 파랑 (원칙·규범) */
4
+ .nav-folder-title[data-path="conventions"] .nav-folder-title-content {
5
+ color: #4fc3f7;
6
+ font-weight: 600;
7
+ }
8
+ .nav-folder-title[data-path="conventions"] + .nav-folder-children .nav-file-title-content {
9
+ color: #b3e5fc;
10
+ }
11
+
12
+ /* decisions/ — 주황 (중요 판단) */
13
+ .nav-folder-title[data-path="decisions"] .nav-folder-title-content {
14
+ color: #ffb74d;
15
+ font-weight: 600;
16
+ }
17
+ .nav-folder-title[data-path="decisions"] + .nav-folder-children .nav-file-title-content {
18
+ color: #ffe0b2;
19
+ }
20
+
21
+ /* devlog/ — 초록 (진행·성장) */
22
+ .nav-folder-title[data-path="devlog"] .nav-folder-title-content {
23
+ color: #81c784;
24
+ font-weight: 600;
25
+ }
26
+ .nav-folder-title[data-path="devlog"] + .nav-folder-children .nav-file-title-content {
27
+ color: #c8e6c9;
28
+ }
29
+
30
+ /* meetings/ — 보라 (사람·소통) */
31
+ .nav-folder-title[data-path="meetings"] .nav-folder-title-content {
32
+ color: #ce93d8;
33
+ font-weight: 600;
34
+ }
35
+ .nav-folder-title[data-path="meetings"] + .nav-folder-children .nav-file-title-content {
36
+ color: #e1bee7;
37
+ }
38
+
39
+ /* sources/ — 회색 (원본 자료) */
40
+ .nav-folder-title[data-path="sources"] .nav-folder-title-content {
41
+ color: #90a4ae;
42
+ font-weight: 600;
43
+ }
44
+ .nav-folder-title[data-path="sources"] + .nav-folder-children .nav-file-title-content {
45
+ color: #cfd8dc;
46
+ }
47
+
48
+ /* synthesis/ — 핑크 (통찰·결론) */
49
+ .nav-folder-title[data-path="synthesis"] .nav-folder-title-content {
50
+ color: #f48fb1;
51
+ font-weight: 600;
52
+ }
53
+ .nav-folder-title[data-path="synthesis"] + .nav-folder-children .nav-file-title-content {
54
+ color: #fce4ec;
55
+ }
package/AGENT.md ADDED
@@ -0,0 +1,55 @@
1
+ # AGENT.md
2
+
3
+ > ⚠️ 설정 전 상태입니다. `/wiki`를 실행하면 현재 상태를 보고 초기 설정을 추천합니다.
4
+ > 완료 후 이 파일은 프로젝트 맞춤 내용으로 갱신됩니다.
5
+
6
+ ## Intent Router
7
+
8
+ 사용자가 스킬명이나 하위 모드를 기억할 필요는 없다. 자연어 요청 의도에 맞는 스킬을 선택한다. `/wiki` 또는 `/brief`만 단독 호출되면 현재 맥락을 확인하고 가장 적절한 행동을 첫 번째 선택지로 추천한다.
9
+
10
+ | 상황 | 사용할 스킬 |
11
+ |---|---|
12
+ | 프로젝트 최초 설정·컨벤션 재정의 | `/wiki` 내부 setup 라우트 |
13
+ | 과거 결정·프로젝트 성격·컨벤션 질문 | `/wiki` 내부 query 라우트 |
14
+ | 회의·결정 원문 보존 | `/wiki` 내부 capture 라우트 |
15
+ | 현재 작업을 개발 기록으로 남김 | `/wiki` 내부 devlog 라우트 |
16
+ | pending raw 소스를 wiki에 반영 | `/wiki` 내부 ingest 라우트 |
17
+ | wiki 링크·모순·stale 상태 점검 | `/wiki` 내부 lint 라우트 |
18
+ | 현재 상태·최근 변화·다음 우선순위 설명 | `/brief` |
19
+ | dashboard·report·세션 인계 | `/brief`가 맥락에 따라 내부 라우팅 |
20
+ | PR·push 전 변경사항과 컨벤션 검토 | `/review` |
21
+
22
+ ## 스킬 위치
23
+
24
+ - `/wiki` → `skills/wiki/SKILL.md`
25
+ - `/brief` → `skills/brief/SKILL.md`
26
+ - `/review` → `skills/review/SKILL.md`
27
+
28
+ 관련 요청을 처리하기 전에 해당 `SKILL.md`를 읽고 필요한 참조 파일만 추가로 읽는다.
29
+
30
+ ## 항상 적용할 규칙
31
+
32
+ - 프로젝트 질문에는 관련 wiki와 코드 근거를 먼저 확인한다.
33
+ - `raw/` 원문은 상태 필드 외에는 수정하지 않는다.
34
+ - 완료된 구현과 미래 계획을 구분하고, 미구현 항목에 임의 진행률을 부여하지 않는다.
35
+ - 중요한 결정과 모순에는 출처를 남긴다.
36
+ - PR 또는 push 의도가 보이면 `/review`를 제안하되 같은 작업에서 반복 제안하지 않는다.
37
+
38
+ ---
39
+
40
+ ## 비서 페르소나
41
+
42
+ @SOUL.md
43
+
44
+ ---
45
+
46
+ ## 에이전트 무관 설계
47
+
48
+ 이 하네스는 특정 AI 에이전트에 종속되지 않는다.
49
+ AGENT.md 하나가 모든 에이전트의 단일 진실 소스(source of truth)다.
50
+ 다른 에이전트로 전환 시: 해당 에이전트의 컨텍스트 파일에서 `@AGENT.md` 를 임포트하면 된다.
51
+
52
+ 예시:
53
+ - Claude Code: `CLAUDE.md` → `@AGENT.md`
54
+ - Cursor: `.cursorrules` → `@AGENT.md`
55
+ - Continue: `.continuerc.json` → `@AGENT.md`
package/README.kr.md ADDED
@@ -0,0 +1,247 @@
1
+ <p align="center">
2
+ <img src="https://raw.githubusercontent.com/taejung3852/project-scaffold/master/assets/logo.png" width="200" alt="project-scaffold logo" />
3
+ </p>
4
+
5
+ # project-scaffold
6
+
7
+ > AI에게 프로젝트 기억을 제공하고, 사람에게 프로젝트 통제권을 돌려주는 LLM Wiki 기반 개발 컨텍스트 레이어
8
+
9
+ [![Node.js](https://img.shields.io/badge/CLI-Node.js_20+-339933?logo=nodedotjs&logoColor=white)](https://nodejs.org/)
10
+ [![Markdown](https://img.shields.io/badge/Knowledge-LLM_Wiki-000000?logo=markdown)](https://gist.github.com/karpathy/442a6bf555914893e9891c11519de94f)
11
+ [![Skills](https://img.shields.io/badge/Core_Skills-3-1D3461)](./skills)
12
+
13
+ <p align="center"><a href="README.md">English</a> | 한국어</p>
14
+
15
+ ---
16
+
17
+ ## 무엇을 해결하나
18
+
19
+ AI 코딩 에이전트는 빠르지만 세션이 바뀌면 프로젝트 성격, 과거 결정, 사용자 성향과 작업 흐름을 잊기 쉽다. 반대로 모든 정보를 긴 프롬프트로 다시 설명하면 사람도 따라가기 어렵고 토큰도 낭비된다.
20
+
21
+ project-scaffold는 두 레이어로 이 문제를 해결한다.
22
+
23
+ - **Agent Memory Layer** — `raw/`와 `wiki/`에 프로젝트 컨텍스트를 축적한다.
24
+ - **Human Control Plane** — 현재 목표, 최근 변화, 결정할 항목과 다음 행동을 짧게 브리핑한다.
25
+
26
+ 사용자는 12개 명령을 외우지 않는다. 에이전트는 요청 의도를 보고 `/wiki`, `/brief`, `/review` 중 하나를 선택한다.
27
+
28
+ ## 빠른 시작
29
+
30
+ Node.js 20 이상과 Git 저장소가 필요하다.
31
+
32
+ ### 새 프로젝트
33
+
34
+ ```bash
35
+ mkdir my-project && cd my-project
36
+ git init
37
+ npx @taejung3852/project-scaffold@latest init --agent claude-code,codex
38
+ ```
39
+
40
+ AI 에이전트에서 다음을 입력한다.
41
+
42
+ ```text
43
+ /wiki
44
+ ```
45
+
46
+ 컨벤션이 없는 상태를 감지해 “프로젝트 초기 설정”을 첫 번째로 추천한다.
47
+
48
+ ### 기존 프로젝트
49
+
50
+ ```bash
51
+ cd /path/to/existing-project
52
+ npx @taejung3852/project-scaffold@latest add --agent claude-code,cursor
53
+ ```
54
+
55
+ 기존 파일은 기본적으로 보존한다. scaffold 관리 파일까지 갱신하려면 명시적으로 `--force`를 사용한다.
56
+
57
+ 기존 12스킬 버전에서 마이그레이션할 때는 아래 명령이 이전 스킬과 자가 진화 파일을 제거한다. 수정한 기존 스킬도 삭제되므로 먼저 diff를 확인한다.
58
+
59
+ ```bash
60
+ npx @taejung3852/project-scaffold@latest add --agent claude-code,codex --force
61
+ ```
62
+
63
+ ### 에이전트 추가와 상태 검사
64
+
65
+ ```bash
66
+ npx @taejung3852/project-scaffold@latest add-agent --agent codex,cursor
67
+ npx @taejung3852/project-scaffold@latest doctor
68
+ ```
69
+
70
+ 설치 상태는 `.project-scaffold/manifest.json`에 기록한다.
71
+
72
+ ## 핵심 스킬 3개
73
+
74
+ ### `/wiki` — 프로젝트 지식 수명주기
75
+
76
+ `/wiki`만 입력하면 현재 프로젝트 상태를 읽고 할 일을 추천한다. 사용자는 아래 내부 기능 이름을 외울 필요가 없다.
77
+
78
+ | 모드 | 역할 |
79
+ |---|---|
80
+ | `setup` | 코드베이스를 읽고 14개 카테고리 컨벤션 인터뷰 진행 |
81
+ | `capture` | 회의·결정 원문을 `raw/`에 보존 |
82
+ | `devlog` | git과 대화 컨텍스트로 개발 기록 초안 생성 |
83
+ | `ingest` | pending raw 소스를 구조화된 wiki로 반영 |
84
+ | `query` | 프로젝트 성격, 과거 결정과 기록을 근거로 답변 |
85
+ | `lint` | 깨진 링크, 고아 페이지, 모순과 stale 정보 점검 |
86
+
87
+ ```text
88
+ /wiki
89
+ 이 구조를 왜 선택했지?
90
+ 이 결정을 기록해줘
91
+ ```
92
+
93
+ ### `/brief` — 사람 중심 브리핑
94
+
95
+ `/brief`만 입력하면 최근 git 상태와 devlog를 보고 가장 적절한 브리핑을 첫 번째 선택지로 보여준다.
96
+
97
+ 기본 브리핑은 다음 순서로 구성한다.
98
+
99
+ 1. 지금 무엇을 하는가
100
+ 2. 왜 하는가
101
+ 3. 마지막 확인 이후 무엇이 달라졌는가
102
+ 4. 내가 결정해야 할 것은 무엇인가
103
+ 5. 다음 한 단계는 무엇인가
104
+ 6. 근거 문서는 어디인가
105
+
106
+ | 모드 | 역할 |
107
+ |---|---|
108
+ | 기본 | 30초 브리핑. 요청 시 5분·상세 보기로 확장 |
109
+ | `dashboard` | TODO, 마일스톤, 최근 devlog와 주의 항목 갱신 |
110
+ | `report` | 회의록, 인터뷰, ADR, 스프린트 리포트 생성 |
111
+ | `handoff` | 다음 세션이나 다른 에이전트를 위한 인계 저장·복원 |
112
+
113
+ ```text
114
+ /brief
115
+ 최근 변화까지 자세히 알려줘
116
+ 다음 세션용 인계를 남겨줘
117
+ ```
118
+
119
+ ### `/review` — 컨벤션 기반 변경사항 검토
120
+
121
+ `wiki/conventions/`를 기준으로 정적 분석과 LLM 검토를 결합한다.
122
+
123
+ - 네이밍과 아키텍처 의존성
124
+ - 테스트 누락
125
+ - 에러 처리
126
+ - 보안과 하드코딩된 시크릿
127
+ - 프로젝트 고유 리뷰 규칙
128
+
129
+ 자동 수정하지 않고 위반 근거와 수정 제안을 보여준다.
130
+
131
+ ## 사용자는 스킬명을 외울 필요가 없다
132
+
133
+ `AGENT.md`가 intent router 역할을 한다.
134
+
135
+ | 사용자 요청 | 에이전트 행동 |
136
+ |---|---|
137
+ | “지금 어디까지 했어?” | `/brief` |
138
+ | “왜 이 DB를 선택했지?” | `/wiki`가 프로젝트 질의로 판단 |
139
+ | “이 결정 기록해줘” | `/wiki`가 결정 기록으로 판단 |
140
+ | “오늘 작업 정리해줘” | `/wiki`가 devlog로 판단 |
141
+ | “PR 올리기 전에 봐줘” | `/review` |
142
+
143
+ 각 에이전트 설정 파일은 `AGENT.md`를 공통 진실 소스로 사용한다.
144
+
145
+ ## LLM Wiki 구조
146
+
147
+ ```text
148
+ raw/ 사람이 남긴 불변 원본
149
+ └─ /wiki가 맥락에 따라 반영
150
+ wiki/ 에이전트가 정리한 프로젝트 지식
151
+ ├─ conventions/ 프로젝트 규칙
152
+ ├─ decisions/ 기술·제품 결정
153
+ ├─ devlog/ 정제된 개발 흐름
154
+ ├─ sources/ raw 소스 요약
155
+ ├─ synthesis/ 여러 문서를 연결한 답변
156
+ ├─ index.md 탐색 진입점
157
+ ├─ dashboard.md 현재 상태
158
+ └─ log.md wiki 작업 이력
159
+ AGENT.md 상황별 행동과 프로젝트 불변 규칙
160
+ SOUL.md 사용자 선호와 비서 페르소나
161
+ ```
162
+
163
+ `raw/` 본문은 수정하지 않는다. wiki에서 모순이 발견되면 한쪽을 지우지 않고 양쪽 출처를 함께 보존한다.
164
+
165
+ ## 지원 에이전트
166
+
167
+ 공식 [`skills@1.5.16`](https://github.com/vercel-labs/skills) 레지스트리의 73개 에이전트 ID와 프로젝트 경로를 지원한다.
168
+
169
+ | 경로 유형 | 예시 |
170
+ |---|---|
171
+ | `.agents/skills/` 공통 경로 | Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode, Amp, Warp, Zed 등 |
172
+ | `.claude/skills/` | Claude Code |
173
+ | `.continue/skills/` | Continue |
174
+ | `.hermes/skills/` | Hermes Agent |
175
+ | `.windsurf/skills/` | Windsurf |
176
+ | 기타 고유 경로 | Goose, Kiro CLI, Roo Code, Qwen Code, AiderDesk 등 |
177
+
178
+ ```bash
179
+ npx @taejung3852/project-scaffold@latest agents
180
+ ```
181
+
182
+ 전체 목록과 실제 설치 경로는 위 명령으로 확인한다. `--agent all`과 `--agent '*'`도 지원한다.
183
+
184
+ CLI는 루트 `skills/{wiki,brief,review}`를 한 번 설치한 뒤 같은 경로를 사용하는 에이전트를 묶어서 상대 심링크를 생성한다. `--agent`를 생략하면 로컬 설치 흔적을 감지해 후보를 추천하고, 감지하지 못하면 범용 `.agents/skills/`를 기본값으로 사용한다. `claude`, `hermes` 같은 기존 별칭도 계속 지원한다.
185
+
186
+ ## 설치되는 구조
187
+
188
+ ```text
189
+ [your-project]/
190
+ ├── .project-scaffold/manifest.json
191
+ ├── AGENT.md
192
+ ├── SOUL.md
193
+ ├── skills/
194
+ │ ├── wiki/
195
+ │ │ ├── SKILL.md
196
+ │ │ └── references/
197
+ │ ├── brief/
198
+ │ │ ├── SKILL.md
199
+ │ │ └── references/
200
+ │ └── review/SKILL.md
201
+ ├── wiki/
202
+ │ ├── index.md
203
+ │ ├── dashboard.md
204
+ │ ├── log.md
205
+ │ └── devlog/
206
+ ├── raw/
207
+ └── .hooks/
208
+ ```
209
+
210
+ 설치 진입점은 Node CLI 하나다. 기존 shell 설치기는 제거했다.
211
+
212
+ ## Git hooks
213
+
214
+ - `pre-commit` — staged blob 기준으로 시크릿과 사용 가능한 정적 분석 규칙 점검. 공백 파일명을 안전하게 처리하고 도구를 자동 다운로드하지 않는다.
215
+ - `post-commit` — 커밋 메시지와 변경 파일을 안전한 Markdown으로 `raw/dev-logs/`에 기록
216
+
217
+ 기존 hook이 있으면 기본적으로 덮어쓰지 않는다.
218
+
219
+ ## Obsidian과 Graphify
220
+
221
+ - `wiki/`를 Obsidian vault로 열어 사람이 탐색할 수 있다.
222
+ - Graphify가 설치되어 있으면 wiki 변경 후 지식 그래프를 갱신한다.
223
+ - 둘 다 선택 기능이며 LLM Wiki의 기본 동작에는 필수가 아니다.
224
+
225
+ ## 개발과 배포
226
+
227
+ ```bash
228
+ npm test
229
+ npm run check
230
+ npm pack --dry-run
231
+ ```
232
+
233
+ 모든 기능과 문서를 확정한 뒤 최초 publish를 수행한다.
234
+
235
+ ```bash
236
+ npm publish --access public
237
+ ```
238
+
239
+ ## 현재 상태
240
+
241
+ | 항목 | 상태 |
242
+ |---|---|
243
+ | Node CLI (`init`, `add`, `add-agent`, `agents`, `doctor`) | ✅ 구현 |
244
+ | skills@1.5.16 기반 73개 에이전트 레지스트리 | ✅ 구현 |
245
+ | 핵심 스킬 3개 (`wiki`, `brief`, `review`) | ✅ 구현 |
246
+ | Hermes식 스킬 사용 추적·자가 진화 | 🗑️ 제거 |
247
+ | npm 최초 publish | ⏳ 전체 수정 완료 후 진행 |