@wooojin/forgen 0.2.0 → 0.2.1
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.
- package/CHANGELOG.md +28 -0
- package/README.ja.md +79 -14
- package/README.ko.md +89 -14
- package/README.md +77 -14
- package/README.zh.md +79 -14
- package/commands/deep-interview.md +171 -0
- package/commands/specify.md +128 -0
- package/dist/cli.js +9 -0
- package/dist/core/dashboard.d.ts +91 -0
- package/dist/core/dashboard.js +385 -0
- package/dist/core/doctor.js +151 -21
- package/dist/core/drift-score.d.ts +49 -0
- package/dist/core/drift-score.js +87 -0
- package/dist/core/mcp-config.d.ts +2 -0
- package/dist/core/mcp-config.js +6 -1
- package/dist/core/paths.d.ts +1 -1
- package/dist/core/paths.js +1 -1
- package/dist/engine/compound-export.d.ts +41 -0
- package/dist/engine/compound-export.js +169 -0
- package/dist/engine/compound-loop.js +18 -0
- package/dist/engine/solution-matcher.d.ts +23 -0
- package/dist/engine/solution-matcher.js +124 -11
- package/dist/hooks/context-guard.d.ts +10 -0
- package/dist/hooks/context-guard.js +104 -58
- package/dist/hooks/db-guard.js +2 -2
- package/dist/hooks/hook-config.d.ts +27 -1
- package/dist/hooks/hook-config.js +72 -12
- package/dist/hooks/intent-classifier.d.ts +0 -2
- package/dist/hooks/intent-classifier.js +32 -18
- package/dist/hooks/keyword-detector.js +117 -111
- package/dist/hooks/notepad-injector.js +2 -2
- package/dist/hooks/permission-handler.js +2 -2
- package/dist/hooks/post-tool-failure.js +12 -6
- package/dist/hooks/post-tool-handlers.d.ts +1 -1
- package/dist/hooks/post-tool-handlers.js +14 -11
- package/dist/hooks/post-tool-use.d.ts +11 -0
- package/dist/hooks/post-tool-use.js +184 -71
- package/dist/hooks/pre-compact.d.ts +11 -1
- package/dist/hooks/pre-compact.js +112 -37
- package/dist/hooks/pre-tool-use.js +86 -56
- package/dist/hooks/rate-limiter.js +3 -3
- package/dist/hooks/secret-filter.js +2 -2
- package/dist/hooks/session-recovery.js +256 -236
- package/dist/hooks/shared/hook-response.d.ts +4 -4
- package/dist/hooks/shared/hook-response.js +13 -24
- package/dist/hooks/shared/hook-timing.d.ts +15 -0
- package/dist/hooks/shared/hook-timing.js +64 -0
- package/dist/hooks/skill-injector.js +41 -12
- package/dist/hooks/slop-detector.js +3 -3
- package/dist/hooks/solution-injector.js +224 -197
- package/dist/hooks/subagent-tracker.js +2 -2
- package/dist/renderer/rule-renderer.js +9 -11
- package/package.json +1 -1
- package/skills/deep-interview/SKILL.md +166 -0
- package/skills/specify/SKILL.md +122 -0
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: deep-interview
|
|
3
|
+
description: This skill should be used when the user asks to "deep-interview,딥인터뷰,심층인터뷰,deep interview". Deep requirement interview with Ambiguity Score quantification
|
|
4
|
+
triggers:
|
|
5
|
+
- "deep-interview"
|
|
6
|
+
- "딥인터뷰"
|
|
7
|
+
- "심층인터뷰"
|
|
8
|
+
- "deep interview"
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
<Purpose>
|
|
12
|
+
프로젝트의 핵심 주제들을 체계적으로 심층 인터뷰하여 모호성을 제거합니다.
|
|
13
|
+
각 주제에 Ambiguity Score(0-10)를 부여하여 어디가 명확하고 어디가 불분명한지를
|
|
14
|
+
정량적으로 보여줍니다. 반복 질문을 통해 모든 주제의 점수를 3 이하로 낮추는 것이 목표입니다.
|
|
15
|
+
</Purpose>
|
|
16
|
+
|
|
17
|
+
<Steps>
|
|
18
|
+
1. **주제 추출**: 사용자 요청에서 핵심 주제(Topic)를 5-8개 식별합니다
|
|
19
|
+
- 기능 범위 (Scope)
|
|
20
|
+
- 사용자 시나리오 (User Flow)
|
|
21
|
+
- 데이터 모델 (Data)
|
|
22
|
+
- 기술 제약 (Tech Constraints)
|
|
23
|
+
- 엣지 케이스 (Edge Cases)
|
|
24
|
+
- 성능 요구 (Performance)
|
|
25
|
+
- 보안 요구 (Security)
|
|
26
|
+
- 배포/운영 (Operations)
|
|
27
|
+
|
|
28
|
+
2. **초기 Ambiguity Score 산정**: 각 주제별 0-10 점수를 부여합니다
|
|
29
|
+
|
|
30
|
+
3. **라운드 기반 인터뷰**: 가장 높은 점수의 주제부터 질문합니다
|
|
31
|
+
- 한 라운드에 최대 3개 질문
|
|
32
|
+
- 답변 후 점수를 재산정하고 보드를 갱신
|
|
33
|
+
- 점수가 3 이하가 될 때까지 반복
|
|
34
|
+
|
|
35
|
+
4. **최종 보고서**: 인터뷰 결과를 구조화된 명세로 정리합니다
|
|
36
|
+
</Steps>
|
|
37
|
+
|
|
38
|
+
## Ambiguity Score 체계
|
|
39
|
+
|
|
40
|
+
| 점수 | 레벨 | 의미 | 구현 가능 여부 |
|
|
41
|
+
|------|------|------|---------------|
|
|
42
|
+
| **0** | Crystal | 완벽히 명확. 코드로 즉시 변환 가능. | 즉시 가능 |
|
|
43
|
+
| **1-2** | Clear | 사소한 세부사항만 미정. 합리적 가정으로 진행 가능. | 가능 |
|
|
44
|
+
| **3** | Mostly Clear | 한두 가지 선택지가 남음. 가정을 명시하면 진행 가능. | 조건부 가능 |
|
|
45
|
+
| **4-5** | Hazy | 핵심 결정이 1-2개 미정. 가정 위험이 있음. | 위험 감수 시 가능 |
|
|
46
|
+
| **6-7** | Foggy | 주요 방향이 불확실. 잘못된 가정 시 재작업 발생. | 비권장 |
|
|
47
|
+
| **8-9** | Opaque | 요구사항의 대부분이 미정. 프로토타입 수준만 가능. | 불가 |
|
|
48
|
+
| **10** | Black Box | 무엇을 만들어야 하는지조차 불명확. | 불가 |
|
|
49
|
+
|
|
50
|
+
### 점수 산정 기준 (5가지 축)
|
|
51
|
+
|
|
52
|
+
각 축을 0-2점으로 평가하여 합산합니다:
|
|
53
|
+
|
|
54
|
+
| 축 | 0점 (명확) | 1점 (부분 모호) | 2점 (모호) |
|
|
55
|
+
|----|-----------|----------------|-----------|
|
|
56
|
+
| **What** (무엇을) | 기능이 구체적으로 정의됨 | 기능의 범위가 애매함 | 무엇을 만드는지 불명확 |
|
|
57
|
+
| **Who** (누구를 위해) | 대상 사용자가 특정됨 | 대상 사용자가 넓게 정의됨 | 사용자가 누구인지 모름 |
|
|
58
|
+
| **How** (어떻게) | 기술 구현 방식이 결정됨 | 후보 기술이 있으나 미결정 | 구현 방식을 모름 |
|
|
59
|
+
| **When** (언제까지) | 기한과 우선순위가 명확함 | 대략적 일정만 있음 | 기한/우선순위 미정 |
|
|
60
|
+
| **Why** (왜) | 비즈니스 근거가 명확함 | 근거가 있으나 검증 안 됨 | 왜 필요한지 불분명 |
|
|
61
|
+
|
|
62
|
+
## 인터뷰 보드 형식
|
|
63
|
+
|
|
64
|
+
```
|
|
65
|
+
DEEP INTERVIEW BOARD / 심층 인터뷰 보드
|
|
66
|
+
========================================
|
|
67
|
+
|
|
68
|
+
Project: [프로젝트명]
|
|
69
|
+
Round: [N] | Overall Ambiguity: [가중평균 점수] | Status: [진행중/완료]
|
|
70
|
+
|
|
71
|
+
TOPIC SCORES
|
|
72
|
+
────────────────────────────────────────────────
|
|
73
|
+
# Topic Score W H Wh When Why Trend
|
|
74
|
+
1 User Authentication 3/10 0 1 1 0 1 8→5→3 ↓
|
|
75
|
+
2 Payment Flow 7/10 1 2 2 1 1 9→7 ↓
|
|
76
|
+
3 Data Model 2/10 0 0 1 0 1 6→2 ↓↓
|
|
77
|
+
4 Error Handling 5/10 1 1 1 1 1 5 —
|
|
78
|
+
5 Performance 8/10 2 2 2 1 1 8 NEW
|
|
79
|
+
────────────────────────────────────────────────
|
|
80
|
+
Avg: 5.0
|
|
81
|
+
|
|
82
|
+
LEGEND: W=What, H=How, Wh=Who, Trend: ↓=improving ↑=worsening —=no change
|
|
83
|
+
|
|
84
|
+
CURRENT ROUND QUESTIONS
|
|
85
|
+
────────────────────────
|
|
86
|
+
[Targeting: #5 Performance (8/10), #2 Payment Flow (7/10)]
|
|
87
|
+
|
|
88
|
+
Q1. [#5-How] 예상 동시 접속자 수와 초당 요청량(RPS)은?
|
|
89
|
+
→ 이 답변으로 Performance Score -2 예상
|
|
90
|
+
|
|
91
|
+
Q2. [#2-What] 결제 수단은 카드만? 계좌이체/간편결제도 포함?
|
|
92
|
+
→ 이 답변으로 Payment Score -1~2 예상
|
|
93
|
+
|
|
94
|
+
Q3. [#2-How] PG사는 결정되었나요? (토스/아임포트/스트라이프 등)
|
|
95
|
+
→ 이 답변으로 Payment Score -1~2 예상
|
|
96
|
+
|
|
97
|
+
RESOLVED SO FAR
|
|
98
|
+
───────────────
|
|
99
|
+
- [#1] JWT 기반 인증, 만료 15분, 리프레시 토큰 7일
|
|
100
|
+
- [#3] PostgreSQL, users/orders/payments 3테이블
|
|
101
|
+
- [#1] bcrypt 해싱, salt rounds 12
|
|
102
|
+
|
|
103
|
+
[답변을 입력하면 점수를 재산정합니다]
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
## 종료 조건
|
|
107
|
+
|
|
108
|
+
인터뷰는 다음 조건 중 하나를 만족하면 종료합니다:
|
|
109
|
+
|
|
110
|
+
| 조건 | 설명 |
|
|
111
|
+
|------|------|
|
|
112
|
+
| **All Clear** | 모든 주제가 3점 이하 |
|
|
113
|
+
| **Actionable** | 평균 점수 3.5 이하 + 7점 이상 주제 없음 |
|
|
114
|
+
| **User Exit** | 사용자가 "충분해", "진행하자" 등으로 종료 요청 |
|
|
115
|
+
| **Plateau** | 3라운드 연속 총점 변화 없음 (더 이상 정보 획득 불가) |
|
|
116
|
+
|
|
117
|
+
종료 시 자동으로 최종 명세서를 생성합니다.
|
|
118
|
+
|
|
119
|
+
## 최종 보고서 형식
|
|
120
|
+
|
|
121
|
+
```
|
|
122
|
+
DEEP INTERVIEW REPORT / 심층 인터뷰 결과
|
|
123
|
+
=========================================
|
|
124
|
+
|
|
125
|
+
Total Rounds: [N]
|
|
126
|
+
Final Ambiguity: [가중평균] (초기: [초기 평균] → 최종: [최종 평균])
|
|
127
|
+
Score Reduction: [감소량] ([감소율]%)
|
|
128
|
+
|
|
129
|
+
TOPIC SUMMARY
|
|
130
|
+
─────────────
|
|
131
|
+
[각 주제별 최종 점수 + 핵심 결정사항 1-2줄]
|
|
132
|
+
|
|
133
|
+
REMAINING ASSUMPTIONS
|
|
134
|
+
─────────────────────
|
|
135
|
+
[점수 1-3인 항목의 가정 목록 — 검증 필요]
|
|
136
|
+
|
|
137
|
+
IMPLEMENTATION READY
|
|
138
|
+
────────────────────
|
|
139
|
+
[점수 0인 항목 → 즉시 구현 가능한 명세]
|
|
140
|
+
|
|
141
|
+
NEXT ACTIONS
|
|
142
|
+
────────────
|
|
143
|
+
1. [가장 시급한 미결 사항]
|
|
144
|
+
2. [두 번째 미결 사항]
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
<Policy>
|
|
148
|
+
- 라운드당 최대 3개 질문만 합니다 (질문 피로도 방지)
|
|
149
|
+
- 가장 높은 Ambiguity Score 주제부터 우선 공략합니다
|
|
150
|
+
- 답변 후 즉시 점수를 재산정하여 진행 상황을 보여줍니다
|
|
151
|
+
- 각 질문에 예상 점수 감소량을 표시하여 질문의 가치를 투명하게 합니다
|
|
152
|
+
- 사용자가 "모르겠다"고 하면 해당 축을 2점으로 유지하고 다음 질문으로 넘어갑니다
|
|
153
|
+
- 기술적 판단이 가능한 축(How)은 합리적 가정을 제안하여 점수를 낮춥니다
|
|
154
|
+
- 비즈니스 판단이 필요한 축(What, Who, Why)은 반드시 사용자 확인을 구합니다
|
|
155
|
+
</Policy>
|
|
156
|
+
|
|
157
|
+
<Arguments>
|
|
158
|
+
## 사용법
|
|
159
|
+
`deep-interview {프로젝트 또는 기능 설명}`
|
|
160
|
+
|
|
161
|
+
### 예시
|
|
162
|
+
- `deep-interview 이커머스 플랫폼 MVP`
|
|
163
|
+
- `deep-interview 사내 HR 시스템 리뉴얼`
|
|
164
|
+
- `deep-interview 실시간 채팅 기능 추가`
|
|
165
|
+
|
|
166
|
+
### 인자
|
|
167
|
+
- 인터뷰할 프로젝트 또는 기능의 자연어 설명
|
|
168
|
+
- 기존 코드베이스가 있으면 자동으로 기술 제약 주제의 점수를 낮춤
|
|
169
|
+
</Arguments>
|
|
170
|
+
|
|
171
|
+
$ARGUMENTS
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: specify
|
|
3
|
+
description: This skill should be used when the user asks to "specify,명세,요구사항 정리,스펙,spec,requirements". Structured requirement specification with resolved/provisional/unresolved 3-level evaluation
|
|
4
|
+
triggers:
|
|
5
|
+
- "specify"
|
|
6
|
+
- "명세"
|
|
7
|
+
- "요구사항 정리"
|
|
8
|
+
- "스펙 정리"
|
|
9
|
+
- "spec"
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
<Purpose>
|
|
13
|
+
사용자의 모호한 요청을 구조화된 요구사항 명세로 변환합니다.
|
|
14
|
+
각 요구사항을 resolved/provisional/unresolved 3단계로 평가하여
|
|
15
|
+
무엇이 확정되었고, 무엇이 아직 불명확한지를 투명하게 보여줍니다.
|
|
16
|
+
</Purpose>
|
|
17
|
+
|
|
18
|
+
<Steps>
|
|
19
|
+
1. **요청 분해**: 사용자 프롬프트에서 개별 요구사항을 추출합니다
|
|
20
|
+
- 기능 요구사항 (무엇을 해야 하는가)
|
|
21
|
+
- 비기능 요구사항 (성능, 보안, 접근성 등)
|
|
22
|
+
- 제약 조건 (기술 스택, 호환성, 기한 등)
|
|
23
|
+
|
|
24
|
+
2. **3단계 평가**: 각 요구사항의 명확성을 평가합니다
|
|
25
|
+
|
|
26
|
+
3. **갭 분석**: unresolved/provisional 항목에 대해 구체적 질문을 생성합니다
|
|
27
|
+
- 각 질문은 답변 시 해당 항목을 한 단계 승격시킬 수 있어야 함
|
|
28
|
+
- 예/아니오로 답할 수 있는 폐쇄형 질문 우선
|
|
29
|
+
|
|
30
|
+
4. **명세서 출력**: 구조화된 형식으로 전체 명세를 제시합니다
|
|
31
|
+
</Steps>
|
|
32
|
+
|
|
33
|
+
## 3단계 평가 기준
|
|
34
|
+
|
|
35
|
+
| 상태 | 기호 | 기준 | 예시 |
|
|
36
|
+
|------|------|------|------|
|
|
37
|
+
| **Resolved** | `[R]` | 구현에 필요한 모든 정보가 확정됨. 코드 작성 가능. | "JWT 토큰, 만료 15분, RS256 알고리즘" |
|
|
38
|
+
| **Provisional** | `[P]` | 작업 가능한 가정이 있으나 검증 필요. 가정을 명시. | "인증 방식은 JWT로 가정 (확인 필요)" |
|
|
39
|
+
| **Unresolved** | `[U]` | 핵심 정보 부재. 구현 전 반드시 명확화 필요. | "에러 시 사용자에게 어떻게 알릴지 미정" |
|
|
40
|
+
|
|
41
|
+
### 승격 규칙
|
|
42
|
+
|
|
43
|
+
```
|
|
44
|
+
[U] → [P]: 합리적 가정이 도출되면 가정과 함께 승격
|
|
45
|
+
[P] → [R]: 사용자가 가정을 확인하거나 구체적 값을 제공하면 승격
|
|
46
|
+
[R] → [P]: 사용자가 확정 사항을 재검토 요청하면 강등
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## 명세서 출력 형식
|
|
50
|
+
|
|
51
|
+
```
|
|
52
|
+
SPECIFICATION REPORT / 요구사항 명세서
|
|
53
|
+
======================================
|
|
54
|
+
|
|
55
|
+
Summary: [요구사항 한 줄 요약]
|
|
56
|
+
Status: R:[N] P:[N] U:[N] — 진행 가능도: [%]
|
|
57
|
+
|
|
58
|
+
RESOLVED ([N])
|
|
59
|
+
--------------
|
|
60
|
+
[R] REQ-01: 로그인 API 엔드포인트 — POST /api/auth/login
|
|
61
|
+
→ 이메일+비밀번호 입력, JWT 반환, 만료 15분
|
|
62
|
+
|
|
63
|
+
[R] REQ-02: 비밀번호 해싱 — bcrypt, salt rounds 12
|
|
64
|
+
→ 회원가입 시 해싱, 로그인 시 비교
|
|
65
|
+
|
|
66
|
+
PROVISIONAL ([N])
|
|
67
|
+
-----------------
|
|
68
|
+
[P] REQ-03: 소셜 로그인 — Google OAuth 2.0 (가정)
|
|
69
|
+
가정: Google만 지원, 추후 확장 가능
|
|
70
|
+
→ 확인 필요: 지원할 소셜 프로바이더 목록
|
|
71
|
+
|
|
72
|
+
[P] REQ-04: 세션 관리 — Redis 기반 (가정)
|
|
73
|
+
가정: 인메모리 대신 Redis 사용
|
|
74
|
+
→ 확인 필요: 인프라에 Redis가 있는지
|
|
75
|
+
|
|
76
|
+
UNRESOLVED ([N])
|
|
77
|
+
----------------
|
|
78
|
+
[U] REQ-05: 비밀번호 정책
|
|
79
|
+
→ 질문: 최소 길이, 특수문자 요구, 만료 주기는?
|
|
80
|
+
|
|
81
|
+
[U] REQ-06: 다중 기기 로그인 처리
|
|
82
|
+
→ 질문: 동시 세션 허용? 최대 몇 개?
|
|
83
|
+
|
|
84
|
+
GAP QUESTIONS (우선순위순)
|
|
85
|
+
--------------------------
|
|
86
|
+
Q1. [REQ-05] 비밀번호 최소 요구사항은? (길이, 복잡도)
|
|
87
|
+
Q2. [REQ-06] 한 계정에서 동시 로그인 가능한 기기 수는?
|
|
88
|
+
Q3. [REQ-03] Google 외에 지원할 소셜 로그인은?
|
|
89
|
+
Q4. [REQ-04] 현재 인프라에 Redis가 구성되어 있나요?
|
|
90
|
+
|
|
91
|
+
NEXT STEP
|
|
92
|
+
---------
|
|
93
|
+
[위 질문에 답변하면 명세를 업데이트합니다]
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
## 진행 가능도 계산
|
|
97
|
+
|
|
98
|
+
```
|
|
99
|
+
진행 가능도(%) = (R×1.0 + P×0.5 + U×0.0) / 총 요구사항 × 100
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
- **80% 이상**: 구현 착수 가능 (U 항목은 후순위로)
|
|
103
|
+
- **50-79%**: provisional 항목 검증 후 착수 권장
|
|
104
|
+
- **50% 미만**: 추가 명확화 필수, 구현 착수 비권장
|
|
105
|
+
|
|
106
|
+
<Policy>
|
|
107
|
+
- 사용자가 답변하면 즉시 해당 항목의 상태를 승격하고 명세를 갱신합니다
|
|
108
|
+
- 가정을 세울 때는 반드시 "가정:" 레이블을 붙여 투명하게 표시합니다
|
|
109
|
+
- 요구사항 ID(REQ-xx)를 부여하여 후속 대화에서 참조 가능하게 합니다
|
|
110
|
+
- 기술적 판단이 가능한 항목은 provisional로 가정을 세워 진행 가능도를 높입니다
|
|
111
|
+
- 비즈니스 판단이 필요한 항목은 unresolved로 유지하고 질문을 생성합니다
|
|
112
|
+
</Policy>
|
|
113
|
+
|
|
114
|
+
<Arguments>
|
|
115
|
+
## 사용법
|
|
116
|
+
`specify {구현하려는 기능 설명}`
|
|
117
|
+
|
|
118
|
+
### 예시
|
|
119
|
+
- `specify 사용자 인증 시스템 구현`
|
|
120
|
+
- `specify 결제 API 연동`
|
|
121
|
+
- `specify 대시보드 페이지 리디자인`
|
|
122
|
+
|
|
123
|
+
### 인자
|
|
124
|
+
- 구현하려는 기능이나 작업의 자연어 설명
|
|
125
|
+
- 기존 코드베이스가 있으면 자동으로 제약 조건 추출
|
|
126
|
+
</Arguments>
|
|
127
|
+
|
|
128
|
+
$ARGUMENTS
|
package/dist/cli.js
CHANGED
|
@@ -68,6 +68,14 @@ const commands = [
|
|
|
68
68
|
}
|
|
69
69
|
},
|
|
70
70
|
},
|
|
71
|
+
{
|
|
72
|
+
name: 'dashboard',
|
|
73
|
+
description: 'Compound system dashboard with rich overview',
|
|
74
|
+
handler: async (_args) => {
|
|
75
|
+
const { handleDashboard } = await import('./core/dashboard.js');
|
|
76
|
+
await handleDashboard();
|
|
77
|
+
},
|
|
78
|
+
},
|
|
71
79
|
{
|
|
72
80
|
name: 'me',
|
|
73
81
|
description: 'Personal dashboard (→ inspect profile)',
|
|
@@ -277,6 +285,7 @@ function printHelp() {
|
|
|
277
285
|
forgen inspect [profile|rules|evidence|session]
|
|
278
286
|
Inspect v1 state
|
|
279
287
|
forgen compound Manage accumulated knowledge
|
|
288
|
+
forgen dashboard Compound system dashboard
|
|
280
289
|
forgen me Personal dashboard
|
|
281
290
|
forgen init Initialize project
|
|
282
291
|
forgen config hooks Hook management
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Forgen — Compound Dashboard
|
|
3
|
+
*
|
|
4
|
+
* Provides a rich terminal overview of the compound knowledge system:
|
|
5
|
+
* knowledge inventory, injection activity, lifecycle transitions,
|
|
6
|
+
* session history, and hook health.
|
|
7
|
+
*
|
|
8
|
+
* Data is collected from:
|
|
9
|
+
* - ME_SOLUTIONS, ME_RULES, ME_BEHAVIOR (knowledge files)
|
|
10
|
+
* - MATCH_EVAL_LOG_PATH (injection/matching decisions)
|
|
11
|
+
* - STATE_DIR (hook-errors.json, last-extraction.json)
|
|
12
|
+
* - Solution frontmatter (lifecycle evidence fields)
|
|
13
|
+
*/
|
|
14
|
+
import type { SolutionStatus } from '../engine/solution-format.js';
|
|
15
|
+
export interface KnowledgeOverview {
|
|
16
|
+
solutions: {
|
|
17
|
+
total: number;
|
|
18
|
+
byStatus: Record<SolutionStatus, number>;
|
|
19
|
+
};
|
|
20
|
+
rules: {
|
|
21
|
+
total: number;
|
|
22
|
+
categories: Record<string, number>;
|
|
23
|
+
};
|
|
24
|
+
behavior: {
|
|
25
|
+
total: number;
|
|
26
|
+
};
|
|
27
|
+
dateRange: {
|
|
28
|
+
oldest: string | null;
|
|
29
|
+
newest: string | null;
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
export interface InjectionActivity {
|
|
33
|
+
totalRecords: number;
|
|
34
|
+
recentInjections: Array<{
|
|
35
|
+
name: string;
|
|
36
|
+
ts: string;
|
|
37
|
+
source: string;
|
|
38
|
+
}>;
|
|
39
|
+
topSolutions: Array<{
|
|
40
|
+
name: string;
|
|
41
|
+
count: number;
|
|
42
|
+
}>;
|
|
43
|
+
hookCount: number;
|
|
44
|
+
mcpCount: number;
|
|
45
|
+
}
|
|
46
|
+
export interface ReflectionData {
|
|
47
|
+
totalSolutions: number;
|
|
48
|
+
reflectedCount: number;
|
|
49
|
+
unreflectedCount: number;
|
|
50
|
+
reflectionRate: number;
|
|
51
|
+
}
|
|
52
|
+
export interface LifecycleActivity {
|
|
53
|
+
recentPromotionCandidates: Array<{
|
|
54
|
+
name: string;
|
|
55
|
+
status: SolutionStatus;
|
|
56
|
+
evidence: {
|
|
57
|
+
reflected: number;
|
|
58
|
+
sessions: number;
|
|
59
|
+
negative: number;
|
|
60
|
+
};
|
|
61
|
+
}>;
|
|
62
|
+
statusDistribution: Record<SolutionStatus, number>;
|
|
63
|
+
}
|
|
64
|
+
export interface SessionHistory {
|
|
65
|
+
lastExtraction: {
|
|
66
|
+
date: string;
|
|
67
|
+
extractionsToday: number;
|
|
68
|
+
} | null;
|
|
69
|
+
}
|
|
70
|
+
export interface HookHealth {
|
|
71
|
+
errors: Array<{
|
|
72
|
+
hookName: string;
|
|
73
|
+
count: number;
|
|
74
|
+
lastAt: string;
|
|
75
|
+
}>;
|
|
76
|
+
}
|
|
77
|
+
/** Collect knowledge overview data. */
|
|
78
|
+
export declare function collectKnowledgeOverview(): KnowledgeOverview;
|
|
79
|
+
/** Collect injection activity from match-eval-log. */
|
|
80
|
+
export declare function collectInjectionActivity(): InjectionActivity;
|
|
81
|
+
/** Collect code reflection data from solution evidence. */
|
|
82
|
+
export declare function collectReflectionData(): ReflectionData;
|
|
83
|
+
/** Collect lifecycle activity data. */
|
|
84
|
+
export declare function collectLifecycleActivity(): LifecycleActivity;
|
|
85
|
+
/** Collect session extraction history. */
|
|
86
|
+
export declare function collectSessionHistory(): SessionHistory;
|
|
87
|
+
/** Collect hook error data. */
|
|
88
|
+
export declare function collectHookHealth(): HookHealth;
|
|
89
|
+
export declare function renderDashboard(): string;
|
|
90
|
+
/** CLI handler: forgen dashboard */
|
|
91
|
+
export declare function handleDashboard(): Promise<void>;
|