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
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<!--
|
|
3
|
+
TimSquad Data Design Generator v1.0
|
|
4
|
+
데이터베이스 설계 (ERD, 테이블 정의)를 생성합니다.
|
|
5
|
+
-->
|
|
6
|
+
<generator name="data-design" version="1.0" output=".timsquad/ssot/data-design.md">
|
|
7
|
+
<metadata>
|
|
8
|
+
<description>데이터 설계서 생성기</description>
|
|
9
|
+
<purpose>ERD, 테이블 정의, 인덱스 전략</purpose>
|
|
10
|
+
<depends-on>prd.md, service-spec.md</depends-on>
|
|
11
|
+
</metadata>
|
|
12
|
+
|
|
13
|
+
<instructions>
|
|
14
|
+
<![CDATA[
|
|
15
|
+
기능과 API를 기반으로 필요한 테이블을 도출합니다.
|
|
16
|
+
|
|
17
|
+
1. 핵심 엔티티 식별 (User, Match 등)
|
|
18
|
+
2. 각 테이블의 컬럼 정의
|
|
19
|
+
3. 관계(FK) 설정
|
|
20
|
+
4. 인덱스 전략
|
|
21
|
+
|
|
22
|
+
정제 원칙:
|
|
23
|
+
- 테이블명: 소문자, 복수형 (users, matches)
|
|
24
|
+
- 컬럼명: snake_case
|
|
25
|
+
- PK: id (UUID 또는 auto increment)
|
|
26
|
+
- 타임스탬프: created_at, updated_at 필수
|
|
27
|
+
]]>
|
|
28
|
+
</instructions>
|
|
29
|
+
|
|
30
|
+
<!-- ============================================================
|
|
31
|
+
섹션 1: 테이블 정의
|
|
32
|
+
============================================================ -->
|
|
33
|
+
<section id="tables" title="테이블 정의" repeatable="true">
|
|
34
|
+
<field name="name" type="text" required="true">
|
|
35
|
+
<prompt>테이블 이름? (예: users, matches, messages)</prompt>
|
|
36
|
+
<refinement>소문자, 복수형, snake_case</refinement>
|
|
37
|
+
</field>
|
|
38
|
+
|
|
39
|
+
<field name="description" type="text" required="true">
|
|
40
|
+
<prompt>이 테이블의 역할?</prompt>
|
|
41
|
+
</field>
|
|
42
|
+
|
|
43
|
+
<field name="columns" type="table" required="true">
|
|
44
|
+
<prompt>컬럼을 정의하세요 (이름:타입:설명 형식, 여러 줄)</prompt>
|
|
45
|
+
<auto-include>
|
|
46
|
+
<column name="id" type="uuid" pk="true">Primary Key</column>
|
|
47
|
+
<column name="created_at" type="timestamp">생성 시각</column>
|
|
48
|
+
<column name="updated_at" type="timestamp">수정 시각</column>
|
|
49
|
+
</auto-include>
|
|
50
|
+
<hint>
|
|
51
|
+
email:varchar(255):이메일 주소
|
|
52
|
+
nickname:varchar(50):닉네임
|
|
53
|
+
skill_level:integer:실력 레벨 (1-10)
|
|
54
|
+
</hint>
|
|
55
|
+
<types>
|
|
56
|
+
<type name="uuid">UUID</type>
|
|
57
|
+
<type name="varchar">VARCHAR(n)</type>
|
|
58
|
+
<type name="text">TEXT</type>
|
|
59
|
+
<type name="integer">INTEGER</type>
|
|
60
|
+
<type name="bigint">BIGINT</type>
|
|
61
|
+
<type name="boolean">BOOLEAN</type>
|
|
62
|
+
<type name="timestamp">TIMESTAMP</type>
|
|
63
|
+
<type name="date">DATE</type>
|
|
64
|
+
<type name="jsonb">JSONB</type>
|
|
65
|
+
<type name="decimal">DECIMAL(p,s)</type>
|
|
66
|
+
</types>
|
|
67
|
+
</field>
|
|
68
|
+
|
|
69
|
+
<field name="indexes" type="list" required="false">
|
|
70
|
+
<prompt>인덱스가 필요한 컬럼? (검색, 정렬에 자주 사용되는)</prompt>
|
|
71
|
+
<hint>email (unique), skill_level, created_at</hint>
|
|
72
|
+
</field>
|
|
73
|
+
</section>
|
|
74
|
+
|
|
75
|
+
<!-- ============================================================
|
|
76
|
+
섹션 2: 관계 정의
|
|
77
|
+
============================================================ -->
|
|
78
|
+
<section id="relations" title="관계 정의" repeatable="true">
|
|
79
|
+
<field name="from_table" type="text" required="true">
|
|
80
|
+
<prompt>FK가 있는 테이블?</prompt>
|
|
81
|
+
</field>
|
|
82
|
+
|
|
83
|
+
<field name="to_table" type="text" required="true">
|
|
84
|
+
<prompt>참조하는 테이블?</prompt>
|
|
85
|
+
</field>
|
|
86
|
+
|
|
87
|
+
<field name="relation_type" type="select" required="true">
|
|
88
|
+
<prompt>관계 유형?</prompt>
|
|
89
|
+
<options>
|
|
90
|
+
<option value="1:1">1:1 (One to One)</option>
|
|
91
|
+
<option value="1:N">1:N (One to Many)</option>
|
|
92
|
+
<option value="N:M">N:M (Many to Many)</option>
|
|
93
|
+
</options>
|
|
94
|
+
</field>
|
|
95
|
+
|
|
96
|
+
<field name="fk_column" type="text" required="true">
|
|
97
|
+
<prompt>FK 컬럼명?</prompt>
|
|
98
|
+
<auto-suggest>{{to_table | singular}}_id</auto-suggest>
|
|
99
|
+
</field>
|
|
100
|
+
|
|
101
|
+
<field name="on_delete" type="select" required="false">
|
|
102
|
+
<prompt>삭제 시 동작?</prompt>
|
|
103
|
+
<options>
|
|
104
|
+
<option value="CASCADE">CASCADE - 함께 삭제</option>
|
|
105
|
+
<option value="SET NULL">SET NULL - NULL로 설정</option>
|
|
106
|
+
<option value="RESTRICT">RESTRICT - 삭제 방지</option>
|
|
107
|
+
</options>
|
|
108
|
+
<default>CASCADE</default>
|
|
109
|
+
</field>
|
|
110
|
+
</section>
|
|
111
|
+
|
|
112
|
+
<!-- ============================================================
|
|
113
|
+
섹션 3: Enum 정의
|
|
114
|
+
============================================================ -->
|
|
115
|
+
<section id="enums" title="Enum 정의" repeatable="true" optional="true">
|
|
116
|
+
<field name="name" type="text" required="true">
|
|
117
|
+
<prompt>Enum 이름? (예: match_status, user_role)</prompt>
|
|
118
|
+
</field>
|
|
119
|
+
|
|
120
|
+
<field name="values" type="list" required="true">
|
|
121
|
+
<prompt>가능한 값들?</prompt>
|
|
122
|
+
<hint>pending, accepted, rejected, completed</hint>
|
|
123
|
+
</field>
|
|
124
|
+
</section>
|
|
125
|
+
|
|
126
|
+
<!-- ============================================================
|
|
127
|
+
섹션 4: 인덱스 전략
|
|
128
|
+
============================================================ -->
|
|
129
|
+
<section id="index_strategy" title="인덱스 전략">
|
|
130
|
+
<field name="composite_indexes" type="list" required="false">
|
|
131
|
+
<prompt>복합 인덱스가 필요한 경우? (테이블.컬럼1,컬럼2)</prompt>
|
|
132
|
+
<hint>matches.user_id,status</hint>
|
|
133
|
+
</field>
|
|
134
|
+
|
|
135
|
+
<field name="full_text" type="list" required="false">
|
|
136
|
+
<prompt>전문 검색이 필요한 컬럼?</prompt>
|
|
137
|
+
<hint>users.bio, messages.content</hint>
|
|
138
|
+
</field>
|
|
139
|
+
</section>
|
|
140
|
+
|
|
141
|
+
<!-- ============================================================
|
|
142
|
+
출력 템플릿
|
|
143
|
+
============================================================ -->
|
|
144
|
+
<output-template>
|
|
145
|
+
<![CDATA[
|
|
146
|
+
# {{project_name}} 데이터 설계서
|
|
147
|
+
|
|
148
|
+
**생성일**: {{DATE}}
|
|
149
|
+
**버전**: 1.0
|
|
150
|
+
**DBMS**: {{tech.database | default: "PostgreSQL"}}
|
|
151
|
+
|
|
152
|
+
---
|
|
153
|
+
|
|
154
|
+
## 1. ERD 개요
|
|
155
|
+
|
|
156
|
+
```
|
|
157
|
+
{{#each tables}}
|
|
158
|
+
[{{name}}]
|
|
159
|
+
{{/each}}
|
|
160
|
+
|
|
161
|
+
관계:
|
|
162
|
+
{{#each relations}}
|
|
163
|
+
{{from_table}} {{relation_type}} {{to_table}} ({{fk_column}})
|
|
164
|
+
{{/each}}
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
---
|
|
168
|
+
|
|
169
|
+
## 2. 테이블 정의
|
|
170
|
+
|
|
171
|
+
{{#each tables}}
|
|
172
|
+
### 2.{{@index + 1}} {{name}}
|
|
173
|
+
|
|
174
|
+
> {{description}}
|
|
175
|
+
|
|
176
|
+
| Column | Type | Nullable | Default | Description |
|
|
177
|
+
|--------|------|:--------:|---------|-------------|
|
|
178
|
+
| id | UUID | NO | gen_random_uuid() | PK |
|
|
179
|
+
{{#each columns}}
|
|
180
|
+
| {{name}} | {{type}} | {{#if nullable}}YES{{else}}NO{{/if}} | {{default | default: "-"}} | {{description}} |
|
|
181
|
+
{{/each}}
|
|
182
|
+
| created_at | TIMESTAMP | NO | now() | 생성 시각 |
|
|
183
|
+
| updated_at | TIMESTAMP | NO | now() | 수정 시각 |
|
|
184
|
+
|
|
185
|
+
{{#if indexes}}
|
|
186
|
+
**인덱스:**
|
|
187
|
+
{{#each indexes}}
|
|
188
|
+
- `idx_{{../name}}_{{this}}` ON ({{this}})
|
|
189
|
+
{{/each}}
|
|
190
|
+
{{/if}}
|
|
191
|
+
|
|
192
|
+
```sql
|
|
193
|
+
CREATE TABLE {{name}} (
|
|
194
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
195
|
+
{{#each columns}}
|
|
196
|
+
{{name}} {{type}}{{#unless nullable}} NOT NULL{{/unless}}{{#if default}} DEFAULT {{default}}{{/if}},
|
|
197
|
+
{{/each}}
|
|
198
|
+
created_at TIMESTAMP NOT NULL DEFAULT now(),
|
|
199
|
+
updated_at TIMESTAMP NOT NULL DEFAULT now()
|
|
200
|
+
);
|
|
201
|
+
|
|
202
|
+
{{#each indexes}}
|
|
203
|
+
CREATE INDEX idx_{{../name}}_{{this}} ON {{../name}}({{this}});
|
|
204
|
+
{{/each}}
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
---
|
|
208
|
+
|
|
209
|
+
{{/each}}
|
|
210
|
+
|
|
211
|
+
## 3. 관계 (Foreign Keys)
|
|
212
|
+
|
|
213
|
+
| From | To | Type | FK Column | On Delete |
|
|
214
|
+
|------|-----|:----:|-----------|-----------|
|
|
215
|
+
{{#each relations}}
|
|
216
|
+
| {{from_table}} | {{to_table}} | {{relation_type}} | {{fk_column}} | {{on_delete}} |
|
|
217
|
+
{{/each}}
|
|
218
|
+
|
|
219
|
+
```sql
|
|
220
|
+
{{#each relations}}
|
|
221
|
+
ALTER TABLE {{from_table}}
|
|
222
|
+
ADD CONSTRAINT fk_{{from_table}}_{{to_table}}
|
|
223
|
+
FOREIGN KEY ({{fk_column}}) REFERENCES {{to_table}}(id)
|
|
224
|
+
ON DELETE {{on_delete}};
|
|
225
|
+
|
|
226
|
+
{{/each}}
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
---
|
|
230
|
+
|
|
231
|
+
{{#if enums}}
|
|
232
|
+
## 4. Enum 정의
|
|
233
|
+
|
|
234
|
+
{{#each enums}}
|
|
235
|
+
### {{name}}
|
|
236
|
+
|
|
237
|
+
```sql
|
|
238
|
+
CREATE TYPE {{name}} AS ENUM (
|
|
239
|
+
{{#each values}}
|
|
240
|
+
'{{this}}'{{#unless @last}},{{/unless}}
|
|
241
|
+
{{/each}}
|
|
242
|
+
);
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
{{/each}}
|
|
246
|
+
{{/if}}
|
|
247
|
+
|
|
248
|
+
---
|
|
249
|
+
|
|
250
|
+
## 5. 인덱스 전략
|
|
251
|
+
|
|
252
|
+
### 5.1 단일 컬럼 인덱스
|
|
253
|
+
{{#each tables}}
|
|
254
|
+
{{#if indexes}}
|
|
255
|
+
- `{{name}}`: {{#each indexes}}{{this}}{{#unless @last}}, {{/unless}}{{/each}}
|
|
256
|
+
{{/if}}
|
|
257
|
+
{{/each}}
|
|
258
|
+
|
|
259
|
+
{{#if index_strategy.composite_indexes}}
|
|
260
|
+
### 5.2 복합 인덱스
|
|
261
|
+
{{#each index_strategy.composite_indexes}}
|
|
262
|
+
- {{this}}
|
|
263
|
+
{{/each}}
|
|
264
|
+
{{/if}}
|
|
265
|
+
|
|
266
|
+
{{#if index_strategy.full_text}}
|
|
267
|
+
### 5.3 전문 검색 인덱스
|
|
268
|
+
{{#each index_strategy.full_text}}
|
|
269
|
+
- {{this}}
|
|
270
|
+
{{/each}}
|
|
271
|
+
{{/if}}
|
|
272
|
+
|
|
273
|
+
---
|
|
274
|
+
|
|
275
|
+
## 6. 마이그레이션 순서
|
|
276
|
+
|
|
277
|
+
1. Enum 타입 생성
|
|
278
|
+
2. 테이블 생성 (의존성 없는 것 먼저)
|
|
279
|
+
{{#each tables}}
|
|
280
|
+
- {{name}}
|
|
281
|
+
{{/each}}
|
|
282
|
+
3. Foreign Key 추가
|
|
283
|
+
4. 인덱스 생성
|
|
284
|
+
|
|
285
|
+
---
|
|
286
|
+
|
|
287
|
+
*Generated by TimSquad v2.0*
|
|
288
|
+
]]>
|
|
289
|
+
</output-template>
|
|
290
|
+
</generator>
|
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<!--
|
|
3
|
+
TimSquad PRD Generator v1.0
|
|
4
|
+
메인 세션이 이 템플릿을 읽고 사용자와 대화하며 PRD를 생성합니다.
|
|
5
|
+
-->
|
|
6
|
+
<generator name="prd" version="1.0" output=".timsquad/ssot/prd.md">
|
|
7
|
+
<metadata>
|
|
8
|
+
<description>제품 요구사항 정의서 (PRD) 생성기</description>
|
|
9
|
+
<purpose>프로젝트의 목적, 타겟, 핵심 기능을 정의</purpose>
|
|
10
|
+
</metadata>
|
|
11
|
+
|
|
12
|
+
<instructions>
|
|
13
|
+
<![CDATA[
|
|
14
|
+
이 생성기를 사용하여 PRD를 작성합니다.
|
|
15
|
+
|
|
16
|
+
1. 각 섹션의 필드를 순서대로 질문하세요
|
|
17
|
+
2. 사용자 답변을 정제하여 전문적인 문서 형식으로 변환하세요
|
|
18
|
+
3. 필수(required) 필드는 반드시 채워야 합니다
|
|
19
|
+
4. repeatable 섹션은 사용자가 "끝" 또는 빈 입력할 때까지 반복
|
|
20
|
+
5. 모든 입력이 완료되면 output-template을 사용해 문서 생성
|
|
21
|
+
|
|
22
|
+
정제 원칙:
|
|
23
|
+
- 구어체 → 문어체로 변환
|
|
24
|
+
- 모호한 표현 → 구체적 표현으로
|
|
25
|
+
- 20자 이내로 간결하게
|
|
26
|
+
- 전문 용어 적절히 사용
|
|
27
|
+
]]>
|
|
28
|
+
</instructions>
|
|
29
|
+
|
|
30
|
+
<!-- ============================================================
|
|
31
|
+
섹션 1: 기본 정보
|
|
32
|
+
============================================================ -->
|
|
33
|
+
<section id="basic" title="기본 정보">
|
|
34
|
+
<field name="project_name" type="text" required="true">
|
|
35
|
+
<prompt>프로젝트 이름이 뭔가요?</prompt>
|
|
36
|
+
<refinement>영문 소문자, 하이픈 허용 (예: smash-sg)</refinement>
|
|
37
|
+
</field>
|
|
38
|
+
|
|
39
|
+
<field name="one_liner" type="text" required="true">
|
|
40
|
+
<prompt>한 줄로 설명하면?</prompt>
|
|
41
|
+
<example>싱가폴/아세안 테니스 매칭 앱</example>
|
|
42
|
+
<refinement>
|
|
43
|
+
- 20자 이내
|
|
44
|
+
- "~앱", "~서비스", "~플랫폼" 형식
|
|
45
|
+
- 지역 + 도메인 + 핵심 가치 포함
|
|
46
|
+
</refinement>
|
|
47
|
+
</field>
|
|
48
|
+
|
|
49
|
+
<field name="target_user" type="text" required="true">
|
|
50
|
+
<prompt>주요 타겟 사용자는 누구인가요?</prompt>
|
|
51
|
+
<example>싱가폴 거주 테니스 동호인 (20-40대)</example>
|
|
52
|
+
<refinement>
|
|
53
|
+
- 지역 + 연령대 + 특성 포함
|
|
54
|
+
- 구체적인 페르소나로 정제
|
|
55
|
+
</refinement>
|
|
56
|
+
</field>
|
|
57
|
+
|
|
58
|
+
<field name="problem" type="text" required="true">
|
|
59
|
+
<prompt>해결하려는 핵심 문제는?</prompt>
|
|
60
|
+
<example>실력 맞는 테니스 파트너 찾기 어려움</example>
|
|
61
|
+
<refinement>
|
|
62
|
+
- 문제 중심으로 서술
|
|
63
|
+
- "~어려움", "~불편함", "~한계" 형식
|
|
64
|
+
</refinement>
|
|
65
|
+
</field>
|
|
66
|
+
|
|
67
|
+
<field name="solution" type="text" required="true">
|
|
68
|
+
<prompt>어떻게 해결하려고 하나요?</prompt>
|
|
69
|
+
<example>실력/위치/시간 기반 자동 매칭 시스템</example>
|
|
70
|
+
<refinement>
|
|
71
|
+
- 솔루션 중심으로 서술
|
|
72
|
+
- 핵심 메커니즘 포함
|
|
73
|
+
</refinement>
|
|
74
|
+
</field>
|
|
75
|
+
</section>
|
|
76
|
+
|
|
77
|
+
<!-- ============================================================
|
|
78
|
+
섹션 2: 핵심 기능
|
|
79
|
+
============================================================ -->
|
|
80
|
+
<section id="features" title="핵심 기능" repeatable="true">
|
|
81
|
+
<instructions>
|
|
82
|
+
기능을 하나씩 입력받습니다.
|
|
83
|
+
빈 입력 또는 "끝"이 입력되면 종료합니다.
|
|
84
|
+
최소 3개 이상의 기능을 권장합니다.
|
|
85
|
+
</instructions>
|
|
86
|
+
|
|
87
|
+
<field name="name" type="text" required="true">
|
|
88
|
+
<prompt>기능 이름?</prompt>
|
|
89
|
+
<example>매칭, 채팅, 프로필</example>
|
|
90
|
+
<refinement>2-4글자 명사형</refinement>
|
|
91
|
+
</field>
|
|
92
|
+
|
|
93
|
+
<field name="description" type="text" required="false">
|
|
94
|
+
<prompt>간단한 설명? (생략 가능)</prompt>
|
|
95
|
+
<example>실력/위치/시간 기반 자동 매칭</example>
|
|
96
|
+
<refinement>한 줄로 핵심 동작 설명</refinement>
|
|
97
|
+
</field>
|
|
98
|
+
|
|
99
|
+
<field name="priority" type="select" required="true">
|
|
100
|
+
<prompt>우선순위? (m:must / s:should / c:could)</prompt>
|
|
101
|
+
<options>
|
|
102
|
+
<option value="must" shortcut="m">MVP 필수</option>
|
|
103
|
+
<option value="should" shortcut="s">있으면 좋음</option>
|
|
104
|
+
<option value="could" shortcut="c">나중에</option>
|
|
105
|
+
</options>
|
|
106
|
+
<default>must</default>
|
|
107
|
+
</field>
|
|
108
|
+
</section>
|
|
109
|
+
|
|
110
|
+
<!-- ============================================================
|
|
111
|
+
섹션 3: 기술 스택
|
|
112
|
+
============================================================ -->
|
|
113
|
+
<section id="tech" title="기술 스택">
|
|
114
|
+
<field name="frontend" type="select" required="true">
|
|
115
|
+
<prompt>프론트엔드 프레임워크?</prompt>
|
|
116
|
+
<options>
|
|
117
|
+
<option value="nextjs" shortcut="1">Next.js (권장)</option>
|
|
118
|
+
<option value="react" shortcut="2">React</option>
|
|
119
|
+
<option value="vue" shortcut="3">Vue.js</option>
|
|
120
|
+
<option value="other" shortcut="4">기타</option>
|
|
121
|
+
</options>
|
|
122
|
+
<default>nextjs</default>
|
|
123
|
+
</field>
|
|
124
|
+
|
|
125
|
+
<field name="backend" type="select" required="true">
|
|
126
|
+
<prompt>백엔드/BaaS?</prompt>
|
|
127
|
+
<options>
|
|
128
|
+
<option value="supabase" shortcut="1">Supabase (권장)</option>
|
|
129
|
+
<option value="firebase" shortcut="2">Firebase</option>
|
|
130
|
+
<option value="custom" shortcut="3">커스텀 서버</option>
|
|
131
|
+
</options>
|
|
132
|
+
<default>supabase</default>
|
|
133
|
+
</field>
|
|
134
|
+
|
|
135
|
+
<field name="deploy" type="select" required="true">
|
|
136
|
+
<prompt>배포 플랫폼?</prompt>
|
|
137
|
+
<options>
|
|
138
|
+
<option value="vercel" shortcut="1">Vercel (권장)</option>
|
|
139
|
+
<option value="aws" shortcut="2">AWS</option>
|
|
140
|
+
<option value="cloudflare" shortcut="3">Cloudflare</option>
|
|
141
|
+
<option value="other" shortcut="4">기타</option>
|
|
142
|
+
</options>
|
|
143
|
+
<default>vercel</default>
|
|
144
|
+
</field>
|
|
145
|
+
|
|
146
|
+
<field name="database" type="select" required="false">
|
|
147
|
+
<prompt>데이터베이스? (백엔드 선택에 따라 자동 설정됨)</prompt>
|
|
148
|
+
<options>
|
|
149
|
+
<option value="postgresql">PostgreSQL</option>
|
|
150
|
+
<option value="mysql">MySQL</option>
|
|
151
|
+
<option value="mongodb">MongoDB</option>
|
|
152
|
+
</options>
|
|
153
|
+
<auto-fill>
|
|
154
|
+
<rule if="backend=supabase">postgresql</rule>
|
|
155
|
+
<rule if="backend=firebase">firestore</rule>
|
|
156
|
+
</auto-fill>
|
|
157
|
+
</field>
|
|
158
|
+
</section>
|
|
159
|
+
|
|
160
|
+
<!-- ============================================================
|
|
161
|
+
섹션 4: 성공 지표 (선택)
|
|
162
|
+
============================================================ -->
|
|
163
|
+
<section id="metrics" title="성공 지표" optional="true">
|
|
164
|
+
<field name="primary_metric" type="text" required="false">
|
|
165
|
+
<prompt>핵심 성공 지표? (예: DAU, 매칭 성사율)</prompt>
|
|
166
|
+
<example>주간 매칭 성사율 70% 이상</example>
|
|
167
|
+
</field>
|
|
168
|
+
|
|
169
|
+
<field name="target_users" type="text" required="false">
|
|
170
|
+
<prompt>목표 사용자 수? (MVP 기준)</prompt>
|
|
171
|
+
<example>런칭 3개월 내 MAU 1,000명</example>
|
|
172
|
+
</field>
|
|
173
|
+
</section>
|
|
174
|
+
|
|
175
|
+
<!-- ============================================================
|
|
176
|
+
출력 템플릿
|
|
177
|
+
============================================================ -->
|
|
178
|
+
<output-template>
|
|
179
|
+
<![CDATA[
|
|
180
|
+
# {{basic.project_name}} PRD
|
|
181
|
+
|
|
182
|
+
> {{basic.one_liner}}
|
|
183
|
+
|
|
184
|
+
**생성일**: {{DATE}}
|
|
185
|
+
**버전**: 1.0
|
|
186
|
+
**상태**: Draft
|
|
187
|
+
|
|
188
|
+
---
|
|
189
|
+
|
|
190
|
+
## 1. 개요
|
|
191
|
+
|
|
192
|
+
### 1.1 프로젝트 정보
|
|
193
|
+
|
|
194
|
+
| 항목 | 내용 |
|
|
195
|
+
|-----|------|
|
|
196
|
+
| 프로젝트명 | {{basic.project_name}} |
|
|
197
|
+
| 한 줄 설명 | {{basic.one_liner}} |
|
|
198
|
+
| 타겟 사용자 | {{basic.target_user}} |
|
|
199
|
+
|
|
200
|
+
### 1.2 문제 정의
|
|
201
|
+
|
|
202
|
+
**해결하려는 문제:**
|
|
203
|
+
{{basic.problem}}
|
|
204
|
+
|
|
205
|
+
**제안하는 솔루션:**
|
|
206
|
+
{{basic.solution}}
|
|
207
|
+
|
|
208
|
+
---
|
|
209
|
+
|
|
210
|
+
## 2. 핵심 기능
|
|
211
|
+
|
|
212
|
+
| 우선순위 | 기능 | 설명 |
|
|
213
|
+
|:-------:|------|------|
|
|
214
|
+
{{#each features}}
|
|
215
|
+
| {{priority | upper}} | {{name}} | {{description | default: "-"}} |
|
|
216
|
+
{{/each}}
|
|
217
|
+
|
|
218
|
+
### 2.1 MVP 범위 (MUST)
|
|
219
|
+
|
|
220
|
+
{{#each features where priority="must"}}
|
|
221
|
+
- **{{name}}**: {{description | default: "상세 정의 필요"}}
|
|
222
|
+
{{/each}}
|
|
223
|
+
|
|
224
|
+
### 2.2 확장 기능 (SHOULD/COULD)
|
|
225
|
+
|
|
226
|
+
{{#each features where priority!="must"}}
|
|
227
|
+
- **{{name}}** ({{priority | upper}}): {{description | default: "상세 정의 필요"}}
|
|
228
|
+
{{/each}}
|
|
229
|
+
|
|
230
|
+
---
|
|
231
|
+
|
|
232
|
+
## 3. 기술 스택
|
|
233
|
+
|
|
234
|
+
| 구분 | 선택 | 비고 |
|
|
235
|
+
|-----|------|-----|
|
|
236
|
+
| Frontend | {{tech.frontend | capitalize}} | |
|
|
237
|
+
| Backend | {{tech.backend | capitalize}} | |
|
|
238
|
+
| Database | {{tech.database | capitalize}} | {{tech.backend}} 기본 |
|
|
239
|
+
| Deploy | {{tech.deploy | capitalize}} | |
|
|
240
|
+
|
|
241
|
+
---
|
|
242
|
+
|
|
243
|
+
## 4. 성공 지표
|
|
244
|
+
|
|
245
|
+
{{#if metrics.primary_metric}}
|
|
246
|
+
- **핵심 지표**: {{metrics.primary_metric}}
|
|
247
|
+
{{/if}}
|
|
248
|
+
{{#if metrics.target_users}}
|
|
249
|
+
- **목표 사용자**: {{metrics.target_users}}
|
|
250
|
+
{{/if}}
|
|
251
|
+
{{#unless metrics.primary_metric}}
|
|
252
|
+
- (추후 정의)
|
|
253
|
+
{{/unless}}
|
|
254
|
+
|
|
255
|
+
---
|
|
256
|
+
|
|
257
|
+
## 5. 일정 (TBD)
|
|
258
|
+
|
|
259
|
+
| 마일스톤 | 목표 | 상태 |
|
|
260
|
+
|---------|-----|:----:|
|
|
261
|
+
| PRD 완료 | - | ✅ |
|
|
262
|
+
| 설계 완료 | - | ⬜ |
|
|
263
|
+
| MVP 개발 | - | ⬜ |
|
|
264
|
+
| 베타 런칭 | - | ⬜ |
|
|
265
|
+
|
|
266
|
+
---
|
|
267
|
+
|
|
268
|
+
## 6. 다음 단계
|
|
269
|
+
|
|
270
|
+
1. [ ] requirements.md 작성
|
|
271
|
+
2. [ ] service-spec.md 작성
|
|
272
|
+
3. [ ] data-design.md 작성
|
|
273
|
+
4. [ ] UI/UX 설계
|
|
274
|
+
|
|
275
|
+
---
|
|
276
|
+
|
|
277
|
+
*Generated by TimSquad v2.0*
|
|
278
|
+
]]>
|
|
279
|
+
</output-template>
|
|
280
|
+
</generator>
|