claudeos-core 1.0.7 → 1.2.0

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.

Potentially problematic release.


This version of claudeos-core might be problematic. Click here for more details.

Files changed (44) hide show
  1. package/CHANGELOG.md +84 -1
  2. package/CONTRIBUTING.md +15 -4
  3. package/README.de.md +187 -11
  4. package/README.es.md +187 -11
  5. package/README.fr.md +187 -11
  6. package/README.hi.md +187 -11
  7. package/README.ja.md +186 -10
  8. package/README.ko.md +331 -364
  9. package/README.md +200 -11
  10. package/README.ru.md +187 -11
  11. package/README.vi.md +188 -12
  12. package/README.zh-CN.md +186 -10
  13. package/bin/cli.js +183 -61
  14. package/bootstrap.sh +128 -21
  15. package/content-validator/index.js +131 -60
  16. package/health-checker/index.js +29 -23
  17. package/import-linter/index.js +14 -8
  18. package/manifest-generator/index.js +26 -20
  19. package/package.json +84 -75
  20. package/pass-json-validator/index.js +92 -70
  21. package/pass-prompts/templates/common/header.md +4 -4
  22. package/pass-prompts/templates/common/lang-instructions.json +27 -0
  23. package/pass-prompts/templates/common/pass3-footer.md +2 -3
  24. package/pass-prompts/templates/java-spring/pass1.md +84 -81
  25. package/pass-prompts/templates/java-spring/pass2.md +66 -66
  26. package/pass-prompts/templates/java-spring/pass3.md +60 -60
  27. package/pass-prompts/templates/kotlin-spring/pass1.md +172 -0
  28. package/pass-prompts/templates/kotlin-spring/pass2.md +109 -0
  29. package/pass-prompts/templates/kotlin-spring/pass3.md +98 -0
  30. package/pass-prompts/templates/node-express/pass1.md +73 -73
  31. package/pass-prompts/templates/node-express/pass2.md +66 -66
  32. package/pass-prompts/templates/node-express/pass3.md +53 -53
  33. package/pass-prompts/templates/node-nextjs/pass1.md +68 -68
  34. package/pass-prompts/templates/node-nextjs/pass2.md +61 -61
  35. package/pass-prompts/templates/node-nextjs/pass3.md +48 -48
  36. package/pass-prompts/templates/python-django/pass1.md +78 -78
  37. package/pass-prompts/templates/python-django/pass2.md +69 -69
  38. package/pass-prompts/templates/python-django/pass3.md +45 -45
  39. package/pass-prompts/templates/python-fastapi/pass1.md +76 -76
  40. package/pass-prompts/templates/python-fastapi/pass2.md +67 -67
  41. package/pass-prompts/templates/python-fastapi/pass3.md +45 -45
  42. package/plan-installer/index.js +623 -97
  43. package/plan-validator/index.js +54 -23
  44. package/sync-checker/index.js +25 -14
@@ -3,15 +3,15 @@
3
3
  /**
4
4
  * ClaudeOS-Core — Pass JSON Validator
5
5
  *
6
- * 역할: Pass 1~3에서 생성된 JSON 파일의 포맷과 필수 키를 검증
7
- * 검증 항목:
8
- * - JSON 파싱 가능 여부
9
- * - pass1-*.json: analyzedAt, passNum, domains, analysisPerDomain 존재
10
- * - pass2-merged.json: 공통 필수 섹션(9개) + 백엔드 추가 섹션(2) 존재 여부 fuzzy 검증
11
- * 탐지, 최상위 검증 (5 미만 ERROR, 9 미만 WARNING)
12
- * - project-analysis.json: stack, domains, frontend, summary 존재
6
+ * Role: Validate format and required keys of JSON files generated by Pass 1-3
7
+ * Validation items:
8
+ * - JSON is parseable
9
+ * - pass1-*.json: analyzedAt, passNum, domains, analysisPerDomain keys exist
10
+ * - pass2-merged.json: fuzzy validation of common required sections (10) + backend sections (2)
11
+ * empty value detection, top-level key count check (<5 ERROR, <9 WARNING)
12
+ * - project-analysis.json: stack, domains, frontend, summary keys exist
13
13
  *
14
- * 실행: npx claudeos-core <cmd> 또는 node claudeos-core-tools/pass-json-validator/index.js
14
+ * Usage: npx claudeos-core <cmd> or node claudeos-core-tools/pass-json-validator/index.js
15
15
  */
16
16
 
17
17
  const fs = require("fs");
@@ -29,7 +29,7 @@ async function main() {
29
29
  console.log("╚══════════════════════════════════════╝\n");
30
30
 
31
31
  if (!fs.existsSync(GEN_DIR)) {
32
- console.log(" ❌ claudeos-core/generated/ 디렉토리 없음\n");
32
+ console.log(" ❌ claudeos-core/generated/ directory not found\n");
33
33
  process.exit(1);
34
34
  }
35
35
 
@@ -37,11 +37,11 @@ async function main() {
37
37
  const warnings = [];
38
38
  let checked = 0;
39
39
 
40
- // ─── 헬퍼: JSON 파싱 + 검증 ────────────────────────
40
+ // ─── Helpers: JSON parse + key validation ────────────────────────
41
41
  function validateJson(filePath, requiredKeys, optionalKeys) {
42
42
  const r = rel(filePath);
43
43
  if (!fs.existsSync(filePath)) {
44
- errors.push({ file: r, type: "MISSING", msg: "파일 없음" });
44
+ errors.push({ file: r, type: "MISSING", msg: "File not found" });
45
45
  return null;
46
46
  }
47
47
  checked++;
@@ -50,18 +50,18 @@ async function main() {
50
50
  const raw = fs.readFileSync(filePath, "utf-8");
51
51
  data = JSON.parse(raw);
52
52
  } catch (e) {
53
- errors.push({ file: r, type: "PARSE_ERROR", msg: `JSON 파싱 실패: ${e.message}` });
53
+ errors.push({ file: r, type: "PARSE_ERROR", msg: `JSON parse failed: ${e.message}` });
54
54
  return null;
55
55
  }
56
56
 
57
57
  for (const key of requiredKeys) {
58
58
  if (!(key in data)) {
59
- errors.push({ file: r, type: "MISSING_KEY", msg: `필수 '${key}' 없음` });
59
+ errors.push({ file: r, type: "MISSING_KEY", msg: `Required key '${key}' missing` });
60
60
  }
61
61
  }
62
62
  for (const key of (optionalKeys || [])) {
63
63
  if (!(key in data)) {
64
- warnings.push({ file: r, type: "MISSING_KEY", msg: `권장 '${key}' 없음` });
64
+ warnings.push({ file: r, type: "MISSING_KEY", msg: `Recommended key '${key}' missing` });
65
65
  }
66
66
  }
67
67
  return data;
@@ -72,17 +72,18 @@ async function main() {
72
72
  const pa = validateJson(
73
73
  path.join(GEN_DIR, "project-analysis.json"),
74
74
  ["analyzedAt", "stack", "domains", "frontend", "summary"],
75
- ["template", "templates", "rootPackage", "activeDomains"]
75
+ ["lang", "template", "templates", "rootPackage", "activeDomains"]
76
76
  );
77
77
  if (pa) {
78
78
  if (!pa.stack || !pa.stack.language) {
79
- errors.push({ file: "project-analysis.json", type: "INVALID_STACK", msg: "stack.language 없음" });
79
+ errors.push({ file: "project-analysis.json", type: "INVALID_STACK", msg: "stack.language is missing" });
80
80
  }
81
81
  if (!Array.isArray(pa.domains)) {
82
- errors.push({ file: "project-analysis.json", type: "INVALID_DOMAINS", msg: "domains 배열이 아님" });
82
+ errors.push({ file: "project-analysis.json", type: "INVALID_DOMAINS", msg: "domains is not an array" });
83
83
  } else {
84
84
  console.log(` stack: ${pa.stack?.language || "?"} / ${pa.stack?.framework || "?"}`);
85
- console.log(` domains: ${pa.domains.length}개`);
85
+ console.log(` domains: ${pa.domains.length}`);
86
+ console.log(` lang: ${pa.lang || "en (default)"}`);
86
87
  const tmpl = pa.templates || pa.template;
87
88
  if (typeof tmpl === "object") {
88
89
  console.log(` templates: backend=${tmpl.backend || "none"}, frontend=${tmpl.frontend || "none"}`);
@@ -102,19 +103,19 @@ async function main() {
102
103
  );
103
104
  if (dg) {
104
105
  if (!Array.isArray(dg.groups)) {
105
- errors.push({ file: "domain-groups.json", type: "INVALID_GROUPS", msg: "groups 배열이 아님" });
106
+ errors.push({ file: "domain-groups.json", type: "INVALID_GROUPS", msg: "groups is not an array" });
106
107
  } else {
107
- console.log(` ${dg.totalGroups} 그룹, ${dg.totalDomains} 도메인`);
108
+ console.log(` ${dg.totalGroups} groups, ${dg.totalDomains} domains`);
108
109
  }
109
110
  }
110
111
 
111
112
  // ─── 3. pass1-*.json ──────────────────────────────────
112
113
  console.log(" [3/4] pass1-*.json...");
113
114
  const pass1Files = await glob("pass1-*.json", { cwd: GEN_DIR, absolute: true });
114
- // pass1-prompt.md는 제외
115
+ // Exclude pass1-prompt.md
115
116
  const pass1JsonFiles = pass1Files.filter(f => f.endsWith(".json"));
116
117
  if (pass1JsonFiles.length === 0) {
117
- warnings.push({ file: "pass1-*.json", type: "NO_FILES", msg: "pass1 JSON 없음 (아직 미실행?)" });
118
+ warnings.push({ file: "pass1-*.json", type: "NO_FILES", msg: "No pass1 JSON found (not yet executed?)" });
118
119
  }
119
120
  for (const f of pass1JsonFiles) {
120
121
  const data = validateJson(f,
@@ -123,13 +124,13 @@ async function main() {
123
124
  );
124
125
  if (data) {
125
126
  if (!Array.isArray(data.domains) || data.domains.length === 0) {
126
- warnings.push({ file: rel(f), type: "EMPTY_DOMAINS", msg: "분석된 도메인이 없음" });
127
+ warnings.push({ file: rel(f), type: "EMPTY_DOMAINS", msg: "No analyzed domains found" });
127
128
  }
128
129
  if (typeof data.analysisPerDomain !== "object") {
129
- errors.push({ file: rel(f), type: "INVALID_ANALYSIS", msg: "analysisPerDomain 객체가 아님" });
130
+ errors.push({ file: rel(f), type: "INVALID_ANALYSIS", msg: "analysisPerDomain is not an object" });
130
131
  } else {
131
132
  const domainCount = Object.keys(data.analysisPerDomain).length;
132
- console.log(` ${path.basename(f)}: ${domainCount} 도메인 분석`);
133
+ console.log(` ${path.basename(f)}: ${domainCount} domains analyzed`);
133
134
  }
134
135
  }
135
136
  }
@@ -138,92 +139,110 @@ async function main() {
138
139
  console.log(" [4/4] pass2-merged.json...");
139
140
  const p2path = path.join(GEN_DIR, "pass2-merged.json");
140
141
  if (!fs.existsSync(p2path)) {
141
- warnings.push({ file: "pass2-merged.json", type: "NO_FILE", msg: "아직 미생성 (Pass 2 미실행?)" });
142
+ warnings.push({ file: "pass2-merged.json", type: "NO_FILE", msg: "Not yet generated (Pass 2 not executed?)" });
142
143
  } else {
143
144
  checked++;
144
145
  let data;
145
146
  try {
146
147
  data = JSON.parse(fs.readFileSync(p2path, "utf-8"));
147
148
  } catch (e) {
148
- errors.push({ file: "pass2-merged.json", type: "PARSE_ERROR", msg: `JSON 파싱 실패: ${e.message}` });
149
+ errors.push({ file: "pass2-merged.json", type: "PARSE_ERROR", msg: `JSON parse failed: ${e.message}` });
149
150
  data = null;
150
151
  }
151
152
 
152
153
  if (data) {
153
154
  const keys = Object.keys(data);
154
- console.log(` 최상위 키 ${keys.length}개: ${keys.slice(0, 5).join(", ")}${keys.length > 5 ? " ..." : ""}`);
155
+ console.log(` ${keys.length} top-level keys: ${keys.slice(0, 5).join(", ")}${keys.length > 5 ? " ..." : ""}`);
155
156
 
156
- // 모든 스택 공통 필수 항목 (5 스택 pass2 프롬프트 교집합)
157
+ // Required sections common to all stacks (intersection of all 5 stack pass2 prompts)
157
158
  const REQUIRED_SECTIONS = [
158
- "commonPatterns", // 1. 전체 공통 패턴
159
- "sharedPatterns", // 2. 다수 공유 패턴
160
- "domainSpecific", // 3. 도메인 특화 패턴
161
- "antiPatterns", // 4. 안티패턴 종합
162
- "namingConventions", // 5. 명명 규칙 종합
163
- "commonUtilities", // 6. 공통 클래스/유틸리티 목록
164
- "security", // 7. 보안/인증 패턴
165
- "testing", // 9. 테스트 전략 종합
166
- "logging", // 10. 로깅/모니터링 전략
167
- "codeQuality", // 12. 코드 품질 도구
159
+ "commonPatterns", // 1. Universal patterns
160
+ "sharedPatterns", // 2. Majority patterns
161
+ "domainSpecific", // 3. Domain-specific patterns
162
+ "antiPatterns", // 4. Anti-pattern summary
163
+ "namingConventions", // 5. Naming conventions summary
164
+ "commonUtilities", // 6. Common classes/utilities list
165
+ "security", // 7. Security/auth patterns
166
+ "testing", // 9. Testing strategy summary
167
+ "logging", // 10. Logging/monitoring strategy
168
+ "codeQuality", // 12. Code quality tools
168
169
  ];
169
170
 
170
- // 백엔드 스택(java/node-express/django/fastapi)에만 있는 항목
171
+ // Sections only in backend stacks (java/node-express/django/fastapi/kotlin)
171
172
  const BACKEND_SECTIONS = [
172
- "database", // 8. DB 패턴
173
- "performance", // 11. 성능 패턴
173
+ "database", // 8. DB patterns
174
+ "performance", // 11. Performance patterns
174
175
  ];
175
176
 
176
- // project-analysis.json에서 스택 확인
177
+ // Sections only in kotlin-spring with CQRS/BFF/multi-module detected
178
+ const KOTLIN_CQRS_SECTIONS = [
179
+ "bffPatterns", // 7. BFF patterns summary
180
+ "interModuleCommunication", // Inter-module communication
181
+ ];
182
+ // Sections for all kotlin-spring projects (regardless of CQRS)
183
+ const KOTLIN_BASE_SECTIONS = [
184
+ "buildModulePatterns", // 13. Build & module patterns
185
+ ];
186
+
187
+ // Check stack from project-analysis.json
177
188
  const paPath = path.join(GEN_DIR, "project-analysis.json");
178
- let isBackend = true; // 기본값: 백엔드 항목도 검증
189
+ let isBackend = true; // Default: also validate backend sections
190
+ let isKotlin = false;
191
+ let isKotlinCqrs = false;
179
192
  if (fs.existsSync(paPath)) {
180
193
  try {
181
- const pa = JSON.parse(fs.readFileSync(paPath, "utf-8"));
182
- const frontend = pa.stack?.frontend;
183
- const framework = pa.stack?.framework;
194
+ const paData = JSON.parse(fs.readFileSync(paPath, "utf-8"));
195
+ const frontend = paData.stack?.frontend;
196
+ const framework = paData.stack?.framework;
197
+ const language = paData.stack?.language;
198
+ const architecture = paData.stack?.architecture;
184
199
  isBackend = !frontend || ["express", "nestjs", "django", "fastapi", "spring-boot"].includes(framework);
185
- } catch { /* project-analysis 파싱 실패 시 보수적으로 백엔드로 가정 */ }
200
+ isKotlin = language === "kotlin";
201
+ isKotlinCqrs = isKotlin && (architecture === "cqrs" || paData.stack?.multiModule);
202
+ } catch { /* If project-analysis parsing fails, conservatively assume backend */ }
186
203
  }
187
204
 
188
- const sectionsToCheck = isBackend
189
- ? [...REQUIRED_SECTIONS, ...BACKEND_SECTIONS]
190
- : REQUIRED_SECTIONS;
205
+ const sectionsToCheck = [
206
+ ...REQUIRED_SECTIONS,
207
+ ...(isBackend ? BACKEND_SECTIONS : []),
208
+ ...(isKotlin ? KOTLIN_BASE_SECTIONS : []),
209
+ ...(isKotlinCqrs ? KOTLIN_CQRS_SECTIONS : []),
210
+ ];
191
211
 
192
- // 존재 여부 검증 (대소문자 무시 fuzzy 매칭)
193
- const lowerKeys = keys.map(k => k.toLowerCase());
212
+ // Key existence validation (case-insensitive fuzzy matching)
213
+ // Normalize a key to a comparable form: lowercase, strip separators
214
+ const normalize = (s) => s.toLowerCase().replace(/[_\-\s]/g, "");
215
+ const normalizedKeys = keys.map(normalize);
194
216
  for (const section of sectionsToCheck) {
195
- const variants = [
196
- section,
197
- section.toLowerCase(),
198
- section.replace(/([A-Z])/g, "_$1").toLowerCase(), // camelCase → snake_case
199
- section.replace(/([A-Z])/g, " $1").toLowerCase(), // camelCase → space
200
- ];
201
- const found = variants.some(v => lowerKeys.some(k => k.includes(v.replace(/_/g, ""))));
217
+ const sectionNorm = normalize(section);
218
+ // Exact normalized match first, then containment (only for names >= 6 chars to avoid false positives)
219
+ const found = normalizedKeys.some(k => k === sectionNorm)
220
+ || (sectionNorm.length >= 6 && normalizedKeys.some(k => k.includes(sectionNorm) || sectionNorm.includes(k)));
202
221
  if (!found) {
203
222
  warnings.push({
204
223
  file: "pass2-merged.json",
205
224
  type: "MISSING_SECTION",
206
- msg: `'${section}' 항목이 없음 (Claude 다른 이름을 사용했을 있음)`,
225
+ msg: `'${section}' section missing (Claude may have used a different key name)`,
207
226
  });
208
227
  }
209
228
  }
210
229
 
211
- // 최상위 검증
230
+ // Top-level key count validation
212
231
  if (keys.length < 5) {
213
232
  errors.push({
214
233
  file: "pass2-merged.json",
215
234
  type: "INSUFFICIENT_KEYS",
216
- msg: `최상위 키가 ${keys.length}개뿐통합이 불완전함 (최소 5 필요)`,
235
+ msg: `Only ${keys.length} top-level keys merge is incomplete (minimum 5 required)`,
217
236
  });
218
237
  } else if (keys.length < 9) {
219
238
  warnings.push({
220
239
  file: "pass2-merged.json",
221
240
  type: "FEW_KEYS",
222
- msg: `최상위 키가 ${keys.length}일부 항목이 누락됐을 있음 (권장 9개+)`,
241
+ msg: `${keys.length} top-level keys some sections may be missing (recommended 9+)`,
223
242
  });
224
243
  }
225
244
 
226
- // 내용 깊이 검증 객체/배열 탐지
245
+ // Value depth validationdetect empty objects/arrays
227
246
  let emptyCount = 0;
228
247
  for (const [k, v] of Object.entries(data)) {
229
248
  const isEmpty =
@@ -237,18 +256,18 @@ async function main() {
237
256
  warnings.push({
238
257
  file: "pass2-merged.json",
239
258
  type: "EMPTY_VALUES",
240
- msg: `${emptyCount} 항목이 분석 내용이 없을 있음`,
259
+ msg: `${emptyCount} items have empty values analysis content may be missing`,
241
260
  });
242
261
  }
243
262
 
244
263
  const missingCount = warnings.filter(w => w.file === "pass2-merged.json" && w.type === "MISSING_SECTION").length;
245
264
  if (missingCount === 0 && keys.length >= 9) {
246
- console.log(` ✅ 구조 검증 통과 (${keys.length} 키, 빈 값 ${emptyCount})`);
265
+ console.log(` ✅ Structure validation passed (${keys.length} keys, ${emptyCount} empty values)`);
247
266
  }
248
267
  }
249
268
  }
250
269
 
251
- // ─── 결과 출력 ─────────────────────────────────────────
270
+ // ─── Output results ─────────────────────────────────────────
252
271
  console.log(`\n Checked ${checked} files\n`);
253
272
  if (errors.length) {
254
273
  console.log(` ❌ ERRORS (${errors.length}):`);
@@ -264,10 +283,13 @@ async function main() {
264
283
  console.log(" ✅ All JSON validation passed\n");
265
284
  }
266
285
 
267
- // stale-report에 기록
286
+ // Record in stale-report
268
287
  if (fs.existsSync(GEN_DIR)) {
269
288
  const rp = path.join(GEN_DIR, "stale-report.json");
270
- const ex = fs.existsSync(rp) ? JSON.parse(fs.readFileSync(rp, "utf-8")) : {};
289
+ let ex = {};
290
+ if (fs.existsSync(rp)) {
291
+ try { ex = JSON.parse(fs.readFileSync(rp, "utf-8")); } catch { ex = {}; }
292
+ }
271
293
  ex.jsonValidation = { checkedAt: new Date().toISOString(), checked, errors: errors.length, warnings: warnings.length };
272
294
  ex.summary = { ...ex.summary, jsonErrors: errors.length, jsonWarnings: warnings.length };
273
295
  fs.writeFileSync(rp, JSON.stringify(ex, null, 2));
@@ -1,7 +1,7 @@
1
- 당신은 코드 분석 도구입니다. 아래 지시에 따라 프로젝트 소스 코드를 분석하고, 결과를 JSON 파일로 저장하세요.
2
- 대화하지 말고, 분석 결과만 JSON으로 출력하세요.
1
+ You are a code analysis tool. Analyze the project source code according to the instructions below and save the results as a JSON file.
2
+ Do not converse. Output only the analysis results in JSON format.
3
3
 
4
- 프로젝트 루트 경로: {{PROJECT_ROOT}}
5
- 경로를 기준으로 모든 파일 경로를 해석해줘.
4
+ Project root path: {{PROJECT_ROOT}}
5
+ Interpret all file paths relative to this root.
6
6
 
7
7
  ---
@@ -0,0 +1,27 @@
1
+ {
2
+ "supported": ["en", "ko", "zh-CN", "ja", "es", "vi", "hi", "ru", "fr", "de"],
3
+ "labels": {
4
+ "en": "English",
5
+ "ko": "한국어 (Korean)",
6
+ "zh-CN": "简体中文 (Chinese Simplified)",
7
+ "ja": "日本語 (Japanese)",
8
+ "es": "Español (Spanish)",
9
+ "vi": "Tiếng Việt (Vietnamese)",
10
+ "hi": "हिन्दी (Hindi)",
11
+ "ru": "Русский (Russian)",
12
+ "fr": "Français (French)",
13
+ "de": "Deutsch (German)"
14
+ },
15
+ "instructions": {
16
+ "en": "",
17
+ "ko": "\n---\n\n## ⚠️ LANGUAGE REQUIREMENT (MANDATORY)\n\nGenerate ALL output file content in **Korean (한국어)**.\n\nThis applies to:\n- CLAUDE.md\n- All files under claudeos-core/standard/\n- All files under .claude/rules/\n- All files under claudeos-core/skills/\n- All files under claudeos-core/guide/\n- All files under claudeos-core/plan/\n- All files under claudeos-core/database/\n- All files under claudeos-core/mcp-guide/\n\nRules:\n- All headings, descriptions, explanations, comments, and documentation text MUST be in Korean.\n- Code examples inside ```code blocks``` keep their original syntax (Java/Kotlin/Python/JS class names, method names, annotations, keywords remain in English as they are programming language syntax).\n- JSON keys in generated files (e.g., frontmatter `paths:`, `name:`) remain in English.\n- Markdown structural elements (```markdown, ---, ✅, ❌) remain as-is.\n- Use natural, professional Korean — not machine-translated style.\n- Technical terms that are commonly used in English among Korean developers (e.g., Controller, Service, Repository, DTO, API, CRUD) may remain in English or be written as 컨트롤러, 서비스, etc. — use whichever is more natural in context.\n\n---\n\n",
18
+ "zh-CN": "\n---\n\n## ⚠️ LANGUAGE REQUIREMENT (MANDATORY)\n\nGenerate ALL output file content in **Simplified Chinese (简体中文)**.\n\nThis applies to:\n- CLAUDE.md\n- All files under claudeos-core/standard/\n- All files under .claude/rules/\n- All files under claudeos-core/skills/\n- All files under claudeos-core/guide/\n- All files under claudeos-core/plan/\n- All files under claudeos-core/database/\n- All files under claudeos-core/mcp-guide/\n\nRules:\n- All headings, descriptions, explanations, comments, and documentation text MUST be in Simplified Chinese.\n- Code examples inside ```code blocks``` keep their original syntax.\n- JSON keys and frontmatter keys remain in English.\n- Use natural, professional Simplified Chinese.\n- Technical terms commonly used in English among Chinese developers may remain in English where natural.\n\n---\n\n",
19
+ "ja": "\n---\n\n## ⚠️ LANGUAGE REQUIREMENT (MANDATORY)\n\nGenerate ALL output file content in **Japanese (日本語)**.\n\nThis applies to:\n- CLAUDE.md\n- All files under claudeos-core/standard/\n- All files under .claude/rules/\n- All files under claudeos-core/skills/\n- All files under claudeos-core/guide/\n- All files under claudeos-core/plan/\n- All files under claudeos-core/database/\n- All files under claudeos-core/mcp-guide/\n\nRules:\n- All headings, descriptions, explanations, comments, and documentation text MUST be in Japanese.\n- Code examples inside ```code blocks``` keep their original syntax.\n- JSON keys and frontmatter keys remain in English.\n- Use natural, professional Japanese (です/ます体 for documentation).\n- Technical terms commonly used in English among Japanese developers (e.g., コントローラー, サービス) may use katakana or English — whichever is more natural.\n\n---\n\n",
20
+ "es": "\n---\n\n## ⚠️ LANGUAGE REQUIREMENT (MANDATORY)\n\nGenerate ALL output file content in **Spanish (Español)**.\n\nThis applies to:\n- CLAUDE.md\n- All files under claudeos-core/standard/\n- All files under .claude/rules/\n- All files under claudeos-core/skills/\n- All files under claudeos-core/guide/\n- All files under claudeos-core/plan/\n- All files under claudeos-core/database/\n- All files under claudeos-core/mcp-guide/\n\nRules:\n- All headings, descriptions, explanations, comments, and documentation text MUST be in Spanish.\n- Code examples inside ```code blocks``` keep their original syntax.\n- JSON keys and frontmatter keys remain in English.\n- Use natural, professional Spanish.\n- Technical terms commonly used in English among Spanish-speaking developers may remain in English where natural.\n\n---\n\n",
21
+ "vi": "\n---\n\n## ⚠️ LANGUAGE REQUIREMENT (MANDATORY)\n\nGenerate ALL output file content in **Vietnamese (Tiếng Việt)**.\n\nThis applies to:\n- CLAUDE.md\n- All files under claudeos-core/standard/\n- All files under .claude/rules/\n- All files under claudeos-core/skills/\n- All files under claudeos-core/guide/\n- All files under claudeos-core/plan/\n- All files under claudeos-core/database/\n- All files under claudeos-core/mcp-guide/\n\nRules:\n- All headings, descriptions, explanations, comments, and documentation text MUST be in Vietnamese.\n- Code examples inside ```code blocks``` keep their original syntax.\n- JSON keys and frontmatter keys remain in English.\n- Use natural, professional Vietnamese.\n- Technical terms commonly used in English among Vietnamese developers may remain in English where natural.\n\n---\n\n",
22
+ "hi": "\n---\n\n## ⚠️ LANGUAGE REQUIREMENT (MANDATORY)\n\nGenerate ALL output file content in **Hindi (हिन्दी)**.\n\nThis applies to:\n- CLAUDE.md\n- All files under claudeos-core/standard/\n- All files under .claude/rules/\n- All files under claudeos-core/skills/\n- All files under claudeos-core/guide/\n- All files under claudeos-core/plan/\n- All files under claudeos-core/database/\n- All files under claudeos-core/mcp-guide/\n\nRules:\n- All headings, descriptions, explanations, comments, and documentation text MUST be in Hindi.\n- Code examples inside ```code blocks``` keep their original syntax.\n- JSON keys and frontmatter keys remain in English.\n- Use natural, professional Hindi (Devanagari script).\n- Technical terms commonly used in English among Hindi-speaking developers may remain in English where natural.\n\n---\n\n",
23
+ "ru": "\n---\n\n## ⚠️ LANGUAGE REQUIREMENT (MANDATORY)\n\nGenerate ALL output file content in **Russian (Русский)**.\n\nThis applies to:\n- CLAUDE.md\n- All files under claudeos-core/standard/\n- All files under .claude/rules/\n- All files under claudeos-core/skills/\n- All files under claudeos-core/guide/\n- All files under claudeos-core/plan/\n- All files under claudeos-core/database/\n- All files under claudeos-core/mcp-guide/\n\nRules:\n- All headings, descriptions, explanations, comments, and documentation text MUST be in Russian.\n- Code examples inside ```code blocks``` keep their original syntax.\n- JSON keys and frontmatter keys remain in English.\n- Use natural, professional Russian.\n- Technical terms commonly used in English among Russian-speaking developers may remain in English where natural.\n\n---\n\n",
24
+ "fr": "\n---\n\n## ⚠️ LANGUAGE REQUIREMENT (MANDATORY)\n\nGenerate ALL output file content in **French (Français)**.\n\nThis applies to:\n- CLAUDE.md\n- All files under claudeos-core/standard/\n- All files under .claude/rules/\n- All files under claudeos-core/skills/\n- All files under claudeos-core/guide/\n- All files under claudeos-core/plan/\n- All files under claudeos-core/database/\n- All files under claudeos-core/mcp-guide/\n\nRules:\n- All headings, descriptions, explanations, comments, and documentation text MUST be in French.\n- Code examples inside ```code blocks``` keep their original syntax.\n- JSON keys and frontmatter keys remain in English.\n- Use natural, professional French.\n- Technical terms commonly used in English among French-speaking developers may remain in English where natural.\n\n---\n\n",
25
+ "de": "\n---\n\n## ⚠️ LANGUAGE REQUIREMENT (MANDATORY)\n\nGenerate ALL output file content in **German (Deutsch)**.\n\nThis applies to:\n- CLAUDE.md\n- All files under claudeos-core/standard/\n- All files under .claude/rules/\n- All files under claudeos-core/skills/\n- All files under claudeos-core/guide/\n- All files under claudeos-core/plan/\n- All files under claudeos-core/database/\n- All files under claudeos-core/mcp-guide/\n\nRules:\n- All headings, descriptions, explanations, comments, and documentation text MUST be in German.\n- Code examples inside ```code blocks``` keep their original syntax.\n- JSON keys and frontmatter keys remain in English.\n- Use natural, professional German.\n- Technical terms commonly used in English among German-speaking developers may remain in English where natural.\n\n---\n\n"
26
+ }
27
+ }
@@ -1,4 +1,3 @@
1
1
 
2
- 완료 반드시 아래 명령을 순서대로 실행:
3
- 1. node claudeos-core-tools/manifest-generator/index.js
4
- 2. node claudeos-core-tools/health-checker/index.js
2
+ After completion, run the following commands in order:
3
+ 1. npx claudeos-core health
@@ -1,97 +1,100 @@
1
- claudeos-core/generated/project-analysis.json 읽고,
2
- 다음 도메인만 깊이 분석해줘: {{DOMAIN_GROUP}}
1
+ Read claudeos-core/generated/project-analysis.json and
2
+ perform a deep analysis of the following domains only: {{DOMAIN_GROUP}}
3
3
 
4
- 도메인에서 레이어별 대표 파일을 1개씩 선정하여 코드를 읽고 분석해줘.
5
- 가장 패턴이 풍부한 파일을 우선 선정할 것.
4
+ For each domain, select one representative file per layer, read its code, and analyze it.
5
+ Prioritize files with the richest patterns.
6
6
 
7
- 분석 항목 (도메인별로):
7
+ Analysis items (per domain):
8
8
 
9
- 1. Controller 패턴
10
- - 클래스 어노테이션 (@Controller vs @RestController, 상속 여부)
11
- - 메서드 매핑 (@GetMapping, @PostMapping, @PutMapping, @DeleteMapping, @PatchMapping)
12
- - URL 패턴 (RESTful 규칙, 네이밍 컨벤션, 버저닝 방식)
13
- - 파라미터 바인딩 (@RequestBody, @PathVariable, @RequestParam, @ModelAttribute, @RequestHeader)
14
- - 응답 형식 (ResponseEntity, 커스텀 응답 래퍼, 직접 반환)
15
- - 에러 핸들링 (try-catch 패턴, @ExceptionHandler, @ControllerAdvice)
16
- - 인증/인가 (@AuthenticationPrincipal, @PreAuthorize, SecurityContext)
17
- - API 문서화 (Swagger/SpringDoc 어노테이션)
18
- - 페이지네이션 (Pageable, 커스텀 페이징 파라미터)
9
+ 1. Controller Patterns
10
+ - Class annotations (@Controller vs @RestController, inheritance)
11
+ - Method mappings (@GetMapping, @PostMapping, @PutMapping, @DeleteMapping, @PatchMapping)
12
+ - URL patterns (RESTful conventions, naming conventions, versioning)
13
+ - Parameter binding (@RequestBody, @PathVariable, @RequestParam, @ModelAttribute, @RequestHeader)
14
+ - Response format (ResponseEntity, custom response wrappers, direct return)
15
+ - Error handling (try-catch patterns, @ExceptionHandler, @ControllerAdvice)
16
+ - Authentication/authorization (@AuthenticationPrincipal, @PreAuthorize, SecurityContext)
17
+ - API documentation (Swagger/SpringDoc annotations)
18
+ - Pagination (Pageable, custom paging parameters)
19
19
 
20
- 2. Service 패턴
21
- - 클래스 어노테이션 (@Service, @Transactional)
22
- - 트랜잭션 전략 (클래스 레벨 vs 메서드 레벨, readOnly 분리, propagation)
23
- - 의존성 주입 방식 (생성자 주입, @RequiredArgsConstructor, @Autowired)
24
- - 비즈니스 예외 처리 (커스텀 Exception 계층, 예외 메시지 관리)
25
- - 검증 로직 위치 (Service vs Validator 분리)
26
- - 이벤트 처리 (ApplicationEventPublisher, @EventListener)
20
+ 2. Service Patterns
21
+ - Class annotations (@Service, @Transactional)
22
+ - Transaction strategy (class-level vs method-level, readOnly separation, propagation)
23
+ - Dependency injection (constructor injection, @RequiredArgsConstructor, @Autowired)
24
+ - Business exception handling (custom Exception hierarchy, exception message management)
25
+ - Validation logic placement (within Service vs separate Validator)
26
+ - Event handling (ApplicationEventPublisher, @EventListener)
27
27
 
28
- 3. 데이터 접근 패턴
29
- - ORM 방식 (MyBatis XML/Annotation, JPA/Hibernate, QueryDSL, JDBC Template)
30
- - Repository/Mapper 인터페이스 구조 (상속 관계, 커스텀 메서드)
31
- - 조회/변경 분리 여부
32
- - 페이징 방식 (Pageable, PageHelper, RowBounds, 커스텀)
33
- - 감사 컬럼 처리 (생성일/수정일/생성자/수정자, @CreatedDate, @LastModifiedDate)
34
- - NULL 처리 전략
35
- - PK 생성 전략 (AUTO_INCREMENT, SEQUENCE, UUID, 커스텀 채번)
36
- - N+1 문제 대응 (fetch join, @EntityGraph, BatchSize)
37
- - 동적 쿼리 (Specification, QueryDSL, MyBatis <if>/<choose>)
28
+ 3. Data Access Patterns
29
+ - ORM approach (MyBatis XML/Annotation, JPA/Hibernate, QueryDSL, JDBC Template)
30
+ - Repository/Mapper interface structure (inheritance, custom methods)
31
+ - Read/write separation
32
+ - Pagination approach (Pageable, PageHelper, RowBounds, custom)
33
+ - Audit columns (createdAt/updatedAt/createdBy/updatedBy, @CreatedDate, @LastModifiedDate)
34
+ - NULL handling strategy
35
+ - PK generation strategy (AUTO_INCREMENT, SEQUENCE, UUID, custom ID generation)
36
+ - N+1 problem handling (fetch join, @EntityGraph, BatchSize)
37
+ - Dynamic queries (Specification, QueryDSL, MyBatis <if>/<choose>)
38
38
 
39
- 4. DTO/Entity 패턴
40
- - 클래스 구조 (상속 여부, Base 클래스, Record 사용)
41
- - Lombok 사용 범위 (@Getter, @Setter, @Builder, @Data, @Value)
42
- - Request/Response DTO 분리 규칙
43
- - DTO 명명 규칙
44
- - 필드 타입 관례 (Boolean 처리, 날짜 타입, Enum 관리)
45
- - Validation 어노테이션 (@NotNull, @NotBlank, @Size, @Pattern, 커스텀)
46
- - 변환 방식 (MapStruct, ModelMapper, 수동 변환)
39
+ 4. DTO/VO/Entity Patterns
40
+ - Class structure (inheritance, Base class, Record usage)
41
+ - Lombok usage scope (@Getter, @Setter, @Builder, @Data, @Value)
42
+ - Request/Response DTO separation rules
43
+ - DTO naming conventions
44
+ - **DTO vs VO distinction**: DTO (data transfer, mutable) vs VO (domain concept, immutable, equality by value)
45
+ - VO usage patterns (Java Record as VO, @Value with Lombok, custom equals/hashCode)
46
+ - VO location (domain layer vs shared module)
47
+ - Field type conventions (Boolean handling, date types, Enum management)
48
+ - Validation annotations (@NotNull, @NotBlank, @Size, @Pattern, custom)
49
+ - Conversion approach (MapStruct, ModelMapper, manual conversion)
47
50
 
48
- 5. Interceptor/Filter/AOP 패턴
49
- - HandlerInterceptor 사용 여부
50
- - Filter 체인 (SecurityFilterChain, 커스텀 Filter)
51
- - AOP 활용 (@Aspect, 로깅, 성능 측정, 감사)
52
- - 미들웨어 등록 순서
51
+ 5. Interceptor/Filter/AOP Patterns
52
+ - HandlerInterceptor usage
53
+ - Filter chain (SecurityFilterChain, custom Filters)
54
+ - AOP usage (@Aspect, logging, performance measurement, auditing)
55
+ - Middleware registration order
53
56
 
54
- 6. 설정/환경 패턴
55
- - Profile 분리 (local/dev/stg/prod)
56
- - 설정 로딩 (@ConfigurationProperties, @Value, Environment)
57
- - 멀티모듈 구조 여부
58
- - 외부 설정 (application.yml 구조, 환경변수)
57
+ 6. Configuration/Environment Patterns
58
+ - Profile separation (local/dev/stg/prod)
59
+ - Configuration loading (@ConfigurationProperties, @Value, Environment)
60
+ - Multi-module structure
61
+ - External configuration (application.yml structure, environment variables)
59
62
 
60
- 7. 로깅 패턴
61
- - 로거 사용 (SLF4J, Logback, Log4j2)
62
- - 로그 레벨 정책
63
- - 구조화 로깅 (MDC, JSON 포맷)
64
- - 요청/응답 로깅 방식
63
+ 7. Logging Patterns
64
+ - Logger usage (SLF4J, Logback, Log4j2)
65
+ - Log level policy
66
+ - Structured logging (MDC, JSON format)
67
+ - Request/response logging approach
65
68
 
66
- 8. 테스트 패턴
67
- - 테스트 프레임워크 (JUnit 5, Mockito, AssertJ)
68
- - 테스트 분류 (단위/통합/슬라이스)
69
+ 8. Testing Patterns
70
+ - Test framework (JUnit 5, Mockito, AssertJ)
71
+ - Test classification (unit/integration/slice)
69
72
  - @SpringBootTest vs @WebMvcTest vs @DataJpaTest
70
- - 모킹 전략 (@MockBean, @Mock, @InjectMocks)
71
- - 테스트 데이터 관리 (TestFixture, Builder 패턴)
72
- - 테스트 네이밍 규칙
73
+ - Mocking strategy (@MockBean, @Mock, @InjectMocks)
74
+ - Test data management (TestFixture, Builder pattern)
75
+ - Test naming conventions
73
76
 
74
- 9. 도메인만의 특화 패턴
75
- - 파일 업로드/다운로드 (MultipartFile, S3)
77
+ 9. Domain-Specific Patterns
78
+ - File upload/download (MultipartFile, S3)
76
79
  - Excel import/export (Apache POI, EasyExcel)
77
- - 일괄 처리 (Batch CUD, Spring Batch)
78
- - 상태 전이 로직 (상태 머신, Enum 기반)
79
- - 스케줄링 (@Scheduled, Quartz)
80
- - 외부 API 연동 (RestTemplate, WebClient, FeignClient, RestClient)
81
- - 캐싱 (@Cacheable, Redis, Caffeine)
82
- - 메시징 (Kafka, RabbitMQ)
83
- - 국제화 (MessageSource, LocaleResolver)
84
- - API 버저닝 전략
80
+ - Bulk processing (Batch CUD, Spring Batch)
81
+ - State transition logic (state machine, Enum-based)
82
+ - Scheduling (@Scheduled, Quartz)
83
+ - External API integration (RestTemplate, WebClient, FeignClient, RestClient)
84
+ - Caching (@Cacheable, Redis, Caffeine)
85
+ - Messaging (Kafka, RabbitMQ)
86
+ - Internationalization (MessageSource, LocaleResolver)
87
+ - API versioning strategy
85
88
 
86
- 10. 안티패턴 / 비일관성
87
- - 도메인 내에서 스타일이 다른 코드
88
- - 다른 도메인과 불일치하는 패턴
89
- - 레거시로 보이는 패턴
90
- - 성능 문제 (N+1, 불필요한 쿼리, 메모리 낭비)
91
- - 보안 문제 (SQL Injection 가능성, 권한 누락)
89
+ 10. Anti-patterns / Inconsistencies
90
+ - Code with differing styles within the domain
91
+ - Patterns inconsistent with other domains
92
+ - Legacy-looking patterns
93
+ - Performance issues (N+1, unnecessary queries, memory waste)
94
+ - Security issues (SQL Injection potential, missing authorization)
92
95
 
93
- 파일 생성은 하지 마. 분석만.
94
- 결과를 claudeos-core/generated/pass1-{{PASS_NUM}}.json 아래 형식으로 저장:
96
+ Do not create files. Analysis only.
97
+ Save results to claudeos-core/generated/pass1-{{PASS_NUM}}.json in the following format:
95
98
 
96
99
  {
97
100
  "analyzedAt": "ISO timestamp",
@@ -102,7 +105,7 @@ claudeos-core/generated/project-analysis.json을 읽고,
102
105
  "representativeFiles": {
103
106
  "controller": "UserController.java",
104
107
  "service": "UserService.java",
105
- "repository": "UserRepository.java 또는 UserMapper.java",
108
+ "repository": "UserRepository.java or UserMapper.java",
106
109
  "entity": "User.java",
107
110
  "dto": "UserRequestDto.java"
108
111
  },
@@ -121,7 +124,7 @@ claudeos-core/generated/project-analysis.json을 읽고,
121
124
  }
122
125
  },
123
126
  "crossDomainCommon": {
124
- "description": " 그룹의 도메인들이 공통으로 사용하는 패턴",
127
+ "description": "Patterns commonly used across domains in this group",
125
128
  "patterns": []
126
129
  }
127
130
  }