@angar2/taskery 0.8.1 → 1.0.1

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 (61) hide show
  1. package/README.md +437 -188
  2. package/bin/add.js +27 -99
  3. package/bin/backlog.js +240 -113
  4. package/bin/check.js +182 -0
  5. package/bin/commands.js +151 -0
  6. package/bin/finish.js +365 -0
  7. package/bin/init.js +99 -190
  8. package/bin/install.js +143 -0
  9. package/bin/lib.js +591 -1336
  10. package/bin/mcp.js +31 -263
  11. package/bin/orche.js +240 -0
  12. package/bin/plan.js +58 -120
  13. package/bin/prepare.js +329 -0
  14. package/bin/prune.js +46 -176
  15. package/bin/status.js +57 -151
  16. package/bin/taskery.js +76 -120
  17. package/bin/update.js +66 -269
  18. package/package.json +5 -5
  19. package/template/.taskery/BACKLOG.md +38 -0
  20. package/template/.taskery/rules/CHANGELOG_RULE.md +31 -0
  21. package/template/.taskery/rules/DEV_RULE.local.md +8 -0
  22. package/template/.taskery/rules/GIT_RULE.md +82 -0
  23. package/template/.taskery/rules/MOCKUP_RULE.md +19 -0
  24. package/template/.taskery/rules/TASKERY_RULE.md +112 -0
  25. package/template/.taskery/rules/TASK_DOC_RULE.md +104 -0
  26. package/template/.taskery/rules/TEST_RULE.local.md +16 -0
  27. package/template/AGENTS.md +15 -53
  28. package/template/shared/skills/add-backlog/SKILL.md +8 -38
  29. package/template/shared/skills/log-friction/SKILL.md +10 -88
  30. package/template/shared/skills/plan-init/SKILL.md +10 -98
  31. package/template/shared/skills/project-init/SKILL.md +13 -342
  32. package/template/shared/skills/task-close/SKILL.md +16 -319
  33. package/template/shared/skills/task-dev/SKILL.md +19 -233
  34. package/template/shared/skills/task-init/SKILL.md +11 -68
  35. package/template/shared/skills/task-orche/SKILL.md +35 -0
  36. package/template/shared/skills/task-plan/SKILL.md +19 -498
  37. package/template/shared/skills/task-test/SKILL.md +23 -342
  38. package/bin/close.js +0 -86
  39. package/bin/fork.js +0 -112
  40. package/bin/legacy-quotes.js +0 -60
  41. package/bin/migrate.js +0 -481
  42. package/bin/set-status.js +0 -98
  43. package/template/.claude/hooks/closed-immutable.sh +0 -77
  44. package/template/.claude/settings.json +0 -18
  45. package/template/.claude/skills/run-team/SKILL.md +0 -145
  46. package/template/.codex/agents/task-tester.toml +0 -41
  47. package/template/.codex/agents/test-plan-author.toml +0 -34
  48. package/template/.codex/config.toml +0 -17
  49. package/template/.codex/hooks/closed-immutable.sh +0 -66
  50. package/template/.project/changelog/.gitkeep +0 -0
  51. package/template/.project/flows/.gitkeep +0 -0
  52. package/template/.project/plans/.gitkeep +0 -0
  53. package/template/.project/rules/CHANGELOG_RULE.md +0 -97
  54. package/template/.project/rules/GIT_RULE.md +0 -325
  55. package/template/.project/rules/MOCKUP_RULE.md +0 -86
  56. package/template/.project/rules/TASKERY_RULE.md +0 -237
  57. package/template/.project/rules/TASK_DOC_RULE.md +0 -668
  58. package/template/.project/shared/received/completed/.gitkeep +0 -0
  59. package/template/.project/shared/sent/completed/.gitkeep +0 -0
  60. package/template/.project/tasks/.gitkeep +0 -0
  61. package/template/shared/hooks/git-guard.sh +0 -108
@@ -1,77 +0,0 @@
1
- #!/bin/bash
2
- # .claude/hooks/closed-immutable.sh
3
- # PreToolUse(Write|Edit) 훅 — closed 상태 task.md 재수정 차단
4
- #
5
- # 잡는 것 (단순화 — task.md 본 파일만 보호):
6
- # 1. .project/tasks/<NNN_slug>/<NNN>_<slug>.md (단일 파일)
7
- # 2. .project/tasks/<NNN_slug>/TASK-<NNN>_<slug>/task.md (폴더 승격)
8
- # → 헤더 status가 'closed'면 차단
9
- #
10
- # 차단 안 함 (의도적):
11
- # - .project/tasks/<NNN_slug>/spec-diffs/*.md — 역사적 자료, 자유 수정
12
- # - .project/tasks/<NNN_slug>/screenshots/* — 자유
13
- # - .project/tasks/<NNN_slug>/mockup/*.html — UX/UI 목업, 자유 수정 (<NNN_slug> 공통)
14
- # - 폴더 승격 task 폴더 안 추가 자료 (서브 문서 등) — 자유
15
- # - 코드 영역 — closed task 코드 재수정은 *새 task로 처리*가 정상 흐름
16
- #
17
- # 우회 (의도적으로 closed task를 풀어 다시 진행해야 하는 경우):
18
- # - 헤더 status를 closed → developing(또는 다른 상태)으로 직접 sed로 변경 (Bash 영역)
19
- # - 그 후 정상 Edit 가능
20
- #
21
- # Catastrophic 영역 (완료 보호). 잘 지키면 작동 0회 (무해).
22
-
23
- INPUT=$(cat)
24
-
25
- # tool_input.file_path 추출
26
- FILE_PATH=$(echo "$INPUT" | python3 -c "
27
- import sys, json
28
- try:
29
- d = json.load(sys.stdin)
30
- print(d.get('tool_input', {}).get('file_path', ''))
31
- except Exception:
32
- print('')
33
- " 2>/dev/null)
34
-
35
- # task.md 본 파일 매칭 (단일 + 폴더 승격)
36
- # - 단일: .project/tasks/<NNN_slug>/<NNN>_<slug>.md (NNN_<slug> 패턴 — plan 폴더 직속, spec-diffs/screenshots/mockup 하위 X)
37
- # - 폴더: .project/tasks/<NNN_slug>/TASK-<NNN>_<slug>/task.md
38
- # plan 폴더명은 한 세그먼트([^/]+)면 무엇이든 매칭 (NNN_slug 신규 / 구버전 vX.X 모두). spec-diffs/screenshots/mockup 직속 파일은 추가 세그먼트라 매칭 안 됨 (보호 대상 X)
39
- if ! echo "$FILE_PATH" | grep -qE '\.project/tasks/[^/]+/([0-9]+_[^/]+\.md|TASK-[^/]+/task\.md)$'; then
40
- exit 0
41
- fi
42
-
43
- # task.md = file_path 자체
44
- TASK_MD="$FILE_PATH"
45
-
46
- # task.md 존재 안 하면 통과 (신규 생성 케이스)
47
- if [ ! -f "$TASK_MD" ]; then
48
- exit 0
49
- fi
50
-
51
- # 헤더 status 추출 — status는 헤더 표의 *마지막* 셀.
52
- # 5컬럼(구): 생성일 / 플랜 / 유형 / 규모 / 상태
53
- # 6컬럼(0.6.0+): 생성일 / 플랜 / 유형 / 규모 / 부모 브랜치 / 상태
54
- # python3 정규식 사용 (mac BSD grep -P 미지원)
55
- STATUS=$(TM="$TASK_MD" python3 -c "
56
- import os, re
57
- try:
58
- content = open(os.environ['TM']).read()
59
- except Exception:
60
- print('')
61
- raise SystemExit(0)
62
- # 7-state whitelist
63
- WL = r'(draft|planned|developing|developed|testing|tested|closed)'
64
- # status = 마지막 셀. 선행 셀 4개(구 5컬럼) 또는 5개(신 6컬럼) 뒤에 온다.
65
- m = re.search(rf'^\|(?:[^|]*\|){{4,5}}\s*{WL}\s*\|\s*\$', content, re.MULTILINE)
66
- print(m.group(1) if m else '')
67
- " 2>/dev/null)
68
-
69
- # closed 상태면 차단
70
- if [ "$STATUS" = "closed" ]; then
71
- echo "closed-immutable: '$FILE_PATH' 차단. task '$TASK_MD' 상태가 'closed' — 재수정 금지." >&2
72
- echo " 의도적 재진입 필요 시: sed로 헤더 status를 'developing' 또는 다른 상태로 직접 변경 후 Edit 가능." >&2
73
- echo " *closed task 코드 / spec-diffs / screenshots / mockup*은 보호 영역 외 — 자유 수정. 단 코드 변경은 *새 task로 처리*가 정상 흐름." >&2
74
- exit 2
75
- fi
76
-
77
- exit 0
@@ -1,18 +0,0 @@
1
- {
2
- "hooks": {
3
- "PreToolUse": [
4
- {
5
- "matcher": "Bash",
6
- "hooks": [
7
- { "type": "command", "command": ".claude/hooks/git-guard.sh" }
8
- ]
9
- },
10
- {
11
- "matcher": "Write|Edit",
12
- "hooks": [
13
- { "type": "command", "command": ".claude/hooks/closed-immutable.sh" }
14
- ]
15
- }
16
- ]
17
- }
18
- }
@@ -1,145 +0,0 @@
1
- ---
2
- name: run-team
3
- description: agent teams로 다건 태스크를 독립 워크트리에서 자동 병렬 처리 — 리더 세션이 팀원(독립 세션)에게 태스크 1개씩 분배하고 흐름을 관리한다. 트리거 발화(예 "백로그 한 번에 진행해" / "팀에게 전부 독립으로 맡겨") 시에만 발동. Claude 전용 · 실험 기능(agent teams) 전제.
4
- ---
5
-
6
- # /run-team
7
-
8
- ## 개요
9
-
10
- 다건 태스크(백로그 여러 건 / 명시된 작업 묶음)를 **agent teams로 자동 병렬 처리**한다. 리더 메인 세션 1개가 작업을 태스크 단위로 묶어 결정하고, 각 태스크를 **팀원(독립 Claude Code 세션)** 에게 1개씩 맡긴다. 각 팀원은 taskery 태스크 5단계(`/task-init` ~ `/task-close`)를 *독립 워크트리*에서 수행한다.
11
-
12
- 이 스킬이 추가하는 것은 *세션 오케스트레이션 레이어*뿐이다. **워크트리 격리는 `/task-init`이, 머지 직렬화·충돌 3단계 해결은 `/task-close`가 이미 담당**한다 — 본 스킬은 그 위에서 누가 어떤 태스크를 맡고 어디서 멈추는지만 조율한다.
13
-
14
- > **taskery 기본 플로우가 아니다.** 디폴트는 *1세션 1태스크* (사용자가 직접 지시). 본 스킬은 *트리거 발화가 있을 때만* 발동하는 고기능이다. 평소 단일 태스크 흐름을 침범하지 않는다.
15
-
16
- ## 팀원 = agent teams 팀원 (Task tool 서브에이전트 아님)
17
-
18
- 본 스킬의 "팀원"은 **Claude Code의 agent teams 기능으로 생성되는 독립 세션**이다. **Task tool 서브에이전트로 대체하는 것을 영구 금지**한다 — 둘은 다르다.
19
-
20
- | | Task tool 서브에이전트 (금지) | agent teams 팀원 (본 스킬) |
21
- |---|---|---|
22
- | 세션 | 리더 컨텍스트 *안*의 백그라운드 워커 | **독립 세션 · 자체 컨텍스트 윈도우** |
23
- | 사용자 접근 | 직접 들어가 지시 불가 | **사용자가 직접 들어가 확인·지시 가능** |
24
- | 통신 | 결과만 리더에 반환 | 팀원↔리더 자동 통지 + 팀원끼리 직접 통신 (리더가 다 봄) |
25
- | 스킬 호출 | 제한적 | 프로젝트 `.claude/skills/` 그대로 로드 → taskery 5스킬 직접 호출 |
26
-
27
- 팀원은 각자 새 세션으로 시작하며 진입 문서(`CLAUDE.md` → `@AGENTS.md`)를 자동 로드하므로 taskery 룰을 그대로 따른다.
28
-
29
- ## 호출 시점
30
-
31
- - **트리거 발화** — 다건을 한 번에 / 팀으로 / 독립 병렬로 처리하라는 의도:
32
- - *"백로그 BL-003, 005, 007 한 번에 진행해"*
33
- - *"백로그에 쌓인 거 묶을 수 있는 단위로 팀한테 전부 맡겨"*
34
- - *"이 작업들 독립으로 병렬 처리해"*
35
- - **단일 태스크 의도면 발동 금지** — *"로그인 기능 추가해줘"* 류 단건은 기존 `/task-init` 흐름. 본 스킬 진입 X.
36
-
37
- ## 입력 처리
38
-
39
- 인자 = (선택) 대상 작업 목록 / 중단점 모드. 예: `/run-team BL-003 BL-005 BL-007` / `/run-team BL-003~009 --until test` / 인자 없이 발화로.
40
-
41
- - 대상이 모호하면 한 번에 한 질문씩 확인. **자동 추정으로 팀 가동 금지** — 태스크 묶음·팀원 수·중단점 모드 확정 후 진입.
42
-
43
- ## 단계
44
-
45
- ### Step 0 — 가드 (플랫폼 + 활성화)
46
-
47
- 본 스킬 진입 즉시 두 가드를 통과해야 한다. 하나라도 실패 시 *팀을 만들지 말고* 안내 후 중단.
48
-
49
- 1. **플랫폼 가드** — agent teams는 Claude 전용. 현재 세션이 Codex면 *"agent teams는 Claude 전용이라 Codex에서는 자동 병렬을 지원하지 않는다. 단일 태스크 흐름(`/task-init`)으로 진행하라"* 안내 + 중단. (본 스킬은 Claude 자산으로만 설치되므로 정상 경로에선 도달하지 않으나, 발화가 Codex 세션에 들어온 경우 대비.)
50
- 2. **활성화 가드** — agent teams는 기본 비활성. 활성 여부 확인:
51
- ```sh
52
- [ "$CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS" = "1" ] || echo "agent teams 비활성"
53
- ```
54
- - 비활성이면 *팀 가동을 시작하지 말고* 다음을 안내 + 중단:
55
- - *"agent teams는 실험 기능이라 기본 비활성이다. `~/.claude/settings.json`의 `env`에 `\"CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS\": \"1\"`를 넣고 세션을 재시작한 뒤 다시 호출하라. (팀원을 split pane으로 보려면 `env`가 아닌 최상위에 `\"teammateMode\": \"tmux\"`도 — 기본값 `auto`는 환경 자동 감지 후 in-process 폴백.)"*
56
- - 꺼진 채로 헛도는 것을 막기 위한 안전망이다.
57
-
58
- ### Step 1 — 작업 수집
59
-
60
- - 대상이 백로그면 `$MAIN_WT/.project/tasks/<활성 plan>/BACKLOG.md`에서 해당 BL 항목 정독 (개요 / 대상 영역).
61
- ```sh
62
- MAIN_WT=$(dirname "$(git rev-parse --path-format=absolute --git-common-dir)")
63
- ```
64
- - 대상이 명시 작업 목록이면 그 발화를 그대로.
65
- - 활성 plan은 `status` 도구(또는 `npx @angar2/taskery status`)로 검출.
66
-
67
- ### Step 2 — 태스크 묶기 판단
68
-
69
- 수집한 작업을 **태스크 단위로 묶는다**. 백로그 1건 = 태스크 1개가 *필수 아님* — 작업 범위·응집도에 따라 여러 건을 한 태스크로 묶거나 한 건을 그대로 둔다 (리더 판단).
70
-
71
- - **응집 기준**: 같은 모듈·파일군을 건드리거나 의존 관계가 있으면 한 태스크로 묶어 *충돌·중복을 사전 회피*. 서로 독립이면 분리해 병렬 이득 확보.
72
- - **팀원 수 권장 3~5** (agent teams 권장치). 결정된 태스크가 5개를 넘으면 *배치로 분할* — 1차 배치 완료(또는 중단점 도달) 후 2차 배치. 한 번에 다 띄우지 않는다 (토큰·조율 부담).
73
- - 묶음 결과를 사용자에게 제시 + confirm: *"태스크 N개로 묶었다 — ① <묶음>(BL-003+005) ② <묶음>(BL-007) … 팀원 N명. 이대로 갈까?"*
74
-
75
- ### Step 3 — 중단점 모드 결정
76
-
77
- 각 팀원이 taskery 5단계 중 *어디까지 자동 진행하고 어디서 멈출지* 결정한다.
78
-
79
- - **기본 = 단계별 정지** — 별도 지시가 없으면 각 팀원은 *한 단계 수행 후 멈추고 리더에 보고*. 사용자(또는 리더)가 다음 단계를 지시할 때까지 대기.
80
- - **구간 자동** — 사용자 지시(*"init부터 test까지 자동으로"*, *"--until test"*)가 있으면 해당 구간을 멈춤 없이 진행.
81
- - **`/task-close`(머지) 게이트 권장** — 자동 구간이라도 close는 *되돌릴 수 없는 dev 병합*이므로, 별도의 명시 지시가 없으면 close 직전에 멈춰 사용자 확인을 받도록 팀원에 지시한다.
82
- - 모드는 팀원마다 다르게 줄 수 있다 (태스크별 난이도에 따라).
83
-
84
- ### Step 4 — agent teams 팀원 생성 + 자기완결 지시
85
-
86
- > **팀원은 agent teams 팀원으로만 생성**한다 (위 "팀원 = agent teams 팀원" 절). Task tool 서브에이전트 대체 영구 금지.
87
-
88
- 리더가 결정한 태스크 수만큼 팀원을 만들고, 각 팀원에게 **태스크 1개 + 자기완결 지시**를 준다. 팀원 지시에 다음을 모두 포함한다 (팀원은 리더 컨텍스트를 공유하지 않으므로 *그 자체로 완결*되어야 한다):
89
-
90
- 1. **맡을 작업** — 태스크 주제 / 출처(BL-NNN 등) / 묶음이면 포함 항목 전부 + 각 개요·대상 영역.
91
- 2. **시작 위치** — *메인 워크트리(dev 체크아웃) cwd에서 `/task-init`을 먼저 호출*. `/task-init`이 독립 워크트리·브랜치를 분기한다.
92
- 3. **이동** — `/task-init` 결과 보고에 출력된 *워크트리 경로로 cd*한 뒤 후속 단계(`/task-plan` 이후)를 그 워크트리에서 수행.
93
- 4. **중단점 모드** — Step 3에서 정한 구간/정지 규칙. 예: *"`/task-init`과 `/task-plan`까지만 수행하고 멈춰 리더에 보고하라"*.
94
- 5. **보고 의무** — 각 중단점 도달 시 *상태(어느 단계까지 / 결과 요약 / 막힌 점)* 를 리더에 보고.
95
-
96
- - 여러 팀원이 동시에 메인 워크트리 cwd에서 `/task-init`을 호출해도, `/task-init`이 부르는 `fork` 명령이 **init 락으로 [채번~워크트리 분기]를 직렬화**(번호 충돌 차단)하고 브랜치명 유일성을 git이 보장하므로 충돌을 막는다. 각 팀원의 작업은 *물리적으로 분리된 워크트리 디렉토리*(`~/.taskery/worktrees/...`)에서 진행되므로 **agent teams의 "같은 파일 동시 편집 → 덮어쓰기" 제약이 구조적으로 회피된다.**
97
-
98
- ### Step 5 — 모니터링
99
-
100
- - 팀원이 중단점에 도달하거나 idle 상태가 되면 agent teams가 리더에 자동 통지한다 (폴링 불필요).
101
- - 리더는 각 팀원의 보고를 모아 *사용자에게 한 곳에서 종합 보고*: *"팀원 ①은 TASK-007 plan 완료·대기 / 팀원 ②는 TASK-008 dev 진행 중 …"*.
102
- - 사용자는 리더를 통해 다음 단계를 지시하거나, 특정 팀원 세션에 *직접 들어가* 지시할 수 있다 (in-process 화살표/Enter, 또는 `teammateMode` split pane).
103
- - **task 상태 lag 주의** — 팀원이 단계 완료를 제때 마킹하지 못해 후속이 막히면, 리더가 해당 팀원에 *상태 갱신/진행을 한 번 nudge*한다.
104
-
105
- ### Step 6 — 머지 조율
106
-
107
- 각 팀원의 `/task-close`는 **머지 락으로 자동 직렬화**된다 (동시 close 시도해도 한쪽씩 순차). 리더가 추가로 할 일:
108
-
109
- - 완료 순서를 *대기열로 관리* — 여러 팀원이 동시에 close 단계면 순차 진행을 안내.
110
- - `/task-close`의 충돌 3단계(단순 자동 / 의미적 자료 / 판단 불가)는 각 팀원이 자체 수행한다. **판단 불가(4-c)에 이르면 팀원이 사용자 호출**하도록 되어 있으므로, 리더는 그 호출을 사용자에게 전달한다.
111
- - 모든 태스크 close 후 *전체 결과를 종합 보고*: 머지된 TASK 목록 / 충돌 해결 내역 / 미완(중단점에서 멈춘 것) 목록.
112
-
113
- ## 도구 가이드
114
-
115
- - **Bash**: 메인 워크트리 검출 / 활성화 가드 확인 / `status`로 활성 plan 검출 / BACKLOG 정독용 경로 산출
116
- - **Read**: `$MAIN_WT/.project/tasks/<활성 plan>/BACKLOG.md` / `$MAIN_WT/.project/rules/TASKERY_RULE.md`
117
- - **agent teams (자연어)**: 팀원 생성 + 태스크별 지시 + 모니터링. (전용 슬래시 명령은 없음 — 리더가 자연어로 팀을 가동)
118
- - **AskUserQuestion**: 태스크 묶음 / 팀원 수 / 중단점 모드 확인
119
-
120
- ## 주의사항
121
-
122
- - **agent teams 팀원으로만** — Task tool 서브에이전트 대체 영구 금지 (자체 컨텍스트·사용자 직접 접근·리더 관리가 본 스킬의 전제).
123
- - **트리거 한정 발동** — 단일 태스크 의도에는 진입 금지. 기본 플로우(1세션 1태스크) 비침범.
124
- - **두 가드 선통과** — 플랫폼(Claude) + 활성화(env) 미충족 시 팀을 만들지 말고 안내 후 중단.
125
- - **워크트리·머지는 기존 스킬이 담당** — 본 스킬은 worktree를 직접 만들거나 머지하지 않는다. 팀원이 `/task-init`·`/task-close`를 호출하게 할 뿐. 본 스킬에서 git 명령 직접 실행 금지.
126
- - **팀원 지시는 자기완결** — 리더 컨텍스트 미공유. 작업·시작 위치·이동·중단점·보고 의무를 지시에 모두 명시.
127
- - **권장 3~5 팀원 / 초과 시 배치** — 토큰 비용은 팀원 수에 선형 증가. 한 번에 다 띄우지 않는다.
128
- - **`/task-close` 게이트 보존 권장** — 자동 구간이라도 되돌릴 수 없는 머지는 사용자 확인 후.
129
- - **in-process resume 취약** — agent teams는 `/resume`·`/rewind`로 in-process 팀원이 복원되지 않는다. 세션 중단 후 재개 시 *살아있지 않은 팀원에 메시지 시도*가 발생할 수 있으므로, 재개하면 팀원을 새로 만들고 진행 상태는 `npx @angar2/taskery status`로 재확인한다.
130
- - **split pane 환경 의존** — 팀원을 분할 화면으로 보려면 tmux/iTerm2 필요. VS Code 통합 터미널 등은 in-process(화살표 전환)만 가능.
131
-
132
- ## 상태 전이
133
-
134
- | 진입 시 | 종료 시 |
135
- |--------|--------|
136
- | (해당 없음 — 오케스트레이터) | (해당 없음) |
137
-
138
- 본 스킬은 task 상태를 직접 전이시키지 않는다. **상태 전이는 각 팀원이 호출하는 task 5스킬이 수행**한다 (`/task-init`=draft … `/task-close`=closed). 본 스킬은 누가 무엇을 어디까지 진행하는지만 조율한다.
139
-
140
- ## 멀티세션 정합
141
-
142
- - **기존 멀티세션 위에 얹힘** — taskery는 이미 *여러 메인 세션이 독립 워크트리로 병렬* 진행을 지원한다. 본 스킬은 그 "여러 세션"을 사용자가 일일이 띄우는 대신 *리더가 agent teams로 띄우고 관리*하게 하는 것뿐이다. 워크트리·머지 락·충돌 해결 정합은 기존과 동일.
143
- - **머지 락** — `~/.taskery/<projectId>.merge.lock` 단일. 팀원들의 close가 직렬화된다.
144
- - **race 차단** — 동시 `/task-init`은 브랜치명 유일성 + SSoT 2층으로 차단 (기존 `/task-init` 정합 그대로).
145
- - **완료 추적** — `npx @angar2/taskery status` (진행 중 팀원/워크트리) + dev 머지 히스토리.
@@ -1,41 +0,0 @@
1
- # taskery 격리 검증 서브에이전트 — /task-test가 spawn하는 독립 tester
2
- #
3
- # 클로드의 "Task tool 격리 세션"에 대응하는 코덱스 서브에이전트 정의.
4
- # 메인 세션의 plan/dev 컨텍스트(확증편향) 없이 task.md + TEST_RULE.local.md를 보고 독립 검증한다.
5
- #
6
- # ⚠ 미러 — 아래 developer_instructions는 `.agents/skills/task-test/SKILL.md`의 격리 펜스(수행 룰)와
7
- # *같은 효과*를 내야 한다. /task-test는 그 펜스 전체를 spawn prompt(task)로 전달하므로 펜스가 단일 룰
8
- # 소스이며, 이 지침은 코덱스에서 동일 효과를 보장하는 기준선이다. 펜스의 룰이 바뀌면 이 지침도 함께 갱신한다.
9
- # (클로드 = general-purpose 서브에이전트 + 펜스 / 코덱스 = 본 에이전트 + 펜스 — 양쪽 동일 효과)
10
- #
11
- # ⚠ model 명시 필수 — 생략하면 자식 모델 resolve가 service tier validation에서 실패한다.
12
- # 환경의 사용 가능 모델에 맞게 조정한다(기본 gpt-5.5).
13
- #
14
- # ⚠ sandbox_mode = workspace-write — 음성 대조(펜스 룰 19: 구현 일시 되돌림 → FAIL 확인 → 즉시 원복)가
15
- # 쓰기를 요구해 read-only에서 workspace-write로 전환. 코드 수정 금지 원칙(룰 8)은 유지되며 룰 19가
16
- # 유일 예외(원복 의무 + 메인 측 전후 스냅샷 대조가 안전망).
17
-
18
- name = "task-tester"
19
- description = "격리 검증 에이전트. 메인의 확증편향 없이 task.md + TEST_RULE.local.md를 보고 Test Plan을 증거 기반으로 독립 수행한다. /task-test가 spawn한다."
20
- model = "gpt-5.5"
21
- sandbox_mode = "workspace-write"
22
- developer_instructions = """
23
- 너는 격리된 tester다. 메인 세션의 가정(plan/dev 컨텍스트, "잘 될 거야")을 일체 신뢰하지 말고, 넘겨받은 검사 지시(spawn prompt)와 문서만 보고 자기완결적으로 검증하라.
24
-
25
- 검사 룰의 단일 소스 = spawn 시 넘겨받은 검사 지시(prompt)다. 그것을 그대로 따르며, 아래는 그 핵심을 코덱스에서 동일하게 보장하는 기준선이다(넘겨받은 지시와 충돌 시 넘겨받은 지시 우선):
26
-
27
- - 넘겨받은 task.md와 TEST_RULE.local.md를 직접 읽는다(task.md가 목업을 참조하면 목업도, 시험지 원본 경로가 주어졌으면 그것도). "task.md 하나만"이 아니다 — TEST_RULE.local.md는 각 검증 방식을 *이 프로젝트에서 실제로 어떻게 실행하나*(DB 조회 경로 / API 호출법 / E2E 셋업 / 시각 실행)의 단일 소스다.
28
- - task.md의 ## Test Plan 시나리오를 순서대로 그대로 수행한다(임의 추가/스킵/변형 금지).
29
- - 문 앞 검사(먼저) — 각 [AUTO] 시나리오가 [실행 명령/입력 + 구체적·관측 가능한 기대값(출력값/상태코드/어서션/조회 결과/화면 상태)] 한 쌍을 갖췄는지 확인한다. "정상 동작/잘 됨/확인한다" 같은 소원은 기대값이 아니다. UX/UI task의 [AUTO] 기대값은 출처 표기("(출처: 목업 §N / Req N)")도 자격 요건 — 무표기·"(출처 없음 — 사용자 확인 필요)" 잔존은 자격 미달. 미달인 [AUTO]는 검사하지 말고 "시험문제 결함(검증 불가)"으로 분류 + 무엇이 빠졌는지 지목한다(PASS 반올림 금지).
30
- - 시험지 오염 대조(시험지 원본 경로가 주어졌을 때, 먼저) — 원본을 Read해 task.md ## Test Plan과 칸 단위 대조. 무플래그 차이 = 무조건 오염 즉시 반려. 플래그 칸은 종류별 검증 — 【A수정】은 방식 칸만 허용(원안 문자열이 원본과 일치해야 하며 시나리오·PASS 기준의 A수정 = 오염), 【사용자결정】·【보수】는 허용 경로(원안 표기 일치만 확인). 방식 교체를 빙자해 기대값·시나리오 의미가 함께 바뀌었으면 오염. 오염 = UNCERTAIN(검증 불가) + "시험지 오염" 라벨로 리턴(어느 칸이 어떻게 다른지 명시).
31
- - 음성 대조(핵심 시나리오 최소 1개 — 코드 수정 금지의 유일 예외) — 구현 코드를 일시 되돌린 상태에서 그 시나리오가 실제로 FAIL함을 확인한 후 즉시 원복하고 통과 근거에 포함한다(git 명령 금지, 종료 시 되돌림 흔적 0 의무 — 원복 후 스스로 diff 확인). 되돌리기가 위험한 영역이면 생략 + 사유 기록.
32
- - 증거 일치 시만 PASS — 자격 갖춘 [AUTO]는 실제로 실행해 *관측 결과가 기대값과 일치할 때만* PASS. 코드 정독 "그럴듯함"·추정으로 PASS 금지. 증거(명령 출력/응답 로그/캡처/조회 결과)를 첨부한다.
33
- - [AUTO]/[USER] 분류 — [USER]는 정답지가 *주관*인 것만(시각 미세 취향 / 색조·2px / UX 느낌) → UNCERTAIN(사람 검수) + 증거 캡처로 리턴. 시각 *객관* 깨짐(요소 빠짐/빈 화면/배치 딴판/색 완전히 틀림)은 [USER]가 아니라 [AUTO] — 실제 화면 캡처 → 승인 목업과 대조해 네가 직접 판정한다(어긋나면 *구체적 어긋남 목록* + FAIL). 시각이라고 무조건 사람에게 넘기지 마라. 단 시각 객관의 [AUTO] 승격은 TEST_RULE.local.md의 *시각 실행* 절에 캡처 실행 경로가 있을 때 한정이다 — 경로가 없어 task.md가 [USER]로 분류했으면 그 분류를 존중한다.
34
- - UNCERTAIN 세 종류 — (사람 검수)=정답지가 주관인 영역 / (검증 불가)=[AUTO]인데 대조할 기대값을 구성 못 함=시험문제 결함 / (실행 보류)=화면·입력 점유 제약으로 실행하지 않음=환경 제약(사용자 승인 또는 격리 실행 경로 필요. 무엇을 왜 실행하지 않았는지 기록해 리턴). 검증 불가는 PASS로 반올림하거나 사람 검수로 떠넘기지 말고, *무엇을 시도했고 왜 기대값을 구성할 수 없는지* 근거를 반드시 기록한다(task-plan으로 Test Plan을 보수해야 하는 신호).
35
- - 신규 테스트 추가 시 카운트 +N / 모든 PASS만으로 단정 X — 신규 *테스트 식별자*(suite/class/function 등)가 runner 로그에 실제 등장했는지 grep으로 확인한다(1 hit 이상, 없으면 Suite 미실행 → FAIL). grep/Read 존재 확인은 보조용 — 실동작 PASS를 대체할 수 없다.
36
- - 픽스처 현실성 — 픽스처·시드가 실제 산출물과 형식·정밀도가 같은지 의심하고, 의심되면 실제 코드(writer·생성기)로 재생성해 재실행한 결과로 판정한다. 재생성 경로가 없어 대조를 구성할 수 없으면 시험문제 결함(검증 불가)으로 분류한다.
37
- - 어서션 정면성 — 기대값이 요구사항을 정면으로 겨누는지 확인한다("벗어날 수 없다"면 실제로 벗어나 볼 것. 버튼 disabled 확인은 우회 지표다). 우회 지표로 검사하는 [AUTO] 시나리오는 시험문제 결함으로 분류하고 무엇이 정면 관측인지 지목한다.
38
- - 화면·입력 점유 금지 — 실제 앱을 띄워 UI를 자동 조작하는 스위트는 사용자의 화면·입력을 점유한다. TEST_RULE.local.md의 *테스트 실행 환경* 절에 격리 실행 경로(창 숨김·헤드리스 / 컨테이너 / VM / CI)가 있으면 그 경로로 실행하고, 없으면 비점유 부분만 실행하거나 실행 보류(사용자 승인 필요)로 표시해 리턴한다. 헤드리스 모드가 있으면 항상 그쪽을 쓴다.
39
- - 코드와 동작만 신뢰한다. 코드 파일 수정 금지(유일 예외 = 위 음성 대조의 일시 되돌림 — 즉시 원복). 임시 파일(테스트 스크립트 등)은 종료 후 삭제한다.
40
- - 검증을 마치면 넘겨받은 검사 지시의 결과 형식(종합 판정 PASS/FAIL/UNCERTAIN / 시나리오별 결과 / 검증·테스트 명령 결과 / UNCERTAIN 3종 / 시험문제 결함 / 실행 보류)을 그대로 리턴한다.
41
- """
@@ -1,34 +0,0 @@
1
- # taskery 출제 분리 서브에이전트 — /task-plan Step 5-B가 spawn하는 독립 Test Plan 출제자(B)
2
- #
3
- # 클로드의 "서브에이전트 격리 호출"에 대응하는 코덱스 서브에이전트 정의.
4
- # 구현자(A=메인)가 출제를 겸하면 같은 오독이 문제지와 답안지에 함께 들어가므로,
5
- # B는 Requirements 합의문 + 승인 목업 + TEST_RULE.local.md만 보고 출제한다 (Dev Plan·코드 접근 없음).
6
- #
7
- # ⚠ 미러 — 아래 developer_instructions는 `.agents/skills/task-plan/SKILL.md` Step 5-B의 B prompt 펜스와
8
- # *같은 효과*를 내야 한다. /task-plan은 그 펜스 전체를 spawn prompt(task)로 전달하므로 펜스가 단일 룰
9
- # 소스이며, 이 지침은 코덱스에서 동일 효과를 보장하는 기준선이다. 펜스의 룰이 바뀌면 이 지침도 함께 갱신한다.
10
- # (클로드 = 서브에이전트 격리 호출 + 펜스 / 코덱스 = 본 에이전트 + 펜스 — 양쪽 동일 효과)
11
- #
12
- # ⚠ model 명시 필수 — 생략하면 자식 모델 resolve가 service tier validation에서 실패한다.
13
- # 환경의 사용 가능 모델에 맞게 조정한다(기본 gpt-5.5).
14
-
15
- name = "test-plan-author"
16
- description = "출제 분리 에이전트(B). Requirements 합의문 + 승인 목업 + TEST_RULE.local.md만 보고 Test Plan을 출제한다 — 구현 계획·코드 접근 없음. /task-plan Step 5-B가 spawn한다."
17
- model = "gpt-5.5"
18
- sandbox_mode = "read-only"
19
- developer_instructions = """
20
- 너는 격리된 Test Plan 출제자(B)다. 구현 계획·코드에 대한 어떤 가정도 없이, spawn prompt에 명시된 자료만 보고 검증 시나리오를 출제하라.
21
-
22
- 출제 룰의 단일 소스 = spawn 시 넘겨받은 출제 지시(prompt)다. 그것을 그대로 따르며, 아래는 그 핵심을 코덱스에서 동일하게 보장하는 기준선이다(넘겨받은 지시와 충돌 시 넘겨받은 지시 우선):
23
-
24
- - 입력은 prompt에 인라인된 Requirements 합의문 + (있을 때만) 승인 목업 경로 + 검증 규칙(TEST_RULE.local.md) 경로뿐이다. task 문서·코드·기타 문서를 열지 않는다. Requirements에 적힌 것만 검증 대상 — 적히지 않은 요구를 추정해 시나리오를 만들지 않는다.
25
- - 검증 규칙 파일이 주어졌으면 반드시 Read — ① 방식별 실행 경로 ② 테스트 실행 환경(점유 스위트 격리 경로·사용자 결정 기록) ③ 범위·방식 정책.
26
- - 시나리오 형식 = [실제 실행할 명령/입력] + [구체적·관측 가능한 기대값] 한 쌍 강제. "정상 동작/잘 됨" 같은 소원 금지. 장면 쪼개기 — 진짜 떨어질 장면 여러 개로 분해.
27
- - 방식 선택은 기계적으로 — 화면 신규·변경=시각(캡처-목업 대조) / 상호작용=UI 동작 / 엔드포인트=API 호출 / 데이터 변경=사이드 이펙트 조회 / 순수 계산=입출력 비교 / 기존 영역=회귀. 여러 개 걸리면 다 붙인다.
28
- - 방식 칸은 검증 규칙의 "방식별 실행 경로" 절에 등재된 경로로 채운다. 등재 경로가 없으면 그 칸에 "등재 경로 없음 — 메인 확인 필요"라고 적는다(실행 경로를 지어내지 않는다).
29
- - 어서션 정면성 — 기대값이 요구사항 자체를 관측해야 한다. "벗어날 수 없다"면 실제로 벗어나 보는 것이 정면, disabled 확인 같은 우회 지표는 PASS 기준이 될 수 없다.
30
- - 기대값 출처 표기 — UX/UI 요구의 모든 [AUTO] PASS 기준 끝에 출처를 단다: "(출처: 목업 §N / Req N)". 달 수 없으면 "(출처 없음 — 사용자 확인 필요)"로 표기한다(추정 은폐 금지).
31
- - 화면·입력 점유 스위트는 검증 규칙 "테스트 실행 환경" 절의 현재 기록 기준으로 분류한다 — 격리 경로 선언 있음=[AUTO] / "없음 — 매번 승인" 기록 또는 무기록=시나리오에 "사용자 승인 후 실행" 표기(사용자 질문은 메인 몫).
32
- - grep/Read-only 존재 확인 시나리오는 보조용 — 단독 PASS 가치 없음. Requirements 각 항목당 end-to-end 실동작 시나리오 최소 1개.
33
- - 출력은 넘겨받은 출제 지시의 출력 형식 그대로 — ## Test Plan 표(시나리오/분류/방식/PASS 기준) + Requirements ↔ Test Plan 매트릭스. 코드·문서 수정 금지 — 출제만 하고 리턴한다.
34
- """
@@ -1,17 +0,0 @@
1
- # taskery Codex 프로젝트 설정 — PreToolUse hook 2종 등록 (git 안전망 + closed 보호)
2
- #
3
- # hook 스크립트 경로는 git 리포 루트 기준으로 해석한다($(git rev-parse --show-toplevel)).
4
- # 설치 위치와 무관하게 동작하도록 절대경로 하드코딩을 피한다.
5
- # 최초 1회 코덱스 `/hooks`로 trust 승인이 필요하다(승인 전 hook은 자동 skip).
6
-
7
- [[hooks.PreToolUse]]
8
- matcher = "^Bash$"
9
- [[hooks.PreToolUse.hooks]]
10
- type = "command"
11
- command = 'bash "$(git rev-parse --show-toplevel)/.codex/hooks/git-guard.sh"'
12
-
13
- [[hooks.PreToolUse]]
14
- matcher = "apply_patch"
15
- [[hooks.PreToolUse.hooks]]
16
- type = "command"
17
- command = 'bash "$(git rev-parse --show-toplevel)/.codex/hooks/closed-immutable.sh"'
@@ -1,66 +0,0 @@
1
- #!/bin/bash
2
- # .codex/hooks/closed-immutable.sh
3
- # Codex PreToolUse(apply_patch) 훅 — closed 상태 task.md 재수정 차단 (코덱스 전용판)
4
- #
5
- # 클로드판(.claude/hooks/closed-immutable.sh)과의 차이:
6
- # - 클로드: tool_input.file_path 1개를 읽음 (Write|Edit 도구)
7
- # - 코덱스: 파일 편집이 apply_patch 도구 1개로 처리되며 tool_input.command 안에
8
- # patch envelope 전체(`*** Begin Patch` ... `*** Update File: <경로>` ...)가 들어옴.
9
- # file_path 키가 없으므로 command에서 `*** Update File:` / `*** Add File:` 헤더의
10
- # 경로를 정규식 추출해 각각 검사한다. matcher = "apply_patch".
11
- #
12
- # 잡는 것:
13
- # 1. .project/tasks/<NNN_slug>/<NNN>_<slug>.md (단일 파일)
14
- # 2. .project/tasks/<NNN_slug>/TASK-<NNN>_<slug>/task.md (폴더 승격)
15
- # → 헤더 status가 'closed'면 차단 (exit 2)
16
- #
17
- # 차단 안 함 (의도적): spec-diffs / screenshots / mockup — 역사적 자료 자유 수정.
18
- # Add File은 대상 파일이 존재하지 않으므로 자연 통과(새 파일은 closed일 수 없음).
19
- #
20
- # 우회: 헤더 status를 closed → developing 등으로 직접 변경 후 편집.
21
- # Catastrophic 영역 (완료 보호). 잘 지키면 작동 0회 (무해).
22
-
23
- INPUT=$(cat)
24
-
25
- # tool_input.command (apply_patch envelope 전체) 추출
26
- CMD=$(echo "$INPUT" | python3 -c "
27
- import sys, json
28
- try:
29
- print(json.load(sys.stdin).get('tool_input', {}).get('command', ''))
30
- except Exception:
31
- print('')
32
- " 2>/dev/null)
33
-
34
- # Update/Add File 헤더에서 대상 경로 추출 (한 patch에 여러 파일 가능)
35
- PATHS=$(echo "$CMD" | grep -oE '^\*\*\* (Update|Add) File: .+$' | sed -E 's/^\*\*\* (Update|Add) File: //')
36
-
37
- [ -z "$PATHS" ] && exit 0
38
-
39
- while IFS= read -r FILE_PATH; do
40
- # task.md 본 파일 패턴만 검사 (spec-diffs/screenshots/mockup 직속은 보호 대상 X)
41
- echo "$FILE_PATH" | grep -qE '\.project/tasks/[^/]+/([0-9]+_[^/]+\.md|TASK-[^/]+/task\.md)$' || continue
42
- # 존재하는 파일만 (Add File 신규 생성은 통과)
43
- [ -f "$FILE_PATH" ] || continue
44
-
45
- # 헤더 status 추출 — status는 헤더 표의 *마지막* 셀 (5컬럼 구 / 6컬럼 0.6.0+ 양쪽).
46
- STATUS=$(TM="$FILE_PATH" python3 -c "
47
- import os, re
48
- try:
49
- content = open(os.environ['TM']).read()
50
- except Exception:
51
- print('')
52
- raise SystemExit(0)
53
- WL = r'(draft|planned|developing|developed|testing|tested|closed)'
54
- m = re.search(rf'^\|(?:[^|]*\|){{4,5}}\s*{WL}\s*\|\s*\$', content, re.MULTILINE)
55
- print(m.group(1) if m else '')
56
- " 2>/dev/null)
57
-
58
- if [ "$STATUS" = "closed" ]; then
59
- echo "closed-immutable: '$FILE_PATH' 차단. task 상태가 'closed' — 재수정 금지." >&2
60
- echo " 의도적 재진입 시: sed로 헤더 status를 'developing' 등으로 변경 후 편집 가능." >&2
61
- echo " closed task 코드 / spec-diffs / screenshots / mockup은 보호 영역 외 — 자유 수정. 코드 변경은 새 task로 처리가 정상 흐름." >&2
62
- exit 2
63
- fi
64
- done <<< "$PATHS"
65
-
66
- exit 0
File without changes
File without changes
File without changes
@@ -1,97 +0,0 @@
1
- # CHANGELOG_RULE
2
-
3
- > 본 파일은 taskery 시스템 권장 프로젝트별 CHANGELOG 정책이다.
4
- > 우선순위: **이 파일** (`.project/rules/CHANGELOG_RULE.md`) → 메인 판단.
5
- > 프로젝트별 변형이 필요하면 `.project/rules/CHANGELOG_RULE.local.md` 생성 (npx update 미터치, 구속력은 코어와 동등 — `TASKERY_RULE` §7).
6
-
7
- ---
8
-
9
- ## 1. 파일 위치 / 기본 구조
10
-
11
- - **경로**: `.project/changelog/CHANGELOG.md` (단일 파일) 또는 `.project/changelog/<YYYY-MM>.md` (월별 분할, 선호)
12
- - **형식**: Markdown. 각 항목 = `## [TASK-NNN] <한 줄 요약>` 시작
13
- - **정렬**: 최신 항목이 *맨 위* (Reverse chronological order)
14
-
15
- ---
16
-
17
- ## 2. 항목 형식
18
-
19
- **작성 주체 = close CLI 자동.** 각 task close 시 `npx @angar2/taskery close`가 새 항목 1개를 직접 append한다 (헤더=task 문서 H1 제목 / 날짜 / 타입=헤더 유형 / 변경 요약=Dev Plan Phase 명 목록):
20
-
21
- ```markdown
22
- ## [TASK-NNN] <제목 — task 문서 H1>
23
-
24
- - **날짜**: YYYY-MM-DD
25
- - **타입**: feature / bug / improvement / refactor / docs / chore
26
- - **변경 요약**:
27
- - Phase 1 — <Phase 명>
28
- - Phase 2 — <Phase 명>
29
- ```
30
-
31
- ### 필수 필드 (CLI 자동 작성분)
32
-
33
- 1. 헤더 `## [TASK-NNN] <제목>` (한 줄)
34
- 2. **날짜** (`YYYY-MM-DD`)
35
- 3. **타입** (task 헤더 유형 — `feature` / `bug` / `improvement` / `refactor` / `docs` / `chore`)
36
- 4. **변경 요약** (Phase 명 목록 — Phase 부재 시 제목 1줄)
37
-
38
- ### 보강 (선택 — 세션·사용자 자유 편집)
39
-
40
- CLI 자동 작성분이 기본이고, 세션·사용자가 항목을 자유롭게 보강할 수 있다 (closed 잠금은 task 문서만 — changelog는 잠금 밖):
41
-
42
- - 변경 요약 문장 보강
43
- - 영향 파일 (참고용)
44
- - 사유 (참고용)
45
- - 관련 PR / 이슈 링크 (있을 시)
46
-
47
- ---
48
-
49
- ## 3. 삽입 위치 (중요)
50
-
51
- - **최신 항목이 맨 위** — 기존 첫 `##` 항목 *바로 위*에 삽입
52
- - 메인 세션이 CHANGELOG.md Edit 시 *파일 전체 구조 확인 후* 정확한 위치에 삽입 의무
53
- - 중간 삽입 / 끝 삽입 금지
54
-
55
- ---
56
-
57
- ## 4. task-close 흐름과의 정합
58
-
59
- **close CLI가 append한다 — 세션 수기 작성 불요, 보강만.**
60
-
61
- 1. `npx @angar2/taskery close`(또는 `task_close` 도구)가 §2 형식으로 항목을 자동 append — 파일 없으면 생성(§1 두 형식 중 단일 `CHANGELOG.md` 실재 시 그쪽, 아니면 이번 달 `<YYYY-MM>.md`), 최신 위치(맨 위) 삽입, `[TASK-NNN]` 중복 가드(재호출 시 skip)
62
- 2. 세션은 필요 시 append된 항목을 보강(§2 보강)
63
- 3. 커밋: 미등록 케이스는 close의 문서 커밋이 자동 수거 / 등록 케이스는 `.project/`가 git 밖이라 커밋 불요
64
-
65
- ---
66
-
67
- ## 5. 예시
68
-
69
- ```markdown
70
- ## [TASK-042] 사용자 인증 OAuth 2.0 지원
71
-
72
- - **날짜**: 2026-06-15
73
- - **타입**: feature
74
- - **변경 요약**:
75
- - Phase 1 — OAuth provider 연동 (Google / GitHub)
76
- - Phase 2 — 인증 라우트 배선
77
- - **영향 파일**: `src/auth/oauth.ts`, `src/routes/auth.ts`, `migrations/0042_oauth.sql`
78
- - **사유**: 외부 서비스 연동 요구 누적 — 인증 흐름 다변화
79
-
80
- ## [TASK-041] 로그인 페이지 입력 검증 fix
81
-
82
- - **날짜**: 2026-06-12
83
- - **타입**: bug
84
- - **변경 요약**:
85
- - Phase 1 — 이메일 형식 검증 보강
86
- ```
87
-
88
- (TASK-042 = CLI 자동 작성분에 영향 파일·사유를 보강한 예 / TASK-041 = CLI 자동 작성분 그대로.)
89
-
90
- ---
91
-
92
- ## 6. 수정 이력
93
-
94
- | 날짜 | 변경 사항 |
95
- |------|----------|
96
- | 2026-05-30 | 신규 작성 — 위치 / 형식 / 필수 필드 / task-close 정합 (stash FRICTION_LOG #8+9 반영) |
97
- | 2026-08-09 | 작성 주체를 close CLI 자동으로 개정 — §2 항목 형식(변경 요약=Phase 명 목록)·필수/보강 재편, §4 흐름 개정(수기 작성 불요·보강만·중복 가드). recordion FRICTION 2026-08-09(문서 갱신 세션 준수 의존) 반영 |