timsquad 2.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.
- package/LICENSE +21 -0
- package/README.md +347 -0
- package/bin/tsq.js +6 -0
- package/dist/commands/feedback.d.ts +3 -0
- package/dist/commands/feedback.d.ts.map +1 -0
- package/dist/commands/feedback.js +142 -0
- package/dist/commands/feedback.js.map +1 -0
- package/dist/commands/full.d.ts +3 -0
- package/dist/commands/full.d.ts.map +1 -0
- package/dist/commands/full.js +87 -0
- package/dist/commands/full.js.map +1 -0
- package/dist/commands/git/commit.d.ts +3 -0
- package/dist/commands/git/commit.d.ts.map +1 -0
- package/dist/commands/git/commit.js +88 -0
- package/dist/commands/git/commit.js.map +1 -0
- package/dist/commands/git/index.d.ts +5 -0
- package/dist/commands/git/index.d.ts.map +1 -0
- package/dist/commands/git/index.js +5 -0
- package/dist/commands/git/index.js.map +1 -0
- package/dist/commands/git/pr.d.ts +3 -0
- package/dist/commands/git/pr.d.ts.map +1 -0
- package/dist/commands/git/pr.js +138 -0
- package/dist/commands/git/pr.js.map +1 -0
- package/dist/commands/git/release.d.ts +3 -0
- package/dist/commands/git/release.d.ts.map +1 -0
- package/dist/commands/git/release.js +158 -0
- package/dist/commands/git/release.js.map +1 -0
- package/dist/commands/git/sync.d.ts +3 -0
- package/dist/commands/git/sync.d.ts.map +1 -0
- package/dist/commands/git/sync.js +132 -0
- package/dist/commands/git/sync.js.map +1 -0
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +150 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/log.d.ts +3 -0
- package/dist/commands/log.d.ts.map +1 -0
- package/dist/commands/log.js +271 -0
- package/dist/commands/log.js.map +1 -0
- package/dist/commands/metrics.d.ts +3 -0
- package/dist/commands/metrics.d.ts.map +1 -0
- package/dist/commands/metrics.js +299 -0
- package/dist/commands/metrics.js.map +1 -0
- package/dist/commands/quick.d.ts +3 -0
- package/dist/commands/quick.d.ts.map +1 -0
- package/dist/commands/quick.js +136 -0
- package/dist/commands/quick.js.map +1 -0
- package/dist/commands/retro.d.ts +3 -0
- package/dist/commands/retro.d.ts.map +1 -0
- package/dist/commands/retro.js +280 -0
- package/dist/commands/retro.js.map +1 -0
- package/dist/commands/status.d.ts +3 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +127 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/watch.d.ts +3 -0
- package/dist/commands/watch.d.ts.map +1 -0
- package/dist/commands/watch.js +213 -0
- package/dist/commands/watch.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +50 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/config.d.ts +34 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +108 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/project.d.ts +47 -0
- package/dist/lib/project.d.ts.map +1 -0
- package/dist/lib/project.js +191 -0
- package/dist/lib/project.js.map +1 -0
- package/dist/lib/template.d.ts +33 -0
- package/dist/lib/template.d.ts.map +1 -0
- package/dist/lib/template.js +151 -0
- package/dist/lib/template.js.map +1 -0
- package/dist/types/config.d.ts +75 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +66 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/feedback.d.ts +59 -0
- package/dist/types/feedback.d.ts.map +1 -0
- package/dist/types/feedback.js +26 -0
- package/dist/types/feedback.js.map +1 -0
- package/dist/types/index.d.ts +4 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/project.d.ts +89 -0
- package/dist/types/project.d.ts.map +1 -0
- package/dist/types/project.js +44 -0
- package/dist/types/project.js.map +1 -0
- package/dist/utils/colors.d.ts +30 -0
- package/dist/utils/colors.d.ts.map +1 -0
- package/dist/utils/colors.js +54 -0
- package/dist/utils/colors.js.map +1 -0
- package/dist/utils/date.d.ts +25 -0
- package/dist/utils/date.d.ts.map +1 -0
- package/dist/utils/date.js +65 -0
- package/dist/utils/date.js.map +1 -0
- package/dist/utils/fs.d.ts +49 -0
- package/dist/utils/fs.d.ts.map +1 -0
- package/dist/utils/fs.js +84 -0
- package/dist/utils/fs.js.map +1 -0
- package/dist/utils/prompts.d.ts +31 -0
- package/dist/utils/prompts.d.ts.map +1 -0
- package/dist/utils/prompts.js +95 -0
- package/dist/utils/prompts.js.map +1 -0
- package/dist/utils/yaml.d.ts +21 -0
- package/dist/utils/yaml.d.ts.map +1 -0
- package/dist/utils/yaml.js +40 -0
- package/dist/utils/yaml.js.map +1 -0
- package/package.json +71 -0
- package/templates/common/CLAUDE.md.template +254 -0
- package/templates/common/claude/agents/tsq-dba.md +290 -0
- package/templates/common/claude/agents/tsq-designer.md +304 -0
- package/templates/common/claude/agents/tsq-developer.md +118 -0
- package/templates/common/claude/agents/tsq-planner.md +90 -0
- package/templates/common/claude/agents/tsq-prompter.md +336 -0
- package/templates/common/claude/agents/tsq-qa.md +134 -0
- package/templates/common/claude/agents/tsq-retro.md +168 -0
- package/templates/common/claude/agents/tsq-security.md +190 -0
- package/templates/common/claude/skills/architecture/SKILL.md +123 -0
- package/templates/common/claude/skills/backend/node/SKILL.md +1015 -0
- package/templates/common/claude/skills/coding/SKILL.md +171 -0
- package/templates/common/claude/skills/database/prisma/SKILL.md +357 -0
- package/templates/common/claude/skills/frontend/nextjs/SKILL.md +279 -0
- package/templates/common/claude/skills/frontend/react/SKILL.md +1729 -0
- package/templates/common/claude/skills/methodology/bdd/SKILL.md +234 -0
- package/templates/common/claude/skills/methodology/ddd/SKILL.md +311 -0
- package/templates/common/claude/skills/methodology/tdd/SKILL.md +512 -0
- package/templates/common/claude/skills/planning/SKILL.md +90 -0
- package/templates/common/claude/skills/security/SKILL.md +234 -0
- package/templates/common/claude/skills/testing/SKILL.md +146 -0
- package/templates/common/claude/skills/typescript/SKILL.md +435 -0
- package/templates/common/config.template.yaml +131 -0
- package/templates/common/timsquad/architectures/clean/ARCHITECTURE.md +49 -0
- package/templates/common/timsquad/architectures/clean/backend.xml +210 -0
- package/templates/common/timsquad/architectures/clean/frontend.xml +148 -0
- package/templates/common/timsquad/architectures/fsd/ARCHITECTURE.md +67 -0
- package/templates/common/timsquad/architectures/fsd/frontend.xml +288 -0
- package/templates/common/timsquad/architectures/hexagonal/ARCHITECTURE.md +60 -0
- package/templates/common/timsquad/architectures/hexagonal/backend.xml +300 -0
- package/templates/common/timsquad/constraints/competency-framework.xml +501 -0
- package/templates/common/timsquad/constraints/ssot-schema.xml +433 -0
- package/templates/common/timsquad/feedback/feedback-router.sh +341 -0
- package/templates/common/timsquad/feedback/routing-rules.yaml +352 -0
- package/templates/common/timsquad/generators/data-design.xml +290 -0
- package/templates/common/timsquad/generators/prd.xml +280 -0
- package/templates/common/timsquad/generators/requirements.xml +220 -0
- package/templates/common/timsquad/generators/service-spec.xml +266 -0
- package/templates/common/timsquad/logs/_example.md +81 -0
- package/templates/common/timsquad/logs/_template.md +46 -0
- package/templates/common/timsquad/patterns/cqrs.xml +127 -0
- package/templates/common/timsquad/patterns/event-sourcing.xml +85 -0
- package/templates/common/timsquad/patterns/repository.xml +64 -0
- package/templates/common/timsquad/process/state-machine.xml +343 -0
- package/templates/common/timsquad/process/validation-rules.xml +308 -0
- package/templates/common/timsquad/process/workflow-base.xml +202 -0
- package/templates/common/timsquad/retrospective/cycle-report.template.md +205 -0
- package/templates/common/timsquad/retrospective/metrics/metrics-schema.json +203 -0
- package/templates/common/timsquad/retrospective/patterns/failure-patterns.md +199 -0
- package/templates/common/timsquad/retrospective/patterns/success-patterns.md +262 -0
- package/templates/common/timsquad/retrospective/retrospective-config.xml +294 -0
- package/templates/common/timsquad/retrospective/retrospective-state.xml +210 -0
- package/templates/common/timsquad/ssot/adr/ADR-000-template.md +121 -0
- package/templates/common/timsquad/ssot/adr/ADR-001-example.md +115 -0
- package/templates/common/timsquad/ssot/data-design.template.md +132 -0
- package/templates/common/timsquad/ssot/deployment-spec.template.md +384 -0
- package/templates/common/timsquad/ssot/env-config.template.md +346 -0
- package/templates/common/timsquad/ssot/error-codes.template.md +114 -0
- package/templates/common/timsquad/ssot/functional-spec.template.md +185 -0
- package/templates/common/timsquad/ssot/glossary.template.md +148 -0
- package/templates/common/timsquad/ssot/integration-spec.template.md +391 -0
- package/templates/common/timsquad/ssot/planning.template.md +94 -0
- package/templates/common/timsquad/ssot/prd.template.md +102 -0
- package/templates/common/timsquad/ssot/requirements.template.md +117 -0
- package/templates/common/timsquad/ssot/security-spec.template.md +309 -0
- package/templates/common/timsquad/ssot/service-spec.template.md +194 -0
- package/templates/common/timsquad/ssot/test-spec.template.md +264 -0
- package/templates/common/timsquad/ssot/ui-ux-spec.template.md +262 -0
- package/templates/common/timsquad/state/workspace.xml +217 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Eric
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
# TimSquad
|
|
2
|
+
|
|
3
|
+
> **"AI 시대의 소프트웨어 개발 표준 프로세스"**
|
|
4
|
+
|
|
5
|
+
SSOT 기반 문서 체계, 최적화된 에이전트 롤, 회고적 학습을 통해 Claude Code에서 지속적으로 개선되는 고품질 소프트웨어 생성 프레임워크
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
최적화된 롤 정의 + 고도화된 스킬 + 회고적 학습 = 지속적으로 개선되는 고품질 결과물
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Why TimSquad?
|
|
14
|
+
|
|
15
|
+
| oh-my-* | **TimSquad** |
|
|
16
|
+
|---------|--------------|
|
|
17
|
+
| "Zero learning curve" | **"체계를 세우면 더 잘 된다"** |
|
|
18
|
+
| 알아서 해줌 | **개발자가 컨트롤** |
|
|
19
|
+
| 속도 최우선 | **품질 + 일관성 최우선** |
|
|
20
|
+
| Magic | **Structure** |
|
|
21
|
+
|
|
22
|
+
**For developers who want structure, not magic.**
|
|
23
|
+
|
|
24
|
+
### 타겟 사용자
|
|
25
|
+
|
|
26
|
+
- 체계적인 프로세스를 원하는 시니어 개발자
|
|
27
|
+
- 1인 CTO / 테크 리드 (혼자서 팀 수준의 품질 필요)
|
|
28
|
+
- 문서화와 일관성을 중시하는 개발자
|
|
29
|
+
|
|
30
|
+
### NOT for
|
|
31
|
+
|
|
32
|
+
- "알아서 해줘" 원하는 사람 → oh-my-claudecode 추천
|
|
33
|
+
- 코딩만 빠르게 하고 싶은 사람 → Claude Code 그냥 사용
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## Features
|
|
38
|
+
|
|
39
|
+
### SSOT (Single Source of Truth)
|
|
40
|
+
|
|
41
|
+
모든 에이전트가 참조하는 단일 문서 체계
|
|
42
|
+
|
|
43
|
+
```
|
|
44
|
+
.timsquad/ssot/
|
|
45
|
+
├── prd.md # 제품 요구사항 (Why)
|
|
46
|
+
├── requirements.md # 요건 정의 (What)
|
|
47
|
+
├── service-spec.md # API 명세 (프론트-백 계약서)
|
|
48
|
+
├── data-design.md # ERD, 데이터 설계
|
|
49
|
+
└── ...
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### 분수(Fountain) 모델
|
|
53
|
+
|
|
54
|
+
SSOT는 순차적 의존성, 실제 작업은 병렬 실행
|
|
55
|
+
|
|
56
|
+
```
|
|
57
|
+
SSOT (순차: PRD → 기획 → 설계)
|
|
58
|
+
│
|
|
59
|
+
┌────┼────┐
|
|
60
|
+
↓ ↓ ↓
|
|
61
|
+
화면 요건 API ← 병렬 작업
|
|
62
|
+
│ │ │
|
|
63
|
+
└────┼────┘
|
|
64
|
+
↓
|
|
65
|
+
ERD + 구현 (병렬)
|
|
66
|
+
↓
|
|
67
|
+
QA/Test
|
|
68
|
+
│
|
|
69
|
+
┌────┼────┐
|
|
70
|
+
↓ ↓ ↓
|
|
71
|
+
L1 L2 L3 ← 피드백 라우팅
|
|
72
|
+
↓
|
|
73
|
+
회고적 학습 → 템플릿/프롬프트 자동 개선
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
### 서브에이전트 시스템
|
|
77
|
+
|
|
78
|
+
```
|
|
79
|
+
.claude/agents/
|
|
80
|
+
├── tsq-planner.md # 기획/설계 (Opus)
|
|
81
|
+
├── tsq-developer.md # 코드 구현 (Sonnet)
|
|
82
|
+
├── tsq-qa.md # 검증/리뷰 (Sonnet)
|
|
83
|
+
├── tsq-security.md # 보안 검토
|
|
84
|
+
├── tsq-dba.md # DB 설계
|
|
85
|
+
├── tsq-designer.md # UI/UX 설계
|
|
86
|
+
├── tsq-prompter.md # 프롬프트 최적화
|
|
87
|
+
└── tsq-retro.md # 회고 분석
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### 토큰 효율성
|
|
91
|
+
|
|
92
|
+
| 작업 | oh-my-* 방식 | TimSquad 방식 | 절약률 |
|
|
93
|
+
|-----|-------------|--------------|-------|
|
|
94
|
+
| 피드백 분류 | LLM 판단 | YAML 규칙 | **100%** |
|
|
95
|
+
| 로그 저장 | "저장해" 프롬프트 | bash 파이프 | **100%** |
|
|
96
|
+
| 에이전트 선택 | LLM 오케스트레이터 | 프로그램 스케줄러 | **100%** |
|
|
97
|
+
| **전체** | 100% | 40-60% | **40-60% 절약** |
|
|
98
|
+
|
|
99
|
+
### XML 문서 생성기
|
|
100
|
+
|
|
101
|
+
토큰 효율적인 SSOT 문서 작성
|
|
102
|
+
|
|
103
|
+
```xml
|
|
104
|
+
<generator name="prd" output=".timsquad/ssot/prd.md">
|
|
105
|
+
<section id="basic" title="기본 정보">
|
|
106
|
+
<field name="project_name" type="text" required="true">
|
|
107
|
+
<prompt>프로젝트 이름?</prompt>
|
|
108
|
+
<refinement>영문 소문자, 하이픈 허용</refinement>
|
|
109
|
+
</field>
|
|
110
|
+
</section>
|
|
111
|
+
<output-template>...</output-template>
|
|
112
|
+
</generator>
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
## Installation
|
|
118
|
+
|
|
119
|
+
### npm (권장)
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
# 전역 설치
|
|
123
|
+
npm install -g timsquad
|
|
124
|
+
|
|
125
|
+
# 또는 npx로 직접 실행
|
|
126
|
+
npx timsquad init -n my-app -t web-service -l 2
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
### Git Clone
|
|
130
|
+
|
|
131
|
+
```bash
|
|
132
|
+
git clone https://github.com/sonature-lab/timsquad.git
|
|
133
|
+
cd timsquad
|
|
134
|
+
npm install
|
|
135
|
+
npm run build
|
|
136
|
+
npm link
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
141
|
+
## Quick Start
|
|
142
|
+
|
|
143
|
+
### 1. 프로젝트 초기화
|
|
144
|
+
|
|
145
|
+
```bash
|
|
146
|
+
# 새 프로젝트 생성
|
|
147
|
+
tsq init -n my-app -t web-service -l 2
|
|
148
|
+
|
|
149
|
+
# 옵션
|
|
150
|
+
# -n, --name 프로젝트 이름
|
|
151
|
+
# -t, --type 프로젝트 타입 (web-service, api-backend, platform, fintech, infra)
|
|
152
|
+
# -l, --level 프로젝트 레벨 (1=MVP, 2=Standard, 3=Enterprise)
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
### 2. 생성된 구조
|
|
156
|
+
|
|
157
|
+
```
|
|
158
|
+
my-app/
|
|
159
|
+
├── CLAUDE.md # PM 역할 정의
|
|
160
|
+
├── .claude/
|
|
161
|
+
│ ├── agents/ # 에이전트 정의
|
|
162
|
+
│ └── skills/ # 스킬 파일
|
|
163
|
+
└── .timsquad/
|
|
164
|
+
├── config.yaml # 프로젝트 설정
|
|
165
|
+
├── ssot/ # SSOT 문서
|
|
166
|
+
├── generators/ # 문서 생성기 (XML)
|
|
167
|
+
├── state/ # 현재 상태
|
|
168
|
+
├── knowledge/ # 프로젝트 지식
|
|
169
|
+
├── feedback/ # 피드백 시스템
|
|
170
|
+
├── retrospective/ # 회고 시스템
|
|
171
|
+
└── logs/ # 작업 로그
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
### 3. Claude Code에서 작업 시작
|
|
175
|
+
|
|
176
|
+
```bash
|
|
177
|
+
# Claude Code 실행
|
|
178
|
+
claude
|
|
179
|
+
|
|
180
|
+
# 에이전트 호출
|
|
181
|
+
@tsq-planner "PRD 작성 시작해줘"
|
|
182
|
+
@tsq-developer "로그인 API 구현해줘"
|
|
183
|
+
@tsq-qa "코드 리뷰해줘"
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
---
|
|
187
|
+
|
|
188
|
+
## CLI Commands
|
|
189
|
+
|
|
190
|
+
### 기본 커맨드
|
|
191
|
+
|
|
192
|
+
```bash
|
|
193
|
+
tsq init [options] # 프로젝트 초기화
|
|
194
|
+
tsq status [options] # 현재 상태 확인
|
|
195
|
+
tsq log <subcommand> # 작업 로그 관리
|
|
196
|
+
tsq feedback <message> # 피드백 라우팅
|
|
197
|
+
tsq retro <subcommand> # 회고 실행
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
### 작업 모드
|
|
201
|
+
|
|
202
|
+
```bash
|
|
203
|
+
tsq q "버튼 색상 변경" # Quick Mode - 간단한 작업
|
|
204
|
+
tsq f "결제 기능 추가" # Full Mode - SSOT 체크 + Planner 라우팅
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
### Git 커맨드
|
|
208
|
+
|
|
209
|
+
```bash
|
|
210
|
+
tsq commit [message] # 스테이징 + Co-Author 커밋
|
|
211
|
+
tsq pr [title] # 푸시 + PR 생성 (gh CLI 필요)
|
|
212
|
+
tsq release [version] # 태그 + GitHub Release 생성
|
|
213
|
+
tsq sync # fetch + rebase
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
### 자동화 커맨드
|
|
217
|
+
|
|
218
|
+
```bash
|
|
219
|
+
tsq watch start # SSOT 파일 변경 감시 시작
|
|
220
|
+
tsq watch stop # 감시 중지
|
|
221
|
+
tsq metrics collect # 메트릭 수집
|
|
222
|
+
tsq metrics summary # 메트릭 요약 표시
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
---
|
|
226
|
+
|
|
227
|
+
## Project Types
|
|
228
|
+
|
|
229
|
+
| 타입 | 설명 | 추가 문서 | Consensus |
|
|
230
|
+
|-----|------|----------|-----------|
|
|
231
|
+
| **web-service** | SaaS, 웹앱 | ui-ux-spec | 선택적 |
|
|
232
|
+
| **api-backend** | API 서버, 마이크로서비스 | - | 선택적 |
|
|
233
|
+
| **platform** | 프레임워크, SDK | integration-spec | 선택적 |
|
|
234
|
+
| **fintech** | 거래소, 결제 | security-spec | **필수** |
|
|
235
|
+
| **infra** | DevOps, 자동화 | deployment-spec | 선택적 |
|
|
236
|
+
|
|
237
|
+
---
|
|
238
|
+
|
|
239
|
+
## Project Levels
|
|
240
|
+
|
|
241
|
+
| Level | 설명 | 필수 문서 | 대상 |
|
|
242
|
+
|-------|-----|----------|-----|
|
|
243
|
+
| **1 (MVP)** | 최소 문서 | prd, requirements, service-spec, data-design | 사이드 프로젝트, PoC |
|
|
244
|
+
| **2 (Standard)** | 표준 문서 | L1 + glossary, error-codes, test-spec, ADR | 일반 프로젝트, 스타트업 |
|
|
245
|
+
| **3 (Enterprise)** | 전체 문서 | L2 + security-spec, deployment-spec | 엔터프라이즈, fintech |
|
|
246
|
+
|
|
247
|
+
---
|
|
248
|
+
|
|
249
|
+
## Feedback Routing
|
|
250
|
+
|
|
251
|
+
피드백 레벨에 따라 적절한 담당자에게 자동 라우팅
|
|
252
|
+
|
|
253
|
+
| Level | 유형 | 트리거 | 라우팅 |
|
|
254
|
+
|-------|-----|--------|--------|
|
|
255
|
+
| **1** | 구현 수정 | test_failure, lint_error, type_error | → Developer |
|
|
256
|
+
| **2** | 설계 수정 | api_mismatch, architecture_issue | → Planner (Architect) |
|
|
257
|
+
| **3** | 기획 수정 | requirement_ambiguity, scope_change | → Planner → **User 승인** |
|
|
258
|
+
|
|
259
|
+
---
|
|
260
|
+
|
|
261
|
+
## Retrospective Learning
|
|
262
|
+
|
|
263
|
+
개발 사이클 완료 후 자동 회고 및 개선
|
|
264
|
+
|
|
265
|
+
```bash
|
|
266
|
+
tsq retro
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
1. **로그 수집** - 에이전트별 작업 로그, 피드백 이력
|
|
270
|
+
2. **패턴 분석** - 반복 실패/성공 패턴, 병목 지점
|
|
271
|
+
3. **개선 제안** - 프롬프트/템플릿 개선안 생성
|
|
272
|
+
4. **사용자 승인** - 검토 후 적용
|
|
273
|
+
5. **적용** - Lessons Learned 추가, 템플릿 업데이트
|
|
274
|
+
|
|
275
|
+
---
|
|
276
|
+
|
|
277
|
+
## Theoretical Background
|
|
278
|
+
|
|
279
|
+
| 이론/논문 | 핵심 개념 | TimSquad 적용 |
|
|
280
|
+
|---------|---------|--------------|
|
|
281
|
+
| **Agentsway** (2025) | Prompting Agent, Retrospective Learning | 프롬프트 최적화, 회고적 학습 |
|
|
282
|
+
| **ACM TOSEM** (2025) | Competency Mapping | 역량 프레임워크, 성과 지표 |
|
|
283
|
+
| **Agentic SE** (2025) | AGENT.md, Meta-Prompt Files | 계층화된 메타-프롬프트 구조 |
|
|
284
|
+
| **FRAME** (2025) | Feedback-Driven Refinement | 레벨별 피드백 라우팅 |
|
|
285
|
+
|
|
286
|
+
---
|
|
287
|
+
|
|
288
|
+
## Configuration
|
|
289
|
+
|
|
290
|
+
`.timsquad/config.yaml`:
|
|
291
|
+
|
|
292
|
+
```yaml
|
|
293
|
+
project:
|
|
294
|
+
name: "my-app"
|
|
295
|
+
type: web-service
|
|
296
|
+
level: 2
|
|
297
|
+
|
|
298
|
+
agents:
|
|
299
|
+
planner:
|
|
300
|
+
model: opus
|
|
301
|
+
developer:
|
|
302
|
+
model: sonnet
|
|
303
|
+
qa:
|
|
304
|
+
model: sonnet
|
|
305
|
+
|
|
306
|
+
methodology:
|
|
307
|
+
development: tdd
|
|
308
|
+
process: agile
|
|
309
|
+
branching: github-flow
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
---
|
|
313
|
+
|
|
314
|
+
## Roadmap
|
|
315
|
+
|
|
316
|
+
- [x] **Phase 0 (MVP)** - common 템플릿, 기본 에이전트, CLI
|
|
317
|
+
- [ ] **Phase 1** - 타입별 템플릿 확장, 회고 시스템 고도화
|
|
318
|
+
- [ ] **Phase 2** - Plugin 배포, MCP 서버, 멀티 LLM 지원
|
|
319
|
+
|
|
320
|
+
---
|
|
321
|
+
|
|
322
|
+
## Contributing
|
|
323
|
+
|
|
324
|
+
기여를 환영합니다! 다음을 참고해주세요:
|
|
325
|
+
|
|
326
|
+
1. Fork the repository
|
|
327
|
+
2. Create your feature branch (`git checkout -b feature/amazing-feature`)
|
|
328
|
+
3. Commit your changes (`git commit -m 'Add amazing feature'`)
|
|
329
|
+
4. Push to the branch (`git push origin feature/amazing-feature`)
|
|
330
|
+
5. Open a Pull Request
|
|
331
|
+
|
|
332
|
+
---
|
|
333
|
+
|
|
334
|
+
## License
|
|
335
|
+
|
|
336
|
+
MIT License - see [LICENSE](LICENSE) for details.
|
|
337
|
+
|
|
338
|
+
---
|
|
339
|
+
|
|
340
|
+
## Related Projects
|
|
341
|
+
|
|
342
|
+
- [Anthropic Skills](https://github.com/anthropics/skills)
|
|
343
|
+
- [Superpowers](https://github.com/obra/superpowers)
|
|
344
|
+
|
|
345
|
+
---
|
|
346
|
+
|
|
347
|
+
**TimSquad v2.0** - AI Agent Development Process Framework
|
package/bin/tsq.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feedback.d.ts","sourceRoot":"","sources":["../../src/commands/feedback.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUpC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAY9D"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import path from 'path';
|
|
2
|
+
import { colors, printHeader, printError, printSuccess, printKeyValue } from '../utils/colors.js';
|
|
3
|
+
import { findProjectRoot } from '../lib/project.js';
|
|
4
|
+
import { exists, readFile, writeFile } from '../utils/fs.js';
|
|
5
|
+
import { loadYaml } from '../utils/yaml.js';
|
|
6
|
+
import { getDateString, getTimeString } from '../utils/date.js';
|
|
7
|
+
import { DEFAULT_ROUTING_RULES } from '../types/feedback.js';
|
|
8
|
+
export function registerFeedbackCommand(program) {
|
|
9
|
+
program
|
|
10
|
+
.command('feedback <message>')
|
|
11
|
+
.description('Route feedback to appropriate agent')
|
|
12
|
+
.action(async (message) => {
|
|
13
|
+
try {
|
|
14
|
+
await routeFeedback(message);
|
|
15
|
+
}
|
|
16
|
+
catch (error) {
|
|
17
|
+
printError(error.message);
|
|
18
|
+
process.exit(1);
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
async function routeFeedback(message) {
|
|
23
|
+
const projectRoot = await findProjectRoot();
|
|
24
|
+
if (!projectRoot) {
|
|
25
|
+
throw new Error('Not a TimSquad project');
|
|
26
|
+
}
|
|
27
|
+
// Load routing rules
|
|
28
|
+
const rulesPath = path.join(projectRoot, '.timsquad', 'feedback', 'routing-rules.yaml');
|
|
29
|
+
let rules = DEFAULT_ROUTING_RULES;
|
|
30
|
+
if (await exists(rulesPath)) {
|
|
31
|
+
rules = await loadYaml(rulesPath);
|
|
32
|
+
}
|
|
33
|
+
// Classify feedback
|
|
34
|
+
const result = classifyFeedback(message, rules);
|
|
35
|
+
printHeader('Feedback Routing');
|
|
36
|
+
printKeyValue('Message', message.substring(0, 50) + (message.length > 50 ? '...' : ''));
|
|
37
|
+
printKeyValue('Level', `${result.level} (${getLevelName(result.level)})`);
|
|
38
|
+
printKeyValue('Route to', result.routeTo);
|
|
39
|
+
printKeyValue('Approval required', result.approvalRequired ? 'Yes' : 'No');
|
|
40
|
+
// Log feedback
|
|
41
|
+
await logFeedback(projectRoot, message, result);
|
|
42
|
+
console.log('');
|
|
43
|
+
if (result.approvalRequired) {
|
|
44
|
+
console.log(colors.warning('⚠ This feedback requires user approval before action'));
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
printSuccess(`Feedback routed to ${result.routeTo}`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
function classifyFeedback(message, rules) {
|
|
51
|
+
const lowerMessage = message.toLowerCase();
|
|
52
|
+
// Check Level 1 triggers (implementation issues)
|
|
53
|
+
for (const trigger of rules.level_1.triggers) {
|
|
54
|
+
const patterns = getTriggerPatterns(trigger);
|
|
55
|
+
if (patterns.some(p => lowerMessage.includes(p))) {
|
|
56
|
+
return {
|
|
57
|
+
level: 1,
|
|
58
|
+
routeTo: rules.level_1.route_to,
|
|
59
|
+
approvalRequired: rules.level_1.approval_required,
|
|
60
|
+
trigger,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// Check Level 2 triggers (design issues)
|
|
65
|
+
for (const trigger of rules.level_2.triggers) {
|
|
66
|
+
const patterns = getTriggerPatterns(trigger);
|
|
67
|
+
if (patterns.some(p => lowerMessage.includes(p))) {
|
|
68
|
+
return {
|
|
69
|
+
level: 2,
|
|
70
|
+
routeTo: rules.level_2.route_to,
|
|
71
|
+
approvalRequired: rules.level_2.approval_required,
|
|
72
|
+
trigger,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// Check Level 3 triggers (planning issues)
|
|
77
|
+
for (const trigger of rules.level_3.triggers) {
|
|
78
|
+
const patterns = getTriggerPatterns(trigger);
|
|
79
|
+
if (patterns.some(p => lowerMessage.includes(p))) {
|
|
80
|
+
return {
|
|
81
|
+
level: 3,
|
|
82
|
+
routeTo: 'user',
|
|
83
|
+
approvalRequired: rules.level_3.approval_required,
|
|
84
|
+
trigger,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
// Default to Level 1 (developer)
|
|
89
|
+
return {
|
|
90
|
+
level: 1,
|
|
91
|
+
routeTo: 'developer',
|
|
92
|
+
approvalRequired: false,
|
|
93
|
+
trigger: 'default',
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
function getTriggerPatterns(trigger) {
|
|
97
|
+
const patterns = {
|
|
98
|
+
test_failure: ['test fail', 'test error', '테스트 실패', 'assertion', 'expect'],
|
|
99
|
+
lint_error: ['lint', 'eslint', 'prettier', 'format'],
|
|
100
|
+
type_error: ['type error', 'typescript', '타입 에러', 'type mismatch'],
|
|
101
|
+
runtime_error: ['runtime', 'exception', '런타임', 'crash', 'undefined'],
|
|
102
|
+
code_style_violation: ['style', 'convention', '컨벤션', 'naming'],
|
|
103
|
+
architecture_issue: ['architecture', '아키텍처', 'structure', 'design pattern'],
|
|
104
|
+
api_mismatch: ['api', 'endpoint', '명세', 'spec', 'contract'],
|
|
105
|
+
performance_problem: ['performance', '성능', 'slow', 'memory', 'leak'],
|
|
106
|
+
scalability_concern: ['scale', '확장', 'load', 'bottleneck'],
|
|
107
|
+
security_vulnerability: ['security', '보안', 'vulnerability', 'xss', 'injection'],
|
|
108
|
+
requirement_ambiguity: ['requirement', '요구사항', 'unclear', '불명확', 'ambiguous'],
|
|
109
|
+
scope_change: ['scope', '범위', 'change request', '변경'],
|
|
110
|
+
business_logic_error: ['business', '비즈니스', 'logic', '로직'],
|
|
111
|
+
feature_request: ['feature', '기능', 'request', '요청', 'add'],
|
|
112
|
+
stakeholder_feedback: ['stakeholder', 'client', '고객', 'user feedback'],
|
|
113
|
+
};
|
|
114
|
+
return patterns[trigger] || [trigger.replace(/_/g, ' ')];
|
|
115
|
+
}
|
|
116
|
+
function getLevelName(level) {
|
|
117
|
+
const names = {
|
|
118
|
+
1: '구현 수정',
|
|
119
|
+
2: '설계 수정',
|
|
120
|
+
3: '기획 수정',
|
|
121
|
+
};
|
|
122
|
+
return names[level];
|
|
123
|
+
}
|
|
124
|
+
async function logFeedback(projectRoot, message, result) {
|
|
125
|
+
const date = getDateString();
|
|
126
|
+
const time = getTimeString();
|
|
127
|
+
const logDir = path.join(projectRoot, '.timsquad', 'logs');
|
|
128
|
+
const logFile = path.join(logDir, `${date}-feedback.md`);
|
|
129
|
+
let content = '';
|
|
130
|
+
if (await exists(logFile)) {
|
|
131
|
+
content = await readFile(logFile);
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
content = `# Feedback Log - ${date}\n\n`;
|
|
135
|
+
}
|
|
136
|
+
content += `## ${time} [Level ${result.level}]\n\n`;
|
|
137
|
+
content += `**Trigger:** ${result.trigger}\n`;
|
|
138
|
+
content += `**Route to:** ${result.routeTo}\n`;
|
|
139
|
+
content += `**Message:**\n\n${message}\n\n---\n\n`;
|
|
140
|
+
await writeFile(logFile, content);
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=feedback.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feedback.js","sourceRoot":"","sources":["../../src/commands/feedback.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"full.d.ts","sourceRoot":"","sources":["../../src/commands/full.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAa1D"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import path from 'path';
|
|
2
|
+
import { colors, printHeader, printError, printSuccess, printKeyValue } from '../utils/colors.js';
|
|
3
|
+
import { findProjectRoot, getSSOTStatus, getCurrentPhase } from '../lib/project.js';
|
|
4
|
+
import { exists, writeFile, readFile } from '../utils/fs.js';
|
|
5
|
+
import { getDateString, getTimeString } from '../utils/date.js';
|
|
6
|
+
export function registerFullCommand(program) {
|
|
7
|
+
program
|
|
8
|
+
.command('f <task>')
|
|
9
|
+
.alias('full')
|
|
10
|
+
.description('Full mode with SSOT checks and Planner routing')
|
|
11
|
+
.action(async (task) => {
|
|
12
|
+
try {
|
|
13
|
+
await runFullMode(task);
|
|
14
|
+
}
|
|
15
|
+
catch (error) {
|
|
16
|
+
printError(error.message);
|
|
17
|
+
process.exit(1);
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
async function runFullMode(task) {
|
|
22
|
+
const projectRoot = await findProjectRoot();
|
|
23
|
+
if (!projectRoot) {
|
|
24
|
+
throw new Error('Not a TimSquad project. Run "tsq init" first.');
|
|
25
|
+
}
|
|
26
|
+
printHeader('Full Mode');
|
|
27
|
+
printKeyValue('Task', task);
|
|
28
|
+
// Get current phase
|
|
29
|
+
const phase = await getCurrentPhase(projectRoot);
|
|
30
|
+
printKeyValue('Current Phase', phase.current);
|
|
31
|
+
// Check SSOT status
|
|
32
|
+
const ssotDocs = await getSSOTStatus(projectRoot);
|
|
33
|
+
const filledDocs = ssotDocs.filter(d => d.filled && d.required);
|
|
34
|
+
const requiredDocs = ssotDocs.filter(d => d.required);
|
|
35
|
+
printKeyValue('SSOT Status', `${filledDocs.length}/${requiredDocs.length} documents ready`);
|
|
36
|
+
console.log('');
|
|
37
|
+
// Warn about incomplete SSOT
|
|
38
|
+
const missingDocs = requiredDocs.filter(d => !d.filled);
|
|
39
|
+
if (missingDocs.length > 0) {
|
|
40
|
+
console.log(colors.warning('⚠ Missing required SSOT documents:'));
|
|
41
|
+
missingDocs.forEach(doc => {
|
|
42
|
+
console.log(colors.dim(` - ${doc.name}.md`));
|
|
43
|
+
});
|
|
44
|
+
console.log('');
|
|
45
|
+
}
|
|
46
|
+
// Log the full task
|
|
47
|
+
await logFullTask(projectRoot, task, phase.current);
|
|
48
|
+
printSuccess('Full task logged');
|
|
49
|
+
console.log('');
|
|
50
|
+
console.log(colors.subheader('Instructions for Claude:'));
|
|
51
|
+
console.log(colors.dim('─'.repeat(50)));
|
|
52
|
+
console.log(`Execute this task with full SSOT compliance:\n`);
|
|
53
|
+
console.log(colors.highlight(` ${task}\n`));
|
|
54
|
+
console.log(colors.subheader('Required Steps:'));
|
|
55
|
+
console.log(colors.dim(' 1. Check SSOT documents for requirements'));
|
|
56
|
+
console.log(colors.dim(' 2. Validate against service-spec.md'));
|
|
57
|
+
console.log(colors.dim(' 3. Follow architecture patterns'));
|
|
58
|
+
console.log(colors.dim(' 4. Write tests (TDD)'));
|
|
59
|
+
console.log(colors.dim(' 5. Request QA review'));
|
|
60
|
+
console.log(colors.dim('─'.repeat(50)));
|
|
61
|
+
console.log('');
|
|
62
|
+
console.log(colors.dim('SSOT documents:'));
|
|
63
|
+
console.log(colors.path(' .timsquad/ssot/prd.md'));
|
|
64
|
+
console.log(colors.path(' .timsquad/ssot/service-spec.md'));
|
|
65
|
+
console.log(colors.path(' .timsquad/ssot/data-design.md'));
|
|
66
|
+
}
|
|
67
|
+
async function logFullTask(projectRoot, task, currentPhase) {
|
|
68
|
+
const date = getDateString();
|
|
69
|
+
const time = getTimeString();
|
|
70
|
+
const logDir = path.join(projectRoot, '.timsquad', 'logs');
|
|
71
|
+
const logFile = path.join(logDir, `${date}-planner.md`);
|
|
72
|
+
let content = '';
|
|
73
|
+
if (await exists(logFile)) {
|
|
74
|
+
content = await readFile(logFile);
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
content = `# Planner Log - ${date}\n\n`;
|
|
78
|
+
}
|
|
79
|
+
content += `## ${time} [work] 📝\n\n`;
|
|
80
|
+
content += `**Task**: ${task}\n`;
|
|
81
|
+
content += `**Phase**: ${currentPhase}\n`;
|
|
82
|
+
content += `**Mode**: Full (SSOT compliance)\n`;
|
|
83
|
+
content += `**Status**: Pending assignment\n`;
|
|
84
|
+
content += `\n---\n\n`;
|
|
85
|
+
await writeFile(logFile, content);
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=full.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"full.js","sourceRoot":"","sources":["../../src/commands/full.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commit.d.ts","sourceRoot":"","sources":["../../../src/commands/git/commit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAc5D"}
|