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.
- package/CHANGELOG.ko.md +83 -0
- package/CHANGELOG.md +206 -156
- package/README.ko.md +34 -16
- package/README.md +34 -16
- package/bundle/AGENTS.md +4 -1
- package/bundle/templates/TICKET_TEMPLATE.md +36 -39
- package/package.json +49 -55
- package/scripts/cli-args.mjs +1 -0
- package/scripts/cli-init-commands.mjs +16 -2
- package/scripts/cli-ticket-commands.mjs +23 -1
- package/scripts/cli-ticket-logic.mjs +61 -7
- package/scripts/cli-utils.mjs +22 -1
- package/scripts/cli.mjs +7 -2
- package/scripts/sync-bundle.mjs +12 -0
- package/scripts/sync-oss.mjs +4 -0
- package/scripts/changelog-polish.mjs +0 -22
package/CHANGELOG.ko.md
ADDED
|
@@ -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.
|
|
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
|
-
-
|
|
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:**
|
|
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
|
-
-
|
|
53
|
-
- **
|
|
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
|
-
## [
|
|
25
|
+
## [2.4.0] - 2026-04-18
|
|
73
26
|
|
|
74
27
|
|
|
75
28
|
### Added
|
|
76
29
|
|
|
77
|
-
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
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
|
|
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
|
-
-
|
|
119
|
-
-
|
|
120
|
-
-
|
|
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
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
- **
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
-
|
|
188
|
-
|
|
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
|
-
프로젝트
|
|
28
|
+
본 패키지는 여러 서브모듈 및 프로젝트 전반에서 빈번하게 사용되는 CLI 도구이므로 **전역(Global) 설치를 강력히 권장**합니다.
|
|
29
29
|
|
|
30
30
|
```bash
|
|
31
|
-
npm install deuk-agent-rule
|
|
32
|
-
|
|
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
|
-
- 스택 변경이 필요 없으면 이후에는 `
|
|
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 코딩
|
|
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
|
-
|
|
88
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 `
|
|
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 **
|
|
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
|
-
|
|
87
|
-
|
|
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.
|
|
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
|
-
"
|
|
28
|
-
"
|
|
29
|
-
"
|
|
30
|
-
"README.
|
|
31
|
-
"
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
"
|
|
37
|
-
"
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
"
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
"
|
|
48
|
-
}
|
|
49
|
-
|
|
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
|
+
}
|
package/scripts/cli-args.mjs
CHANGED
|
@@ -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
|
-
|
|
15
|
-
|
|
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
|
-
|
|
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
|
|
86
|
-
(activeRows.join("\n") || "| - | - | No active tickets | - | - | - | - |") +
|
|
87
|
-
"\n\n### 📦 Archived Tickets\n\n| # | Status | Title | Group | Project | Created | Path |\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, '|').replace(/(\n|\\n)+/g, ' ');
|
|
102
|
-
|
|
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
|
-
*
|
|
476
|
+
* Returns the machine hostname slug (lowercase, alphanumeric + hyphen only).
|
|
475
477
|
*/
|
|
476
|
-
export function
|
|
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);
|
package/scripts/cli-utils.mjs
CHANGED
|
@@ -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 "
|
|
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().
|
|
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
|
});
|
package/scripts/sync-bundle.mjs
CHANGED
|
@@ -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);
|
package/scripts/sync-oss.mjs
CHANGED
|
@@ -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");
|