feature-loop-harness-cli 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/README.md +53 -0
  2. package/bin/flh.js +391 -0
  3. package/package.json +29 -0
  4. package/templates/default/.codex/config.toml +2 -0
  5. package/templates/default/.codex/hooks/user-prompt-submit.sh +5 -0
  6. package/templates/default/.codex/hooks.json +16 -0
  7. package/templates/default/.flh/docs/FEATURE_IMPLEMENTATION_PIPELINE.md +454 -0
  8. package/templates/default/.flh/docs/PROJECT_WORKFLOW.md +270 -0
  9. package/templates/default/.flh/docs/REVIEW_PATCH_PIPELINE.md +166 -0
  10. package/templates/default/.flh/hooks/user_prompt_submit.py +1440 -0
  11. package/templates/default/.flh/runtime/STATE.md +84 -0
  12. package/templates/default/.flh/scripts/pre_commit.py +674 -0
  13. package/templates/default/.flh/workflow/docs-spec.yml +134 -0
  14. package/templates/default/.flh/workflow/flow.yml +82 -0
  15. package/templates/default/.flh/workflow/request-patterns.yml +265 -0
  16. package/templates/default/.flh/workflow/state-actions.yml +117 -0
  17. package/templates/default/.flh/workflow/transition-guards.yml +57 -0
  18. package/templates/default/.husky/pre-commit +3 -0
  19. package/templates/default/AGENTS.md +44 -0
  20. package/templates/default/HARNESS_MANUAL.md +1105 -0
  21. package/templates/default/README.md +251 -0
  22. package/templates/default/docs/API.md +41 -0
  23. package/templates/default/docs/ARCHITECTURE.md +86 -0
  24. package/templates/default/docs/DB_SCHEMA.md +149 -0
  25. package/templates/default/docs/DESIGN.md +52 -0
  26. package/templates/default/docs/MVP.md +47 -0
  27. package/templates/default/docs/QUALITY_SCORE.md +54 -0
  28. package/templates/default/docs/docs-map.md +64 -0
  29. package/templates/default/docs/features/active/.gitkeep +1 -0
  30. package/templates/default/docs/features/backlog/.gitkeep +1 -0
  31. package/templates/default/docs/features/blocked/.gitkeep +1 -0
  32. package/templates/default/docs/features/done/.gitkeep +1 -0
  33. package/templates/default/docs/features/feature-index.md +21 -0
  34. package/templates/default/docs/features/postponed/.gitkeep +1 -0
  35. package/templates/default/docs/features/ready/.gitkeep +1 -0
  36. package/templates/default/docs/features/review/.gitkeep +1 -0
  37. package/templates/default/docs/source-layout.yml +33 -0
  38. package/templates/default/gitignore.template +9 -0
  39. package/templates/default/tests/hooks/test_pre_commit.py +659 -0
  40. package/templates/default/tests/hooks/test_user_prompt_submit.py +750 -0
@@ -0,0 +1,1105 @@
1
+ # Feature Loop Harness Manual
2
+
3
+ <br>
4
+ <br>
5
+
6
+ # Part 1. 개요와 구조 이해
7
+
8
+ <br>
9
+ <br>
10
+
11
+ ## 1. 이 매뉴얼의 목적
12
+
13
+ 이 문서는 Feature Loop Harness의 구조와 운영 방식을 이해하기 위한 내부 매뉴얼이다.
14
+
15
+ 해당 매뉴얼에서는 프로젝트 전역의 작업 흐름, 훅/Husky를 통한 제어, AGENTS.md 규칙, 문서 산출물 , 구현 파이프라인 등이 각각 어떤 책임을 가지는지 설명하는 것을 목표로 한다.
16
+
17
+ <br>
18
+ <br>
19
+
20
+ ## 2. 하네스의 핵심 개념
21
+
22
+ <br>
23
+ <br>
24
+
25
+ ## 3. 전체 구조 지도
26
+
27
+ ```text
28
+ .
29
+ ├── .codex/
30
+ │ ├── config.toml # Codex 프로젝트 설정 및 훅 연결 파일
31
+ │ ├── hooks.json # hook 활성화 설정 파일
32
+ │ └── hooks/
33
+ │ └── user-prompt-submit.sh # UserPromptSubmit hook에서 실행하는 wrapper script
34
+ ├── .flh/ # FeatureLoopHarness의 런타임/정책 디렉토리
35
+ │ ├── docs/ # 운영 및 지침 관련 문서 디렉토리
36
+ │ │ ├── FEATURE_IMPLEMENTATION_PIPELINE.md # 기능 단위 구현 파이프라인
37
+ │ │ └── PROJECT_WORKFLOW.md # 프로젝트 전체 파이프라인
38
+ │ ├── hooks/
39
+ │ │ └── user_prompt_submit.py # 사용자 요청 분석 및 워크플로우를 제어하는 훅 스크립트
40
+ │ ├── runtime/
41
+ │ │ └── STATE.md # 프로젝트 전역 상태 기록 및 제어 문서
42
+ │ ├── scripts/
43
+ │ │ └── pre_commit.py # pre-commit 실제 스크립트
44
+ │ └── workflow/ # 훅이 읽는 워크플로우 관련 문서
45
+ │ ├── docs-spec.yml # 문서별 완료 기준을 담은 문서
46
+ │ ├── flow.yml # 프로젝트 전체 상태 목록 및 상태 별 허용하는 요청 타입을 정의
47
+ │ ├── request-patterns.yml # 사용자 프롬프트의 요청 타입을 분류하기 위한 패턴을 정의
48
+ │ ├── state-actions.yml # 상태별 진행 해야 할 에이전트 행동 규칙
49
+ │ └── transition-guards.yml # 상태 전이 시 필요한 guards 조건
50
+ ├── .husky/
51
+ │ ├── pre-commit # git-hook 실행을 위한 Husky pre-commit 파일
52
+ ├── app/ # 프로젝트의 실제 소스코드가 들어갈 디렉토리
53
+ ├── docs/ # 프로젝트 진행에 필요한 기능 및 설계 문서 디렉토리
54
+ │ ├── API.md # API 설계 관련 문서
55
+ │ ├── ARCHITECTURE.md # 아키텍쳐 설계 관련 문서
56
+ │ ├── DB_SCHEMA.md # 데이터 스키마 관련 문서, 해당 파일은 prisma Schema 생성 시 사용됨
57
+ │ ├── DESIGN.md # 프론트앤드 디자인 지침 문서
58
+ │ ├── MVP.md # 프로젝트 MVP 정의 문서
59
+ │ ├── QUALITY_SCORE.md # 기능별 품질 점수 문서
60
+ │ ├── docs-map.md # docs/ 및 ./flh 내부 문서들의 인덱스 파일
61
+ │ ├── source-layout.yml # app/ 내부 디렉토리 구조를 나타내는 파일
62
+ │ ├── features/ # 기능 목록 디렉토리
63
+ │ │ ├── feature-index.md # 구현할 기능 목록 및 우선순위에 대한 인덱스 파일
64
+ │ │ ├── active/ # 현재 에이전트가 구현을 진행 중인 기능이 위치하는 디렉토리
65
+ │ │ ├── backlog/ # 아직 설계가 시작되지 않았거나 설계 중인 기능이 위치하는 디렉토리
66
+ │ │ ├── blocked/ # 이슈로 인해 작업이 중단된 기능이 위치하는 디렉토리
67
+ │ │ ├── done/ # 사용자가 최종 승인한 기능이 위치하는 디렉토리
68
+ │ │ ├── postponed/ # 보류된 기능이 위치하는 디렉토리
69
+ │ │ ├── ready/ # 설계가 완료되어 구현을 대기중인 기능이 위치하는 디렉토리
70
+ │ │ └── review/ # 에이전트가 구현은 완료하였으나, 사용자의 최종 검토를 기다리는 기능이 위치하는 디렉토리
71
+ │ ├── generated/ # 위의 문서 이외에도 에이전트가 생성한 기타 문서들이 위치하는 디렉토리
72
+ │ └── references/ # 에이전트가 참조하면 좋은 문서들이 위치하는 디렉토리
73
+ ├── scripts/ # 프로젝트 보조 스크립트가 위치하는 디렉토리
74
+ ├── tests/
75
+ │ ├── e2e/ # 개별 기능의 E2E 테스트 파일이 위치하는 디렉토리
76
+ │ └── hooks/ # 훅 테스트 디렉토리
77
+ │ ├── test_pre_commit.py # Pre-commit 테스트 스크립트
78
+ │ └── test_user_prompt_submit.py # UserPromptSubmit Hook 테스트 스크립트
79
+ ├── .gitignore
80
+ ├── AGENTS.md # 전역 에이전트 작업 규칙
81
+ ├── HARNESS_MANUAL.md # flh 운영 매뉴얼
82
+ ├── README.md
83
+ ├── package-lock.json
84
+ └── package.json
85
+ ```
86
+
87
+ <br>
88
+ <br>
89
+
90
+ ## 4. 제어 계층
91
+
92
+ 해당 하네스 구조에서는 Codex를 통해 사용자 요청이 들어오는 순간부터 여러 제어 계층들이 아래 순서대로 작동한다.
93
+
94
+ 1. Codex UserPromptSubmit hook
95
+ - 사용자 프롬프트의 요청 의도를 분석하여, 현재 프로젝트 진행 상태에서 허용하는 요청인지 확인 및 제어한다.
96
+ - 현재 프로젝트 진행 상태에서 허용하는 요청이면 Codex에게 프롬프트를 전달한다.
97
+ - 허용하지 않는 요청에 대해서 hook 차원에서 요청을 반환하고 사용자에게 반환 이유를 설명한다.
98
+
99
+ 2. AGENTS.md : 실제 작업 시 반드시 지켜야 할 핵심 지침들을 제시한다.
100
+
101
+ 3. .flh/workflow/ 내부 문서
102
+ - 프로젝트 전체 파이프라인에 대해 각 상태에서 진행해야 할 작업 목록 및 상태 제어를 수행한다.
103
+
104
+ 4. .flh/docs/FEATURE_IMPLEMENTATION_PIPELINE.md
105
+ - 모든 설계 및 구조화 작업이 끝난 후 실제 구현 시 작동하는 파이프라인
106
+
107
+ 5. Git pre-commit hook(Husky)
108
+ - 구현 작업 이후 발생하는 커밋에 대해 검사하는 과정이다.
109
+ - 해당 커밋이 하네스 구조가 요구하는 대로 진행되었는지 기계적인 방식으로 확인한다.
110
+
111
+ <br>
112
+ <br>
113
+
114
+ # Part 2. 프로젝트 런타임 및 워크플로우
115
+
116
+ <br>
117
+ <br>
118
+
119
+ ## 5. 프로젝트 전체 워크플로우
120
+
121
+ flh는 구현 단계의 하네스 뿐만 아니라, 설계, 지침 생성, DB 배포 등 구현 이외의 원활한 프로젝트 진행을 위해 아래와 같은
122
+ 파이프라인을 수행한다.
123
+
124
+ ```text
125
+ # (p)는 사용자에 의해 생략 가능한 단계
126
+
127
+ MVP_DEFINITION
128
+ -> ARCHITECTURE DESIGN
129
+ -> FEATURE_INDEX_DEFINITION
130
+ -> DATA_MODEL_DEFINITION(p)
131
+ -> API_DESIGN(p)
132
+ -> FRONTEND_DESIGN(p)
133
+ -> FEATURE_IMPLEMENTATION
134
+ ```
135
+
136
+ ### 각 단계별 목적 및 산출물
137
+ 1. MVP_DEFINITION
138
+ - 목적 : 전체 프로젝트에 대한 MVP 지침을 생성
139
+ - 산출물 : docs/MVP.md
140
+
141
+ 2. ARCHITECTURE_DESIGN
142
+ - 목적 : 프로젝트 전체 아키텍쳐 디자인을 수행
143
+ - 세부 목표
144
+ - 프로젝트 종류, 패키지 매니져, 세부 스택, 테스팅 도구, 데이터베이스 프로바이더 및 사용여부 등을 결정
145
+ - MVP 문서 기반 아키텍쳐 문서 생성
146
+ - source-layout.yml 기반 app/ 내부 디렉토리 구조 생성(단순 디렉토리 생성만 수행)
147
+ - 산출물
148
+ - docs/ARCHITECTURE.md : 전역 아키텍쳐 문서
149
+ - docs/source-layout.yml : 소스 레이아웃 및 스택 관련 문서
150
+
151
+ 3. FEATURE_INDEX_DEFINITION
152
+ - 목적 : MVP 및 아키텍쳐 문서에 따른 필요한 기능 목록을 생성
153
+ - 산출물 : docs/features/feature-index.md : 기능 목록 인덱스 파일
154
+
155
+ 4. DATA_MODEL_DEFINITION
156
+ - 목적 : 프로젝트 전역의 데이터베이스 스키마를 생성하는 과정
157
+ - 해당 단계는 프로젝트가 데이터베이스를 필요로 하지 않으면 생략할 수 있음
158
+ - 산출물 : docs/DB_SCHEMA.md - 프로젝트 전역에 대한 DB 스키마 문서
159
+
160
+ 5. API_DESIGN
161
+ - 목적 : API 영역 및 앤드포인트 초안을 생성
162
+ - 해당 단계는 프로젝트에서 백앤드 영역을 필요로 하지 않으면 생략될 수 있음
163
+ - 산출물 : docs/API.md
164
+
165
+ 6. FRONTEND_DESIGN
166
+ - 목적 : 프론트앤드 구현 시 참고할 디자인 지침 문서를 생성
167
+ - 해당 단계 이전에 에이전트는 사용자에게 선택을 요청한다.
168
+ 1. 직접 디자인 지침 문서를 생성할 것인지
169
+ 2. 외부에서 디자인 지침 문서(DESIGN.md)를 가져올 것인지
170
+ -> 이 경우 해당 단계는 생략
171
+ - 해당 단계는 프로젝트에서 프론트앤드 영역을 필요로 하지 않으면 생략할 수 있음
172
+ - 산출물 : docs/DESIGN.md
173
+
174
+ 7. FEATURE_IMPLEMENTATION
175
+ - 목적 : 기능 목록에 따른 기능 단위 구현을 진행한다.
176
+ - 해당 단계에서는 모든 작업을 .flh/docs/FEATURE_IMPLEMENTATION_PIPELINE.md 에 따라 수행한다.
177
+
178
+ <br>
179
+ <br>
180
+
181
+ ## 6. STATE.md
182
+
183
+ STATE.md는 하네스가 현재 프로젝트 진행 상태를 기억하는 파일이다.
184
+ .flh/runtime/STATE.md에 기록되며, Codex Hook과 에이전트는 작업 시작하기 전에 반드시 해당 파일을 읽어 현재 프로젝트 상태를 확인한다.
185
+
186
+ ### STATE.md 구조
187
+ ```markdown
188
+ ---
189
+ current_state: MVP_DEFINITION
190
+ completed_states: []
191
+ approvals: {}
192
+ last_transition: null
193
+ updated_at: null
194
+ ---
195
+ ```
196
+
197
+ 해당 파일은 마크다운 형식으로 작성되어 있으나, 해당 파일에서 기계가 읽는 부분은 ---로 둘러 쌓인 YAML frontmatter 뿐이다.
198
+
199
+ 나머지 본문 내용은 에이전트가 프로젝트 상태 변경을 위해 해당 파일을 수정할 때 참조할 설명과 예시로 구성되어 있다.
200
+
201
+ ### Frontmatter 필드 설명
202
+ - `current_state` : 현재 프로젝트 상태
203
+ - `completed_states` : 완료되었거나 전이 과정에서 통과한 단계 목록
204
+ - `last_transition` : 마지막으로 발생한 상태 전이
205
+ - `updated_at` : 마지막 상태 갱신 시각
206
+
207
+ ### Approvals
208
+ 해당 필드는 하네스가 "이 일은 사용자가 승인했거나 실제로 검증됐다" 라고 기억해야 하는 항목만 저장하는 공간이다.
209
+
210
+ 프로젝트 전체 진행에 있어서 approvals에 기록해야 하는 작업은 3가지이다.
211
+
212
+ 1. `design`: 프론트엔드 디자인 지침 문서를 외부에서 가져올지, 하네스 흐름 안에서 직접 작성할지를 결정한 뒤 그 승인 내용을 기록하는 필드다.
213
+
214
+ 2. `source_scaffold`: 최초 기능 구현 전에 프로젝트의 기본 스캐폴딩 작업이 완료되고, 해당 변경사항이 커밋까지 진행되었음을 기록하는 필드다.
215
+
216
+ 3. `database_baseline`: 최초 기능 구현 전에 DB baseline이 처리되었는지를 기록하는 필드다. DB가 필요 없는 프로젝트는 skip 기록을 남기고, DB가 필요한 프로젝트는 Prisma baseline 배포와 검증 결과를 남긴다.
217
+
218
+ <br>
219
+ <br>
220
+
221
+ ## 7. 워크플로우 설정 파일
222
+
223
+ 하네스의 워크플로우 관련 정책 문서들은 `.flh/workflow` 내부에 정의되어 있다.
224
+ 해당 문서들은 사람이 읽는 설명 문서가 아닌, 훅과 에이전트가 실제로 참고하는 설정 문서들이다.
225
+
226
+ 프로젝트 전반의 진행 상황을 이해하고자 한다면 `.flh/docs/PROJECT_WORKFLOW.md` 를 참고하자.
227
+
228
+ ### 7.1. flow.yml
229
+ ```yaml
230
+ # flow 예시
231
+ states:
232
+ MVP_DEFINITION:
233
+ description: "Define the actual project's MVP using docs/MVP.md."
234
+ allowed_request_types:
235
+ - MVP_DESIGN_REQUEST
236
+ - STATE_STATUS_REQUEST
237
+ - STATE_TRANSITION_REQUEST
238
+ - UNKNOWN
239
+ next_states:
240
+ - ARCHITECTURE_DESIGN
241
+ ...
242
+ ```
243
+ 전체 워크플로우의 상태 목록과 각 상태에서 허용하는 request_type(사용자 요청 의도)를 정의한다.
244
+
245
+ 각 상태에 대한 설명과 허용하는 요청 타입, 그리고 다음 진행할 상태에 대해서 정의하고 있다.
246
+
247
+
248
+ ### 7.2. state-actions.yml
249
+ ```yaml
250
+ # state-actions 예시
251
+ MVP_DEFINITION:
252
+ required_outputs:
253
+ - docs/MVP.md
254
+ actions:
255
+ - Clarify MVP goal, target users, core problem, scope, non-goals, and success criteria.
256
+ - Update docs/MVP.md.
257
+ - Mark docs/MVP.md as completed only when the MVP scope is clear.
258
+ allowed_extra_writes: []
259
+ ask_user_when:
260
+ - MVP scope is broad, conflicting, or unclear.
261
+ ```
262
+
263
+ 프로젝트 파이프라인의 각 단계에서 수행해야 할 행동, 필수 추출물, 허용되는 파일 수정 영역, 사용자에게 질문할 때 등을 정의하고 있다.
264
+
265
+
266
+ ### 7.3. docs-spec.yml
267
+ ```yaml
268
+ documents:
269
+ mvp:
270
+ path: docs/MVP.md
271
+ purpose: "Template completed by the actual project to define MVP scope."
272
+ required_sections:
273
+ - "MVP Goal"
274
+ - "Target Users"
275
+ - "Core Problem"
276
+ - "In Scope"
277
+ - "Out of Scope"
278
+ - "Success Criteria"
279
+ ```
280
+
281
+ 프로젝트 파이프라인에서 필요로 하는 각 문서들의 완성 기준에 대해 정의하고 있다.
282
+
283
+ 각 문서들의 완료 여부는 훅에서 상태 전이 시 참조한다.
284
+
285
+
286
+ ### 7.4. request-patterns.yml
287
+ 사용자 프롬프트를 어떤 request type으로 분류할지 결정하는 패턴을 정의한다.
288
+
289
+
290
+ ### 7.5. transition-guards.yml
291
+ ```yaml
292
+ transitions:
293
+ MVP_DEFINITION_TO_ARCHITECTURE_DESIGN:
294
+ from: MVP_DEFINITION
295
+ to: ARCHITECTURE_DESIGN
296
+ required_docs:
297
+ - mvp
298
+ ```
299
+ 프로젝트가 특정 상태에서 다음 상태로 넘어갈 떄 반드시 확인해야 하는 조건을 정의하는 파일이다.
300
+
301
+ 다음 상태로 전이하기 위해 완료되어 있어야 할 문서, 디렉토리, 명령 등을 정의하고 있다.
302
+
303
+ <br>
304
+ <br>
305
+
306
+ ## 8. 문서 산출물과 완료 기준
307
+ 하네스에서는 개별 단계마다 필요한 문서 산출물을 정해두고, 해당 문서가 완료되었는지 검사한 후 다음 단계로 넘어간다.
308
+
309
+ 문서 완료 기준은 `.flh/workflow/docs-spec.yml`에 정의되어 있다.
310
+
311
+ 문서들의 기본 완료 조건은 다음과 같다.
312
+ - 문서의 `status`가 completed 여야 한다.
313
+ - `TODO`, `TBD`, `PLACEHOLDER` 같은 placeholder 문구가 남아 있으면 안 된다.
314
+ - 필수 섹션이 모두 존재해야 한다.
315
+ - 각 필수 섹션에는 최소한의 내용이 작성되어 있어야 한다.
316
+ - YAML 문서의 경우 필수 필드가 모두 채워져 있어야 한다.
317
+
318
+ 예를 들어 `docs/MVP.md`는 `MVP Goal`, `Target Users`, `Core Problem`, `In Scope`, `Out of Scope`, `Success Criteria` 섹션이 모두 있어야 한다.
319
+
320
+ `docs/source-layout.yml`처럼 기계가 읽는 YAML 문서의 경우에는 섹션이 아니라 `project.type`, `project.package_manager`, `source_roots` 같은 필수 필드가 채워져 있는지를 검사한다.
321
+
322
+ <br>
323
+ <br>
324
+
325
+ ## 9. UserPromptSubmit Hook 동작
326
+
327
+ 해당 하네스에서는 Codex의 `UserPromptSubmit hook`를 통해 매 사용자의 요청에 대해서 프롬프트를 검증하고 있다.
328
+
329
+ 해당 훅의 목적은 사용자의 요청이 현재 프로젝트 상태에서 허용되는 요청인지 확인하는 것이다.
330
+ 즉 Codex에게 실제 작업을 인가하기 전에 "지금 이 요청을 진행해도 되는 것인가?" 를 기계적으로 판단하는 역할을 한다.
331
+
332
+ 해당 훅의 실행 흐름은 다음과 같다.
333
+
334
+ ```markdown
335
+ 1. 사용자 프롬프트 입력
336
+ 2. .codex/hooks/user-prompt-submit.sh 실행
337
+ 3. 3번의 script가 실제 hook 본체인 .flh/hooks/user_prompt_submit.py를 실행함
338
+ 4. 사용자 프롬프트의 의도를 분석함
339
+ 5. 현재 프로젝트 진행 상태를 STATE.md에서 불러옴
340
+ 6. 현재 상태에서 사용자 요청 의도가 허용되는지 확인함
341
+ 6.1. 허용되는 요청이면 Codex에게 프롬프트를 그대로 전달함
342
+ 6.2. 허용되지 않는 요청이면, 해당 요청을 처리할 수 있는 상태로 전이 가능한지 확인함
343
+ 6.2.A. 전이가 가능하면 STATE.md를 갱신하고 Codex에게 작업을 허용함
344
+ 6.2.B. 전이가 불가능하면 hook 단계에서 요청을 차단함
345
+ ```
346
+
347
+ 이러한 흐름을 통해 하네스는 각 프로젝트 단계에서 필요한 사전 작업이 완료되었는지 확인하고, 준비되지 않은 작업이 임의로 실행되는 것을 방지한다.
348
+
349
+ <br>
350
+ <br>
351
+
352
+ ## 10. 요청 분류 시스템
353
+
354
+ UserPromptSubmit Hook의 첫번째 단계로, 훅에서 사용자 프롬프트를 받으면 해당 프롬프트의 `request_type`를 분류하는 작업을 수행한다.
355
+
356
+ ### 프롬프트 요청 패턴 확인
357
+ 요청 분류에 대한 기준은 `.flh/workflow/request-patterns.yml`에서 정의하고 있다.
358
+ 해당 파일을 통해 표현의 명확도에 따라 패턴을 나누어 사용한다.
359
+
360
+ - `strong` : 특정 요청 의도를 거의 확실하게 판단할 수 있는 표현
361
+ - `alias` : 같은 의도로 해석할 수 있는 비슷한 표현
362
+ - `question_or_confirmation_patterns` : 실행 요청이 아니라 질문이나 확인으로 봐야 하는 표현
363
+
364
+ 예를 들어, 사용자 프롬프트가 "MVP 범위 정리해줘" 라고 하면, 'MVP'라는 키워드가 strong 패턴이므로 해당 프롬프트는 `MVP_DESIGN_REQUEST`로 분류된다.
365
+
366
+ 만약 사용자가 보기에 요청이 과하게 차단되거나 반대로 너무 쉽게 허용된다면, `request-patterns.yml`의 패턴을 수정해 요청 분류 기준을 조정할 수 있다.
367
+
368
+
369
+ ### 정확도 분석
370
+ 요청이 분류되면 동시에 `confidence` 값도 계산한다.
371
+ 해당 값은 하네스가 해당 분류를 얼마나 확실하게 판단하였는지를 나타낸다.
372
+
373
+ confidence는 패턴 분석 결과에 따라 아래와 같이 결정된다.
374
+ - `high` : 질문 요청 패턴, `/q(질문 모드)`, `/d(문서 모드)`, 혹은 한 개의 정확한 `strong` 과 매칭된 경우
375
+ - `medium` : 하나의 `alias`와 매칭된 경우
376
+ - `low` : 질문형 표현과 명령형 표현이 섞여있거나, 여러 요청 패턴에 동시에 매칭된 경우
377
+ - `unknown` : 어떤 패턴에도 매칭되지 않은 경우
378
+
379
+ 각 confidence에 대해 hook은 다음과 같이 동작한다.
380
+ - `high` : 그대로 작업 진행
381
+ - `medium` : '사용자가 정정하지 않으면 이 해석대로 진행하라' 라는 내용의 컨텍스트를 추가하여 Codex에게 작업 인가
382
+ - `low` : '바로 작업하지 말고 사용자에게 의도를 명확히 할 것을 요청하라' 라는 내용의 컨텍스트를 추가하여 codex에게 작업 전가
383
+ - `unknown` : 추가 컨텍스트를 통해서 다음과 같은 추가 지침을 포함하여 Codex에게 인가한다.
384
+ - 파일 변경 없는 설명, 분석, 상태 확인 등의 작업은 진행 가능
385
+ - 코드, 테스트, DB 마이그레이션, 수정 등의 작업은 진행을 엄격히 금지
386
+ - `STATE.md` 변경 금지
387
+
388
+
389
+ <br>
390
+ <br>
391
+
392
+ ## 11. Prefix Mode 정책
393
+ 모든 종류의 사용자 요청을 자연어 패턴만으로 엄격하게 제어하면, 특정 단어가 포함된 질문이나 문서 작업까지 의도치 않게 차단될 수 있다.
394
+ 예를 들어 “구현”이라는 단어가 들어간 설명 요청이 실제 구현 요청으로 오해되거나, “커밋 정책을 문서에 정리해줘” 같은 문서 작업이 커밋 요청으로 잘못 분류될 수 있다.
395
+ Prefix Mode는 이런 애매한 상황에서 사용자가 요청의 성격을 명확히 지정할 수 있도록 제공되는 우회 경로다.
396
+
397
+ 현재 하네스에서 사용할 수 있는 입력 모드는 `/d` 와 `/q` 두 가지이다.
398
+ 사용자는 프롬프트 맨앞에 prefix를 추가하여 모드를 선택할 수 있다.
399
+
400
+ ### `/q` : 질문 모드
401
+ 설명, 확인, 의견, 문장 정리 처럼 답변만 필요한 요청을 할 때 사용한다.
402
+
403
+ 질문 모드에서 하지 않는 것
404
+ - 파일 생성/수정/삭제
405
+ - STATE.md 수정
406
+ - 커밋, 푸쉬, 머지
407
+
408
+ ### `/d` : 문서 및 하네스 제어 모드
409
+ 프로젝트 내부 문서 및 하네스 문서들을 수정할 떄 사용한다.
410
+
411
+ 해당 모드에서는 다음 범위의 파일만 수정할 수 있다.
412
+ - `docs/`
413
+ - `.flh/`
414
+ - `AGENTS.md`
415
+ - `README.md`
416
+ - `.codex/`
417
+ - `tests/hooks/`
418
+ - `.husky/`
419
+ - `package.json`
420
+ - `package-lock.json`
421
+
422
+ 변경사항이 위의 범위 내애 존재하고, 사용자가 명시적으롤 커밋을 요청한 경우, 커밋을 허용한다.
423
+ 단, 머지는 허용하지 안흔다.
424
+
425
+ 문서 및 하네스 제어 모드에서 진행하지 않는 것
426
+ - 소스 코드 구현/수정/삭제
427
+ - 테스트 생성 및 진행
428
+
429
+ 또한 `/d` 모드에서는 사용자는 프롬프트에 명시함으로써 워크플로우의 다음 상태로 스킵할 수 있다.
430
+ 단, 프로젝트의 기반이 되는 MVP 설계, 아키텍쳐 설계, 기능 목록 생성 단계는 생략할 수 없다.
431
+
432
+
433
+ <br>
434
+ <br>
435
+
436
+ ## 12. 상태 전이 Guard
437
+ 상태 전이 guard는 프로젝트가 다음 워크플로우 단계로 넘어가기 전에 필요한 조건이 준비되었는지 확인하는 장치다.
438
+
439
+ 하네스는 사용자의 프롬프트를 먼저 요청 타입으로 분류한다.
440
+ 그리고 현재 상태에서 해당 요청 타입이 허용되지 않으면, 그 요청을 처리할 수 있는 workflow 상태가 있는지 찾는다.
441
+ 만약 요청을 처리할 수 있는 다음 상태가 존재한다면, 하네스는 `.flh/workflow/transition-guards.yml`에 정의된 조건을 확인하여 전이 가능성을 확인한다.
442
+
443
+ 예를 들어 현재 상태가 `MVP_DEFINITION`인데 사용자가 아키텍처 설계를 요청했다면, 하네스는 `ARCHITECTURE_DESIGN`으로 전이 가능한지 검사한다.
444
+ 이때 `MVP_DEFINITION_TO_ARCHITECTURE_DESIGN` guard에 따라 `docs/MVP.md`가 완료되어 있어야 한다.
445
+
446
+ Guard에서 확인하는 대표 조건은 다음과 같다.
447
+
448
+ - `required_docs`: 반드시 완료되어 있어야 하는 문서
449
+ - `required_docs_any`: 여러 문서 중 하나만 완료되어도 되는 조건
450
+ - `required_approvals_any`: 여러 approval 중 하나만 있어도 되는 조건
451
+ - `required_directories`: 반드시 존재해야 하는 디렉토리
452
+ - `required_source_layout_directories`: `docs/source-layout.yml`에 정의된 source directory가 실제로 생성되어 있는지 확인하는 조건
453
+
454
+ 또한 요청 의도를 처리하기 위해 현재 상태보다 여러 단계 뒤의 상태로 전이해야 하는 경우에도, 하네스는 그 사이에 있는 모든 단계의 guard를 순서대로 검사한다.
455
+ 따라서 중간 단계의 산출물이나 조건이 준비되지 않았다면 뒤 단계 작업으로 바로 넘어갈 수 없다.
456
+
457
+
458
+
459
+ <br>
460
+ <br>
461
+
462
+ ## 13. AGENTS.md 운영 계약
463
+
464
+ AGENTS.md에는 훅을 통과한 사용자의 요청에 대해서 Codex가 작업하는 동안 지켜야 할 필수 지침들이 기록되어 있다.
465
+
466
+ 해당 AGENTS.md는 프로젝트 전역에서 에이전트가 반드시 지켜야 할 필수 지침, 매 요청마다 수행해야 할 작업 목록, 참고할 문서 등이 기록되어 있다.
467
+
468
+ 참고할 만한 핵심 지침들은 다음과 같다.
469
+ 1. 전역 핵심 지침
470
+ - 작업 시작 전 항상 `STATE.md`를 읽어 현재 프로젝트 진행 상태를 불러온다.
471
+ - 현재 상태에서 해야할 일들을 `state-actions.yml`에서 불러온다.
472
+ - 현재 상태가 `FEATURE_IMPLEMENTATION`이 아니면 절대 구현을 수행하지 않는다.
473
+
474
+
475
+ 2. 기능 구현 관련 지침
476
+ - 현재 상태가 `FEATURE_IMPLEMENTATION`이고, 사용자가 구현할 것을 명시적으로 요청한 경우 `.flh/docs/FEATURE_IMPLEMENTATION_PIPELINE.md`를 기반으로 구현을 수행한다.
477
+ - 해당 파이프라인을 통해 구현이 완료된 기능은 사용자의 승인이 있어야 최종적으로 완료 상태에 들어갈 수 있다.
478
+ - 모든 구현은 한 번에 하나의 기능에 대한 구현만 수행한다.
479
+
480
+ 3. 사용자 리뷰 관련
481
+ - `/review` 디렉토리에 있는 기능에 대한 수정 시 에이전트는 최소 범위의 수정만 진행한다.
482
+ - 단, UI/UX 관련 수정이 요청되면, playwright 기반 테스트를 통해 검증을 수행한다.
483
+ - 수정사항이 기능의 품질에 변화를 주었다고 판단하면, 해당 기능의 품질 점수를 수정한다.
484
+
485
+ 정리하면 `AGENTS.md`는 Codex가 하네스 안에서 작업할 때 지켜야 하는 행동 규칙이다.
486
+ hook이 요청을 통과시켰더라도, Codex는 `AGENTS.md`에 정의된 상태별 작업 범위와 금지 규칙을 계속 따라야 한다.
487
+
488
+ <br>
489
+ <br>
490
+
491
+ # Part 3. 기능 구현 운영
492
+
493
+ <br>
494
+ <br>
495
+
496
+ ## 14. Feature Implementation Pipeline
497
+
498
+ - 프로젝트 진행 단계가 '구현' 단계이고, 사용자가 명시적으로 특정 기능에 대한 구현을 요구하면, 에이전트는
499
+ `기능 단위 구현 파이프라인`을 통해서 해당 기능에 대한 구현을 진행한다.
500
+
501
+ - 기능 단위 구현 시 지켜야할 지침은 다음과 같다.
502
+ - 한 번에 단 하나의 기능만 구현한다. 즉 하나의 기능이 완료되기 전에 다른 기능의 구현을 시작하지 않는다.
503
+ - 기능 단위 구현 파이프라인 적용을 위해 `.flh/docs/FEATURE_IMPLEMENTATION_PIPELINE.md`를 참고한다.
504
+ - 개별 기능의 완료 기준은 해당 파이프라인의 종료가 아닌, 사용자의 최종 허용이다.
505
+
506
+ ### 기능 단위 파이프라인 구성
507
+ 개별 기능에 대한 구현은 아래과 같은 순서로 진행된다.
508
+
509
+ 0. Preparation - 준비
510
+ 1. Design - 설계
511
+ 1.5 Source Package Scaffold Baseline - 스카폴딩
512
+ 1.6 Baseline DB Deployment - DB 배포
513
+ 2. Branch and Worktree - 브랜치 및 워크트리 생성
514
+ 3. Implementation and Tests - 구현 및 테스트 생성
515
+ 4. Verification - 검증
516
+ 4.5 Quality Scoring - 품질 점수 생성
517
+ 5. Feedback Loop - 수정 피드백
518
+ 6. Commit Merge and Cleanup - 머지 및 후처리
519
+
520
+ 이 때 1.5 스카폴딩과 1.6 DB 배포는 프로젝트 전체에 있어서 단 한 번만 수행되는 작업이다.
521
+ 자세한 내용은 아래의 섹션 16, 17을 참고하자.
522
+
523
+ ### 과정별 작업 내용
524
+ #### 0. Preparation - 준비
525
+
526
+ 해당 단계에서는 구현할 기능의 대상을 확정하고 기능 디렉토리를 준비한다.
527
+ 준비 단계에서 수행하는 작업은 아래와 같다.
528
+
529
+ ```markdown
530
+ 1. 사용자가 요청한 기능을 `feature-index.md`에서 찾는다.
531
+ 2. `feature-index.md` 기능이 존재하지 않으면 해당 문서에 요청된 기능의 정보를 추가한다.
532
+ 3. 해당 기능 디렉토리를 `docs/features/backlog/FEAT-XXX-name/`에 생성한다.
533
+ 4. 해당 기능 디렉토리 내부에 `artifacts/` 디렉토리를 생성한다.
534
+ 단, `review/`, `active/` 내부에 기능 디렉토리가 하나라도 존재하면 파이프라인을 중단한 후 아직 완료되지 않은 기능이 있음을 사용자에게 알린다.
535
+ ```
536
+
537
+ #### 1. Design - 설계
538
+
539
+ 사용자가 요청한 단위 기능의 상세 설계를 작성한다.
540
+
541
+ 설계문서는 준비 과정에서 생성한 기능 디렉토리 내부에 생성한다.
542
+
543
+ 생성해야 할 문서는 다음과 같다:
544
+ - `SPEC.md`: 기능 목표, 범위, 비범위, 흐름, 요구사항, 완료 기준, 제약조건
545
+ - `CHECKLIST.md`: 실제 구현 시 진행할 체크리스트
546
+ - `TEST_CASES.md`: E2E 테스트 파일 생성 시 참고할 테스트 케이스
547
+
548
+ 설계 과정에서 데이터 모델의 변경이 필요한 경우:
549
+ - 먼저 `SPEC.md`에 변경 제안을 작성한다.
550
+ - `docs/DB_SCHEMA.md`와 충돌 여부를 확인한 후 해당 문서를 업데이트 한다.
551
+
552
+ 설계가 완료된 기능 디렉토리의 구조는 아래와 같아야 한다.
553
+ ```text
554
+ docs/features/backlog/
555
+ FEAT-001-LOGIN/
556
+ SPEC.md
557
+ CHECKLIST.md
558
+ TEST_CASES.md
559
+ artifacts/
560
+ ```
561
+
562
+
563
+ 모든 설계 작업이 종료되면, 해당 기능 디렉토리를 `backlog/`에서 `ready/`로 이동한다.
564
+
565
+ #### 1.5. Source Package Scaffold Baseline
566
+
567
+ 소스 디렉토리인 app/ 내부의 스카폴딩을 수행하는 단계이다.
568
+
569
+ 자세한 내용은 섹션 16을 참고하자.
570
+
571
+ #### 1.6. Baseline DB Deployment
572
+
573
+ `docs/source-layout.yml`의 persistence 설정을 확인해 DB baseline이 필요한지 먼저 판단한다.
574
+ DB가 필요 없는 프로젝트는 DB 배포를 실행하지 않고 skip approval을 기록한다.
575
+ DB가 필요한 프로젝트는 Prisma schema를 생성하고, 해당 baseline을 실제로 사용할 DB 서버에 배포한다.
576
+
577
+ 자세한 내용은 섹션 17을 참고하자.
578
+
579
+ #### 2. Branch and Worktree
580
+
581
+ main/master 브랜치에서 직접 구현하는 것을 막기 위해서 모든 기능 작업 시 해당 기능만을 위한 브랜치/워크트리를 생성한다.
582
+
583
+ 해당 단계에서 진행하는 작업은 다음과 같다.
584
+ ```markdown
585
+ 1. `STATE.md`의 approvals를 참고하여 스카폴딩 및 DB baseline 처리 여부가 기록되었는지 확인한다.
586
+ 2. 완료되었다면 구현할 기능 디렉토리를 `active/`로 이동한다.
587
+ 3. 브랜치를 생성한다. 해당 브랜치의 이름은 해당 기능 디렉토리의 이름과 같게한다.
588
+ 4. 워크트리를 생성한다. 워크트리의 이름 또한 해당 기능 디렉토리의 이름과 같게한다.
589
+ ```
590
+
591
+ #### 3. Implementation and test - 구현 및 테스트 생성
592
+
593
+ 실제 소스의 구현을 진행하고, 구현된 소스의 테스트 파일을 생성하는 과정이다.
594
+
595
+ 구현 관련 규칙
596
+ - 구현 작업은 `SPEC.md`의 범위 및 목표를 준수하며, `CHECKLIST.md`의 작업 항목을 기준으로 수행한다.
597
+ - `CHECKLIST.md`에 없는 작업이 필요해지면 작업 전에 먼저 `SPEC.md` 와 `CHECKLIST.md`를 수정한다.
598
+ - 프론트엔드 구현 시 `docs/DESIGN.md`를 참고한다.
599
+
600
+ 테스트 파일 생성 관련 규칙
601
+ - 단위 테스트 파일은 테스트 대상 파일과 같은 디렉토리에 생성한다.
602
+ - E2E 테스트 파일은 `TEST_CASES.md`를 참고하여 `tests/e2e/feature-xxx-feature.e2e.spec.ts`에 생성한다.
603
+
604
+ 요구사항 변경 규칙
605
+ - 구현 중 요구사항 변경이 발생하면 코드 수정 전에 설계 문서를 먼저 갱신한다.
606
+ - 변경사항이 프로젝트 공통 데이터 모델에 영향을 주면 `docs/DB_SCHEMA.md`도 함께 수정한다.
607
+
608
+ #### 4. Verification - 검증
609
+
610
+ 검증은 아래와 같은 순서로 진행된다.
611
+
612
+ 1. Lint / Typecheck
613
+ 2. Unit Test
614
+ 3. Integration Test
615
+ 4. E2E Test
616
+
617
+ 규칙
618
+ - 검증을 통과하지 못하면 다음 단계로 넘어가지 않는다.
619
+ - E2E 결과는 기능의 실제 동작 판단에 우선적으로 참고한다.
620
+ - E2E 테스트 중 발생하는 아티팩트들은 해당 기능 디렉토리 내부의 artifacts/ 에 저장한다.
621
+
622
+ #### 4.5 Quality Scoring
623
+ E2E 검증 까지 완료되면, 구현된 기능에 대한 품질 평가를 진행한다.
624
+ 사전에 정의된 평가 기준에 따라 해당 기능의 품질에 대해 100점 만점으로 평가한다.
625
+
626
+ 해당 기능에 대한 품질 점수가 70점을 넘지 못하면 피드백 루프를 수행한다.
627
+ 단, 70점을 넘더라도 구현 범위를 과하게 위반하거나 데이터 모델과 충돌하는 등 심각한 위반사항이 존재한다고 판단되면 커밋을 수행하지 않는다.
628
+
629
+ 세부 평가 기준 및 점수 기록 위치에 대한 내용은 섹션 19를 참고하자.
630
+
631
+ #### 5. Feedback Loop - 피드백 루프
632
+
633
+ 검증을 실패하는 경우 다음 루프를 통해 수정을 진행한다.
634
+
635
+ ```
636
+ 검증 실패
637
+ -> 원인 수정
638
+ -> 관련 테스트 재실행
639
+ -> 전체 검증(4번) 재실행
640
+ ```
641
+
642
+ - 수정사항이 `SPEC.md` 를 벗어나면, 구현을 멈추고 설계 문서를 먼저 수정한다.
643
+ - 외부 의존성, 결정 대기 등의 이슈로 진행이 불가능하다고 판단되면 해당 기능 디렉토리를 `blocked/` 로 이동한다.
644
+
645
+ #### 6. Commit Merge and Cleanup - 머지 및 후처리
646
+
647
+ 검증을 마친 기능에 대해서 커밋 및 머지를 수행한다.
648
+
649
+ 커밋 메시지는 다음과 같다 : feat(scope): description
650
+
651
+ 머지 이후 후처리 목록
652
+ 1. 메인 브랜치에 정상 머지 여부를 확인한다.
653
+ 2. 로컬 브랜치와 동기화 상태를 확인한다.
654
+ 3. 머지가 완료된 워크트리와 브랜치를 삭제한다.
655
+ 4. 관련 임시/테스트/디버그 파일을 정리한다.
656
+ 5. 해당 기능 디렉토리를 `docs/features/review/`로 이동한다.
657
+ 6. `docs/features/feature-index.md`에 review 상태, 요약, 참조 경로를 갱신한다.
658
+ 7. `docs/QUALITY_SCORE.md`의 해당 기능 점수와 상세 점수 파일 경로를 갱신한다.
659
+ 8. 사용자의 최종 완료 승인이 있기 전까지 `done/`으로 이동하지 않는다.
660
+
661
+ 기능 디렉토리를 `docs/features/review/`로 이동하면 최초 구현 파이프라인은 종료된다.
662
+ 이후 사용자 검토/수정 요청은 `AGENTS.md`의 review 규칙을 따른다.
663
+
664
+ <br>
665
+ <br>
666
+
667
+ ## 15. Feature State Directories
668
+
669
+ 기능 구현 상태는 `docs/features/` 내부 디렉토리 위치를 기준으로 판단한다.
670
+
671
+ ### 상태 목록 및 디렉토리 구조
672
+ ```text
673
+ docs/features/
674
+ feature-index.md
675
+ backlog/
676
+ ready/
677
+ active/
678
+ blocked/
679
+ review/
680
+ done/
681
+ postponed/
682
+ ```
683
+
684
+ 각 디렉토리 의미:
685
+
686
+ - `backlog/`: 설계 대상으로 선택되었지만 아직 `SPEC.md`, `CHECKLIST.md`, `TEST_CASES.md`가 완성되지 않은 기능
687
+ - `ready/`: 기능 설계 문서 3개가 작성되어 구현 가능한 기능
688
+ - `active/`: 브랜치/워크트리 생성 후 현재 구현 중인 기능
689
+ - `blocked/`: 외부 의존성이나 결정 대기로 멈춘 기능
690
+ - `review/`: 최초 구현 초안, 검증, 품질 점수 작성이 끝났고 사용자가 확인/수정 중인 기능
691
+ - `done/`: 사용자가 최종 완료 승인한 기능
692
+ - `postponed/`: 보류 또는 연기된 기능
693
+
694
+
695
+ <br>
696
+ <br>
697
+
698
+ ## 16. Source Package Scaffold Baseline
699
+
700
+ Source Package Scaffold Baseline은 첫 기능 구현을 시작하기 전에 프로젝트의 기본 소스 디렉토리와 패키지 구조를 준비하는 단계다.
701
+
702
+ 이 단계에서는 `docs/source-layout.yml`에 정의된 구조를 기준으로 필요한 package 설정, 기본 script, 테스트/린트 설정, 최소 실행 파일 등을 준비한다.
703
+
704
+ 목적은 기능 구현이 시작된 뒤에 패키지 구조나 기본 설정이 없어 흐름이 끊기는 일을 막는 것이다.
705
+ 즉, 이후 기능 구현, 테스트 실행, 커밋 훅 검증이 같은 기준 위에서 자연스럽게 이어질 수 있도록 프로젝트의 기본 개발 기반을 먼저 맞춰두는 단계다.
706
+
707
+ ### 스카폴딩 실행 조건
708
+ - 프로젝트 전체에 대한 첫번째 기능 구현 시
709
+ - `.flh/runtime/STATE.md`에 `approvals.source_scaffold.created:true`가 없을 때
710
+
711
+ ### 절차
712
+ 1. `docs/source-layout.yml` 을 읽고, source roots, 패키지 매니저, 워크스페이스, 프레임웤, 런타임, 언어, 모듈 타입, 테스팅 도구 등을 결정한다.
713
+ 2. 해당 문서에 누락된 정보가 있거나, 스카폴딩을 위해 더 필요한 정보가 있다고 판단되면 사용자에게 요청한다.
714
+ 3. main/master 브랜치에서 스카폴딩 과정을 수행한다.
715
+ 4. 생성된 파일이 허용 범위 안에 있는지 확인한다.
716
+ 5. `.flh/runtime/STATE.md`에 `approvals.source_scaffold.created:true`를 기록한다.
717
+ 6. 생성된 베이스라인 파일과 `STATE.md` 를 함꼐 커밋한다.
718
+
719
+ ### 허용 범위
720
+ - package-level `package.json`
721
+ - package manager/workspace 설정
722
+ - lint/typecheck/test script
723
+ - TypeScript 또는 runtime config
724
+ - lint/format/test runner config
725
+ - 최소 entry file
726
+ - Prisma를 사용하는 backend package의 기본 연결 구조
727
+ - 빈 source directory를 유지하기 위한 `.gitkeep`
728
+
729
+
730
+ <br>
731
+ <br>
732
+
733
+ ## 17. Baseline DB Deployment
734
+
735
+ Baseline DB Deployment는 첫 기능 구현 전에 DB baseline 처리 여부를 확정하는 단계다.
736
+
737
+ ### 판단 기준
738
+ - `docs/source-layout.yml`의 `project.persistence.database_required` 값을 먼저 확인한다.
739
+ - `database_required: false`이면 DB를 사용하지 않는 프로젝트로 보고, DB 배포를 수행하지 않는다.
740
+ - `database_required: true`이면 DB-backed 프로젝트로 보고, Prisma 기준의 baseline 생성을 수행한다.
741
+ - persistence 값이 없거나 애매하면 에이전트가 임의로 판단하지 않고 사용자에게 확인한다.
742
+
743
+ ### DB 미사용 프로젝트
744
+ - Prisma schema, migration, DB deploy script를 생성하지 않는다.
745
+ - `.flh/runtime/STATE.md`에 `approvals.database_baseline.required: false`와 `approvals.database_baseline.skipped: true`를 기록한다.
746
+ - skip approval을 기록하는 커밋에는 source file 변경을 포함하지 않는다.
747
+ - 이 기록이 있으면 이후 기능 구현 루프에서 1.6을 다시 요구하지 않는다.
748
+
749
+ ### DB-backed 프로젝트
750
+ - 공식 자동 baseline은 Prisma만 대상으로 한다.
751
+ - `docs/DB_SCHEMA.md`의 Prisma-ready 명세를 기준으로 `app/be/prisma/schema.prisma`를 생성한다.
752
+ - baseline migration을 생성하고 실제 개발 DB에 반영한다.
753
+ - `db:deploy`, `db:verify` 같은 명령으로 배포와 검증을 수행한다.
754
+ - 성공하면 `.flh/runtime/STATE.md`에 `approvals.database_baseline.required: true`와 `approvals.database_baseline.verified: true`를 기록한다.
755
+
756
+ ### 주의사항
757
+ - 비밀값, API key, token, password, DB connection string은 `STATE.md`나 문서에 기록하지 않는다.
758
+ - Prisma가 아닌 ORM, migration tool, raw SQL baseline은 현재 하네스의 공식 자동 처리 범위가 아니다.
759
+ - `approvals.database_baseline` 기록이 없으면 다음 기능 구현 루프에서도 1.6 단계가 다시 요구될 수 있다.
760
+
761
+ <br>
762
+ <br>
763
+
764
+ ## 18. Review Patch Flow
765
+
766
+ Review Patch Flow는 기능 단위 구현 파이프라인을 마치고 `docs/features/review/`에 위치한 기능에 대해, 사용자의 세부 수정 요청을 처리하는 단계다.
767
+
768
+ 이 단계에서는 `.flh/docs/FEATURE_IMPLEMENTATION_PIPELINE.md`를 다시 실행하지 않는다.
769
+ 대신 `.flh/docs/REVIEW_PATCH_PIPELINE.md`를 기준으로, 이미 구현된 기능에 대한 lightweight patch만 수행한다.
770
+
771
+ ### 수정 대상
772
+
773
+ `review/`에 기능 디렉토리가 있으면 사용자의 수정 요청은 기본적으로 해당 기능을 대상으로 한다.
774
+ `review/`에는 동시에 하나의 기능만 존재해야 하며, `review/`에 기능이 있는 동안에는 새 기능 구현을 시작하지 않는다.
775
+
776
+ 요청 범위가 현재 review 기능과 맞지 않거나 새 기능 구현에 가까운 경우에는 바로 수정하지 않고 사용자에게 먼저 확인한다.
777
+
778
+ ### Branch와 Worktree
779
+
780
+ source 변경이 포함된 review patch는 main/master에서 직접 커밋하지 않는다.
781
+ 리뷰 대상 기능마다 하나의 `fix/*` branch/worktree를 만들고, 사용자가 해당 기능의 완료를 명시적으로 승인할 때까지 같은 branch/worktree를 재사용한다.
782
+
783
+ 예시:
784
+
785
+ ```text
786
+ feature: docs/features/review/FEAT-001-login
787
+ branch: fix/FEAT-001-login-review
788
+ worktree: FEAT-001-login-review
789
+ ```
790
+
791
+ 이미 해당 review branch/worktree가 있다면 새로 만들지 않고 기존 branch/worktree에서 이어서 작업한다.
792
+
793
+ ### 수정 범위와 검증
794
+
795
+ 수정은 사용자가 요청한 내용에 한정한다.
796
+ 관련 없는 리팩토링, 기능 추가, 설계 변경은 하지 않는다.
797
+
798
+ 수정 후에는 관련 테스트를 실행한다.
799
+ UI/UX 변경이 포함된 경우 Playwright 기반 검증을 수행한다.
800
+ 검증 자료, 실패 기록, blocker는 해당 기능 디렉토리의 `artifacts/review-patches/` 아래에 저장한다.
801
+
802
+ 수정으로 인해 기능 품질에 변화가 생겼다고 판단되면 해당 기능의 `QUALITY_SCORE.md`를 갱신한다.
803
+
804
+ ### 완료 처리
805
+
806
+ 사용자가 해당 기능의 검토 완료를 명시적으로 승인하기 전까지 기능 디렉토리는 `review/`에 유지한다.
807
+
808
+ 사용자가 완료를 승인하면 최종 검증을 수행하고, 필요한 품질 점수와 feature index를 갱신한 뒤, 기능 디렉토리를 `review/`에서 `done/`으로 이동한다.
809
+ 이후 review branch를 main/master로 merge하고 review worktree와 branch를 정리한다.
810
+
811
+ <br>
812
+ <br>
813
+
814
+ ## 19. Quality Scoring
815
+ E2E 검증 까지 완료되면, 구현된 기능에 대한 품질 평가를 진행한다.
816
+ 사전에 정의된 평가 기준에 따라 해당 기능의 품질에 대해 100점 만점으로 평가한다.
817
+
818
+ 작성 위치는 다음과 같다:
819
+ - 전역 요약 기록 : `docs/QUALITY.md`
820
+ - 개별 상세 점수 : `docs/features/active/FEAT-XXX-name/QUALITY_SCORE.md`
821
+
822
+ 개별 상세 점수 기록 시 다음 기준을 참고하여 진행한다.
823
+ - 요구사항 충족 여부 - 30점 만점
824
+ - 테스트 겨과 및 커버리지 - 25점 만점
825
+ - E2E 결과 및 UX 안정성 - 20점 만점
826
+ - 설계 및 범위 충족 - 15점 만점
827
+ - 에러 및 엣지 케이스 핸들링 - 10점 만점
828
+
829
+ 해당 기능에 대한 품질 점수가 70점을 넘지 못하면 피드백 루프를 수행한다.
830
+ 단, 70점을 넘더라도 구현 범위를 과하게 위반하거나 데이터 모델과 충돌하는 등 심각한 위반사항이 존재한다고 판단되면 커밋을 수행하지 않는다.
831
+
832
+ 해당 품질 점수는 이후 리팩토링 과정에서 우선순위를 결정하는 데 사용된다.
833
+
834
+ <br>
835
+ <br>
836
+
837
+ # Part 4. Git, 검증, 실행 환경
838
+
839
+ <br>
840
+ <br>
841
+
842
+ ## 20. Pre-commit Guard
843
+
844
+ Pre-commit Guard는 실제 커밋 직전에 현재 변경 사항이 하네스의 진행 규칙을 지키고 있는지 기계적으로 확인하는 안전장치다.
845
+
846
+ Pre-commit Guard의 수정이 필요한 경우 `.flh/scripts/pre_commit.py` 를 수정하면 된다.
847
+
848
+ ### 입력 정보
849
+ - 스테이징 파일 목록 : Pre-commit 테스트 대상
850
+ - 현재 브랜치 : 브랜치 적절성 확인을 위함
851
+ - STATE.md : Main 브랜치 예외 커밋 확인을 위함
852
+ - source-layout.yml : 스테이징 파일의 종류를 확인
853
+ - docs/features/active/ : 커밋하려고 하는 소스가 설계를 거쳐 완성된 것인지 확인
854
+ - docs/features/review/ : 커밋하려고 하는 소스가 설계를 거쳐 완성된 것인지 확인
855
+
856
+ ### 동작 흐름
857
+ ```text
858
+ 1. 현재 브랜치를 읽음
859
+ 2. 추적 중인 파일 목록을 읽음
860
+ 3. source-layout.yml을 읽음 - 해당 파일이 소스코드인지 아닌지 판별하고, 해당 파일이 포함된 폴더의 패키지를 불러오기 위함
861
+ 4. 추적 중인 파일을 분류함 : docs(harness) / source / unknown
862
+ - docs(harness) 파일의 경우 block없이 바로 커밋 수행
863
+ - source 와 unknown이 섞여 있으면 차단
864
+ - docs와 unknown이 섞여 있으면 일단 수행하고 사용자에게 보고
865
+ 5. 소스 코드 변경이 존재하면 아래 조건들을 확인함
866
+ - 추적 중인 소스 코드가 source-layout.yml의 sourceroots 위에 존재하는가?
867
+ - 현재 브랜치가 main/master가 아닌가?
868
+ - 현재 브랜치 이름이 feat/*, fix/*, refactor/* 인가?
869
+ - docs/features/active/ 혹은 review/에 기능 디렉토리가 존재하는가?
870
+ 6. 위의 조건들을 모두 만족한다면 영향을 받는 package.json을 찾아서 패키지 매니저(pm)를 검사함
871
+ - 만약 source-layout.yml에 적힌 pm정보와 package.json의 pm가 다르면 block
872
+ - source-layout.yml에는 있지만 package.json에는 없으면 source-layout.yml에 적힌 pm으로 결정
873
+ 7. package.json에 존재하는 lint / typecheck / test 스크립트를 수행
874
+ 8. 전역 lint-staged를 수행
875
+ ```
876
+
877
+ ### 예외 조건
878
+ main 브랜치에서는 모든 소스코드에 대한 커밋을 막지만, 두 가지의 예외가 존재한다.
879
+
880
+ #### 1. source scaffold baseline 구현 및 커밋
881
+
882
+ STATE.md 의 approvals.source_scaffold가 true이면 main/master에서 커밋을 허용한다.
883
+
884
+ #### 2. database baseline 구현 및 커밋
885
+
886
+ 아래의 두 조건이 모두 충족되면 main/master에서 커밋을 허용한다.
887
+ - approvals.source_scaffold = true
888
+ - approvals.database_baseline.verified = true 이거나
889
+ approvals.database_baseline.required = false 와 approvals.database_baseline.skipped = true 중 하나가 존재할 때
890
+
891
+ 두 예외는 기능 구현이 아니라, 첫 기능 구현 전에 프로젝트 기반을 준비하기 위한 커밋이다.
892
+ 따라서 main/master에서 허용되지만, 반드시 STATE.md approval 기록과 함께 커밋되어야 한다.
893
+
894
+ 단, STATE.md의 Approvals에 해당 예외를 허용한다는 내용이 기입되어야만 커밋이 가능하다.
895
+ database basline 구현 및 커밋의 경우, source scaffold baseline이 완료된 상태에서만 커밋이 가능하다.
896
+
897
+
898
+
899
+ <br>
900
+ <br>
901
+
902
+ ## 21. Branch와 Commit 정책
903
+
904
+ 해당 섹션에서는 에이전트가 어떤 단위로 커밋을 수행하고, 어떤 포맷의 메시지를 남기며, 작업이 완료된 브랜치에 대한 후처리를 어떻게 수행하는 지에 대해 다룬다.
905
+
906
+ ### 커밋 단위
907
+ - 하나의 커밋은 하나의 목적만 가져야 한다.
908
+ - 기능 구현 / 사용자 요청 변경사항 적용 / 문서 및 하네스 수정 은 가능하면 서로 분리하여 커밋한다.
909
+ - 테스트 수정 사항은 해당 구현 변경과 직접 관련이 있는 경우에만 같은 커밋에 포함한다.
910
+
911
+ ### 커밋 메시지 예시
912
+ ```text
913
+ feat(scope): description
914
+ fix(scope): description
915
+ refactor(scope): description
916
+ docs(scope): description
917
+ test(scope): description
918
+ chore(scope): description
919
+ ```
920
+
921
+ ### Review Patch 커밋
922
+ - review patch 커밋은 review 대상 기능에만 한정한다.
923
+ - 동일한 review 기능이 `done/`으로 가기 전까지 같은 브랜치에서 커밋한다.
924
+ - Review patch pipeline에서는 에이전트가 매 수정 이후 자동으로 커밋을 수행하지 않으며,
925
+ 해당 단계에서 커밋은 모두 사용자의 명시된 요청에 의해서 수행된다.
926
+ - 만약, Review 작업에 대해 에이전트가 매번 커밋을 진행하도록 하고자 한다면, `.flh/docs/REVIEW_PATCH_PIPELINE.md`
927
+ 의 Commit Policy를 아래와 같이 수정하면 된다.
928
+ ```text
929
+
930
+ 변경 전 :
931
+ Review patch의 기본 커밋 정책은 사용자 명시 커밋 방식이다.
932
+
933
+ 에이전트는 review patch 요청을 받으면 수정, 검증, 필요한 artifacts 기록, 품질 점수 갱신까지 수행할 수 있다.
934
+ 다만 커밋은 사용자가 명시적으로 커밋을 요청했을 때 해당 review branch에서 수행한다.
935
+
936
+ 사용자가 커밋을 요청하기 전까지는 같은 review branch/worktree에 변경사항을 유지할 수 있다.
937
+ 사소한 수정 요청이 여러 번 이어지는 경우, 사용자가 커밋을 요청하는 시점에 하나의 커밋으로 묶을 수 있다.
938
+ 변경 목적이 서로 다르거나 사용자가 분리를 요청한 경우에는 여러 커밋으로 나눌 수 있다.
939
+
940
+ 변경 후 :
941
+
942
+ Review patch는 하나의 사용자 수정 요청을 처리하고 검증을 마친 뒤, 해당 review branch에 커밋하는 것을 기본으로 한다.
943
+ 단, 사용자가 커밋 보류를 요청한 경우에는 커밋하지 않는다.
944
+
945
+ ```
946
+
947
+ ### Merge 후 후처리
948
+ - merge 까지 종료된 브랜치/워크트리는 더 이상 필요없음을 확인한 후 제거한다.
949
+ - review 브랜치/워크트리는 사용자 승인 전까지 반드시 유지한다.
950
+ - 기능 디렉토리가 `done/` 으로 이동하면 해당 review 브랜치 / 워크트리를 제거한다.
951
+
952
+
953
+
954
+ <br>
955
+ <br>
956
+
957
+ ## 22. 설치와 최초 설정
958
+
959
+ 이 섹션에서는 flh를 프로젝트에 적용하기 위한 최초 설정 과정을 설명한다.
960
+
961
+ ### A. 요구사항
962
+
963
+ flh를 사용하기 전에 아래 도구들이 필요하다.
964
+ - `git`
965
+ - `node`
966
+ - `npm`
967
+ - `python3`
968
+ - `PyYAML`
969
+ - `Codex CLI`
970
+
971
+ ### B. flh 클론하기
972
+
973
+ flh는 Git brance, staged file, pre-commit 훅 등의 요소들에 의해 엄격하게 제어되므로, 반드시 Git repo 안에서 사용해야 한다.
974
+
975
+ ```sh
976
+ # 1. flh를 clone 한다.
977
+ git clone https://github.com/jkuminga/FeatureLoopHarness <PROJECT_DIR>
978
+ cd <PROJECT_DIR>
979
+
980
+ # 2. 사용자 레포지토리로 연결하기 위해 flh 제거
981
+ git remote remove origin
982
+
983
+ # 3. 사용자 레포지토리를 origin에 연결
984
+ git remote add origin <YOUR_PROJECT_REPO_URL>
985
+ git remote -v
986
+
987
+ # 4. 초기 상태 push
988
+ git push -u origin main
989
+ ```
990
+
991
+ ### C. npm install
992
+
993
+ Git hook을 위한 Husky 활성화를 위해 아래 명령어를 실행하자.
994
+
995
+ ```sh
996
+ npm install
997
+ ```
998
+
999
+ ### D. Codex hook 활성화
1000
+
1001
+ flh는 사용자 의도 검사와 프로젝트 상태 전이를 위해 Codex `UserPromptSubmit` Hook을 사용한다.
1002
+
1003
+ 이 hook은 최초 사용 시 사용자가 실행을 승인해야 한다. 여기서 승인한다는 것은 hook 설정과 스크립트 경로를 확인한 뒤, Codex가 해당 hook을 실행해도 된다고 허용하는 것을 의미한다.
1004
+
1005
+ 현재 project-local hook의 실행 승인 작업은 Codex CLI에서만 가능하다. 따라서 Codex Desktop App을 주로 사용하더라도, 훅 활성화를 위해서는 최초 설정 단계에서 Codex CLI가 필요하다.
1006
+
1007
+ hook 승인 이후에는 Codex CLI와 Codex Desktop App 모두에서 하네스 구조와 파이프라인을 사용할 수 있다.
1008
+
1009
+ flh를 clone한 뒤 Codex CLI를 최초로 실행하면, CLI가 project-local hook을 감지하고 사용자에게 실행 승인 여부를 물어볼 수 있다.
1010
+ 만약 이 승인 안내가 자동으로 표시되지 않거나 나중에 다시 확인해야 한다면, Codex CLI 안에서 `/hooks` 명령을 실행해 hook 목록을 확인하고 `UserPromptSubmit` hook을 승인하면 된다.
1011
+
1012
+ ### E. 실행 권한 확인(옵션)
1013
+
1014
+ 실행 권한이 설정되어 있지 않아 훅 스크립트가 실행되지 않는 경우가 존재한다.
1015
+ 아래 명령어를 터미널에 입력하여 필수 훅 스크립트에 대한 실행 권한을 부여하자.
1016
+
1017
+ ```sh
1018
+ chmod +x .codex/hooks/user-prompt-submit.sh
1019
+ chmod +x .flh/hooks/user-prompt-submit.sh
1020
+ chmod +x .flh/scripts/pre_commit.py
1021
+ ```
1022
+
1023
+
1024
+ <br>
1025
+ <br>
1026
+
1027
+ ## 23. 테스트와 검증
1028
+
1029
+ 섹션 22의 과정대로 초기 설정을 완료했다면, 실제 하네스 구조가 정상적으로 작동하는지 확인해보자.
1030
+
1031
+ ### 23.1. 훅 테스트
1032
+
1033
+ 아래 명령을 실행함으로써 훅 스크립트의 정상 동적 여부를 확인할 수 있다.
1034
+
1035
+ ```sh
1036
+ # 명령
1037
+ printf '아키텍쳐 설계하자' | .codex/hooks/user-prompt-submit.sh
1038
+ ```
1039
+
1040
+ 훅이 정상적으로 활성화되었다면, 아래와 같이 명령이 Block 되어야한다.
1041
+
1042
+ ```json
1043
+ # 예상 출력
1044
+ {
1045
+ "decision": "block",
1046
+ "reason": "[Harness Guard: BLOCKED]\n\nCodex did not start the requested work because the project workflow guard blocked this prompt.\n\nReason:\n- Transition guard check failed.\n\nRequest:\n- request_type: ARCHITECTURE_DESIGN_REQUEST\n- confidence: high\n- current_state: MVP_DEFINITION\n- target_state: ARCHITECTURE_DESIGN\n\nMissing requirements:\n- docs/MVP.md: status is not completed\n\nNext action:\n- Finish the current workflow step first, or ask for current status/next work."
1047
+ }
1048
+ ```
1049
+
1050
+ ### 23.2. Unit Test
1051
+
1052
+ Pre-commit 과 User-Prompt-Submit 훅 스크립트에 대한 기계적인 테스트를 진행한다.
1053
+
1054
+ 해당 테스트로 아래 항목들을 검증할 수 있다.
1055
+ - 요청 의도 분류
1056
+ - 워크플로우 상태 전이
1057
+ - docs-spec.yml을 통한 문서 완료 여부 확인
1058
+ - source-layout 검사
1059
+ - pre-commit 모의 테스트
1060
+ - 스카폴딩 / DB 배포 예외 처리 확인
1061
+
1062
+ ```sh
1063
+ npm test
1064
+ ```
1065
+
1066
+ 예상되는 출력 결과는 아래와 같다.
1067
+ ```sh
1068
+ ----------------------------------------------------------------------
1069
+ Ran 41 tests in 0.596s
1070
+
1071
+ OK
1072
+ ```
1073
+
1074
+
1075
+ <br>
1076
+ <br>
1077
+
1078
+ ## 24. 트러블 슈팅
1079
+
1080
+ 테스트 과정이나 실제 사용 중 문제가 발생한 경우, 먼저 아래 항목을 확인해 어느 단계에서 문제가 생겼는지 확인한다.
1081
+
1082
+ ### 24.1. Codex Hook이 실행되지 않는 경우
1083
+ - Codex CLI에서 `/hooks` 명령어를 통해 훅이 승인(trust) 되었는지 확인하기
1084
+ - `.codex/hooks.json` 존재 여부 확인하기
1085
+ - `.codex/hooks/user-prompt-submit.sh`, `.flh/hooks/user-prompt-submit.sh` 실행 권한 확인하기
1086
+ - npm test 실행
1087
+
1088
+ ### 24.2. Pre-commit에서 거부되는 경우
1089
+ - 소스를 커밋하는 경우 현재 브랜치가 `feat/*`, `fix/*`, `refactor/*` 인지 확인
1090
+ - 소스 변경이 main/master에 직접 스테이징 되었는지 확인하기
1091
+ - `docs/features/review/` 혹은 `docs/features/active` 에 기능 디렉토리가 존재하는지 확인
1092
+ - `docs/source-layout.yml`의 `status`가 completed 인지 확인하기
1093
+ - 스카폴딩 / DB 배포 과정에서 오류의 경우 `STATE.md`의 approval 확인 하기
1094
+
1095
+ ### 24.3. npm test 실패 의 경우
1096
+ - python3 설치 및 사용가능 여부
1097
+ - PyYAML 설치 여부
1098
+
1099
+ ### 24.4. 상태 전이가 되지 않거나 훅에서 항상 요청을 block 하는 경우
1100
+ 이 경우에는 대개 하네스 정책 문서에 문제가 있는 경우가 대부분이다.
1101
+ `/d` 모드를 통해 현재 하네스 문서 수정을 요청하여 문제를 해결할 수 있다.
1102
+
1103
+ <br>
1104
+ <br>
1105
+