deuk-agent-rule 2.3.1 → 2.4.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.
@@ -0,0 +1,83 @@
1
+ # 변경 이력 (Changelog)
2
+
3
+ 이 프로젝트의 모든 주목할 만한 변경 사항은 이 파일에 기록됩니다.
4
+
5
+ **English:** [CHANGELOG.md](CHANGELOG.md)
6
+
7
+ 형식은 [Keep a Changelog](https://keepachangelog.com/ko/1.1.0/)를 기반으로 하며, 이 프로젝트는 [유의적 버전(Semantic Versioning)](https://semver.org/spec/v2.0.0.html)을 준수합니다.
8
+
9
+ ## [2.4.1] - 2026-04-18
10
+
11
+ ### 추가됨 (Added)
12
+ - **cli:** NPM 최신 버전을 감지하여 터미널에 업데이트를 권고하는 알림 기능(Update Notifier) 추가
13
+
14
+ ### 수정됨 (Fixed)
15
+ - **ticket:** 티켓 생성 시 호스트명 슬러그가 8글자로 엄격히 제한되지 않던 버그 수정
16
+
17
+ ## [2.4.0] - 2026-04-18
18
+
19
+ ### 추가됨 (Added)
20
+
21
+ - **init:** 깔끔한 마이그레이션을 위한 구버전 템플릿 자동 정리 기능 추가
22
+ - **rules:** `AGENTS.md` 문서 내 티켓 검증 단계(TICKET VERIFICATION RULE) 규약 추가
23
+ - **ticket:** 티켓에 우선순위(Priority) 속성 추가
24
+ - **ticket:** 순차 번호 및 호스트네임 기반의 티켓 식별자(ID) 자동 생성 도입 (`NNN-hostname-topic` 포맷)
25
+ - **ticket:** 호스트네임 길이 제한(8자) 및 자동 순번 부여 로직 개선
26
+
27
+ ### 수정됨 (Fixed)
28
+
29
+ - **rules:** 전역 `npx` 캐시 이슈(과거 버전 실행 문제)를 우회하기 위해 로컬 최신 스크립트 호출을 강제/권장하도록 수정
30
+ - **scripts:** OSS 미러 저장소 동기화 시 잘못 표기되던 URL 예시 로그 메시지 정정
31
+
32
+ ### 변경됨 (Changed)
33
+
34
+ - **docs:** 리드미(README) 파일에 [Step 4] 티켓 검증 안내 추가
35
+ - **docs:** 전역 설치(Global Install) 권장 안내 및 운영체제(OS)별 권한 제약 명확화
36
+ - **rules:** 구현 아티팩트(`implementation_plan.md` 등) 내 티켓 번호 참조 의무화
37
+
38
+ ## [2.3.2] - 2026-04-17
39
+
40
+ ### 수정됨 (Fixed)
41
+
42
+ - **cli:** 배포 환경에서 하드코딩된 `yaml` 의존성 경로 문제(`ERR_MODULE_NOT_FOUND`) 해결
43
+ - **dependencies:** `yaml`을 명시적 의존성 목록에 추가
44
+
45
+ ## [2.3.1] - 2026-04-17
46
+
47
+ ### 변경됨 (Changed)
48
+
49
+ - **readme:** 체인지로그 및 자동화된 릴리즈 프로세스 가이드 추가
50
+
51
+ ## [2.3.0] - 2026-04-17
52
+
53
+ ### 추가됨 (Added)
54
+
55
+ - AI 파이프라인 연동 기반 및 선택적 동기화 시스템 고도화
56
+ - **cli:** ticket list 명령에 --submodule 필터 추가
57
+ - **cli:** 티켓 아카이브 및 리포트 워크플로를 모듈형 아키텍처로 복구
58
+ - **rules:** Unity Client, WebApp, C++ 서버 하이브리드 환경을 위한 룰 고도화
59
+ - **ticket:** 분산형 티켓 관리 및 공유 정책 구현
60
+ - **ticket:** V2 YAML Front-matter 및 카테고리화된 리스트로 업그레이드
61
+
62
+ ### 수정됨 (Fixed)
63
+
64
+ - **ticket:** LATEST.md를 폐기하고 ACTIVE_TICKET.md로 포인터 통일
65
+ - **ticket:** DeukAgentRules 현재 진행 중인 티켓 안 나오던 문제 해결
66
+
67
+ ## [1.0.14] - 2026-04-02
68
+
69
+ ### 추가됨 (Added)
70
+
71
+ - **cli:** 병합 도구 및 배포 문서 동기화 스크립트 확장
72
+ - **rules:** 커밋 제목 내 'sync' 금지 구문 룰 추가
73
+ - **handoff:** 인덱스 기반 Handoff 워크플로 및 CLI 신설
74
+ - **architecture:** 제로-터치 NPM 번들 스캐폴딩으로 템플릿 아키텍처 개편
75
+
76
+ ### 수정됨 (Fixed)
77
+
78
+ - **cli:** 템플릿 생성기(init) 내부의 HTML 엔티티 문법 에러 핫픽스
79
+
80
+ ### 변경됨 (Changed)
81
+
82
+ - **docs:** 외부 공개용 릴리즈 가이드 및 동기화 스크립트 주석 갱신
83
+ - **docs:** 리드미(README)에 토큰 비용 차단 메커니즘 설정 및 제로 터치 스캐폴딩 문서 개편
package/CHANGELOG.md CHANGED
@@ -4,185 +4,235 @@ All notable changes to this project will be documented in this file.
4
4
 
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
6
 
7
- ## [2.3.1] - 2026-04-17
8
-
9
-
10
- ### Changed
11
-
12
- - **readme:** add changelog and automated release instructions
13
-
14
- ## [2.3.0] - 2026-04-17
7
+ ## [2.4.1] - 2026-04-18
15
8
 
16
9
 
17
10
  ### Added
18
11
 
19
- - AI 파이프라인 연동 기반 선택적 동기화 시스템 고도화
20
- - **cli:** add --submodule filter to ticket list command
21
- - **cli:** restore ticket archive and reports workflows to modular architecture
22
- - **rules:** advance rules for Unity Client, WebApp, and C++ Server hybrid environment
23
- - **ticket:** implementation of decentralized ticket management & sharing policy
24
- - **ticket:** upgrade to V2 YAML Front-matter and Categorized List
12
+ - **cli:** add update notifier for checking latest npm version
25
13
 
26
14
 
27
15
  ### Fixed
28
16
 
29
- - **ticket:** deprecate LATEST.md, unify pointer to ACTIVE_TICKET.md
30
- - **ticket:** DeukAgentRules 현재 진행중인 티켓 안나오던 문제 해결
31
-
32
-
33
- ### Changed
34
-
35
- - **readme:** clarify YAML front matter preservation and distributed ticket workflow for v2.2.2
36
- - **readme:** restore count headers and npm badges
37
- - **rules:** enforce CLI usage for ticket reading to prevent manual JSON parsing
38
- - update CLI reference with close and migrate commands
39
-
40
- ## [1.0.18] - 2026-04-12
41
-
42
-
43
- ### Added
44
-
45
- - **ai:** map conversational ticket requests to implicit CLI execution
46
- - **cli:** implement ticket archive and reporting workflow
47
- - **rules:** map conversational ticket aliases to implicit CLI execution
17
+ - **ticket:** strictly enforce 8-character limit on hostname slug
48
18
 
49
19
 
50
20
  ### Changed
51
21
 
52
- - **readme:** add ticket archive and reports CLI usage to documentation
53
- - **readme:** describe natural language CLI prompting alternatives
54
- - **readme:** provide explicit conversational prompt examples inside option tables
55
- - **readme:** provide explicit update guide
56
- - **rules:** add prompting guide and execution report archival rule
57
-
58
- ## [1.0.17] - 2026-04-06
59
-
60
-
61
- ### Fixed
62
-
63
- - **template:** move ticket repo-relative marker to bottom
64
-
65
- ## [1.0.16] - 2026-04-05
66
-
67
-
68
- ### Added
69
-
70
- - **workflow:** add auto-verification and final report to agent workflows
22
+ - add reasons for global installation
23
+ - **changelog:** sync korean changelog with v2.4.0
71
24
 
72
- ## [1.0.15] - 2026-04-05
25
+ ## [2.4.0] - 2026-04-18
73
26
 
74
27
 
75
28
  ### Added
76
29
 
77
- - migrate and rename handoff terminology to ticket in CLI and templates
78
-
79
-
80
- ### Changed
81
-
82
- - Add strict rule for DeukPack namespace requirement
83
- - completely eradicate legacy Handoff references from AGENTS.md, templates, and mdc rules
84
- - Enforce DeukPack code format and API strictly as a hard rule
85
- - refactor README usage guide and workflow
86
-
87
- ## [1.0.14] - 2026-04-02
88
-
89
-
90
- ### Added / 추가됨
91
-
92
- - **cli:** extend merge tooling and sync publish docs / 병합 도구 및 배포 문서 동기화 스크립트 확장
93
- - **rules:** forbid 'sync' word in commit titles in agent rules / 커밋 제목 내 'sync' 금지 구문 룰 추가
94
- - **handoff:** add indexed handoff workflow and CLI / 인덱스 기반 Handoff 워크플로 및 CLI 신설
95
- - **architecture:** migrate template architecture to zero-touch NPM bundle scaffolding / 제로-터치 NPM 스캐폴딩으로 템플릿 아키텍처 개편
96
-
97
-
98
- ### Fixed / 수정됨
99
-
100
- - **cli:** resolve html entity syntax error in template generator / 템플릿 생성기(init) 내부의 HTML 엔티티 문법 에러 핫픽스
101
-
102
-
103
- ### Changed / 변경됨
104
-
105
- - **docs:** public-facing RELEASING and changelog wording; sync-bundle comment / 외부 공개용 릴리즈 가이드 및 동기화 스크립트 주석 갱신
106
- - **docs:** update README with token efficiency mechanism and zero-touch template scaffolding / 리드미(README)에 토큰 비용 차단 메커니즘 설정 및 제로 터치 스캐폴딩 문서 개편
107
-
108
- ## [1.0.13] - 2026-03-28
30
+ - **init:** add obsolete template cleanup for cleaner migration
31
+ - **rules:** add TICKET VERIFICATION RULE to original agents.md
32
+ - **ticket:** add priority property to tickets
33
+ - **ticket:** add sequential hostname-aware ticket naming (NNN-hostname-topic)
34
+ - **ticket:** auto-sequence numbering and hostname-based naming (limit 8 chars)
109
35
 
110
36
 
111
37
  ### Fixed
112
38
 
113
- - **deuk-agent-rule:** `printHandoffTip` missing in CLI (handoff tip after `init`)
39
+ - **rules:** force use of local latest deuk-agent-rule to avoid npx cache issues
40
+ - **scripts:** correct log output for OSS repository url example
114
41
 
115
42
 
116
43
  ### Changed
117
44
 
118
- - **docs:** README § Handoffs; GitHub About text; npm keywords; CLI survey adds Claude, Windsurf, JetBrains AI Assistant
119
- - **agents:** optional `.cursor/plans/*.plan.md` mirror for plan-style UI; chat `Path:` line and optional first-line path in handoff files
120
- - **deuk-agent-rule:** `init` prints a short handoff tip after ensuring `.deuk-agent-handoff/`
121
- - **deuk-agent-rule:** default `--rules prefix` overwrites existing `deuk-agent-rule-*.mdc` on repeat `init` (package updates without a separate `merge`)
122
- - **deuk-agent-rule:** `.deuk-agent-rule.config.json` stores interactive choices; later `init` reuses them (`--interactive` to change; `--non-interactive` for CI only)
123
-
124
-
125
- ## [1.0.12] - 2026-03-27
126
-
127
-
128
- ### Fixed
45
+ - add Step 4 (Ticket Verification) to README files
46
+ - clarify global installation and OS-specific permissions
47
+ - enforce ticket reference in implementation artifacts
129
48
 
130
- - **ci:** release workflow runs on pushes to `master`
131
-
132
- ### Changed
133
-
134
- - **agents:** require full repo-root paths for handoff file links
135
-
136
- ## [1.0.11] - 2026-03-26
137
-
138
-
139
- ### Added
140
-
141
- - **ci:** GitHub Release workflow for version tags and `chore(release):` commits on `main` / `master`
142
-
143
- ## [1.0.10] - 2026-03-26
144
-
145
-
146
- ### Added
147
-
148
- - **deuk-agent-rule:** changelog template headers without per-commit links
149
-
150
- ## [1.0.9] - 2026-03-27
151
-
152
- ### Added
153
-
154
- - **deuk-agent-rule:** release changelog tooling; handoff directory gitignore; pre-work handoff scan; AGENTS inject newline fix
155
-
156
- ### Changed
157
-
158
- - **agents:** DeukAgentRules/handoff/LATEST.md handoff path for consumer repos
159
-
160
- ## [1.0.8] - 2026-03-27
161
-
162
- ### Added
163
-
164
- - This changelog and npm `files` entry so releases are traceable.
165
-
166
- ## [1.0.7] - 2026-03-27
167
-
168
- ### Added
169
-
170
- - `init`: create `.deuk-agent-handoff/` and append `.gitignore` rules for local handoffs.
171
- - CLI: pre-work handoff scan; `publish/AGENTS.md` and `multi-ai-workflow.mdc` updates.
172
-
173
- ### Fixed
174
-
175
- - AGENTS tagged-region merge: trailing newline after injected blocks.
176
-
177
- ## [1.0.5] - 2026-03-26
178
-
179
- ### Changed
180
-
181
- - README and package metadata (Deuk Family tagline, npm keywords, GitHub Topics note).
182
-
183
- ## [1.0.4] - 2026-03-26
184
-
185
- ### Changed
186
-
187
- - Release packaging includes `package-lock.json` for reproducible installs.
188
- - README: absolute links for the npm package page.
49
+ ## [2.3.2] - 2026-04-17
50
+
51
+
52
+ ### Fixed
53
+
54
+ - **cli:** resolve `ERR_MODULE_NOT_FOUND` in distributed environments by fixing hardcoded `yaml` dependency path
55
+ - **dependencies:** add `yaml` to explicit dependencies list
56
+
57
+ ## [2.3.1] - 2026-04-17
58
+
59
+
60
+ ### Changed
61
+
62
+ - **readme:** add changelog and automated release instructions
63
+
64
+ ## [2.3.0] - 2026-04-17
65
+
66
+
67
+ ### Added
68
+
69
+ - Advance AI pipeline integration and optional synchronization system
70
+ - **cli:** add --submodule filter to ticket list command
71
+ - **cli:** restore ticket archive and reports workflows to modular architecture
72
+ - **rules:** advance rules for Unity Client, WebApp, and C++ Server hybrid environment
73
+ - **ticket:** implementation of decentralized ticket management & sharing policy
74
+ - **ticket:** upgrade to V2 YAML Front-matter and Categorized List
75
+
76
+
77
+ ### Fixed
78
+
79
+ - **ticket:** deprecate LATEST.md, unify pointer to ACTIVE_TICKET.md
80
+ - **ticket:** resolve issue where active tickets were not listed for DeukAgentRules repo
81
+
82
+
83
+ ### Changed
84
+
85
+ - **readme:** clarify YAML front matter preservation and distributed ticket workflow for v2.2.2
86
+ - **readme:** restore count headers and npm badges
87
+ - **rules:** enforce CLI usage for ticket reading to prevent manual JSON parsing
88
+ - Update CLI reference with close and migrate commands
89
+
90
+ ## [1.0.18] - 2026-04-12
91
+
92
+
93
+ ### Added
94
+
95
+ - **ai:** map conversational ticket requests to implicit CLI execution
96
+ - **cli:** implement ticket archive and reporting workflow
97
+ - **rules:** map conversational ticket aliases to implicit CLI execution
98
+
99
+
100
+ ### Changed
101
+
102
+ - **readme:** add ticket archive and reports CLI usage to documentation
103
+ - **readme:** describe natural language CLI prompting alternatives
104
+ - **readme:** provide explicit conversational prompt examples inside option tables
105
+ - **readme:** provide explicit update guide
106
+ - **rules:** add prompting guide and execution report archival rule
107
+
108
+ ## [1.0.17] - 2026-04-06
109
+
110
+
111
+ ### Fixed
112
+
113
+ - **template:** move ticket repo-relative marker to bottom
114
+
115
+ ## [1.0.16] - 2026-04-05
116
+
117
+
118
+ ### Added
119
+
120
+ - **workflow:** add auto-verification and final report to agent workflows
121
+
122
+ ## [1.0.15] - 2026-04-05
123
+
124
+
125
+ ### Added
126
+
127
+ - Migrate and rename handoff terminology to ticket in CLI and templates
128
+
129
+
130
+ ### Changed
131
+
132
+ - Add strict rule for DeukPack namespace requirement
133
+ - Completely eradicate legacy Handoff references from AGENTS.md, templates, and mdc rules
134
+ - Enforce DeukPack code format and API strictly as a hard rule
135
+ - Refactor README usage guide and workflow
136
+
137
+ ## [1.0.14] - 2026-04-02
138
+
139
+
140
+ ### Added
141
+
142
+ - **cli:** extend merge tooling and sync publish docs
143
+ - **rules:** forbid 'sync' word in commit titles in agent rules
144
+ - **handoff:** add indexed handoff workflow and CLI
145
+ - **architecture:** migrate template architecture to zero-touch NPM bundle scaffolding
146
+
147
+
148
+ ### Fixed
149
+
150
+ - **cli:** resolve html entity syntax error in template generator
151
+
152
+
153
+ ### Changed
154
+
155
+ - **docs:** public-facing RELEASING and changelog wording; sync-bundle comment
156
+ - **docs:** update README with token efficiency mechanism and zero-touch template scaffolding
157
+
158
+ ## [1.0.13] - 2026-03-28
159
+
160
+
161
+ ### Fixed
162
+
163
+ - **deuk-agent-rule:** `printHandoffTip` missing in CLI (handoff tip after `init`)
164
+
165
+
166
+ ### Changed
167
+
168
+ - **docs:** README § Handoffs; GitHub About text; npm keywords; CLI survey adds Claude, Windsurf, JetBrains AI Assistant
169
+ - **agents:** optional `.cursor/plans/*.plan.md` mirror for plan-style UI; chat `Path:` line and optional first-line path in handoff files
170
+ - **deuk-agent-rule:** `init` prints a short handoff tip after ensuring `.deuk-agent-handoff/`
171
+ - **deuk-agent-rule:** default `--rules prefix` overwrites existing `deuk-agent-rule-*.mdc` on repeat `init` (package updates without a separate `merge`)
172
+ - **deuk-agent-rule:** `.deuk-agent-rule.config.json` stores interactive choices; later `init` reuses them (`--interactive` to change; `--non-interactive` for CI only)
173
+
174
+
175
+ ## [1.0.12] - 2026-03-27
176
+
177
+
178
+ ### Fixed
179
+
180
+ - **ci:** release workflow runs on pushes to `master`
181
+
182
+ ### Changed
183
+
184
+ - **agents:** require full repo-root paths for handoff file links
185
+
186
+ ## [1.0.11] - 2026-03-26
187
+
188
+
189
+ ### Added
190
+
191
+ - **ci:** GitHub Release workflow for version tags and `chore(release):` commits on `main` / `master`
192
+
193
+ ## [1.0.10] - 2026-03-26
194
+
195
+
196
+ ### Added
197
+
198
+ - **deuk-agent-rule:** changelog template headers without per-commit links
199
+
200
+ ## [1.0.9] - 2026-03-27
201
+
202
+ ### Added
203
+
204
+ - **deuk-agent-rule:** release changelog tooling; handoff directory gitignore; pre-work handoff scan; AGENTS inject newline fix
205
+
206
+ ### Changed
207
+
208
+ - **agents:** DeukAgentRules/handoff/LATEST.md handoff path for consumer repos
209
+
210
+ ## [1.0.8] - 2026-03-27
211
+
212
+ ### Added
213
+
214
+ - This changelog and npm `files` entry so releases are traceable.
215
+
216
+ ## [1.0.7] - 2026-03-27
217
+
218
+ ### Added
219
+
220
+ - `init`: create `.deuk-agent-handoff/` and append `.gitignore` rules for local handoffs.
221
+ - CLI: pre-work handoff scan; `publish/AGENTS.md` and `multi-ai-workflow.mdc` updates.
222
+
223
+ ### Fixed
224
+
225
+ - AGENTS tagged-region merge: trailing newline after injected blocks.
226
+
227
+ ## [1.0.5] - 2026-03-26
228
+
229
+ ### Changed
230
+
231
+ - README and package metadata (Deuk Family tagline, npm keywords, GitHub Topics note).
232
+
233
+ ## [1.0.4] - 2026-03-26
234
+
235
+ ### Changed
236
+
237
+ - Release packaging includes `package-lock.json` for reproducible installs.
238
+ - README: absolute links for the npm package page.
package/README.ko.md CHANGED
@@ -25,16 +25,26 @@ Cursor, GitHub Copilot, Gemini / Antigravity, Claude, Windsurf, JetBrains AI Ass
25
25
 
26
26
  ## 🛠️ 워크스페이스 초기화 (Getting Started)
27
27
 
28
- 프로젝트 루트에서 최초 1회 패키지를 설치하고 초기화합니다.
28
+ 본 패키지는 여러 서브모듈 및 프로젝트 전반에서 빈번하게 사용되는 CLI 도구이므로 **전역(Global) 설치를 강력히 권장**합니다.
29
29
 
30
30
  ```bash
31
- npm install deuk-agent-rule
32
- npx deuk-agent-rule init
31
+ npm install -g deuk-agent-rule
32
+ deuk-agent-rule init
33
33
  ```
34
34
 
35
+ > [!NOTE]
36
+ > **전역 설치(Global Install) 권한 이슈 해결방안**:
37
+ > - **Linux/macOS**: 기본적으로 `npm install -g` 실행 시 `EACCES` 권한 오류가 발생할 수 있습니다. Node 버전 매니저(`nvm`, `fnm` 등)를 사용하여 권한 제약을 회피하는 것이 가장 좋으나, 시스템 Node를 사용하는 경우 불가피하게 `sudo npm install -g deuk-agent-rule` 명령을 사용해야 합니다.
38
+ > - **Windows**: Node.js가 `Program Files` 등 시스템 폴더에 설치된 경우, 터미널(PowerShell/CMD)을 **관리자 권한**으로 실행한 상태에서 설치해야 오류가 발생하지 않습니다.
39
+
40
+ ### 💡 전역(Global) 설치를 권장하는 이유
41
+ 1. **npx 캐시 이슈 예방**: `npx deuk-agent-rule` 명령어는 로컬 npm 캐시에 의존하므로, 새로운 로직(예: 호스트네임 기반 순번 부여 등)이 포함된 최신 배포본을 무시하고 구버전을 실행하는 치명적인 에이전트 오동작을 유발할 수 있습니다.
42
+ 2. **실행 속도 최적화**: 매번 임시로 패키지를 다운로드/확인하는 `npx` 방식 대비 챗봇 에이전트가 즉각적으로 CLI 응답을 받을 수 있습니다.
43
+ 3. **크로스 레포지토리 일관성**: Deuk Family의 여러 서브모듈 및 독립된 마이크로서비스 저장소들을 오가며 항상 동일한 버전의 에이전트 룰 엔진을 적용할 수 있습니다.
44
+
35
45
  초기화 시 프로젝트의 **기술 스택**, **사용 중인 에이전트 툴**, 그리고 **티켓 공유 정책**을 묻는 대화형 질문이 나타납니다.
36
46
  - **티켓 공유 정책**: 각 저장소 단위의 `.deuk-agent-ticket/` 폴더를 Git으로 추적하여 팀과 공유할지, 아니면 로컬 전용으로 둘지 결정합니다.
37
- - 스택 변경이 필요 없으면 이후에는 `npx deuk-agent-rule init`만 쳐서 규칙을 최신화할 수 있습니다.
47
+ - 스택 변경이 필요 없으면 이후에는 `deuk-agent-rule init`만 쳐서 규칙을 최신화할 수 있습니다. (전역 설치를 하지 않았다면 `npx deuk-agent-rule init`으로 대체 가능합니다.)
38
48
  - CI나 스크립트 환경에서는 대화형 입력을 끄기 위해 `--non-interactive` 파라미터를 추가하세요.
39
49
 
40
50
  ### 🔄 규칙 패키지 업데이트 (Update Rules)
@@ -54,7 +64,7 @@ npx deuk-agent-rule init --non-interactive
54
64
  1. **`.deuk-agent-templates/` (에이전트 템플릿)**: AI가 어떠한 양식으로 작업을 처리하고 보고해야 하는지 정의된 공식 뼈대(`TICKET_TEMPLATE.md`)가 지정됩니다.
55
65
  2. **`.deuk-agent-ticket/` (티켓 실행 공간)**: 실제 지시서(`TICKET-XXX.md`)가 발급되는 공간입니다. 서브모듈 단위로 티켓을 분산 관리할 수 있어 서브모듈만 떼어가도 히스토리가 유지됩니다. (공유 정책에 따라 `.gitignore`에 자동으로 기재될 수 있습니다.)
56
66
 
57
- 이러한 샌드박스 폴더들을 활용하여 스퍼트를 올리는 **최적의 AI 코딩 3단계**는 다음과 같습니다.
67
+ 이러한 샌드박스 폴더들을 활용하여 스퍼트를 올리는 **최적의 AI 코딩 4단계**는 다음과 같습니다.
58
68
 
59
69
  ### [Step 1] 티켓 발급 및 계층적 관리 (Ticket Creation & Delegation)
60
70
  AI에게 중구난방으로 지시하지 마세요. 명확한 티켓을 발급하여 **문맥(Context)을 소속 저장소 단위로 좁혀주어야** 합니다.
@@ -78,23 +88,25 @@ AI는 티켓 내에 정의된 Phase(진행 단계)를 충실히 읽고, **자신
78
88
  ### [Step 3] 검증 및 상태 갱신 (Review & Closure)
79
89
  AI가 코드를 작성하며 티켓 내 마크업의 체크박스(`[x]`)를 갱신합니다. 에이전트의 세션(기억 한계)이 가득 차면, 티켓 내용만 디스크에 남겨둔 채 챗봇 창을 끄고 새 창을 열어 다시 [Step 2]를 지시하면 깔끔하게 인수인계가 이루어집니다.
80
90
  모든 작업이 끝나면 Phase 상태를 `[Phase 완료]`로 승급시킵니다. 터미널 명령어를 직접 치는 대신, **AI 챗봇 프롬프트에 "현재 진행 중인 티켓 리스트를 보여줘" 또는 "완료된 티켓들을 보고서와 함께 아카이브 해 줘"라고 자연어로 지시**하여 AI가 알아서 CLI를 호출해 리스트업 및 관리하게 위임할 수도 있습니다.
81
- 직접 터미널에서 상태를 파악하시려면 아래 명령을 사용하세요:
82
-
83
91
  ```bash
84
92
  npx deuk-agent-rule ticket list
85
93
  ```
86
94
  ```text
87
- 📦 Agent Tickets (Direct System Scan):
88
- [TICKET-DEUKUI-Button.md]
89
- Title: 버튼 컴포넌트 추가
90
- Target: DeukUI
91
- Status: [완료]
92
- 🔨 [TICKET-ui-refactoring.md]
93
- Title: 플러그인 UI 리팩토링
94
- Target: DeukUI
95
- Status: [진행 중]
95
+ # STATUS SUBMODULE GROUP PROJECT CREATED TITLE
96
+ 1 [ ] DeukPack sub global 2026-04-18T13:34:32.484Z naming-consistency
96
97
  ```
97
98
 
99
+ ### [Step 4] 티켓 검증 (자가 교정)
100
+ 모든 진행 단계가 `[x]`로 완료되면, AI에게 마지막으로 다음과 같이 지시합니다:
101
+ > *"이 작업에 대해 **티켓 검증**을 진행해 줘."*
102
+
103
+ AI는 `AGENTS.md`에 정의된 **[TICKET VERIFICATION RULE]**에 따라 즉시 3단계 정밀 진단을 수행합니다:
104
+ 1. **오류 분석**: 잠재적인 빌드 경고나 깨진 의존성(Side Effects) 전수 조사.
105
+ 2. **규약 정합성**: 수정된 파일명과 클래스명이 프로젝트 아키텍처 가이드와 완벽히 일치하는지 재검증.
106
+ 3. **잠재 이슈 보고**: 하위 호환성 파괴 위험이나 네이티브 빌드 제약사항 등 미검증 시나리오 리스트업.
107
+
108
+ 이 과정을 통해 에이전트의 결과물은 단순한 "기능 구현"을 넘어 "프로덕션 레벨"의 아키텍처 정합성을 갖추게 됩니다.
109
+
98
110
  ---
99
111
 
100
112
  ## 🤖 에이전트 프롬프팅 가이드 (Prompting Guide)
@@ -113,6 +125,12 @@ npx deuk-agent-rule ticket list
113
125
 
114
126
  업무 자동화 및 타깃 제어를 위한 상세 옵션입니다.
115
127
 
128
+ > [!NOTE]
129
+ > **패키지 메인테이너(기여자) 전용 - 로컬 개발 환경 권한 주의사항**:
130
+ > 일반 사용자는 해당되지 않습니다. `DeukAgentRules` 저장소 내부 소스코드를 직접 수정하며 로컬 패치를 즉시 테스트하려는 메인테이너의 경우, 글로벌 캐시된 `npx deuk-agent-rule` 대신 `node ./scripts/cli.mjs`를 직접 호출해야 합니다.
131
+ > - **Linux/macOS**: 로컬 심링크(`npm link`) 생성 시 `sudo` 권한이 필요할 수 있으며, 스크립트를 직접 실행(`./scripts/cli.mjs`)할 경우 실행 권한(`chmod +x`) 이슈가 발생할 수 있으므로 `node` 명령어를 통한 명시적 호출이 가장 안전합니다.
132
+ > - **Windows**: `npm link` 사용 시 관리자 권한(또는 개발자 모드)이 필요하며, PowerShell 스크립트 실행 정책(Execution Policy)에 의해 래퍼 스크립트가 차단될 수 있으므로 권한 제약이 없는 `node ./scripts/cli.mjs` 호출 방식을 권장합니다.
133
+
116
134
  ### Ticket 기반 명령
117
135
  아래 CLI 명령어들은 터미널에 직접 입력하는 대신, **AI 챗봇에게 자연어 프롬프트로 지시**하여 실행을 위임할 수 있습니다.
118
136
 
package/README.md CHANGED
@@ -25,15 +25,25 @@ It standardizes project rules (`AGENTS.md`, `.cursor/rules`) and strongly preven
25
25
 
26
26
  ## 🛠️ Getting Started (Workspace Initialization)
27
27
 
28
- Install and initialize the package once at the project root.
28
+ Since this CLI tool is used frequently across multiple repositories and submodules, a **global installation is highly recommended**.
29
29
 
30
30
  ```bash
31
- npm install deuk-agent-rule
32
- npx deuk-agent-rule init
31
+ npm install -g deuk-agent-rule
32
+ deuk-agent-rule init
33
33
  ```
34
34
 
35
+ > [!NOTE]
36
+ > **Global Install Permission Troubleshooting**:
37
+ > - **Linux/macOS**: Running `npm install -g` may result in `EACCES` permission errors. It is highly recommended to use a Node version manager (`nvm`, `fnm`, etc.) to bypass these constraints. If using the system Node installation, you may unavoidably need to use `sudo npm install -g deuk-agent-rule`.
38
+ > - **Windows**: If Node.js is installed in a system directory like `Program Files`, you must run your terminal (PowerShell/CMD) as an **Administrator** for the global installation to complete successfully.
39
+
40
+ ### 💡 Why Global Installation?
41
+ 1. **Preventing `npx` Cache Issues**: Running `npx deuk-agent-rule` relies on the local npm cache, which may silently execute an outdated version of the CLI. This has been proven to cause severe agent hallucinations or ticket formatting errors (e.g., missing hostname sequence IDs).
42
+ 2. **Execution Speed**: The chatbot agent receives instant CLI responses without the overhead of `npx` checking for temporary package downloads.
43
+ 3. **Cross-Repository Consistency**: It allows you to reliably apply the exact same version of the agent rules across various submodules and independent microservices in the Deuk Family ecosystem.
44
+
35
45
  Upon initialization, interactive questions will ask for the project's **tech stack** and **agent tools in use**. Based on your selections, optimized markdown templates and rule files (`.cursor/rules/*`) will be automatically generated and synchronized.
36
- - If you don't need to change the tech stack later, simply run `npx deuk-agent-rule init` to refresh the rules.
46
+ - If you don't need to change the tech stack later, simply run `deuk-agent-rule init` to refresh the rules. (If not installed globally, you can fallback to `npx deuk-agent-rule init`).
37
47
  - Suppress interactive prompts in CI or script environments by appending the `--non-interactive` flag.
38
48
 
39
49
  ### 🔄 Updating the Rules Package
@@ -53,7 +63,7 @@ Running `npx deuk-agent-rule init` deploys a **zero-touch scaffolding sandbox**
53
63
  1. **`.deuk-agent-templates/` (Agent Templates)**: Houses the official blueprint (`TICKET_TEMPLATE.md`) dictating how AIs must process and report tasks. Committed alongside your source code to serve as the team's rulebook.
54
64
  2. **`.deuk-agent-ticket/` (Ticket Execution Space)**: The covert space where volatile instructions (`TICKET-XXX.md`) are exchanged between agents and workers. (Automatically hidden by `.gitignore` to prevent security leaks and repository bloat).
55
65
 
56
- The optimal **3-Step AI Coding Sequence** utilizing these sandbox folders is as follows.
66
+ The optimal **4-Step AI Coding Sequence** utilizing these sandbox folders is as follows.
57
67
 
58
68
  ### [Step 1] Ticket Creation & Submodule Isolation
59
69
  Do not issue scattered, unbounded commands to your AI. Narrowing the **context** via a clear ticket is strictly required to prevent astronomical costs and accidental code corruption.
@@ -77,23 +87,25 @@ The AI will faithfully read the defined Phases in the ticket and write optimized
77
87
  ### [Step 3] Status Review & Closure
78
88
  As the AI writes the code, it will simultaneously update the markup checkboxes (`[x]`) inside the ticket. If the agent's session memory limit is approaching, simply leave the ticket file saved, turn off the chat window, open a fresh session, and issue [Step 2] again. The handoff (session transfer) is seamlessly completed.
79
89
  Once all steps are accomplished, promote the Phase status to `[Phase Complete]`. Instead of manually typing terminal commands, **you can simply tell your AI chatbot via natural language prompt: "Show me the list of active tickets" or "Archive the completed tickets with reports"**, and the AI will autonomously invoke the CLI to manage them for you.
80
- To track tickets manually from the terminal, run:
81
-
82
90
  ```bash
83
91
  npx deuk-agent-rule ticket list
84
92
  ```
85
93
  ```text
86
- 📦 Agent Tickets (Direct System Scan):
87
- [TICKET-DEUKUI-Button.md]
88
- Title: Add Button Component
89
- Target: DeukUI
90
- Status: [Complete]
91
- 🔨 [TICKET-ui-refactoring.md]
92
- Title: Plugin UI Refactoring
93
- Target: DeukUI
94
- Status: [In Progress]
94
+ # STATUS SUBMODULE GROUP PROJECT CREATED TITLE
95
+ 1 [ ] DeukPack sub global 2026-04-18T13:34:32.484Z naming-consistency
95
96
  ```
96
97
 
98
+ ### [Step 4] Ticket Verification (Self-Correction)
99
+ After all phases are marked as `[x]`, you should issue a final command to the AI:
100
+ > *"Proceed with **Ticket Verification** for this task."*
101
+
102
+ The AI, following the strictly defined **[TICKET VERIFICATION RULE]** in `AGENTS.md`, will then autonomously perform a 3-stage audit:
103
+ 1. **Side Effect Analysis**: Detecting potential build warnings or broken dependencies.
104
+ 2. **Convention Audit**: Re-verifying if filenames and classes perfectly match project architecture documents.
105
+ 3. **Potential Issue Reporting**: Listing breaking changes or unverified edge cases (e.g., native build constraints).
106
+
107
+ This final step ensures that the agent's output is not just "functional" but "production-grade" and architecturally sound.
108
+
97
109
  ---
98
110
 
99
111
  ## 🤖 AI Agent Prompting Guide
@@ -112,6 +124,12 @@ Even after installing and initializing the package, some AI agents (Cursor, Gemi
112
124
 
113
125
  Advanced commands for workflow automation and target control.
114
126
 
127
+ > [!NOTE]
128
+ > **For Package Maintainers/Contributors Only - Local Development**:
129
+ > This does not apply to general users. If you are modifying the `DeukAgentRules` source code and need to immediately test local patches bypassing the globally cached `npx deuk-agent-rule`, explicitly invoke `node ./scripts/cli.mjs`.
130
+ > - **Linux/macOS**: Creating symlinks (`npm link`) may require `sudo` privileges. Direct script execution (`./scripts/cli.mjs`) may trigger `chmod +x` permission issues, making explicit `node` invocation the safest workaround.
131
+ > - **Windows**: `npm link` requires Administrator rights (or Developer Mode) to create symlinks, and PowerShell execution policies may block `.cmd` wrapper scripts. Explicitly calling `node ./scripts/cli.mjs` safely bypasses these OS-level restrictions.
132
+
115
133
  ### Ticket-based Commands
116
134
  Instead of manually typing the CLI commands below into the terminal, you can **delegate their execution to your AI chatbot by giving natural language prompt instructions**.
117
135
 
package/bundle/AGENTS.md CHANGED
@@ -12,6 +12,8 @@
12
12
  - For Korean responses, use polite '해요체(-요)' instead of formal '하십시오체(-다/까)'.
13
13
  - **핸드오프 저장 후 채팅**: 파일로 남긴 뒤 채팅에 **`Path: \`루트기준/전체/경로.md\``** 형태로 **한 줄**을 반드시 넣어 다음 세션이 동일 파일을 연다.
14
14
  - **플랜 UI(선택)**: 플랜 전용 패널에 같은 문서를 띄우려면, 관리 중인 **multi-ai-workflow** 규칙에 적힌 **선택적 미러 경로**(예: `.cursor/plans/*.plan.md`)에 동일 본문을 둘 수 있다. 정본은 지정된 티켓 폴더를 유지하고 두 곳 내용을 맞출 것.
15
+ - **Error Loop Prevention (하드룰)**: 명령 실행이나 컴파일 등에서 동일/유사 에러가 2회 이상 반복 발생 시, 에이전트는 절대 임의로 코드 방향을 틀거나 땜질을 시도해서는 안 됩니다. 즉시 작업을 멈추고 현상을 분석한 후 **티켓을 명시적으로 발행**해야 합니다.
16
+ - **Plan in Ticket (하드룰)**: 문제 해결을 위한 모든 실행 계획과 설계는 `implementation_plan.md` 같은 임의의 부산물이 아닌, **정식 티켓 본문 내**에 작성하고 이를 사용자에게 확인시켜야 합니다.
15
17
 
16
18
  English sections above are canonical for tooling; this block is a short Korean mirror for the same rules.
17
19
 
@@ -64,7 +66,8 @@ When given a ticket, you MUST run commands and write code **strictly within the
64
66
  4. **Execute Phase**: Process only the checklist for the **Current Phase**. Do not hallucinate or wander into other architectural areas.
65
67
  5. **Update Status**: Mark checkboxes (`[x]`) as tasks are completed.
66
68
  6. **Archive on Completion**: When all phases are completed, append the execution report at the bottom under a `## 📜 Execution Report` header. **Then, YOU MUST execute `npx deuk-agent-rule ticket archive <ticket-id>` (or `--latest`)** to properly close and archive the ticket. DO NOT attempt to manually `mv` files.
69
+ 7. **[TICKET REFERENCE RULE]**: 부분 개선 또는 기능 추가 시, 구현 아티팩트(`implementation_plan.md`, `task.md`, `walkthrough.md`) 상단에 반드시 해당 티켓 번호(ID)를 명시하여 추적 가능성을 확보하십시오.
67
70
 
68
71
  All Tickets are volatile and strictly local. Do not attempt to version them or mirror them to obsolete plan directories.
69
72
 
70
- <!-- deuk-agent-rule:end -->
73
+ <!-- deuk-agent-rule:end -->
@@ -1,40 +1,37 @@
1
-
2
- # Task: [Task Title / Ticket Number]
3
-
4
- > **[CAUTION FOR AI AGENTS]**
5
- > You are operating within a locked multi-module monorepo.
6
- > 1. Restrict absolutely all analysis, file creation, and modifications to the declared **[Target Submodule]** below.
7
- > 2. Read the files listed in **[Context Files]** before doing ANY code generation.
8
- > 3. DO NOT leak configuration, logic, or dependencies from other submodules.
9
-
10
- ## 🎯 Scope Bounds
11
-
12
- - **Target Submodule:** `[e.g., DeukUI | DeukPack | DeukNavigation]`
13
- - **Context Files:**
14
- - `[e.g., DeukAgentRules/templates/MODULE_RULE_TEMPLATE.md]`
15
- - `[e.g., path/to/your/specific/rules.md]`
16
-
17
- ## 📁 Files to Modify
18
- - `path/from/root/to/target1`: [Specific instructions. Don't write 'refactor', describe WHAT to refactor.]
19
- - `path/from/root/to/target2`: [Instructions...]
20
-
21
- ## 🏗️ Design Decisions (For Context)
22
- - [Why are we doing this? E.g., "To isolate the IR Layout bindings from DOM events"]
23
- - [What pattern to use?]
24
-
25
- ## 🛑 Strict Constraints (Rules to never break)
26
- - [e.g., Do NOT remove existing @ts-nocheck headers]
27
- - [e.g., MUST retain C# [SerializeField] directives]
28
- - [e.g., Do NOT import Vue logic into DeukPack]
29
-
30
- ## 🔄 Phased Execution Steps
31
- > Agent: Do NOT attempt to do Phase 3 before Phase 1 is fully tested. Use separate chat messages per phase if the task is large.
32
- 1. [Phase 1> Setup / Parsing]
33
- 2. [Phase 2> Core Logic Change]
34
- 3. [Phase 3> Cleanup / Verification]
35
-
36
- ## ✅ Verification / QA
37
- - [e.g., Check CLI command output `npm run test`]
38
- - [e.g., Validate Inspector mounts properly in Figma]
39
-
1
+ # Task: [Task Title] | Ticket: [TICKET-XXX]
40
2
 
3
+ > **[CAUTION FOR AI AGENTS]**
4
+ > You are operating within a locked multi-module monorepo.
5
+ > 1. Restrict absolutely all analysis, file creation, and modifications to the declared **[Target Submodule]** below.
6
+ > 2. Read the files listed in **[Context Files]** before doing ANY code generation.
7
+ > 3. DO NOT leak configuration, logic, or dependencies from other submodules.
8
+
9
+ ## 🎯 Scope Bounds
10
+
11
+ - **Target Submodule:** `[e.g., DeukUI | DeukPack | DeukNavigation]`
12
+ - **Context Files:**
13
+ - `[e.g., DeukAgentRules/templates/MODULE_RULE_TEMPLATE.md]`
14
+ - `[e.g., path/to/your/specific/rules.md]`
15
+
16
+ ## 📁 Files to Modify
17
+ - `path/from/root/to/target1`: [Specific instructions. Don't write 'refactor', describe WHAT to refactor.]
18
+ - `path/from/root/to/target2`: [Instructions...]
19
+
20
+ ## 🏗️ Design Decisions (For Context)
21
+ - [Why are we doing this? E.g., "To isolate the IR Layout bindings from DOM events"]
22
+ - [What pattern to use?]
23
+
24
+ ## 🛑 Strict Constraints (Rules to never break)
25
+ - [e.g., Do NOT remove existing @ts-nocheck headers]
26
+ - [e.g., MUST retain C# [SerializeField] directives]
27
+ - [e.g., Do NOT import Vue logic into DeukPack]
28
+
29
+ ## 🔄 Phased Execution Steps
30
+ > Agent: Do NOT attempt to do Phase 3 before Phase 1 is fully tested. Use separate chat messages per phase if the task is large.
31
+ 1. [Phase 1> Setup / Parsing]
32
+ 2. [Phase 2> Core Logic Change]
33
+ 3. [Phase 3> Cleanup / Verification]
34
+
35
+ ## ✅ Verification / QA
36
+ - [e.g., Check CLI command output `npm run test`]
37
+ - [e.g., Validate Inspector mounts properly in Figma]
package/package.json CHANGED
@@ -1,55 +1,49 @@
1
- {
2
- "name": "deuk-agent-rule",
3
- "version": "2.3.1",
4
- "description": "DeukAgentRules: generic AGENTS.md + .cursor rule templates with init/merge CLI (npm name: deuk-agent-rule).",
5
- "keywords": [
6
- "agents-md",
7
- "cursor-rules",
8
- "copilot",
9
- "gemini",
10
- "claude",
11
- "windsurf",
12
- "jetbrains",
13
- "ticket",
14
- "deuk-family",
15
- "deukpack-ecosystem"
16
- ],
17
- "license": "Apache-2.0",
18
- "repository": {
19
- "type": "git",
20
- "url": "https://github.com/joygram/DeukAgentRules.git"
21
- },
22
- "bugs": {
23
- "url": "https://github.com/joygram/DeukAgentRules/issues"
24
- },
25
- "homepage": "https://github.com/joygram/DeukAgentRules#readme",
26
- "files": [
27
- "bundle/**/*",
28
- "scripts/**/*.mjs",
29
- "README.md",
30
- "README.ko.md",
31
- "CHANGELOG.md"
32
- ],
33
- "scripts": {
34
- "sync": "node scripts/sync-bundle.mjs",
35
- "prepack": "node scripts/sync-bundle.mjs",
36
- "bump": "commit-and-tag-version",
37
- "bump:patch": "commit-and-tag-version -r patch",
38
- "bump:minor": "commit-and-tag-version -r minor",
39
- "bump:major": "commit-and-tag-version -r major",
40
- "merge:dry": "node scripts/cli.mjs merge --dry-run --cwd .. --agents skip",
41
- "sync:oss": "node scripts/sync-oss.mjs"
42
- },
43
- "engines": {
44
- "node": ">=18"
45
- },
46
- "bin": {
47
- "deuk-agent-rule": "./scripts/cli.mjs"
48
- },
49
- "devDependencies": {
50
- "commit-and-tag-version": "^12.7.1"
51
- },
52
- "dependencies": {
53
- "ejs": "^5.0.2"
54
- }
55
- }
1
+ {
2
+ "name": "deuk-agent-rule",
3
+ "version": "2.4.1",
4
+ "description": "DeukAgentRules: generic AGENTS.md + .cursor rule templates with init/merge CLI (npm name: deuk-agent-rule).",
5
+ "keywords": [
6
+ "agents-md",
7
+ "cursor-rules",
8
+ "copilot",
9
+ "gemini",
10
+ "claude",
11
+ "windsurf",
12
+ "jetbrains",
13
+ "ticket",
14
+ "deuk-family",
15
+ "deukpack-ecosystem"
16
+ ],
17
+ "license": "Apache-2.0",
18
+ "repository": {
19
+ "type": "git",
20
+ "url": "git+https://github.com/joygram/DeukAgentRules.git"
21
+ },
22
+ "bugs": {
23
+ "url": "https://github.com/joygram/DeukAgentRules/issues"
24
+ },
25
+ "homepage": "https://github.com/joygram/DeukAgentRules#readme",
26
+ "files": [
27
+ "LICENSE",
28
+ "bundle/**/*",
29
+ "scripts/**/*.mjs",
30
+ "README.md",
31
+ "README.ko.md",
32
+ "CHANGELOG.md",
33
+ "CHANGELOG.ko.md"
34
+ ],
35
+ "scripts": {
36
+ "sync": "node scripts/sync-bundle.mjs",
37
+ "prepack": "node scripts/sync-bundle.mjs"
38
+ },
39
+ "engines": {
40
+ "node": ">=18"
41
+ },
42
+ "bin": {
43
+ "deuk-agent-rule": "./scripts/cli.mjs"
44
+ },
45
+ "dependencies": {
46
+ "ejs": "^5.0.2",
47
+ "yaml": "^2.8.3"
48
+ }
49
+ }
@@ -19,6 +19,7 @@ export function parseTicketArgs(argv) {
19
19
  else if (a === "--all") out.all = true;
20
20
  else if (a === "--status") out.status = argv[++i];
21
21
  else if (a === "--archived") out.archived = true;
22
+ else if (a === "--priority") out.priority = argv[++i];
22
23
  else if (a === "--report") out.report = argv[++i];
23
24
  else if (a === "--json") out.json = true;
24
25
  else if (a === "--remote") out.remote = argv[++i];
@@ -11,13 +11,27 @@ function syncTemplates(cwd, bundleRoot, dryRun) {
11
11
  if (!existsSync(tplSrcDir)) return;
12
12
  if (!dryRun) mkdirSync(tplDestDir, { recursive: true });
13
13
 
14
- for (const name of readdirSync(tplSrcDir)) {
15
- if (!name.endsWith(".md")) continue;
14
+ const srcFiles = readdirSync(tplSrcDir).filter(n => n.endsWith(".md"));
15
+ const destFiles = existsSync(tplDestDir) ? readdirSync(tplDestDir).filter(n => n.endsWith(".md")) : [];
16
+
17
+ // 1. Copy/Update new templates
18
+ for (const name of srcFiles) {
16
19
  const src = join(tplSrcDir, name);
17
20
  const dest = join(tplDestDir, name);
18
21
  if (!dryRun) copyFileSync(src, dest);
19
22
  console.log(`template synced: ${dest}`);
20
23
  }
24
+
25
+ // 2. Cleanup obsolete templates (Migration)
26
+ for (const name of destFiles) {
27
+ if (!srcFiles.includes(name)) {
28
+ const obsolete = join(tplDestDir, name);
29
+ if (!dryRun) {
30
+ import("fs").then(fs => fs.unlinkSync(obsolete));
31
+ }
32
+ console.log(`template removed (obsolete): ${obsolete}`);
33
+ }
34
+ }
21
35
  }
22
36
 
23
37
 
@@ -1,4 +1,5 @@
1
1
  import { existsSync, mkdirSync, readFileSync, writeFileSync, unlinkSync, copyFileSync, readdirSync, rmSync, statSync } from "fs";
2
+ import { hostname } from "os";
2
3
  import { basename, join, dirname, relative, resolve } from "path";
3
4
  import { toSlug, toRepoRelativePath, inferRefTitleAndTopic, resolveReferencedTicketPath, toPosixPath, stringifyFrontMatter } from "./cli-utils.mjs";
4
5
  import { TICKET_DIR_NAME, appendTicketEntry, rebuildTicketIndexFromTopicFilesIfNeeded, detectConsumerTicketDir, readTicketIndexJson, writeTicketIndexJson, writeTicketListFile, syncActiveTicketPointer, generateTicketId, syncToPipeline } from "./cli-ticket-logic.mjs";
@@ -31,7 +32,28 @@ export async function runTicketCreate(opts) {
31
32
 
32
33
  // Find nearest or create in CWD if missing
33
34
  const ticketDir = detectConsumerTicketDir(opts.cwd, { createIfMissing: true });
34
- const abs = join(ticketDir, group, `${topic}-${Date.now()}.md`);
35
+
36
+ // Calculate next sequence number by scanning existing files
37
+ let maxSeq = 0;
38
+ const allFiles = [];
39
+ const scanDirs = [join(ticketDir, "sub"), join(ticketDir, "main"), join(ticketDir, "archive/sub"), join(ticketDir, "archive/main")];
40
+ for (const d of scanDirs) {
41
+ if (existsSync(d)) {
42
+ const files = readdirSync(d);
43
+ for (const f of files) {
44
+ const match = f.match(/^(\d+)-/);
45
+ if (match) {
46
+ const num = parseInt(match[1], 10);
47
+ if (num > maxSeq) maxSeq = num;
48
+ }
49
+ }
50
+ }
51
+ }
52
+ const nextSeq = String(maxSeq + 1).padStart(3, "0");
53
+ const hName = hostname().toLowerCase().slice(0, 8);
54
+ const finalFileName = `${nextSeq}-${hName}-ticket-${topic}.md`;
55
+
56
+ const abs = join(ticketDir, group, finalFileName);
35
57
  mkdirSync(join(ticketDir, group), { recursive: true });
36
58
  path = toRepoRelativePath(opts.cwd, abs);
37
59
 
@@ -1,6 +1,7 @@
1
1
  import { existsSync, mkdirSync, readdirSync, readFileSync, statSync, writeFileSync, unlinkSync, copyFileSync } from "fs";
2
2
  import { basename, dirname, join, relative } from "path";
3
3
  import { createHash } from "crypto";
4
+ import { hostname as osHostname } from "os";
4
5
  import { toPosixPath, toRepoRelativePath, toSlug, formatTimestampForFile, makeEntryId, detectProjectFromBody, deriveTopicFromBaseName, parseFrontMatter, stringifyFrontMatter, loadInitConfig } from "./cli-utils.mjs";
5
6
 
6
7
  export const TICKET_DIR_NAME = ".deuk-agent-ticket";
@@ -82,10 +83,10 @@ export function renderTicketListMarkdown(cwd, entries) {
82
83
  const activeRows = sorted.filter(e => e.status !== "archived").map((e, i) => renderLine(e, i, ticketDir, cwd));
83
84
  const archivedRows = sorted.filter(e => e.status === "archived").slice(0, 50).map((e, i) => renderLine(e, i, ticketDir, cwd));
84
85
 
85
- let combinedRows = "### 🚀 Active Tickets\n\n| # | Status | Title | Group | Project | Created | Path |\n|---|---|---|---|---|---|---|\n" +
86
- (activeRows.join("\n") || "| - | - | No active tickets | - | - | - | - |") +
87
- "\n\n### 📦 Archived Tickets\n\n| # | Status | Title | Group | Project | Created | Path |\n|---|---|---|---|---|---|---|\n" +
88
- (archivedRows.join("\n") || "| - | - | No archived tickets | - | - | - | - |");
86
+ let combinedRows = "### 🚀 Active Tickets\n\n| # | Status | Pri | Title | Group | Project | Created | Path |\n|---|---|---|---|---|---|---|---|\n" +
87
+ (activeRows.join("\n") || "| - | - | - | No active tickets | - | - | - | - |") +
88
+ "\n\n### 📦 Archived Tickets\n\n| # | Status | Pri | Title | Group | Project | Created | Path |\n|---|---|---|---|---|---|---|---|\n" +
89
+ (archivedRows.join("\n") || "| - | - | - | No archived tickets | - | - | - | - |");
89
90
 
90
91
  return template
91
92
  .replaceAll("{{SOURCE_INDEX}}", `${TICKET_DIR_NAME}/${TICKET_INDEX_FILENAME}`)
@@ -99,7 +100,8 @@ function renderLine(e, i, ticketDir, cwd) {
99
100
  const relPath = toPosixPath(relative(ticketDir, join(cwd, e.path)));
100
101
  const statusIcon = e.status === "active" ? "🔥 " : (e.status === "archived" ? "📦 " : "[ ] ");
101
102
  const safeTitle = String(e.title || "").replace(/\|/g, '&#124;').replace(/(\n|\\n)+/g, ' ');
102
- return `| ${i + 1} | ${statusIcon}${e.status} | ${safeTitle} | ${e.group} | ${e.project} | ${e.createdAt.split('T')[0]} | [open](${relPath}) |`;
103
+ const prio = e.priority || "P2";
104
+ return `| ${i + 1} | ${statusIcon}${e.status} | ${prio} | ${safeTitle} | ${e.group} | ${e.project} | ${e.createdAt.split('T')[0]} | [open](${relPath}) |`;
103
105
  }
104
106
 
105
107
  export function writeTicketListFile(cwd, entries, opts = {}) {
@@ -471,9 +473,61 @@ export function syncActiveTicketPointer(cwd) {
471
473
 
472
474
 
473
475
  /**
474
- * Deterministic or Hash-based ID to prevent collisions in multi-device sync
476
+ * Returns the machine hostname slug (lowercase, alphanumeric + hyphen only).
475
477
  */
476
- export function generateTicketId(title) {
478
+ export function getHostnameSlug() {
479
+ try {
480
+ const slug = osHostname().toLowerCase().replace(/[^a-z0-9\-]/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '');
481
+ return slug.slice(0, 8).replace(/-$/, '') || 'local';
482
+ } catch {
483
+ return 'local';
484
+ }
485
+ }
486
+
487
+ /**
488
+ * Computes next sequential 3-digit ticket number by scanning all entries
489
+ * in the current INDEX.json for IDs matching `ticket_NNN_*`.
490
+ * Safe to call cross-device: each hostname produces an independent sequence,
491
+ * but the number is always calculated from the current local INDEX state.
492
+ *
493
+ * @param {object[]} existingEntries - entries array from INDEX.json
494
+ * @returns {{ num: number, hostname: string }}
495
+ */
496
+ export function computeNextTicketNumber(existingEntries) {
497
+ const hostname = getHostnameSlug();
498
+ // Match both old format `ticket_NNN_hostname_*` and new `ticket_NNN_*`
499
+ const numRe = /^ticket_(\d{3,})_/;
500
+ let max = 0;
501
+ for (const e of (existingEntries || [])) {
502
+ const m = String(e.id || '').match(numRe);
503
+ if (m) {
504
+ const n = parseInt(m[1], 10);
505
+ if (n > max) max = n;
506
+ }
507
+ }
508
+ return { num: max + 1, hostname };
509
+ }
510
+
511
+ /**
512
+ * Sequential hostname-aware ticket ID.
513
+ * Format: ticket_NNN_<hostname>_<topic-slug>
514
+ * NNN starts at 001 and increments per local INDEX.json state.
515
+ *
516
+ * @param {string} topicSlug
517
+ * @param {object[]} existingEntries - entries array from INDEX.json (may be empty)
518
+ */
519
+ export function generateTicketId(topicSlug, existingEntries) {
520
+ const { num, hostname } = computeNextTicketNumber(existingEntries);
521
+ const numStr = String(num).padStart(3, '0');
522
+ const slug = toSlug(topicSlug || 'ticket').slice(0, 32);
523
+ return `ticket_${numStr}_${hostname}_${slug}`;
524
+ }
525
+
526
+ /**
527
+ * @deprecated Use generateTicketId(topicSlug, existingEntries)
528
+ * Kept for backwards compatibility.
529
+ */
530
+ export function generateTicketIdLegacy(title) {
477
531
  const seed = `${title}-${Date.now()}-${Math.random()}`;
478
532
  try {
479
533
  return "ticket_" + createHash("md5").update(seed).digest("hex").slice(0, 12);
@@ -1,6 +1,6 @@
1
1
  import { existsSync, readFileSync, writeFileSync } from "fs";
2
2
  import { basename, dirname, join, relative } from "path";
3
- import YAML from "../node_modules/yaml/dist/index.js";
3
+ import YAML from "yaml";
4
4
 
5
5
  export const INIT_CONFIG_FILENAME = ".deuk-agent-rule.config.json";
6
6
  export const INIT_CONFIG_VERSION = 1;
@@ -143,3 +143,24 @@ export function stringifyFrontMatter(meta, content) {
143
143
  const yamlStr = YAML.stringify(meta).trim();
144
144
  return `---\n${yamlStr}\n---\n\n${content.trim()}\n`;
145
145
  }
146
+
147
+ export async function checkUpdateNotifier() {
148
+ try {
149
+ const { fileURLToPath } = await import("url");
150
+ const pkgPath = join(dirname(fileURLToPath(import.meta.url)), "..", "package.json");
151
+ const pkg = JSON.parse(readFileSync(pkgPath, "utf8"));
152
+ const currentVersion = pkg.version;
153
+ const res = await fetch("https://registry.npmjs.org/deuk-agent-rule/latest", {
154
+ signal: AbortSignal.timeout(800)
155
+ });
156
+ if (res.ok) {
157
+ const data = await res.json();
158
+ if (data.version && data.version !== currentVersion) {
159
+ console.warn(`\n\x1b[33m💡 Update available! ${currentVersion} → ${data.version}\x1b[0m`);
160
+ console.warn(`\x1b[36mRun 'npm install -g deuk-agent-rule' to update.\x1b[0m\n`);
161
+ }
162
+ }
163
+ } catch(e) {
164
+ // Ignore timeout or network errors silently
165
+ }
166
+ }
package/scripts/cli.mjs CHANGED
@@ -6,9 +6,11 @@ import { parseArgs, parseTicketArgs } from "./cli-args.mjs";
6
6
  import { runInit, runMerge } from "./cli-init-commands.mjs";
7
7
  import { runTicketCreate, runTicketList, runTicketUse, runTicketClose, runTicketArchive, runTicketReports, runTicketMeta, runTicketConnect } from "./cli-ticket-commands.mjs";
8
8
  import { performUpgradeMigration } from "./cli-ticket-logic.mjs";
9
- import { loadInitConfig, writeInitConfig } from "./cli-utils.mjs";
9
+ import { loadInitConfig, writeInitConfig, checkUpdateNotifier } from "./cli-utils.mjs";
10
10
  import { runInteractive } from "./cli-prompts.mjs";
11
11
 
12
+ const updatePromise = checkUpdateNotifier();
13
+
12
14
  const __dirname = dirname(fileURLToPath(import.meta.url));
13
15
  const pkgRoot = join(__dirname, "..");
14
16
  const bundleRoot = join(pkgRoot, "bundle");
@@ -118,7 +120,10 @@ Ticket Options:
118
120
  `);
119
121
  }
120
122
 
121
- main().catch(err => {
123
+ main().then(async () => {
124
+ await updatePromise;
125
+ }).catch(async err => {
126
+ await updatePromise;
122
127
  console.error(err.message || err);
123
128
  process.exit(1);
124
129
  });
@@ -44,6 +44,18 @@ for (const name of readdirSync(publishRulesDir)) {
44
44
  copyFileSync(join(publishRulesDir, name), join(rulesDest, name));
45
45
  }
46
46
 
47
+ const templatesSrc = join(publishDir, "templates");
48
+ const templatesDest = join(pkgRoot, "bundle", "templates");
49
+ if (existsSync(templatesSrc)) {
50
+ if (existsSync(templatesDest)) {
51
+ rmSync(templatesDest, { recursive: true });
52
+ }
53
+ mkdirSync(templatesDest, { recursive: true });
54
+ for (const name of readdirSync(templatesSrc)) {
55
+ copyFileSync(join(templatesSrc, name), join(templatesDest, name));
56
+ }
57
+ }
58
+
47
59
  const agentsBody = readFileSync(agentsSrc, "utf8");
48
60
  writeFileSync(agentsDest, agentsBody, "utf8");
49
61
  copyFileSync(cursorrulesSrc, cursorrulesDest);
@@ -49,6 +49,9 @@ cpSync(join(pkgRoot, "README.ko.md"), join(ossRoot, "README.ko.md"), { force: tr
49
49
  if (existsSync(join(pkgRoot, "CHANGELOG.md"))) {
50
50
  cpSync(join(pkgRoot, "CHANGELOG.md"), join(ossRoot, "CHANGELOG.md"), { force: true });
51
51
  }
52
+ if (existsSync(join(pkgRoot, "CHANGELOG.ko.md"))) {
53
+ cpSync(join(pkgRoot, "CHANGELOG.ko.md"), join(ossRoot, "CHANGELOG.ko.md"), { force: true });
54
+ }
52
55
  if (existsSync(join(pkgRoot, "package-lock.json"))) {
53
56
  cpSync(join(pkgRoot, "package-lock.json"), join(ossRoot, "package-lock.json"), { force: true });
54
57
  }
@@ -91,6 +94,7 @@ const outPkg = {
91
94
  "README.md",
92
95
  "README.ko.md",
93
96
  "CHANGELOG.md",
97
+ "CHANGELOG.ko.md",
94
98
  ],
95
99
  };
96
100
  delete outPkg.private;
@@ -1,22 +0,0 @@
1
- /**
2
- * Post-process CHANGELOG.md after commit-and-tag-version: drop internal "sync" wording
3
- * from user-facing bullets (OSS mirror / sync-oss / release automation noise).
4
- */
5
- import { readFileSync, writeFileSync } from "fs";
6
- import { dirname, join } from "path";
7
- import { fileURLToPath } from "url";
8
-
9
- const root = join(dirname(fileURLToPath(import.meta.url)), "..");
10
- const file = join(root, "CHANGELOG.md");
11
- let s = readFileSync(file, "utf8");
12
-
13
- s = s.replace(/,\s*and OSS sync\b/g, "");
14
- s = s.replace(/\s+and OSS sync\b/g, "");
15
- s = s.replace(
16
- /- `sync-oss` copies (`package-lock\.json`) for reproducible installs\./g,
17
- "- Release packaging includes $1 for reproducible installs.",
18
- );
19
- s = s.replace(/\bCLI and publish AGENTS sync\b/gi, "CLI and publish AGENTS updates");
20
- s = s.replace(/\bpublish AGENTS sync\b/gi, "publish AGENTS alignment");
21
-
22
- writeFileSync(file, s, "utf8");