@kmgeon/taskflow 0.1.3
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/README.md +374 -0
- package/bin/task-mcp.mjs +19 -0
- package/bin/task.mjs +19 -0
- package/docs/clean-code.md +29 -0
- package/docs/git.md +36 -0
- package/docs/guideline.md +25 -0
- package/docs/security.md +32 -0
- package/docs/step-by-step.md +29 -0
- package/docs/superpowers/specs/2026-03-21-cli-advisor-design.md +383 -0
- package/docs/superpowers/specs/2026-03-21-init-redesign-design.md +429 -0
- package/docs/superpowers/specs/2026-03-21-skill-architecture-design.md +362 -0
- package/docs/superpowers/specs/2026-03-23-t-create-task-run-design.md +40 -0
- package/docs/superpowers/specs/2026-03-23-task-run-design.md +44 -0
- package/docs/tdd.md +41 -0
- package/package.json +114 -0
- package/src/app/(protected)/dashboard/page.tsx +7 -0
- package/src/app/(protected)/layout.tsx +10 -0
- package/src/app/api/[[...hono]]/route.ts +13 -0
- package/src/app/example/page.tsx +11 -0
- package/src/app/favicon.ico +0 -0
- package/src/app/globals.css +168 -0
- package/src/app/layout.tsx +35 -0
- package/src/app/page.tsx +5 -0
- package/src/app/providers.tsx +57 -0
- package/src/backend/config/index.ts +36 -0
- package/src/backend/hono/app.ts +32 -0
- package/src/backend/hono/context.ts +38 -0
- package/src/backend/http/response.ts +64 -0
- package/src/backend/middleware/context.ts +23 -0
- package/src/backend/middleware/error.ts +31 -0
- package/src/backend/middleware/supabase.ts +23 -0
- package/src/backend/supabase/client.ts +17 -0
- package/src/cli/commands/__tests__/task-commands.test.ts +170 -0
- package/src/cli/commands/advisor.ts +45 -0
- package/src/cli/commands/ask.ts +50 -0
- package/src/cli/commands/board.ts +72 -0
- package/src/cli/commands/init.ts +184 -0
- package/src/cli/commands/list.ts +138 -0
- package/src/cli/commands/run.ts +143 -0
- package/src/cli/commands/set-status.ts +50 -0
- package/src/cli/commands/show.ts +28 -0
- package/src/cli/commands/tree.ts +72 -0
- package/src/cli/index.ts +38 -0
- package/src/cli/lib/__tests__/formatter.test.ts +123 -0
- package/src/cli/lib/error-boundary.test.ts +135 -0
- package/src/cli/lib/error-boundary.ts +70 -0
- package/src/cli/lib/formatter.ts +764 -0
- package/src/cli/lib/trd.ts +33 -0
- package/src/cli/lib/validate.test.ts +89 -0
- package/src/cli/lib/validate.ts +43 -0
- package/src/cli/prompts/task-run.md +25 -0
- package/src/components/layout/AppLayout.tsx +15 -0
- package/src/components/layout/Sidebar.tsx +124 -0
- package/src/components/ui/accordion.tsx +58 -0
- package/src/components/ui/avatar.tsx +50 -0
- package/src/components/ui/badge.tsx +36 -0
- package/src/components/ui/button.tsx +56 -0
- package/src/components/ui/card.tsx +79 -0
- package/src/components/ui/checkbox.tsx +30 -0
- package/src/components/ui/dialog.tsx +122 -0
- package/src/components/ui/dropdown-menu.tsx +200 -0
- package/src/components/ui/file-upload.tsx +50 -0
- package/src/components/ui/form.tsx +179 -0
- package/src/components/ui/input.tsx +25 -0
- package/src/components/ui/label.tsx +26 -0
- package/src/components/ui/scroll-area.tsx +48 -0
- package/src/components/ui/select.tsx +160 -0
- package/src/components/ui/separator.tsx +31 -0
- package/src/components/ui/sheet.tsx +140 -0
- package/src/components/ui/textarea.tsx +22 -0
- package/src/components/ui/toast.tsx +129 -0
- package/src/components/ui/toaster.tsx +35 -0
- package/src/core/ai/claude-client.ts +79 -0
- package/src/core/claude-runner/flag-builder.ts +57 -0
- package/src/core/claude-runner/index.ts +2 -0
- package/src/core/claude-runner/spawner.ts +86 -0
- package/src/core/prd/__tests__/auto-analyzer.test.ts +35 -0
- package/src/core/prd/__tests__/generator.test.ts +26 -0
- package/src/core/prd/__tests__/scanner.test.ts +35 -0
- package/src/core/prd/auto-analyzer.ts +9 -0
- package/src/core/prd/generator.ts +8 -0
- package/src/core/prd/scanner.ts +117 -0
- package/src/core/project/__tests__/claude-setup.test.ts +133 -0
- package/src/core/project/__tests__/config.test.ts +30 -0
- package/src/core/project/__tests__/init.test.ts +37 -0
- package/src/core/project/__tests__/skill-setup.test.ts +62 -0
- package/src/core/project/claude-setup.ts +224 -0
- package/src/core/project/config.ts +34 -0
- package/src/core/project/docs-setup.ts +26 -0
- package/src/core/project/docs-templates.ts +205 -0
- package/src/core/project/init.ts +40 -0
- package/src/core/project/skill-setup.ts +32 -0
- package/src/core/project/skill-templates.ts +277 -0
- package/src/core/task/index.ts +16 -0
- package/src/core/types.ts +58 -0
- package/src/features/example/backend/error.ts +9 -0
- package/src/features/example/backend/route.ts +52 -0
- package/src/features/example/backend/schema.ts +25 -0
- package/src/features/example/backend/service.ts +73 -0
- package/src/features/example/components/example-status.test.tsx +97 -0
- package/src/features/example/components/example-status.tsx +160 -0
- package/src/features/example/hooks/useExampleQuery.ts +23 -0
- package/src/features/example/lib/dto.test.ts +57 -0
- package/src/features/example/lib/dto.ts +5 -0
- package/src/features/kanban/backend/__tests__/sse-broadcaster.test.ts +137 -0
- package/src/features/kanban/backend/__tests__/sse-event-format.test.ts +55 -0
- package/src/features/kanban/backend/route.ts +55 -0
- package/src/features/kanban/backend/sse-broadcaster.ts +142 -0
- package/src/features/kanban/backend/sse-route.ts +43 -0
- package/src/features/kanban/components/KanbanBoard.tsx +105 -0
- package/src/features/kanban/components/KanbanColumn.tsx +51 -0
- package/src/features/kanban/components/KanbanError.tsx +29 -0
- package/src/features/kanban/components/KanbanSkeleton.tsx +46 -0
- package/src/features/kanban/components/ProgressCard.tsx +42 -0
- package/src/features/kanban/components/TaskCard.tsx +76 -0
- package/src/features/kanban/components/__tests__/kanban-components.test.tsx +86 -0
- package/src/features/kanban/hooks/useTaskSse.ts +66 -0
- package/src/features/kanban/hooks/useTasksQuery.ts +52 -0
- package/src/features/kanban/lib/__tests__/kanban-utils.test.ts +97 -0
- package/src/features/kanban/lib/kanban-utils.ts +37 -0
- package/src/features/taskflow/constants.ts +54 -0
- package/src/features/taskflow/index.ts +27 -0
- package/src/features/taskflow/lib/__tests__/filter.test.ts +89 -0
- package/src/features/taskflow/lib/__tests__/graph.test.ts +247 -0
- package/src/features/taskflow/lib/__tests__/repository.test.ts +233 -0
- package/src/features/taskflow/lib/__tests__/serializer.test.ts +98 -0
- package/src/features/taskflow/lib/advisor/__tests__/advisor-integration.test.ts +98 -0
- package/src/features/taskflow/lib/advisor/ai-advisor.test.ts +40 -0
- package/src/features/taskflow/lib/advisor/ai-advisor.ts +20 -0
- package/src/features/taskflow/lib/advisor/context-builder.test.ts +73 -0
- package/src/features/taskflow/lib/advisor/context-builder.ts +151 -0
- package/src/features/taskflow/lib/advisor/db.test.ts +106 -0
- package/src/features/taskflow/lib/advisor/db.ts +185 -0
- package/src/features/taskflow/lib/advisor/local-summary.test.ts +53 -0
- package/src/features/taskflow/lib/advisor/local-summary.ts +72 -0
- package/src/features/taskflow/lib/advisor/prompts.ts +86 -0
- package/src/features/taskflow/lib/filter.ts +54 -0
- package/src/features/taskflow/lib/fs-utils.ts +50 -0
- package/src/features/taskflow/lib/graph.ts +148 -0
- package/src/features/taskflow/lib/index-builder.ts +42 -0
- package/src/features/taskflow/lib/repository.ts +168 -0
- package/src/features/taskflow/lib/serializer.ts +62 -0
- package/src/features/taskflow/lib/watcher.ts +40 -0
- package/src/features/taskflow/types.ts +71 -0
- package/src/hooks/use-toast.ts +194 -0
- package/src/lib/remote/api-client.ts +40 -0
- package/src/lib/supabase/client.ts +8 -0
- package/src/lib/supabase/server.ts +46 -0
- package/src/lib/supabase/types.ts +3 -0
- package/src/lib/utils.ts +6 -0
- package/src/mcp/index.ts +7 -0
- package/src/mcp/server.ts +21 -0
- package/src/mcp/tools/brainstorm.ts +48 -0
- package/src/mcp/tools/prd.ts +71 -0
- package/src/mcp/tools/project.ts +39 -0
- package/src/mcp/tools/task-status.ts +40 -0
- package/src/mcp/tools/task.ts +82 -0
- package/src/mcp/util.ts +6 -0
|
@@ -0,0 +1,383 @@
|
|
|
1
|
+
# CLI Advisor (프로젝트 비서) 설계 문서
|
|
2
|
+
|
|
3
|
+
## 개요
|
|
4
|
+
|
|
5
|
+
CLI 내장 AI 비서로, 작업 맥락을 유지하면서 "지금 어디쯤이야?", "다음 뭐 해?" 같은 질문에 답변한다.
|
|
6
|
+
|
|
7
|
+
### 해결하는 문제
|
|
8
|
+
|
|
9
|
+
- 태스크가 많아서 뭐가 남았는지 헷갈림
|
|
10
|
+
- 작업 중간에 끊겼을 때 어디서부터 이어야 할지 모름
|
|
11
|
+
- 태스크 간 관계(선후관계)를 깜빡함
|
|
12
|
+
- 전체 진행률 감이 안 옴
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## 명령어 구조
|
|
17
|
+
|
|
18
|
+
### `task status` — 로컬 진행률 + AI 한 줄 인사이트
|
|
19
|
+
|
|
20
|
+
- 로컬 계산: 태스크 상태별 개수, 진행률, 그룹핑 (빠름)
|
|
21
|
+
- AI 보강: 한 줄 인사이트 덧붙임
|
|
22
|
+
- 상태 표시 매핑: 코드 내부 `Todo` → 표시 `Todo`, `InProgress` → `In Progress`
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
📊 프로젝트 진행률: 3/7 (43%)
|
|
26
|
+
|
|
27
|
+
✅ Done (3)
|
|
28
|
+
1. CLI list 아키텍처 재설계
|
|
29
|
+
2. 출력 옵션/플래그 체계화
|
|
30
|
+
3. 태스크 출력 포맷 개선
|
|
31
|
+
|
|
32
|
+
🔵 In Progress (1)
|
|
33
|
+
4. 상태별 그룹핑
|
|
34
|
+
|
|
35
|
+
⬜ Todo (3)
|
|
36
|
+
5. 세부 정보 표시 옵션
|
|
37
|
+
6. 코드 품질 및 테스트 보강
|
|
38
|
+
7. 사용성 개선
|
|
39
|
+
|
|
40
|
+
💡 UI 쪽 기반 작업은 다 끝났어요. 그룹핑만 마무리하면 후반부로 넘어갑니다.
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### `task next` — AI 종합 추천 (기존 명령어 개선)
|
|
44
|
+
|
|
45
|
+
기존 `next` 명령어는 로컬 그래프 스코어링(`graph.ts` `recommend()`)으로 동작한다.
|
|
46
|
+
이를 AI 기반으로 업그레이드하되, 기존 로직을 폴백으로 보존한다.
|
|
47
|
+
|
|
48
|
+
- **AI 사용 가능 시:** AI가 태스크 목록 + TRD/PRD + 결정 기록을 종합 판단
|
|
49
|
+
- **AI 사용 불가 시 (API 키 없음, 에러):** 기존 `recommend()` 로컬 스코어링으로 폴백
|
|
50
|
+
- **기존 플래그 유지:** `--limit`, `--all`, `--include-blocked`, `--json`
|
|
51
|
+
|
|
52
|
+
```
|
|
53
|
+
👉 추천: #5 세부 정보 표시 옵션 추가
|
|
54
|
+
이유: 그룹핑(#4)이 끝나면 상세 출력이 자연스럽게 이어짐.
|
|
55
|
+
의존: #4 완료 필요
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### `task ask "자유 질문"` — AI 자연어 대화
|
|
59
|
+
|
|
60
|
+
- 짧은 질문엔 짧게, 현황 질문엔 브리핑 형태로 자동 조절
|
|
61
|
+
- 코드 관련 질문 시 git diff도 참고
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## 내부 아키텍처
|
|
66
|
+
|
|
67
|
+
### 디렉토리 구조
|
|
68
|
+
|
|
69
|
+
```
|
|
70
|
+
src/features/taskflow/
|
|
71
|
+
├── lib/
|
|
72
|
+
│ ├── repository.ts # (기존) 태스크 CRUD — 마크다운
|
|
73
|
+
│ ├── advisor/ # 비서 모듈
|
|
74
|
+
│ │ ├── context-builder.ts # 데이터 수집기
|
|
75
|
+
│ │ ├── ai-advisor.ts # AI 호출 + 응답 생성
|
|
76
|
+
│ │ ├── local-summary.ts # 로컬 계산 (진행률, 그룹핑)
|
|
77
|
+
│ │ └── db.ts # SQLite 연결 + 스키마
|
|
78
|
+
│ └── ...
|
|
79
|
+
|
|
80
|
+
src/cli/commands/
|
|
81
|
+
├── status.ts # task status (신규 — index.ts에 등록 필요)
|
|
82
|
+
├── next.ts # task next (기존 개선)
|
|
83
|
+
├── ask.ts # task ask "..." (신규 — index.ts에 등록 필요)
|
|
84
|
+
└── ...
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
**CLI 등록:** `src/cli/index.ts`에 `registerStatusCommand`, `registerAskCommand` 추가 필요.
|
|
88
|
+
|
|
89
|
+
### 저장소 분리
|
|
90
|
+
|
|
91
|
+
| 데이터 | 저장소 | 이유 |
|
|
92
|
+
|--------|--------|------|
|
|
93
|
+
| 태스크 | `.taskflow/tasks/*.md` | 사람이 읽고 편집, git 추적 |
|
|
94
|
+
| 설정 | `.taskflow/config.json` | 사람이 편집 |
|
|
95
|
+
| 대화 로그 | `.taskflow/advisor.db` | 양 많음, 검색 필요, 비서 전용 |
|
|
96
|
+
| 결정 기록 | `.taskflow/advisor.db` | 검색 필요, 비서 전용 |
|
|
97
|
+
|
|
98
|
+
**`.gitignore`:** `.taskflow/` 전체가 이미 `.gitignore`에 포함되어 있으므로 `advisor.db`는 별도 추가 불필요.
|
|
99
|
+
|
|
100
|
+
### SQLite 테이블 구조
|
|
101
|
+
|
|
102
|
+
```sql
|
|
103
|
+
-- 대화 로그 (원본)
|
|
104
|
+
CREATE TABLE conversation_logs (
|
|
105
|
+
id INTEGER PRIMARY KEY,
|
|
106
|
+
session_type TEXT, -- 'prd', 'trd', 'brainstorm', 'ask'
|
|
107
|
+
session_id TEXT, -- 세션 식별자
|
|
108
|
+
role TEXT, -- 'user', 'assistant'
|
|
109
|
+
content TEXT,
|
|
110
|
+
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
111
|
+
);
|
|
112
|
+
|
|
113
|
+
-- 결정 기록 (요약)
|
|
114
|
+
CREATE TABLE decisions (
|
|
115
|
+
id INTEGER PRIMARY KEY,
|
|
116
|
+
session_id TEXT, -- 어떤 대화에서 나왔는지
|
|
117
|
+
decision TEXT, -- "인증은 MVP에서 제외"
|
|
118
|
+
reason TEXT, -- "핵심 기능에 집중"
|
|
119
|
+
related_tasks TEXT, -- 관련 태스크 ID들 (JSON)
|
|
120
|
+
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
121
|
+
);
|
|
122
|
+
|
|
123
|
+
-- 인덱스
|
|
124
|
+
CREATE INDEX idx_conv_session ON conversation_logs(session_type, session_id);
|
|
125
|
+
CREATE INDEX idx_conv_created ON conversation_logs(created_at);
|
|
126
|
+
CREATE INDEX idx_decisions_session ON decisions(session_id);
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
### 의존성
|
|
130
|
+
|
|
131
|
+
```
|
|
132
|
+
sql.js # 순수 WASM SQLite (네이티브 컴파일 불필요, 모든 OS에서 동일하게 동작)
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
> `better-sqlite3` 대신 `sql.js` 사용. 이유: `better-sqlite3`는 네이티브 C++ 모듈이라 node-gyp, Python, C++ 컴파일러가 필요하고 Windows/CI에서 문제가 될 수 있음. `sql.js`는 순수 WASM이라 `npm install`만으로 모든 환경에서 동작. 데이터 규모가 작아 성능 차이 무시 가능.
|
|
136
|
+
|
|
137
|
+
**`sql.js` 동작 방식:**
|
|
138
|
+
- DB 전체를 메모리에 로드하여 동작 (인메모리)
|
|
139
|
+
- SQL 읽기/쓰기는 모두 메모리 내에서 동기 처리 (빠름)
|
|
140
|
+
- 디스크 저장은 `db.export()` → `fs.writeFile()`로 별도 수행
|
|
141
|
+
- 파일 기반 WAL 모드는 지원하지 않음 (단일 프로세스 CLI이므로 동시 접근 이슈 없음)
|
|
142
|
+
|
|
143
|
+
### AI SDK
|
|
144
|
+
|
|
145
|
+
기존 프로젝트의 `@anthropic-ai/claude-agent-sdk` 패턴을 그대로 사용한다. `ai-advisor.ts`는 기존 AI 호출 패턴(brainstorm-flow, refine-ai 등)과 동일한 방식으로 SDK를 호출.
|
|
146
|
+
|
|
147
|
+
---
|
|
148
|
+
|
|
149
|
+
## 데이터 흐름
|
|
150
|
+
|
|
151
|
+
### `task status`
|
|
152
|
+
|
|
153
|
+
```
|
|
154
|
+
tasks/*.md → local-summary (로컬 계산) → 진행률 출력
|
|
155
|
+
+ TRD/PRD + decisions 테이블 → ai-advisor → 한 줄 인사이트 덧붙임
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
### `task next`
|
|
159
|
+
|
|
160
|
+
```
|
|
161
|
+
tasks/*.md + TRD/PRD + decisions 테이블 → ai-advisor → 추천 출력
|
|
162
|
+
(AI 실패 시) tasks/*.md → graph.ts recommend() → 로컬 추천 출력
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
### `task ask "..."`
|
|
166
|
+
|
|
167
|
+
```
|
|
168
|
+
질문 → context-builder 분류 → 필요한 데이터 수집 → ai-advisor → 응답 출력
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
---
|
|
172
|
+
|
|
173
|
+
## Context Builder 상세 설계
|
|
174
|
+
|
|
175
|
+
`context-builder.ts`는 질문을 분류하고 필요한 데이터만 수집한다.
|
|
176
|
+
|
|
177
|
+
### 인터페이스
|
|
178
|
+
|
|
179
|
+
```typescript
|
|
180
|
+
interface AdvisorContext {
|
|
181
|
+
tasks: TaskSummary[]; // 항상 포함
|
|
182
|
+
decisions: Decision[]; // 항상 포함
|
|
183
|
+
trdContent?: string; // next, ask(프로젝트 관련 질문)
|
|
184
|
+
prdContent?: string; // next, ask(프로젝트 관련 질문)
|
|
185
|
+
gitDiff?: string; // ask(코드 관련 질문)
|
|
186
|
+
conversationLogs?: ConvLog[]; // ask(이전 대화 참조)
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
function buildContext(
|
|
190
|
+
command: 'status' | 'next' | 'ask',
|
|
191
|
+
question?: string
|
|
192
|
+
): AdvisorContext
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
### 질문 분류 로직 (`task ask` 전용)
|
|
196
|
+
|
|
197
|
+
키워드 매칭으로 분류한다 (별도 AI 호출 없음):
|
|
198
|
+
|
|
199
|
+
| 키워드 | 추가 수집 데이터 |
|
|
200
|
+
|--------|-----------------|
|
|
201
|
+
| `코드`, `git`, `커밋`, `변경`, `diff` | git diff (최근 커밋) |
|
|
202
|
+
| `왜`, `이유`, `결정`, `배경` | conversation_logs (관련 세션) |
|
|
203
|
+
| `계획`, `전체`, `목표`, `방향` | TRD/PRD 전문 |
|
|
204
|
+
| 해당 없음 | 기본 (태스크 + 결정 기록만) |
|
|
205
|
+
|
|
206
|
+
### 토큰 카운팅
|
|
207
|
+
|
|
208
|
+
토큰 예산 초과 여부는 문자 수 기반 근사치로 판단한다 (`문자 수 / 4 ≈ 토큰 수`).
|
|
209
|
+
별도 토큰나이저 라이브러리는 도입하지 않음 — 정밀도보다 단순함 우선.
|
|
210
|
+
|
|
211
|
+
### 토큰 예산
|
|
212
|
+
|
|
213
|
+
| 명령어 | 최대 토큰 | 초과 시 |
|
|
214
|
+
|--------|----------|---------|
|
|
215
|
+
| status | 4,000 | 결정 기록 최근 10개만 |
|
|
216
|
+
| next | 8,000 | TRD/PRD 요약본 사용, 결정 기록 최근 20개만 |
|
|
217
|
+
| ask | 12,000 | 오래된 로그/결정 잘라냄, git diff는 변경 파일 목록만 |
|
|
218
|
+
|
|
219
|
+
---
|
|
220
|
+
|
|
221
|
+
## AI 프롬프트 전략
|
|
222
|
+
|
|
223
|
+
### 명령어별 프롬프트 구성
|
|
224
|
+
|
|
225
|
+
**`task status` — 한 줄 인사이트**
|
|
226
|
+
|
|
227
|
+
```
|
|
228
|
+
[시스템] 너는 프로젝트 비서야. 현황을 보고 한 줄 인사이트를 줘.
|
|
229
|
+
[컨텍스트]
|
|
230
|
+
- 진행률: 3/7 (43%)
|
|
231
|
+
- 완료: #1, #2, #3
|
|
232
|
+
- 진행중: #4
|
|
233
|
+
- 결정 기록: (decisions 테이블에서)
|
|
234
|
+
- TRD 목표: (TRD에서 요약)
|
|
235
|
+
[요청] 한 줄로 현재 상황에 대한 인사이트를 줘.
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
**`task next` — 추천**
|
|
239
|
+
|
|
240
|
+
```
|
|
241
|
+
[시스템] 너는 프로젝트 비서야. 다음에 할 태스크를 추천해.
|
|
242
|
+
[컨텍스트]
|
|
243
|
+
- 전체 태스크 목록 (상태, 의존성, 난이도, 긴급도)
|
|
244
|
+
- 결정 기록
|
|
245
|
+
- TRD/PRD 요약
|
|
246
|
+
[요청] 다음에 할 태스크 1개 추천 + 이유. 짧게.
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
**`task ask` — 자연어 대화**
|
|
250
|
+
|
|
251
|
+
```
|
|
252
|
+
[시스템] 너는 프로젝트 비서야. 질문에 맞게 답변해.
|
|
253
|
+
짧은 질문이면 짧게, 현황 질문이면 브리핑 형태로.
|
|
254
|
+
[컨텍스트]
|
|
255
|
+
- 태스크 목록 + TRD/PRD + 결정 기록
|
|
256
|
+
- (코드 관련 질문이면) 최근 git diff
|
|
257
|
+
- (이전 대화 참조하면) conversation_logs에서 관련 내용
|
|
258
|
+
[질문] 사용자 입력
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
---
|
|
262
|
+
|
|
263
|
+
## 대화 로그 & 결정 기록 수집
|
|
264
|
+
|
|
265
|
+
### 대화 로그 자동 저장
|
|
266
|
+
|
|
267
|
+
| CLI 명령어 | 저장 여부 | 이유 |
|
|
268
|
+
|-----------|----------|------|
|
|
269
|
+
| `task prd` | ✅ | AI 대화 있음 |
|
|
270
|
+
| `task parse-prd` | ✅ | 파싱 과정 |
|
|
271
|
+
| `task brainstorm` | ✅ | AI 대화 있음 |
|
|
272
|
+
| `task refine` | ✅ | 요구사항 변경 대화 |
|
|
273
|
+
| `task ask "..."` | ✅ | 질문과 응답 |
|
|
274
|
+
| `task list`, `task status` | ❌ | 단순 조회 |
|
|
275
|
+
| `task set-status` | ❌ | 단순 상태 변경 |
|
|
276
|
+
|
|
277
|
+
**규칙:** AI와 대화가 오가는 명령어만 저장.
|
|
278
|
+
|
|
279
|
+
### 기존 로그 시스템 마이그레이션
|
|
280
|
+
|
|
281
|
+
현재 `brainstorm-flow.ts`가 `.taskflow/logs/brainstorm-*.json`으로, `refine-logger.ts`가 별도 JSON 로그를 저장하고 있다.
|
|
282
|
+
|
|
283
|
+
**마이그레이션 전략:**
|
|
284
|
+
1. 신규 모듈(`ask`, `status`)은 처음부터 SQLite로 저장
|
|
285
|
+
2. 기존 모듈(`brainstorm`, `refine`)은 기존 JSON 로그 유지 + SQLite에도 이중 저장
|
|
286
|
+
3. 안정화 후 기존 JSON 로그 모듈을 SQLite 단일화로 리팩토링
|
|
287
|
+
4. 기존 JSON 로그 파일은 별도 임포트하지 않음 (7일 보관이라 자연 소멸)
|
|
288
|
+
|
|
289
|
+
### 결정 기록 자동 생성
|
|
290
|
+
|
|
291
|
+
**추출 시점:** AI 대화 세션이 정상 종료될 때 (사용자가 확인 응답을 한 후)
|
|
292
|
+
- `task brainstorm` → 사용자가 "좋아", "그걸로 하자" 등 확인 후 세션 종료 시
|
|
293
|
+
- `task refine` → 변경 사항 적용 완료 시
|
|
294
|
+
- `task prd` → PRD 작성 완료 시
|
|
295
|
+
- Ctrl+C 등 비정상 종료 시에는 결정 기록 생성하지 않음
|
|
296
|
+
|
|
297
|
+
**추출 프롬프트:**
|
|
298
|
+
```
|
|
299
|
+
[시스템] 아래 대화에서 사용자가 명시적으로 승인한 결정 사항만 추출해.
|
|
300
|
+
추측이나 논의 중인 내용은 제외.
|
|
301
|
+
[대화 내용] (conversation_logs에서)
|
|
302
|
+
[출력 형식] JSON: { decision, reason, related_tasks[] }
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
**검증:** `related_tasks`는 현재 태스크 목록의 ID와 매칭하여 존재하는 것만 포함.
|
|
306
|
+
|
|
307
|
+
```
|
|
308
|
+
사용자: task brainstorm #5
|
|
309
|
+
... (대화 진행) ...
|
|
310
|
+
사용자: 좋아 그걸로 하자
|
|
311
|
+
|
|
312
|
+
→ conversation_logs에 대화 전체 저장
|
|
313
|
+
→ AI가 확인된 결정만 추출 → decisions에 저장:
|
|
314
|
+
decision: "세부 정보는 --detail 플래그로 토글"
|
|
315
|
+
reason: "기본 출력은 깔끔하게 유지하기 위해"
|
|
316
|
+
related_tasks: ["5"]
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
### 용량 관리
|
|
320
|
+
|
|
321
|
+
- 대화 로그: **7일 이후 자동 삭제** (설정 변경 가능)
|
|
322
|
+
- 결정 기록: **영구 보관** (가벼움)
|
|
323
|
+
- 수동 정리: `task advisor --cleanup` 명령어로 만료 로그 즉시 삭제
|
|
324
|
+
|
|
325
|
+
### `task advisor` 서브커맨드
|
|
326
|
+
|
|
327
|
+
```
|
|
328
|
+
src/cli/commands/
|
|
329
|
+
├── advisor.ts # task advisor (신규 — index.ts에 등록 필요)
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
`task advisor`는 비서 관리용 유틸리티 명령어:
|
|
333
|
+
- `task advisor --cleanup` — 만료된 대화 로그 즉시 삭제
|
|
334
|
+
- `task advisor --stats` — DB 통계 (로그 수, 결정 수, DB 크기)
|
|
335
|
+
- 향후 확장 가능 (예: `--export`, `--reset`)
|
|
336
|
+
|
|
337
|
+
---
|
|
338
|
+
|
|
339
|
+
## DB 쓰기 전략
|
|
340
|
+
|
|
341
|
+
`sql.js`는 비동기 지원이 가능하나, DB 쓰기 자체가 매우 가볍다 (로그 한 줄 INSERT).
|
|
342
|
+
|
|
343
|
+
### 처리 규칙
|
|
344
|
+
|
|
345
|
+
| 작업 | 처리 방식 | 이유 |
|
|
346
|
+
|------|----------|------|
|
|
347
|
+
| 태스크 읽기 (마크다운) | 동기 | 출력에 필요 |
|
|
348
|
+
| DB 읽기 (decisions, logs) | 동기 | AI 컨텍스트에 필요 |
|
|
349
|
+
| **디스크 저장 (db.export → writeFile)** | **비동기 (fire-and-forget)** | SQL INSERT는 인메모리라 즉시 완료, 디스크 영속화만 비동기 |
|
|
350
|
+
| AI 호출 | 동기 | 응답 자체가 목적 |
|
|
351
|
+
|
|
352
|
+
디스크 저장 실패 시 콘솔에 경고만 남기고 무시. 태스크 데이터는 마크다운에 있으므로 치명적이지 않음. 다음 DB 쓰기 시 재시도됨 (인메모리 데이터는 유지).
|
|
353
|
+
|
|
354
|
+
---
|
|
355
|
+
|
|
356
|
+
## 에러 처리 & 엣지 케이스
|
|
357
|
+
|
|
358
|
+
### AI 호출 실패 시
|
|
359
|
+
|
|
360
|
+
| 상황 | 대응 |
|
|
361
|
+
|------|------|
|
|
362
|
+
| API 타임아웃/에러 | `task status` → 로컬 진행률만 출력 + "💡 인사이트 생성 실패" 표시 |
|
|
363
|
+
| | `task next` → 기존 `recommend()` 로컬 스코어링으로 폴백 |
|
|
364
|
+
| | `task ask` → "AI 연결 실패. 잠시 후 다시 시도해주세요" |
|
|
365
|
+
| API 키 없음 | `task status` → 로컬 진행률만 출력 (AI 없이 동작) |
|
|
366
|
+
| | `task next` → 기존 `recommend()` 로컬 스코어링으로 폴백 |
|
|
367
|
+
| | `task ask` → "AI 기능을 사용하려면 API 키를 설정하세요" |
|
|
368
|
+
|
|
369
|
+
### 데이터 없을 때
|
|
370
|
+
|
|
371
|
+
| 상황 | 대응 |
|
|
372
|
+
|------|------|
|
|
373
|
+
| 태스크 0개 | "태스크가 없습니다. `task parse-prd`로 시작하세요" |
|
|
374
|
+
| TRD/PRD 없음 | AI가 태스크 목록 + 결정 기록만으로 판단 |
|
|
375
|
+
| 결정 기록 0개 | 정상 동작 — 참고할 맥락이 적을 뿐 |
|
|
376
|
+
| advisor.db 없음 | 첫 AI 명령어 실행 시 자동 생성 |
|
|
377
|
+
|
|
378
|
+
### SQLite 관련
|
|
379
|
+
|
|
380
|
+
| 상황 | 대응 |
|
|
381
|
+
|------|------|
|
|
382
|
+
| DB 파일 손상 | 자동 재생성 + 경고 메시지 (태스크는 마크다운이라 무사) |
|
|
383
|
+
| 동시 접근 | 단일 프로세스 CLI이므로 해당 없음. sql.js는 인메모리 동작이라 프로세스 간 동시 접근 불가 |
|