oh-my-customcode 0.36.2 → 0.37.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/dist/cli/index.js +47 -2
  2. package/dist/index.js +44 -0
  3. package/package.json +1 -1
  4. package/templates/.claude/agents/arch-documenter.md +4 -1
  5. package/templates/.claude/agents/arch-speckit-agent.md +15 -0
  6. package/templates/.claude/agents/be-django-expert.md +1 -0
  7. package/templates/.claude/agents/be-express-expert.md +1 -0
  8. package/templates/.claude/agents/be-fastapi-expert.md +1 -0
  9. package/templates/.claude/agents/be-go-backend-expert.md +1 -0
  10. package/templates/.claude/agents/be-nestjs-expert.md +1 -0
  11. package/templates/.claude/agents/be-springboot-expert.md +1 -0
  12. package/templates/.claude/agents/db-postgres-expert.md +1 -0
  13. package/templates/.claude/agents/db-redis-expert.md +1 -0
  14. package/templates/.claude/agents/db-supabase-expert.md +1 -0
  15. package/templates/.claude/agents/de-airflow-expert.md +1 -0
  16. package/templates/.claude/agents/de-dbt-expert.md +1 -0
  17. package/templates/.claude/agents/de-kafka-expert.md +1 -0
  18. package/templates/.claude/agents/de-pipeline-expert.md +1 -0
  19. package/templates/.claude/agents/de-snowflake-expert.md +1 -0
  20. package/templates/.claude/agents/de-spark-expert.md +1 -0
  21. package/templates/.claude/agents/fe-flutter-agent.md +1 -0
  22. package/templates/.claude/agents/fe-svelte-agent.md +1 -0
  23. package/templates/.claude/agents/fe-vercel-agent.md +1 -0
  24. package/templates/.claude/agents/fe-vuejs-agent.md +1 -0
  25. package/templates/.claude/agents/infra-aws-expert.md +1 -0
  26. package/templates/.claude/agents/infra-docker-expert.md +1 -0
  27. package/templates/.claude/agents/lang-golang-expert.md +1 -0
  28. package/templates/.claude/agents/lang-java21-expert.md +3 -0
  29. package/templates/.claude/agents/lang-kotlin-expert.md +1 -0
  30. package/templates/.claude/agents/lang-python-expert.md +1 -0
  31. package/templates/.claude/agents/lang-rust-expert.md +1 -0
  32. package/templates/.claude/agents/lang-typescript-expert.md +1 -0
  33. package/templates/.claude/agents/mgr-claude-code-bible.md +1 -2
  34. package/templates/.claude/agents/mgr-creator.md +1 -0
  35. package/templates/.claude/agents/mgr-gitnerd.md +1 -0
  36. package/templates/.claude/agents/mgr-sauron.md +5 -2
  37. package/templates/.claude/agents/mgr-supplier.md +1 -3
  38. package/templates/.claude/agents/mgr-updater.md +1 -0
  39. package/templates/.claude/agents/qa-engineer.md +1 -0
  40. package/templates/.claude/agents/qa-planner.md +4 -1
  41. package/templates/.claude/agents/qa-writer.md +1 -1
  42. package/templates/.claude/agents/sec-codeql-expert.md +4 -2
  43. package/templates/.claude/agents/sys-memory-keeper.md +30 -0
  44. package/templates/.claude/agents/sys-naggy.md +36 -2
  45. package/templates/.claude/agents/tool-bun-expert.md +1 -1
  46. package/templates/.claude/agents/tool-npm-expert.md +1 -1
  47. package/templates/.claude/agents/tool-optimizer.md +1 -2
  48. package/templates/.claude/hooks/hooks.json +2 -2
  49. package/templates/.claude/hooks/scripts/agent-teams-advisor.sh +10 -0
  50. package/templates/.claude/hooks/scripts/content-hash-validator.sh +2 -3
  51. package/templates/.claude/hooks/scripts/schema-validator.sh +15 -0
  52. package/templates/.claude/hooks/scripts/secret-filter.sh +31 -1
  53. package/templates/.claude/rules/MUST-agent-teams.md +0 -23
  54. package/templates/.claude/rules/MUST-orchestrator-coordination.md +1 -13
  55. package/templates/.claude/skills/django-best-practices/SKILL.md +27 -134
  56. package/templates/.claude/skills/flutter-best-practices/SKILL.md +39 -146
  57. package/templates/.claude/skills/go-backend-best-practices/SKILL.md +29 -233
  58. package/templates/.claude/skills/java21-best-practices/SKILL.md +48 -163
  59. package/templates/CLAUDE.md.en +7 -65
  60. package/templates/CLAUDE.md.ko +7 -65
  61. package/templates/manifest.json +1 -1
@@ -44,6 +44,8 @@ records:
44
44
  example: record Point(int x, int y) {}
45
45
  ```
46
46
 
47
+ Reference: guides/java21/java-style-guide.md
48
+
47
49
  ### 2. Virtual Threads (JEP 444)
48
50
 
49
51
  ```yaml
@@ -52,27 +54,10 @@ principles:
52
54
  - Avoid pooling Virtual Threads (they are lightweight)
53
55
  - Replace thread pools for blocking I/O with Virtual Thread executors
54
56
 
55
- patterns: |
56
- // Preferred: Virtual Thread executor
57
- try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
58
- Future<String> result = executor.submit(() -> fetchFromDB());
59
- System.out.println(result.get());
60
- }
61
-
62
- // Direct creation
63
- Thread vThread = Thread.ofVirtual().start(() -> {
64
- // blocking I/O is fine here
65
- String data = callExternalApi();
66
- process(data);
67
- });
68
-
69
- // With structured concurrency (JEP 453, preview)
70
- try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {
71
- Future<String> user = scope.fork(() -> fetchUser(id));
72
- Future<List<Order>> orders = scope.fork(() -> fetchOrders(id));
73
- scope.join().throwIfFailed();
74
- return new UserProfile(user.get(), orders.get());
75
- }
57
+ patterns:
58
+ executor: "Executors.newVirtualThreadPerTaskExecutor()"
59
+ direct: "Thread.ofVirtual().start(() -> { ... })"
60
+ structured: "StructuredTaskScope.ShutdownOnFailure() for fork/join"
76
61
 
77
62
  antipatterns:
78
63
  - "Executors.newFixedThreadPool() for I/O tasks — use Virtual Threads instead"
@@ -80,44 +65,23 @@ antipatterns:
80
65
  - "synchronized blocks in Virtual Thread code — use ReentrantLock instead"
81
66
  ```
82
67
 
68
+ Reference: guides/java21/modern-java21.md
69
+
83
70
  ### 3. Pattern Matching
84
71
 
85
72
  ```yaml
86
- instanceof_patterns: |
87
- // Old style (avoid)
88
- if (obj instanceof String) {
89
- String s = (String) obj;
90
- System.out.println(s.length());
91
- }
92
-
93
- // New style (prefer)
94
- if (obj instanceof String s) {
95
- System.out.println(s.length());
96
- }
97
-
98
- // With guard
99
- if (obj instanceof String s && s.length() > 5) {
100
- System.out.println("Long string: " + s);
101
- }
102
-
103
- switch_patterns: |
104
- // Pattern matching for switch (JEP 441)
105
- String result = switch (obj) {
106
- case Integer i -> "int " + i;
107
- case String s -> "str " + s;
108
- case null -> "null";
109
- default -> "other " + obj;
110
- };
111
-
112
- // With guards (when clause)
113
- String label = switch (shape) {
114
- case Circle c when c.radius() > 10 -> "large circle";
115
- case Circle c -> "small circle";
116
- case Rectangle r -> "rectangle";
117
- default -> "unknown";
118
- };
73
+ instanceof_patterns:
74
+ rule: "Use pattern variable binding instead of explicit casts"
75
+ guard: "Combine with && for conditional matching"
76
+
77
+ switch_patterns:
78
+ rule: "Pattern matching for switch (JEP 441) — use case Type var syntax"
79
+ guards: "Use 'when' clause for conditional cases"
80
+ null_handling: "case null supported in switch"
119
81
  ```
120
82
 
83
+ Reference: guides/java21/modern-java21.md
84
+
121
85
  ### 4. Records (JEP 395)
122
86
 
123
87
  ```yaml
@@ -126,59 +90,29 @@ principles:
126
90
  - Prefer Records over POJOs with getters/setters for pure data
127
91
  - Compact constructors for validation
128
92
 
129
- patterns: |
130
- // Basic record
131
- record Point(int x, int y) {}
132
-
133
- // With validation (compact constructor)
134
- record Range(int min, int max) {
135
- Range {
136
- if (min > max) throw new IllegalArgumentException(
137
- "min %d > max %d".formatted(min, max));
138
- }
139
- }
140
-
141
- // With custom methods
142
- record Circle(double radius) {
143
- double area() {
144
- return Math.PI * radius * radius;
145
- }
146
- }
147
-
148
- // Implementing interface
149
- interface Shape { double area(); }
150
- record Square(double side) implements Shape {
151
- public double area() { return side * side; }
152
- }
93
+ features:
94
+ validation: "Compact constructor (no parens) for input validation"
95
+ methods: "Custom methods allowed alongside auto-generated accessors"
96
+ interfaces: "Records can implement interfaces"
153
97
 
154
98
  antipatterns:
155
99
  - "Mutable state in records — records are inherently immutable"
156
100
  - "Using records for entities with behavior — prefer classes"
157
101
  ```
158
102
 
103
+ Reference: guides/java21/modern-java21.md
104
+
159
105
  ### 5. Record Patterns (JEP 440)
160
106
 
161
107
  ```yaml
162
- patterns: |
163
- // Deconstruct record in instanceof
164
- if (obj instanceof Point(int x, int y)) {
165
- System.out.println("x=" + x + ", y=" + y);
166
- }
167
-
168
- // In switch
169
- String describe = switch (shape) {
170
- case Circle(double r) -> "circle r=" + r;
171
- case Rectangle(double w, double h) -> "rect " + w + "x" + h;
172
- default -> "unknown";
173
- };
174
-
175
- // Nested record patterns
176
- record ColoredPoint(Point point, Color color) {}
177
- if (obj instanceof ColoredPoint(Point(int x, int y), Color c)) {
178
- System.out.println("colored point at " + x + "," + y);
179
- }
108
+ patterns:
109
+ instanceof: "Deconstruct record components in instanceof check"
110
+ switch: "Deconstruct in switch case labels"
111
+ nested: "Nested record patterns for deep destructuring"
180
112
  ```
181
113
 
114
+ Reference: guides/java21/modern-java21.md
115
+
182
116
  ### 6. Sealed Classes (JEP 409)
183
117
 
184
118
  ```yaml
@@ -187,21 +121,11 @@ principles:
187
121
  - Combine with Pattern Matching switch for exhaustive handling
188
122
  - Prefer sealed interfaces for behavior-focused hierarchies
189
123
 
190
- patterns: |
191
- // Sealed interface with records
192
- sealed interface Shape permits Circle, Rectangle, Triangle {}
193
- record Circle(double radius) implements Shape {}
194
- record Rectangle(double width, double height) implements Shape {}
195
- record Triangle(double base, double height) implements Shape {}
196
-
197
- // Exhaustive switch (no default needed)
198
- double area = switch (shape) {
199
- case Circle(double r) -> Math.PI * r * r;
200
- case Rectangle(double w, double h) -> w * h;
201
- case Triangle(double b, double h) -> 0.5 * b * h;
202
- };
124
+ pattern: "sealed interface with record implementations, exhaustive switch (no default needed)"
203
125
  ```
204
126
 
127
+ Reference: guides/java21/modern-java21.md
128
+
205
129
  ### 7. Sequenced Collections (JEP 431)
206
130
 
207
131
  ```yaml
@@ -209,43 +133,21 @@ principles:
209
133
  - Use SequencedCollection for ordered access
210
134
  - getFirst()/getLast() replace get(0) and get(size-1)
211
135
 
212
- patterns: |
213
- // SequencedCollection methods
214
- List<String> list = new ArrayList<>(List.of("a", "b", "c"));
215
- String first = list.getFirst(); // "a"
216
- String last = list.getLast(); // "c"
217
- list.addFirst("z"); // ["z", "a", "b", "c"]
218
- list.addLast("end"); // ["z", "a", "b", "c", "end"]
219
-
220
- // Reversed view
221
- List<String> reversed = list.reversed();
222
-
223
- // SequencedMap
224
- SequencedMap<String, Integer> map = new LinkedHashMap<>();
225
- map.put("one", 1);
226
- map.put("two", 2);
227
- Map.Entry<String, Integer> firstEntry = map.firstEntry(); // "one"=1
136
+ methods: "getFirst(), getLast(), addFirst(), addLast(), reversed(), firstEntry()"
228
137
  ```
229
138
 
139
+ Reference: guides/java21/modern-java21.md
140
+
230
141
  ### 8. Text Blocks and String Features
231
142
 
232
143
  ```yaml
233
- patterns: |
234
- // Text blocks (since Java 15)
235
- String json = """
236
- {
237
- "name": "Alice",
238
- "age": 30
239
- }
240
- """;
241
-
242
- // String.formatted() (since Java 15)
243
- String msg = "Hello, %s! You are %d years old.".formatted(name, age);
244
-
245
- // String templates (JEP 430, preview in Java 21)
246
- // Prefer String.formatted() or MessageFormat for now
144
+ patterns:
145
+ text_blocks: "Triple-quote \"\"\" for multi-line strings (since Java 15)"
146
+ formatted: "String.formatted() for template substitution (since Java 15)"
247
147
  ```
248
148
 
149
+ Reference: guides/java21/modern-java21.md
150
+
249
151
  ### 9. Error Handling
250
152
 
251
153
  ```yaml
@@ -255,35 +157,16 @@ principles:
255
157
  - Never swallow exceptions silently
256
158
  - Use specific exception types
257
159
 
258
- patterns: |
259
- // Specific exception type
260
- public User findUser(long id) {
261
- return userRepository.findById(id)
262
- .orElseThrow(() -> new UserNotFoundException("User not found: " + id));
263
- }
264
-
265
- // Multi-catch
266
- try {
267
- process();
268
- } catch (IOException | SQLException e) {
269
- log.error("Data access failed", e);
270
- throw new ServiceException("Processing failed", e);
271
- }
160
+ patterns:
161
+ optional: "orElseThrow(() -> new SpecificException(msg)) for missing values"
162
+ multi_catch: "catch (IOException | SQLException e) for related exceptions"
272
163
  ```
273
164
 
165
+ Reference: guides/java21/java-style-guide.md
166
+
274
167
  ### 10. Documentation
275
168
 
276
169
  ```yaml
277
- format: |
278
- /**
279
- * Processes the given {@link Order} and returns a {@link Receipt}.
280
- *
281
- * @param order the order to process (must not be null)
282
- * @return the generated receipt
283
- * @throws OrderException if the order cannot be fulfilled
284
- */
285
- public Receipt processOrder(Order order) { }
286
-
287
170
  best_practices:
288
171
  - Use @param and @return for public API
289
172
  - Link related types with {@link}
@@ -291,6 +174,8 @@ best_practices:
291
174
  - Keep Javadoc focused on "what", not "how"
292
175
  ```
293
176
 
177
+ Reference: guides/java21/java-style-guide.md
178
+
294
179
  ## Application
295
180
 
296
181
  When writing or reviewing Java 21 code:
@@ -5,26 +5,7 @@ Powered by oh-my-customcode.
5
5
  ---
6
6
  ## STOP AND READ BEFORE EVERY RESPONSE
7
7
 
8
- ```
9
- +==================================================================+
10
- | MANDATORY CHECK BEFORE RESPONDING: |
11
- | |
12
- | 1. Does my response start with agent identification? |
13
- | +- Agent: {name} ({type}) |
14
- | +- Task: {description} |
15
- | |
16
- | 2. Do my tool calls include identification? |
17
- | [agent-name] -> Tool: {tool} |
18
- | [agent-name] -> Target: {path} |
19
- | |
20
- | |
21
- | 3. Am I about to spawn 2+ agents? |
22
- | YES -> Check R018: Agent Teams may be REQUIRED |
23
- | 3+ agents OR review cycle -> Agent Teams (MUST) |
24
- | |
25
- | If NO to any -> FIX IMMEDIATELY before continuing |
26
- +==================================================================+
27
- ```
8
+ 1. Response starts with agent identification? (R007) 2. Tool calls include identification? (R008) 3. Spawning 2+ agents? Check R018. → If NO to any, FIX IMMEDIATELY
28
9
 
29
10
  ---
30
11
 
@@ -62,51 +43,12 @@ NO EXCEPTIONS. NO EXCUSES.
62
43
 
63
44
  > **These rules are NON-NEGOTIABLE. Violation = immediate correction required.**
64
45
 
65
- ### 1. Agent Identification (ENFORCED)
66
- ```
67
- EVERY response MUST start with:
68
-
69
- +- Agent: {agent-name} ({agent-type})
70
- +- Skill: {skill-name} (if applicable)
71
- +- Task: {brief-task-description}
72
-
73
- NO EXCEPTIONS. Even for simple questions.
74
- ```
75
-
76
- ### 2. Tool Usage Identification (ENFORCED)
77
- ```
78
- EVERY tool call MUST be prefixed with:
79
-
80
- [agent-name] -> Tool: <tool-name>
81
- [agent-name] -> Target: <file/path/url>
82
-
83
- Example:
84
- [lang-golang-expert] -> Tool: Read
85
- [lang-golang-expert] -> Target: src/main.go
86
- ```
87
-
88
- ### 3. Parallel Execution (ENFORCED for 2+ independent tasks)
89
- ```
90
- When 2 or more tasks are INDEPENDENT:
91
- -> MUST spawn parallel agent instances (max 4)
92
- -> MUST NOT process sequentially
93
-
94
- Detection: If tasks don't share state or have dependencies -> PARALLEL
95
- ```
96
-
97
- ### 4. Orchestrator Coordination (ENFORCED for multi-agent tasks)
98
- ```
99
- When task requires multiple agents:
100
- -> Main conversation (orchestrator) MUST coordinate
101
- -> Main conversation assigns tasks to appropriate agents
102
- -> Main conversation aggregates results
103
- -> Orchestrator MUST NEVER directly modify files
104
-
105
- Flow:
106
- User -> Main conversation -> [agent-1, agent-2, agent-3] -> Main conversation -> User
107
-
108
- Violation = immediate correction. No exception for "small changes".
109
- ```
46
+ | Rule | Core | On Violation |
47
+ |------|------|-------------|
48
+ | R007 Agent ID | Every response starts with `┌─ Agent:` header | Add header immediately |
49
+ | R008 Tool ID | Every tool call prefixed with `[agent][model] → Tool:` | Add prefix immediately |
50
+ | R009 Parallel | 2+ independent tasks → parallel agents (max 4) | Stop sequential, switch to parallel |
51
+ | R010 Orchestrator | Orchestrator never modifies files → delegate to subagents | Stop direct modification, delegate |
110
52
 
111
53
  ---
112
54
 
@@ -5,26 +5,7 @@ oh-my-customcode로 구동됩니다.
5
5
  ---
6
6
  ## 모든 응답 전 반드시 확인
7
7
 
8
- ```
9
- +==================================================================+
10
- | 응답 전 필수 확인사항: |
11
- | |
12
- | 1. 내 응답이 에이전트 식별로 시작하는가? |
13
- | +- Agent: {이름} ({타입}) |
14
- | +- Task: {설명} |
15
- | |
16
- | 2. 도구 호출에 식별 정보가 포함되어 있는가? |
17
- | [에이전트명] -> Tool: {도구} |
18
- | [에이전트명] -> Target: {경로} |
19
- | |
20
- | |
21
- | 3. 2개 이상 에이전트를 스폰하려 하는가? |
22
- | YES -> R018 체크: Agent Teams 필수 여부 확인 |
23
- | 3+ 에이전트 OR 리뷰 사이클 -> Agent Teams 필수 |
24
- | |
25
- | 하나라도 NO면 -> 즉시 수정 후 계속 |
26
- +==================================================================+
27
- ```
8
+ 1. 에이전트 식별로 시작하는가? (R007) 2. 도구 호출에 식별 포함? (R008) 3. 2+ 에이전트 스폰 시 R018 체크? → 하나라도 NO면 즉시 수정
28
9
 
29
10
  ---
30
11
 
@@ -62,51 +43,12 @@ oh-my-customcode로 구동됩니다.
62
43
 
63
44
  > **이 규칙들은 협상 불가. 위반 = 즉시 수정 필요.**
64
45
 
65
- ### 1. 에이전트 식별 (강제)
66
- ```
67
- 모든 응답은 반드시 다음으로 시작:
68
-
69
- +- Agent: {에이전트명} ({에이전트타입})
70
- +- Skill: {스킬명} (해당 시)
71
- +- Task: {간단한 작업 설명}
72
-
73
- 예외 없음. 간단한 질문도 마찬가지.
74
- ```
75
-
76
- ### 2. 도구 사용 식별 (강제)
77
- ```
78
- 모든 도구 호출은 반드시 에이전트 식별 포함:
79
-
80
- [에이전트명] -> Tool: <도구명>
81
- [에이전트명] -> Target: <파일/경로/URL>
82
-
83
- 예:
84
- [lang-golang-expert] -> Tool: Read
85
- [lang-golang-expert] -> Target: src/main.go
86
- ```
87
-
88
- ### 3. 병렬 실행 (2개 이상 독립 작업 시 강제)
89
- ```
90
- 2개 이상의 작업이 독립적일 때:
91
- -> 반드시 병렬 에이전트 인스턴스 생성 (최대 4개)
92
- -> 순차 처리 금지
93
-
94
- 감지: 작업 간 상태 공유나 의존성이 없으면 -> 병렬
95
- ```
96
-
97
- ### 4. 오케스트레이터 조율 (다중 에이전트 작업 시 강제)
98
- ```
99
- 작업에 여러 에이전트가 필요할 때:
100
- -> 메인 대화 (오케스트레이터)가 반드시 조율
101
- -> 메인 대화가 적절한 에이전트에 작업 할당
102
- -> 메인 대화가 결과 집계
103
- -> 오케스트레이터는 절대 직접 파일을 수정하지 않음
104
-
105
- 흐름:
106
- 사용자 -> 메인 대화 -> [agent-1, agent-2, agent-3] -> 메인 대화 -> 사용자
107
-
108
- 위반 시 즉시 수정. "작은 변경"도 예외 없음.
109
- ```
46
+ | 규칙 | 핵심 | 위반 시 |
47
+ |------|------|--------|
48
+ | R007 에이전트 식별 | 모든 응답은 `┌─ Agent:` 헤더로 시작 | 즉시 헤더 추가 |
49
+ | R008 도구 식별 | 모든 도구 호출에 `[에이전트명][모델] → Tool:` 접두사 | 즉시 접두사 추가 |
50
+ | R009 병렬 실행 | 독립 작업 2개 이상 → 병렬 에이전트 (최대 4개) | 순차 실행 중단, 병렬로 전환 |
51
+ | R010 오케스트레이터 | 오케스트레이터는 파일 수정 금지 → 서브에이전트에 위임 | 직접 수정 중단, 위임 |
110
52
 
111
53
  ---
112
54
 
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.36.2",
2
+ "version": "0.37.1",
3
3
  "lastUpdated": "2026-03-14T00:00:00.000Z",
4
4
  "components": [
5
5
  {