aiwf 0.3.4 → 0.3.6
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/.aiwf/00_PROJECT_MANIFEST.md +29 -16
- package/.aiwf/02_REQUIREMENTS/M03_Simone_Integration_Enhancement/M03_milestone_meta.md +55 -0
- package/.aiwf/02_REQUIREMENTS/M03_Simone_Integration_Enhancement/SPECS_AIWF_Simplified_Plan.md +221 -0
- package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/S03_M02_sprint_meta.md +0 -1
- package/.aiwf/metrics/metrics.json +18 -0
- package/.aiwf/personas/current.json +5 -0
- package/.aiwf/test-results-s02.json +5 -5
- package/.claude/commands/aiwf/aiwf_add_task_to_sprint.md +283 -0
- package/.claude/commands/aiwf/aiwf_install_git_hooks.md +63 -0
- package/.claude/commands/aiwf/aiwf_link_feature_branch.md +43 -0
- package/.claude/commands/aiwf/aiwf_link_feature_commit.md +46 -0
- package/.claude/commands/aiwf/aiwf_persona_architect.md +1 -1
- package/.claude/commands/aiwf/aiwf_persona_backend.md +1 -1
- package/.claude/commands/aiwf/aiwf_persona_data_analyst.md +1 -1
- package/.claude/commands/aiwf/aiwf_persona_frontend.md +1 -1
- package/.claude/commands/aiwf/aiwf_persona_security.md +1 -1
- package/.claude/commands/aiwf/aiwf_persona_status.md +1 -1
- package/CHANGELOG.md +54 -5
- package/claude-code/aiwf/ko/commands/ai-persona.js +1 -1
- package/package.json +1 -1
- package/src/cli/index.js +58 -2
- package/src/commands/create-project.js +10 -7
- package/src/commands/persona.js +288 -0
- package/src/commands/sprint-task.js +262 -0
- package/src/lib/file-downloader.js +5 -0
- package/src/lib/installer.js +14 -4
- package/tests/integration/test-persona-system/.aiwf/metrics/metrics.json +833 -0
- package/tests/unit/sprint-task.test.js +172 -0
- package/.aiwf/sessions/session_1752877859489_1t7n2fhdb.json +0 -7
- package/.aiwf/sessions/session_1752877859515_cwdv211ry.json +0 -7
- package/.aiwf/sessions/session_1752877860664_huziadmbo.json +0 -7
- package/.aiwf/sessions/session_1752877860666_kyr5u1np6.json +0 -7
- package/.aiwf/sessions/session_1752877861848_9yinepw3t.json +0 -7
- package/.aiwf/sessions/session_1752877861874_y32sputuc.json +0 -7
- package/.aiwf/sessions/session_1752877862685_ivxbl5rhz.json +0 -7
- package/.aiwf/sessions/session_1752877862820_wnq4glvxi.json +0 -7
- package/.aiwf/sessions/session_1752877864632_3ebnpaelb.json +0 -7
- package/.aiwf/sessions/session_1752877864879_b9zgjcb7d.json +0 -7
- package/.aiwf/sessions/session_1752877865533_x14m1vodi.json +0 -7
- package/.aiwf/sessions/session_1752877865562_gkoh19n7d.json +0 -7
- package/.aiwf/sessions/session_1752877866333_wp8qpdcoh.json +0 -7
- package/.aiwf/sessions/session_1752877866509_dawntfpab.json +0 -7
- package/.aiwf/sessions/session_1752877866890_plc5vfucl.json +0 -7
- package/.aiwf/sessions/session_1752877866895_ga8hmq3oi.json +0 -7
- package/.aiwf/sessions/session_1752877867761_ayjp4v5f5.json +0 -7
- package/.aiwf/sessions/session_1752877867892_lfz6jy252.json +0 -7
- package/.aiwf/sessions/session_1752877868139_7bqd9ubli.json +0 -7
- package/.aiwf/sessions/session_1752877868162_zq3ofjbsh.json +0 -7
- package/.aiwf/sessions/session_1752877869054_7rlgm9jt6.json +0 -7
- package/.aiwf/sessions/session_1752877869477_ax3nhbxzr.json +0 -7
- package/.aiwf/sessions/session_1752877870095_6hgp4vl1e.json +0 -7
- package/.aiwf/sessions/session_1752877870381_qfcrdg4li.json +0 -7
- package/.aiwf/sessions/session_1752877871895_pgd5vllhz.json +0 -7
- package/.aiwf/sessions/session_1752877872199_jbhv2g2da.json +0 -7
- package/.aiwf/sessions/session_1752877872680_x04wpffu6.json +0 -7
- package/.aiwf/sessions/session_1752877872895_3y4vbeauo.json +0 -7
- package/.aiwf/sessions/session_1752877873178_3maolzc6b.json +0 -7
- package/.aiwf/sessions/session_1752877873180_ytm83j07f.json +0 -7
- package/.aiwf/sessions/session_1752877874217_dp56c9t42.json +0 -7
- package/.aiwf/sessions/session_1752877874415_epwp1g1og.json +0 -7
- package/.aiwf/sessions/session_1752877874454_heicyuryb.json +0 -7
- package/.aiwf/sessions/session_1752877874869_1c2illeu5.json +0 -7
- package/.aiwf/sessions/session_1752877874879_k1vo4vxyx.json +0 -7
- package/.aiwf/sessions/session_1752877874913_bwgyiz9bp.json +0 -7
- package/.aiwf/sessions/session_1752877876218_44807kztz.json +0 -7
- package/.aiwf/sessions/session_1752877876515_qkhjv5kpw.json +0 -7
- package/.aiwf/sessions/session_1752877876543_p605aud1m.json +0 -7
- package/.aiwf/sessions/session_1752877876819_l65w7ifck.json +0 -7
- package/.aiwf/sessions/session_1752877876867_xrhzss4we.json +0 -7
- package/.aiwf/sessions/session_1752877876872_u7aso54qb.json +0 -7
- package/.aiwf/sessions/session_1752877877705_telnfg4o6.json +0 -7
- package/.aiwf/sessions/session_1752877878285_6s45im2ib.json +0 -7
- package/.aiwf/sessions/session_1752877878506_v0dvguqhz.json +0 -7
- package/.aiwf/sessions/session_1752877878581_3ri3yc66a.json +0 -7
- package/.aiwf/sessions/session_1752877878756_a82x9s2pd.json +0 -7
- package/.aiwf/sessions/session_1752877878886_20pjsfour.json +0 -7
- package/.aiwf/sessions/session_1752877880266_fm1ydjw0g.json +0 -7
- package/.aiwf/sessions/session_1752877881149_xbat4z03d.json +0 -7
- package/.aiwf/sessions/session_1752877881551_qy5sic9qs.json +0 -7
- package/.aiwf/sessions/session_1752877881554_24ugd96wu.json +0 -7
- package/.aiwf/sessions/session_1752877881797_e9mm25uh0.json +0 -7
- package/.aiwf/sessions/session_1752877881822_bxvjj8c9g.json +0 -7
- package/.aiwf/sessions/session_1752877881890_jv7l6jve3.json +0 -7
- package/.aiwf/sessions/session_1752877881991_f0qugdtcq.json +0 -7
- package/.aiwf/sessions/session_1752877883387_0bvw9rvnx.json +0 -7
- package/.aiwf/sessions/session_1752877883820_q6g2md2up.json +0 -7
- package/.aiwf/sessions/session_1752877884393_sqr7trvjl.json +0 -7
- package/.aiwf/sessions/session_1752877884500_whtypmzlf.json +0 -7
- package/.aiwf/sessions/session_1752877884645_y9mvvxli1.json +0 -7
- package/.aiwf/sessions/session_1752877884733_hk46eenel.json +0 -7
- package/.aiwf/sessions/session_1752877884738_c62j6214r.json +0 -7
- package/.aiwf/sessions/session_1752877884771_temhxehoz.json +0 -7
- package/.aiwf/sessions/session_1752877885643_6v5fcktc7.json +0 -7
- package/.aiwf/sessions/session_1752877886426_ee8di2fqh.json +0 -7
- package/.aiwf/sessions/session_1752877886549_3xj6tdoew.json +0 -7
- package/.aiwf/sessions/session_1752877886604_aj80yyfco.json +0 -7
- package/.aiwf/sessions/session_1752877886702_2b8841vyg.json +0 -7
- package/.aiwf/sessions/session_1752877886712_ntqc8b8bz.json +0 -7
- package/.aiwf/sessions/session_1752877886968_946m8tbw6.json +0 -7
- package/.aiwf/sessions/session_1752877887008_wg6zfg8dn.json +0 -7
- package/.aiwf/sessions/session_1752877888479_ciiu2qiqs.json +0 -7
- package/.aiwf/sessions/session_1752877889330_ravg8l66k.json +0 -7
- package/.aiwf/sessions/session_1752877889542_7zepkhjkc.json +0 -7
- package/.aiwf/sessions/session_1752877889638_ev4htqiu0.json +0 -7
- package/.aiwf/sessions/session_1752877889956_szphy2qma.json +0 -7
- package/.aiwf/sessions/session_1752877890220_o6aaa57tt.json +0 -7
- package/.aiwf/sessions/session_1752877890527_v2loy5vu1.json +0 -7
- package/.aiwf/sessions/session_1752877890572_cwq8fiuma.json +0 -7
- package/.aiwf/sessions/session_1752877892200_sgcwq1alt.json +0 -7
- package/.aiwf/sessions/session_1752877892268_v8kexpbc5.json +0 -7
- package/.aiwf/sessions/session_1752877892384_1gbbgrp4y.json +0 -7
- package/.aiwf/sessions/session_1752877893568_9p2n5p31a.json +0 -7
- package/.aiwf/sessions/session_1752877893727_un34a5tvp.json +0 -7
- package/.aiwf/sessions/session_1752877893778_01j79sw9i.json +0 -7
- package/.aiwf/sessions/session_1752877894053_jrhba6wko.json +0 -7
- package/.aiwf/sessions/session_1752877894082_x3bghawox.json +0 -7
- package/.aiwf/sessions/session_1752877894500_iytiav2ku.json +0 -7
- package/.aiwf/sessions/session_1752877894667_ucn0gc2ge.json +0 -7
- package/test-token-system.js +0 -88
- package/tests/temp_invalid_json/invalid.json +0 -1
- /package/{.aiwf/templates → templates}/README.md +0 -0
- /package/{.aiwf/templates → templates}/api-server/config.json +0 -0
- /package/{.aiwf/templates → templates}/api-server/template/.aiwf/config.json +0 -0
- /package/{.aiwf/templates → templates}/api-server/template/.aiwf/feature-ledger.json +0 -0
- /package/{.aiwf/templates → templates}/api-server/template/.aiwf/personas/backend-engineer.json +0 -0
- /package/{.aiwf/templates → templates}/api-server/template/.aiwf/scripts/cli.js +0 -0
- /package/{.aiwf/templates → templates}/api-server/template/.env.example +0 -0
- /package/{.aiwf/templates → templates}/api-server/template/.eslintrc.json +0 -0
- /package/{.aiwf/templates → templates}/api-server/template/README.md +0 -0
- /package/{.aiwf/templates → templates}/api-server/template/jest.config.js +0 -0
- /package/{.aiwf/templates → templates}/api-server/template/nodemon.json +0 -0
- /package/{.aiwf/templates → templates}/api-server/template/package.json +0 -0
- /package/{.aiwf/templates → templates}/api-server/template/src/app.ts +0 -0
- /package/{.aiwf/templates → templates}/api-server/template/src/config/swagger.ts +0 -0
- /package/{.aiwf/templates → templates}/api-server/template/src/controllers/aiwfController.ts +0 -0
- /package/{.aiwf/templates → templates}/api-server/template/src/controllers/authController.ts +0 -0
- /package/{.aiwf/templates → templates}/api-server/template/src/controllers/statusController.ts +0 -0
- /package/{.aiwf/templates → templates}/api-server/template/src/index.ts +0 -0
- /package/{.aiwf/templates → templates}/api-server/template/src/middleware/aiwfMiddleware.ts +0 -0
- /package/{.aiwf/templates → templates}/api-server/template/src/middleware/authMiddleware.ts +0 -0
- /package/{.aiwf/templates → templates}/api-server/template/src/middleware/errorHandler.ts +0 -0
- /package/{.aiwf/templates → templates}/api-server/template/src/middleware/notFoundHandler.ts +0 -0
- /package/{.aiwf/templates → templates}/api-server/template/src/middleware/requestLogger.ts +0 -0
- /package/{.aiwf/templates → templates}/api-server/template/src/routes/aiwf.ts +0 -0
- /package/{.aiwf/templates → templates}/api-server/template/src/routes/index.ts +0 -0
- /package/{.aiwf/templates → templates}/api-server/template/src/routes/v1/index.ts +0 -0
- /package/{.aiwf/templates → templates}/api-server/template/src/utils/logger.ts +0 -0
- /package/{.aiwf/templates → templates}/api-server/template/tests/app.test.ts +0 -0
- /package/{.aiwf/templates → templates}/api-server/template/tsconfig.json +0 -0
- /package/{.aiwf/templates → templates}/npm-library/config.json +0 -0
- /package/{.aiwf/templates → templates}/npm-library/template/LICENSE +0 -0
- /package/{.aiwf/templates → templates}/npm-library/template/README.md +0 -0
- /package/{.aiwf/templates → templates}/npm-library/template/package.json +0 -0
- /package/{.aiwf/templates → templates}/web-app/config.json +0 -0
- /package/{.aiwf/templates → templates}/web-app/template/.aiwf/config.json +0 -0
- /package/{.aiwf/templates → templates}/web-app/template/.aiwf/feature-ledger.json +0 -0
- /package/{.aiwf/templates → templates}/web-app/template/.aiwf/personas/fullstack-developer.json +0 -0
- /package/{.aiwf/templates → templates}/web-app/template/.aiwf/scripts/cli.js +0 -0
- /package/{.aiwf/templates → templates}/web-app/template/.eslintrc.cjs +0 -0
- /package/{.aiwf/templates → templates}/web-app/template/README.md +0 -0
- /package/{.aiwf/templates → templates}/web-app/template/index.html +0 -0
- /package/{.aiwf/templates → templates}/web-app/template/package.json +0 -0
- /package/{.aiwf/templates → templates}/web-app/template/postcss.config.js +0 -0
- /package/{.aiwf/templates → templates}/web-app/template/public/vite.svg +0 -0
- /package/{.aiwf/templates → templates}/web-app/template/src/App.tsx +0 -0
- /package/{.aiwf/templates → templates}/web-app/template/src/components/Layout.tsx +0 -0
- /package/{.aiwf/templates → templates}/web-app/template/src/components/aiwf/ContextStatus.tsx +0 -0
- /package/{.aiwf/templates → templates}/web-app/template/src/components/aiwf/FeatureLedger.tsx +0 -0
- /package/{.aiwf/templates → templates}/web-app/template/src/components/aiwf/TokenUsage.tsx +0 -0
- /package/{.aiwf/templates → templates}/web-app/template/src/index.css +0 -0
- /package/{.aiwf/templates → templates}/web-app/template/src/main.tsx +0 -0
- /package/{.aiwf/templates → templates}/web-app/template/src/pages/AiwfDashboard.tsx +0 -0
- /package/{.aiwf/templates → templates}/web-app/template/src/pages/HomePage.tsx +0 -0
- /package/{.aiwf/templates → templates}/web-app/template/src/pages/NotFound.tsx +0 -0
- /package/{.aiwf/templates → templates}/web-app/template/src/stores/aiwfStore.ts +0 -0
- /package/{.aiwf/templates → templates}/web-app/template/src/types/global.d.ts +0 -0
- /package/{.aiwf/templates → templates}/web-app/template/src/vite-env.d.ts +0 -0
- /package/{.aiwf/templates → templates}/web-app/template/tailwind.config.js +0 -0
- /package/{.aiwf/templates → templates}/web-app/template/tsconfig.json +0 -0
- /package/{.aiwf/templates → templates}/web-app/template/tsconfig.node.json +0 -0
- /package/{.aiwf/templates → templates}/web-app/template/vite.config.ts +0 -0
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
# 스프린트에 태스크 추가
|
|
2
|
+
|
|
3
|
+
기존 스프린트에 새로운 개별 태스크를 추가합니다.
|
|
4
|
+
|
|
5
|
+
## 사용법
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
/aiwf:add_task_to_sprint <스프린트ID> <태스크 제목>
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
예시:
|
|
12
|
+
- `/aiwf:add_task_to_sprint S03 "API 성능 최적화"`
|
|
13
|
+
- `/aiwf:add_task_to_sprint S03 "데이터베이스 인덱스 추가"`
|
|
14
|
+
|
|
15
|
+
## 정확히 다음 12개 항목으로 TODO 생성
|
|
16
|
+
|
|
17
|
+
1. 인수 분석 및 검증
|
|
18
|
+
2. 대상 스프린트 존재 확인
|
|
19
|
+
3. 스프린트 컨텍스트 및 목표 심층 분석
|
|
20
|
+
4. 태스크 적합성 평가 및 사용자 확인
|
|
21
|
+
5. 기존 태스크 목록 확인 및 중복 검사
|
|
22
|
+
6. 다음 태스크 번호 결정
|
|
23
|
+
7. 태스크 상세 내용 작성
|
|
24
|
+
8. 태스크 파일 생성
|
|
25
|
+
9. 스프린트 메타 파일 업데이트
|
|
26
|
+
10. 프로젝트 매니페스트 업데이트
|
|
27
|
+
11. Git 상태 확인
|
|
28
|
+
12. 최종 보고 및 다음 단계 안내
|
|
29
|
+
|
|
30
|
+
## 모든 TODO 항목에 대한 세부사항
|
|
31
|
+
|
|
32
|
+
### 1. 인수 분석 및 검증
|
|
33
|
+
|
|
34
|
+
입력 형식: `<스프린트ID> <태스크 제목>`
|
|
35
|
+
|
|
36
|
+
**검증 항목:**
|
|
37
|
+
- 스프린트 ID가 제공되었는지 확인 (예: S01, S02, S03)
|
|
38
|
+
- 태스크 제목이 제공되었는지 확인
|
|
39
|
+
- 태스크 제목이 따옴표로 묶여있다면 제거
|
|
40
|
+
- 비어있는 경우 사용자에게 올바른 형식 요청
|
|
41
|
+
|
|
42
|
+
### 2. 대상 스프린트 존재 확인
|
|
43
|
+
|
|
44
|
+
**확인 단계:**
|
|
45
|
+
- `.aiwf/03_SPRINTS/` 디렉토리에서 해당 스프린트 폴더 확인
|
|
46
|
+
- 스프린트 메타 파일 존재 확인 (`S##_M##_sprint_meta.md`)
|
|
47
|
+
- 스프린트 상태 확인 (completed가 아닌지)
|
|
48
|
+
- 존재하지 않으면 오류 메시지와 함께 중단
|
|
49
|
+
|
|
50
|
+
### 3. 스프린트 컨텍스트 및 목표 심층 분석
|
|
51
|
+
|
|
52
|
+
**병렬 서브에이전트**를 사용하여 다음 내용을 상세히 분석:
|
|
53
|
+
|
|
54
|
+
1. **스프린트 메타 파일 완전 분석**
|
|
55
|
+
- 스프린트 목표 및 범위 파악
|
|
56
|
+
- 예상 결과물(Deliverables) 확인
|
|
57
|
+
- 스프린트 성공 기준 이해
|
|
58
|
+
- 현재 진행 상황 및 남은 작업 파악
|
|
59
|
+
|
|
60
|
+
2. **마일스톤 컨텍스트 확인**
|
|
61
|
+
- 관련 마일스톤 파일에서 상위 목표 확인
|
|
62
|
+
- 마일스톤 성공 기준과의 정렬성 검토
|
|
63
|
+
- 다른 스프린트와의 연관성 파악
|
|
64
|
+
|
|
65
|
+
3. **기술적 제약사항 검토**
|
|
66
|
+
- `.aiwf/01_PROJECT_DOCS/ARCHITECTURE.md` 분석
|
|
67
|
+
- `.aiwf/05_ARCHITECTURAL_DECISIONS/` ADR 확인
|
|
68
|
+
- 기존 기술 스택 및 패턴 이해
|
|
69
|
+
|
|
70
|
+
4. **분석 결과 정리**
|
|
71
|
+
- 스프린트의 핵심 목표 3-5개 도출
|
|
72
|
+
- 허용되는 작업 범위 명확화
|
|
73
|
+
- 제외되어야 할 작업 유형 식별
|
|
74
|
+
|
|
75
|
+
### 4. 태스크 적합성 평가 및 사용자 확인
|
|
76
|
+
|
|
77
|
+
**태스크 적합성 심층 평가:**
|
|
78
|
+
|
|
79
|
+
1. **스프린트 목표와의 정렬성 검사**
|
|
80
|
+
- 제안된 태스크가 스프린트 목표에 직접적으로 기여하는가?
|
|
81
|
+
- 스프린트 범위를 벗어나지 않는가?
|
|
82
|
+
- 마일스톤 목표와 일치하는가?
|
|
83
|
+
|
|
84
|
+
2. **기존 태스크와의 관계 분석**
|
|
85
|
+
- 중복되는 태스크가 있는가?
|
|
86
|
+
- 다른 태스크와 충돌하거나 상충되는가?
|
|
87
|
+
- 선행 태스크가 필요한가?
|
|
88
|
+
|
|
89
|
+
3. **우선순위 및 복잡도 평가**
|
|
90
|
+
- 현재 스프린트 내에서 완료 가능한가?
|
|
91
|
+
- 다른 태스크보다 우선순위가 높은가?
|
|
92
|
+
- 예상 작업량이 적절한가?
|
|
93
|
+
|
|
94
|
+
4. **사용자에게 분석 결과 제시**
|
|
95
|
+
```
|
|
96
|
+
📊 태스크 적합성 분석 결과:
|
|
97
|
+
|
|
98
|
+
🎯 스프린트 목표: [스프린트 핵심 목표]
|
|
99
|
+
📋 제안된 태스크: [태스크 제목]
|
|
100
|
+
|
|
101
|
+
✅ 적합성 평가:
|
|
102
|
+
- 목표 정렬성: [상/중/하] - [이유]
|
|
103
|
+
- 범위 적절성: [적합/경계/벗어남] - [설명]
|
|
104
|
+
- 우선순위: [높음/보통/낮음] - [근거]
|
|
105
|
+
- 예상 복잡도: [낮음/보통/높음]
|
|
106
|
+
|
|
107
|
+
🔍 관련 태스크:
|
|
108
|
+
- [기존 태스크 목록 중 관련된 것들]
|
|
109
|
+
|
|
110
|
+
💡 권장사항:
|
|
111
|
+
[태스크 추가를 권장하는지, 수정이 필요한지, 다른 스프린트가 적합한지 등]
|
|
112
|
+
|
|
113
|
+
계속 진행하시겠습니까? (Y/N)
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
5. **사용자 확인 처리**
|
|
117
|
+
- Y: 태스크 추가 진행
|
|
118
|
+
- N: 취소하고 대안 제시
|
|
119
|
+
- 수정 제안 시: 새로운 태스크 제목으로 재평가
|
|
120
|
+
|
|
121
|
+
### 5. 기존 태스크 목록 확인 및 중복 검사
|
|
122
|
+
|
|
123
|
+
**상세한 중복 및 충돌 검사:**
|
|
124
|
+
- 스프린트 디렉토리 내 모든 태스크 파일 스캔
|
|
125
|
+
- 제목 및 내용 기반 유사도 검사
|
|
126
|
+
- 기능적 중복 여부 확인
|
|
127
|
+
- 관련 태스크 그룹핑 제안
|
|
128
|
+
|
|
129
|
+
### 6. 다음 태스크 번호 결정
|
|
130
|
+
|
|
131
|
+
**태스크 번호 할당:**
|
|
132
|
+
- 기존 태스크 번호 파악
|
|
133
|
+
- 순차적 번호 할당 (T01, T02...)
|
|
134
|
+
- 파일명 형식: `T##_S##_<제목_언더스코어>.md`
|
|
135
|
+
|
|
136
|
+
### 7. 태스크 상세 내용 작성
|
|
137
|
+
|
|
138
|
+
**스프린트 분석 결과를 바탕으로 태스크 내용 구체화:**
|
|
139
|
+
|
|
140
|
+
1. **태스크 개요 작성**
|
|
141
|
+
- 스프린트 목표와의 연관성 명시
|
|
142
|
+
- 구체적인 작업 범위 정의
|
|
143
|
+
- 예상 결과물 설명
|
|
144
|
+
|
|
145
|
+
2. **요구사항 도출**
|
|
146
|
+
- 스프린트 목표에서 파생된 구체적 요구사항
|
|
147
|
+
- 기술적 제약사항 반영
|
|
148
|
+
- 측정 가능한 완료 조건
|
|
149
|
+
|
|
150
|
+
3. **기술 가이드라인 구체화**
|
|
151
|
+
- 관련 ADR 참조
|
|
152
|
+
- 사용해야 할 기존 패턴/컴포넌트
|
|
153
|
+
- 준수해야 할 코딩 표준
|
|
154
|
+
|
|
155
|
+
4. **구현 전략 수립**
|
|
156
|
+
- 단계별 구현 접근법
|
|
157
|
+
- 예상되는 기술적 도전과제
|
|
158
|
+
- 리스크 및 대응 방안
|
|
159
|
+
|
|
160
|
+
### 8. 태스크 파일 생성
|
|
161
|
+
|
|
162
|
+
**파일 위치:** `.aiwf/03_SPRINTS/S##_M##_<name>/T##_S##_<title>.md`
|
|
163
|
+
|
|
164
|
+
**내용 포함:**
|
|
165
|
+
```markdown
|
|
166
|
+
# T##: [태스크 제목]
|
|
167
|
+
|
|
168
|
+
**스프린트**: S## - [스프린트 이름]
|
|
169
|
+
**생성일**: YYYY-MM-DD HH:MM
|
|
170
|
+
**상태**: pending
|
|
171
|
+
**우선순위**: medium
|
|
172
|
+
**예상 시간**: TBD
|
|
173
|
+
|
|
174
|
+
## 개요
|
|
175
|
+
[태스크에 대한 간단한 설명]
|
|
176
|
+
|
|
177
|
+
## 요구사항
|
|
178
|
+
- [ ] [구체적인 요구사항 1]
|
|
179
|
+
- [ ] [구체적인 요구사항 2]
|
|
180
|
+
- [ ] [구체적인 요구사항 3]
|
|
181
|
+
|
|
182
|
+
## 승인 기준
|
|
183
|
+
- [ ] [완료 조건 1]
|
|
184
|
+
- [ ] [완료 조건 2]
|
|
185
|
+
- [ ] [완료 조건 3]
|
|
186
|
+
|
|
187
|
+
## 기술 가이드라인
|
|
188
|
+
- [관련 아키텍처 결정 참조]
|
|
189
|
+
- [기존 코드베이스 패턴 참조]
|
|
190
|
+
- [사용할 기술 스택]
|
|
191
|
+
|
|
192
|
+
## 구현 노트
|
|
193
|
+
- [구현 시 고려사항]
|
|
194
|
+
- [잠재적 리스크]
|
|
195
|
+
- [테스트 전략]
|
|
196
|
+
|
|
197
|
+
## 참조
|
|
198
|
+
- [관련 문서나 코드 링크]
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
### 9. 스프린트 메타 파일 업데이트
|
|
202
|
+
|
|
203
|
+
스프린트 메타 파일의 태스크 섹션 업데이트:
|
|
204
|
+
- 새로운 태스크를 목록에 추가
|
|
205
|
+
- 전체 태스크 수 업데이트
|
|
206
|
+
- 진행률은 그대로 유지 (새 태스크는 pending)
|
|
207
|
+
|
|
208
|
+
### 10. 프로젝트 매니페스트 업데이트
|
|
209
|
+
|
|
210
|
+
`.aiwf/00_PROJECT_MANIFEST.md` 업데이트:
|
|
211
|
+
- "활성 태스크" 섹션에 새 태스크 추가
|
|
212
|
+
- 태스크 통계 업데이트
|
|
213
|
+
- 최종 업데이트 시간 변경
|
|
214
|
+
|
|
215
|
+
### 11. Git 상태 확인
|
|
216
|
+
|
|
217
|
+
**확인 사항:**
|
|
218
|
+
- 작업 디렉토리가 깨끗한지 확인
|
|
219
|
+
- 새로 생성된 파일 표시
|
|
220
|
+
- 수정된 파일 목록 제공
|
|
221
|
+
|
|
222
|
+
### 12. 최종 보고 및 다음 단계 안내
|
|
223
|
+
|
|
224
|
+
**상세한 보고서 제공:**
|
|
225
|
+
```
|
|
226
|
+
✅ 태스크 추가 완료!
|
|
227
|
+
|
|
228
|
+
📊 태스크 분석 요약:
|
|
229
|
+
- 스프린트 정렬성: [평가 결과]
|
|
230
|
+
- 우선순위: [설정된 우선순위]
|
|
231
|
+
- 예상 복잡도: [복잡도]
|
|
232
|
+
- 관련 태스크: [연관 태스크 목록]
|
|
233
|
+
|
|
234
|
+
📄 생성된 파일: T##_S##_<title>.md
|
|
235
|
+
🏃 스프린트: S## - [스프린트 이름]
|
|
236
|
+
📋 태스크: T## - [태스크 제목]
|
|
237
|
+
⏱️ 상태: pending
|
|
238
|
+
|
|
239
|
+
📝 다음 단계:
|
|
240
|
+
1. 태스크 파일을 열어 생성된 내용 검토
|
|
241
|
+
2. 필요시 세부사항 추가 작성
|
|
242
|
+
3. `/aiwf:do_task T##`로 작업 시작
|
|
243
|
+
4. 완료 후 `/aiwf:update_task_status T## completed` 실행
|
|
244
|
+
|
|
245
|
+
💡 팁:
|
|
246
|
+
- 태스크 목록 확인: `/aiwf:list_sprint_tasks S##`
|
|
247
|
+
- 태스크 상세 보기: `/aiwf:view_task T##`
|
|
248
|
+
- 관련 태스크 확인: [관련 태스크 번호들]
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
**출력 형식:**
|
|
252
|
+
```
|
|
253
|
+
✅ 태스크 추가 완료!
|
|
254
|
+
|
|
255
|
+
📄 생성된 파일: T##_S##_<title>.md
|
|
256
|
+
🏃 스프린트: S## - [스프린트 이름]
|
|
257
|
+
📋 태스크: T## - [태스크 제목]
|
|
258
|
+
⏱️ 상태: pending
|
|
259
|
+
|
|
260
|
+
📝 다음 단계:
|
|
261
|
+
1. 태스크 파일을 열어 세부사항 작성
|
|
262
|
+
2. `/aiwf:do_task T##`로 작업 시작
|
|
263
|
+
3. 완료 후 `/aiwf:update_task_status T## completed` 실행
|
|
264
|
+
|
|
265
|
+
💡 팁: 태스크 목록 확인은 `/aiwf:list_sprint_tasks S##`
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
## 주의사항
|
|
269
|
+
|
|
270
|
+
- **스프린트 적합성**: 태스크가 스프린트 목표에 부합하는지 반드시 검증
|
|
271
|
+
- **중복 방지**: 기존 태스크와의 중복 또는 충돌 확인
|
|
272
|
+
- **범위 관리**: 스프린트 범위를 벗어나는 태스크는 다른 스프린트로 안내
|
|
273
|
+
- **완료 가능성**: 현재 스프린트 기간 내 완료 가능한 작업인지 평가
|
|
274
|
+
- **의존성 확인**: 다른 태스크와의 의존 관계 파악 및 명시
|
|
275
|
+
- **품질 기준**: 태스크 설명은 구체적이고 측정 가능해야 함
|
|
276
|
+
|
|
277
|
+
## 분석 중심 접근법의 이점
|
|
278
|
+
|
|
279
|
+
1. **목표 정렬**: 모든 태스크가 스프린트 목표에 직접 기여
|
|
280
|
+
2. **중복 방지**: 유사하거나 중복된 작업 사전 차단
|
|
281
|
+
3. **품질 향상**: 상세한 분석으로 태스크 품질 개선
|
|
282
|
+
4. **시간 절약**: 부적절한 태스크로 인한 재작업 방지
|
|
283
|
+
5. **투명성**: 태스크 추가 근거와 맥락 명확화
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# Install Git Hooks
|
|
2
|
+
|
|
3
|
+
Install or manage AIWF Git hooks for automatic Feature-Git integration.
|
|
4
|
+
|
|
5
|
+
## Command Usage
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
# Install hooks
|
|
9
|
+
/project:aiwf:install_git_hooks
|
|
10
|
+
|
|
11
|
+
# Check status
|
|
12
|
+
/project:aiwf:install_git_hooks status
|
|
13
|
+
|
|
14
|
+
# Uninstall hooks
|
|
15
|
+
/project:aiwf:install_git_hooks uninstall
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## What It Does
|
|
19
|
+
|
|
20
|
+
### Install (default)
|
|
21
|
+
1. Backs up existing Git hooks if present
|
|
22
|
+
2. Installs AIWF pre-commit hook
|
|
23
|
+
3. Installs AIWF post-commit hook
|
|
24
|
+
4. Installs AIWF post-merge hook
|
|
25
|
+
|
|
26
|
+
### Status
|
|
27
|
+
- Shows which hooks are installed
|
|
28
|
+
- Indicates if AIWF hooks or other hooks are active
|
|
29
|
+
|
|
30
|
+
### Uninstall
|
|
31
|
+
- Removes AIWF hooks
|
|
32
|
+
- Restores original hooks from backup if available
|
|
33
|
+
|
|
34
|
+
## Hooks Functionality
|
|
35
|
+
|
|
36
|
+
### Pre-commit Hook
|
|
37
|
+
- Scans staged files for Feature ID references
|
|
38
|
+
- Prepares for feature tracking
|
|
39
|
+
|
|
40
|
+
### Post-commit Hook
|
|
41
|
+
- Extracts Feature ID from commit message
|
|
42
|
+
- Automatically links commit to feature
|
|
43
|
+
- Updates feature status (planned → active)
|
|
44
|
+
|
|
45
|
+
### Post-merge Hook
|
|
46
|
+
- Detects merges to main/master branch
|
|
47
|
+
- Updates feature status to completed
|
|
48
|
+
- Finalizes feature metrics
|
|
49
|
+
|
|
50
|
+
## Implementation
|
|
51
|
+
|
|
52
|
+
Execute the following command:
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
node .aiwf/scripts/install-git-hooks.cjs {{COMMAND}}
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## Notes
|
|
59
|
+
|
|
60
|
+
- Must be run from a Git repository root
|
|
61
|
+
- Preserves existing hooks as .aiwf-backup files
|
|
62
|
+
- Hooks are non-intrusive and fast
|
|
63
|
+
- Can be safely installed/uninstalled anytime
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# Link Feature Branch
|
|
2
|
+
|
|
3
|
+
Link the current Git branch to a Feature in the Feature Ledger.
|
|
4
|
+
|
|
5
|
+
## Command Usage
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
/project:aiwf:link_feature_branch <feature-id>
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Parameters
|
|
12
|
+
|
|
13
|
+
- `feature-id`: The Feature ID to link the current branch to (e.g., FL001)
|
|
14
|
+
|
|
15
|
+
## What It Does
|
|
16
|
+
|
|
17
|
+
1. Gets the current Git branch name
|
|
18
|
+
2. Updates the feature's git_branch field
|
|
19
|
+
3. Establishes the branch-feature relationship
|
|
20
|
+
|
|
21
|
+
## Examples
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
# On branch feature/FL001-user-auth
|
|
25
|
+
/project:aiwf:link_feature_branch FL001
|
|
26
|
+
|
|
27
|
+
# Creates the link between current branch and feature
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## Implementation
|
|
31
|
+
|
|
32
|
+
Execute the following command:
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
node .aiwf/scripts/git-integration.cjs link-branch {{FEATURE_ID}}
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Notes
|
|
39
|
+
|
|
40
|
+
- Must be run from within a Git repository
|
|
41
|
+
- The current branch will be linked to the feature
|
|
42
|
+
- Overwrites any existing branch link
|
|
43
|
+
- Useful when branch naming doesn't follow the FL### pattern
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# Link Feature Commit
|
|
2
|
+
|
|
3
|
+
Manually link a Git commit to a Feature in the Feature Ledger.
|
|
4
|
+
|
|
5
|
+
## Command Usage
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
/project:aiwf:link_feature_commit <feature-id> <commit-hash>
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Parameters
|
|
12
|
+
|
|
13
|
+
- `feature-id`: The Feature ID (e.g., FL001)
|
|
14
|
+
- `commit-hash`: The Git commit hash to link (full or short hash)
|
|
15
|
+
|
|
16
|
+
## What It Does
|
|
17
|
+
|
|
18
|
+
1. Retrieves commit information (message, author, date, stats)
|
|
19
|
+
2. Links the commit to the specified feature
|
|
20
|
+
3. Updates feature status if needed (planned → active)
|
|
21
|
+
4. Records the commit in the feature's git_commits array
|
|
22
|
+
|
|
23
|
+
## Examples
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
# Link a specific commit to feature FL001
|
|
27
|
+
/project:aiwf:link_feature_commit FL001 abc123def
|
|
28
|
+
|
|
29
|
+
# Link the latest commit
|
|
30
|
+
/project:aiwf:link_feature_commit FL002 HEAD
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## Implementation
|
|
34
|
+
|
|
35
|
+
Execute the following command:
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
node .aiwf/scripts/git-integration.cjs link-commit {{FEATURE_ID}} {{COMMIT_HASH}}
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Notes
|
|
42
|
+
|
|
43
|
+
- The commit must exist in the current repository
|
|
44
|
+
- The feature file must exist in the Feature Ledgers
|
|
45
|
+
- Duplicate commits are automatically ignored
|
|
46
|
+
- Feature status automatically updates from 'planned' to 'active' on first commit
|
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,51 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.3.5] - 2025-07-19
|
|
11
|
+
|
|
12
|
+
### ✨ Features
|
|
13
|
+
- **Persona Management**: Implement unified persona management system (`b913da0`)
|
|
14
|
+
- **Runtime State**: Add runtime persona state and metrics tracking (`6e5ca2c`)
|
|
15
|
+
- **Templates**: Add AIWF test instance and project templates (`3034bce`)
|
|
16
|
+
- **Korean Support**: AIWF 한글 템플릿 추가 문서 및 파일 보완 (`5a24037`)
|
|
17
|
+
- **Template Structure**: AIWF 한글 템플릿 구조 완성 (`f12fb76`)
|
|
18
|
+
- **Template Manager**: 템플릿 관리자 구현 및 작업 템플릿 개선 (`feec001`)
|
|
19
|
+
- **Context Compression**: Implement persona-aware context compression (`646fd4c`)
|
|
20
|
+
- **Quality Evaluation**: Add persona quality evaluation system (`4b60a79`)
|
|
21
|
+
- **Claude Commands**: Add Claude Code commands for 5 AI personas (`3ccdb7b`)
|
|
22
|
+
- **Feature Ledger**: Implement Feature Ledger CLI with full CRUD operations (`97c15b3`)
|
|
23
|
+
|
|
24
|
+
### 📝 Documentation
|
|
25
|
+
- **Persona Docs**: Standardize persona command documentation (`a5a1a98`)
|
|
26
|
+
- **README**: Update README with new persona features (`5dbafc6`)
|
|
27
|
+
|
|
28
|
+
### ♻️ Refactoring
|
|
29
|
+
- **Project Structure**: 완전한 src 폴더 구조 통합 및 정리 (`92fc7f0`)
|
|
30
|
+
- **Evaluation System**: Replace complex evaluation with lightweight background monitoring (`b39da95`)
|
|
31
|
+
|
|
32
|
+
### 🔧 Build/Config
|
|
33
|
+
- **Dependencies**: Bump version to 0.3.4 and clean up dependencies (`66166cb`)
|
|
34
|
+
- **Gitignore**: Add .aiwf/backup_*/ pattern to .gitignore (`2952457`)
|
|
35
|
+
- **Development Rules**: Update .gitignore and add framework development rules to CLAUDE.md (`e58a4eb`)
|
|
36
|
+
|
|
37
|
+
### 🔄 Other Changes
|
|
38
|
+
- 버전 0.3.3으로 업데이트 및 불필요한 압축 관련 문서 삭제 (`9c7c67e`)
|
|
39
|
+
- 설치 완료 플래그 파일 생성 및 기존 설치 확인 로직 수정 (`e956b59`)
|
|
40
|
+
- 버전 업데이트 및 불필요한 CLI 명령어 제거 (`659e6b5`)
|
|
41
|
+
|
|
42
|
+
## [0.3.4] - 2025-07-19
|
|
43
|
+
|
|
44
|
+
### 🔧 Build/Config
|
|
45
|
+
- Clean up dependencies and update package configuration
|
|
46
|
+
|
|
47
|
+
## [0.3.3] - 2025-07-14
|
|
48
|
+
|
|
49
|
+
### 🔄 Other Changes
|
|
50
|
+
- Remove unnecessary compression-related documentation
|
|
51
|
+
- Create installation completion flag file
|
|
52
|
+
- Fix existing installation check logic
|
|
53
|
+
- Remove unnecessary CLI commands
|
|
54
|
+
|
|
10
55
|
### Added
|
|
11
56
|
- 📚 **Comprehensive Documentation Suite**
|
|
12
57
|
- API Reference guide with complete module documentation
|
|
@@ -124,8 +169,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
124
169
|
- GitHub repository download functionality
|
|
125
170
|
- Simple installation script
|
|
126
171
|
|
|
127
|
-
[Unreleased]: https://github.com/
|
|
128
|
-
[
|
|
129
|
-
[0.3.
|
|
130
|
-
[0.
|
|
131
|
-
[0.1
|
|
172
|
+
[Unreleased]: https://github.com/moonklabs/aiwf/compare/v0.3.5...HEAD
|
|
173
|
+
[0.3.5]: https://github.com/moonklabs/aiwf/compare/v0.3.4...v0.3.5
|
|
174
|
+
[0.3.4]: https://github.com/moonklabs/aiwf/compare/v0.3.3...v0.3.4
|
|
175
|
+
[0.3.3]: https://github.com/moonklabs/aiwf/compare/v0.3.1...v0.3.3
|
|
176
|
+
[0.3.1]: https://github.com/moonklabs/aiwf/compare/v1.0.0...v0.3.1
|
|
177
|
+
[1.0.0]: https://github.com/moonklabs/aiwf/compare/v0.3.0...v1.0.0
|
|
178
|
+
[0.3.0]: https://github.com/moonklabs/aiwf/compare/v0.2.0...v0.3.0
|
|
179
|
+
[0.2.0]: https://github.com/moonklabs/aiwf/compare/v0.1.0...v0.2.0
|
|
180
|
+
[0.1.0]: https://github.com/moonklabs/aiwf/releases/tag/v0.1.0
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* 다양한 개발 작업을 위한 AI 행동 페르소나 관리
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
import { AIPersonaManager } from '../../../../lib/ai-persona-manager.js';
|
|
8
|
+
import { AIPersonaManager } from '../../../../src/lib/ai-persona-manager.js';
|
|
9
9
|
import { getBackgroundMonitor } from '../utils/background-monitor.js';
|
|
10
10
|
import path from 'path';
|
|
11
11
|
import chalk from 'chalk';
|
package/package.json
CHANGED
package/src/cli/index.js
CHANGED
|
@@ -4,7 +4,9 @@ import { program } from 'commander';
|
|
|
4
4
|
import chalk from 'chalk';
|
|
5
5
|
import { installAIWF } from '../lib/installer.js';
|
|
6
6
|
import AIToolCommand from '../commands/ai-tool.js';
|
|
7
|
+
import PersonaCommand from '../commands/persona.js';
|
|
7
8
|
import { CacheCLI } from './cache-cli.js';
|
|
9
|
+
import { addTaskToSprint } from '../commands/sprint-task.js';
|
|
8
10
|
|
|
9
11
|
// Parse version from package.json
|
|
10
12
|
import { readFileSync } from 'fs';
|
|
@@ -21,9 +23,9 @@ program
|
|
|
21
23
|
.version(packageJson.version)
|
|
22
24
|
.description('AIWF - AI Workflow Framework');
|
|
23
25
|
|
|
24
|
-
// Install command
|
|
26
|
+
// Install command
|
|
25
27
|
program
|
|
26
|
-
.command('install'
|
|
28
|
+
.command('install')
|
|
27
29
|
.description('Install AIWF framework')
|
|
28
30
|
.option('-f, --force', 'Force install without prompts')
|
|
29
31
|
.action((options) => installAIWF({ ...options, debugLog: true }));
|
|
@@ -161,5 +163,59 @@ lang
|
|
|
161
163
|
await resetLanguage();
|
|
162
164
|
});
|
|
163
165
|
|
|
166
|
+
// Persona management commands
|
|
167
|
+
const persona = program.command('persona');
|
|
168
|
+
persona.description('Manage AI personas / AI 페르소나 관리');
|
|
169
|
+
|
|
170
|
+
persona
|
|
171
|
+
.command('status')
|
|
172
|
+
.alias('s')
|
|
173
|
+
.description('Show current persona status / 현재 페르소나 상태 표시')
|
|
174
|
+
.action(async () => {
|
|
175
|
+
const personaCmd = new PersonaCommand();
|
|
176
|
+
await personaCmd.showStatus();
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
persona
|
|
180
|
+
.command('list')
|
|
181
|
+
.alias('ls')
|
|
182
|
+
.description('List available personas / 사용 가능한 페르소나 목록')
|
|
183
|
+
.action(async () => {
|
|
184
|
+
const personaCmd = new PersonaCommand();
|
|
185
|
+
await personaCmd.listPersonas();
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
persona
|
|
189
|
+
.command('set <persona-name>')
|
|
190
|
+
.alias('switch')
|
|
191
|
+
.description('Switch to specific persona / 특정 페르소나로 전환')
|
|
192
|
+
.action(async (personaName) => {
|
|
193
|
+
const personaCmd = new PersonaCommand();
|
|
194
|
+
await personaCmd.setPersona(personaName);
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
persona
|
|
198
|
+
.command('reset')
|
|
199
|
+
.alias('r')
|
|
200
|
+
.description('Reset to default persona / 기본 페르소나로 리셋')
|
|
201
|
+
.action(async () => {
|
|
202
|
+
const personaCmd = new PersonaCommand();
|
|
203
|
+
await personaCmd.resetPersona();
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
// Sprint task management command
|
|
207
|
+
program
|
|
208
|
+
.command('sprint-task <sprintId> <taskTitle>')
|
|
209
|
+
.alias('st')
|
|
210
|
+
.description('Add a task to an existing sprint / 스프린트에 태스크 추가')
|
|
211
|
+
.action(async (sprintId, taskTitle) => {
|
|
212
|
+
try {
|
|
213
|
+
await addTaskToSprint(sprintId, taskTitle);
|
|
214
|
+
} catch (error) {
|
|
215
|
+
console.error(chalk.red(`오류: ${error.message}`));
|
|
216
|
+
process.exit(1);
|
|
217
|
+
}
|
|
218
|
+
});
|
|
219
|
+
|
|
164
220
|
// Parse command line arguments
|
|
165
221
|
program.parse(process.argv);
|